diff options
Diffstat (limited to 'backend/zmusic/endpoints/zip.py')
-rw-r--r-- | backend/zmusic/endpoints/zip.py | 73 |
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 |