aboutsummaryrefslogtreecommitdiffstats
path: root/backend/zmusic/endpoints/zip.py
diff options
context:
space:
mode:
Diffstat (limited to 'backend/zmusic/endpoints/zip.py')
-rw-r--r--backend/zmusic/endpoints/zip.py73
1 files changed, 37 insertions, 36 deletions
diff --git a/backend/zmusic/endpoints/zip.py b/backend/zmusic/endpoints/zip.py
index e281f6f..d2e4d45 100644
--- a/backend/zmusic/endpoints/zip.py
+++ b/backend/zmusic/endpoints/zip.py
@@ -36,7 +36,7 @@ def zipfile():
db.session.commit()
def do_zip():
- central_directory = ""
+ central_directory = b""
offset = 0
count = 0
for song in songs:
@@ -48,12 +48,12 @@ def zipfile():
ext = ext[1:]
filename = generate_download_filename(song, ext)
file = open(song.filename, 'rb')
- yield "\x50\x4b\x03\x04" #local file header signature
- yield "\x14\x00" #version needed to extract
- yield "\x00\x00" #general purpose bit flag
- yield "\x00\x00" #compression method
- yield "\x00\x00" #last mod file time
- yield "\x00\x00" #last mod file date
+ yield b"\x50\x4b\x03\x04" #local file header signature
+ yield b"\x14\x00" #version needed to extract
+ yield b"\x00\x00" #general purpose bit flag
+ yield b"\x00\x00" #compression method
+ yield b"\x00\x00" #last mod file time
+ yield b"\x00\x00" #last mod file date
crc32 = 0
while True:
data = file.read(8192)
@@ -64,45 +64,46 @@ def zipfile():
crc32 = pack("<I", crc32 & 0xffffffff)
yield crc32 #crc-32
size = os.path.getsize(song.filename)
+ filename_encoded = filename.encode('utf-8')
yield pack("<I", size) #compressed size
- yield pack("<I", size) #uncompressed size
- yield pack("<H", len(filename)) #file name length
- yield "\x00\x00" #extra field length
- yield filename #file name
+ yield pack("<I", size) #uncompressed size
+ yield pack("<H", len(filename_encoded)) #file name length
+ yield b"\x00\x00" #extra field length
+ yield filename_encoded #file name
while True:
data = file.read(8192)
if not data:
break
- yield data #file data
- central_directory += "\x50\x4b\x01\x02"
- central_directory += "\x00\x00" #version made by
- central_directory += "\x14\x00" #version needed to extract
- central_directory += "\x00\x00" #gen purpose bit flag
- central_directory += "\x00\x00" #compression method
- central_directory += "\x00\x00" #last mod file time
- central_directory += "\x00\x00" #last mod file date
- central_directory += crc32 #crc-32
- central_directory += pack("<I", size) #compressed filesize
- central_directory += pack("<I", size) #uncompressed filesize
- central_directory += pack("<H", len(filename)) #length of filename
- central_directory += "\x00\x00" #extra field length
- central_directory += "\x00\x00" #file comment length
- central_directory += "\x00\x00" #disk number start
- central_directory += "\x00\x00" #internal file attributes
- central_directory += "\x20\x00\x00\x00" #external file attributes - 'archive' bit set (32)
- central_directory += pack("<I", offset) #relative offset of local header
- offset += 30 + len(filename) + size
- central_directory += filename
+ yield data #file data
+ central_directory += b"\x50\x4b\x01\x02"
+ central_directory += b"\x00\x00" #version made by
+ central_directory += b"\x14\x00" #version needed to extract
+ central_directory += b"\x00\x00" #gen purpose bit flag
+ central_directory += b"\x00\x00" #compression method
+ central_directory += b"\x00\x00" #last mod file time
+ central_directory += b"\x00\x00" #last mod file date
+ central_directory += crc32 #crc-32
+ central_directory += pack("<I", size) #compressed filesize
+ central_directory += pack("<I", size) #uncompressed filesize
+ central_directory += pack("<H", len(filename_encoded)) #length of filename
+ central_directory += b"\x00\x00" #extra field length
+ central_directory += b"\x00\x00" #file comment length
+ central_directory += b"\x00\x00" #disk number start
+ central_directory += b"\x00\x00" #internal file attributes
+ central_directory += b"\x20\x00\x00\x00" #external file attributes - 'archive' bit set (32)
+ central_directory += pack("<I", offset) #relative offset of local header
+ offset += 30 + len(filename_encoded) + size
+ central_directory += filename_encoded
file.close()
yield central_directory #central directory
- yield "\x50\x4b\x05\x06" #end of central directory signature
- yield "\x00\x00" #number of this disk
- yield "\x00\x00" #number of the disk with the start of the central directory
+ yield b"\x50\x4b\x05\x06" #end of central directory signature
+ yield b"\x00\x00" #number of this disk
+ yield b"\x00\x00" #number of the disk with the start of the central directory
yield pack("<H", count) #number of entries on disk
yield pack("<H", count) #number of entries
yield pack("<I", len(central_directory)) #size of central directory
yield pack("<I", offset) #offset to start of central directory
- yield "\x00\x00" #zip comment size
- response = Response(do_zip(), mimetype="application/zip", direct_passthrough=True)
+ yield b"\x00\x00" #zip comment size
+ response = Response(do_zip(), mimetype="application/zip")
response.headers.add('Content-Disposition', 'attachment', filename="ZX2C4Music-Download-" + str(int(time.time())) + ".zip")
return response