support for png covers with transparency, other fixes

This commit is contained in:
Lynne Megido 2020-10-17 13:34:56 +10:00
parent 83458f9f30
commit 2f62c53a9f
Signed by: lynnesbian
GPG key ID: F0A184B5213D9F90

31
bcao.py
View file

@ -62,7 +62,8 @@ if not os.path.exists(args.zip):
die(f"Couldn't find {args.zip}.", 2) die(f"Couldn't find {args.zip}.", 2)
log("Extracting...") log("Extracting...")
tmp = tempfile.TemporaryDirectory() tmpd = tempfile.TemporaryDirectory()
tmp = tmpd.name
cover = None cover = None
song_names = [] song_names = []
@ -89,6 +90,10 @@ log("Resizing album art to embed in songs...")
with Image.open(os.path.join(tmp, cover)) as image: with Image.open(os.path.join(tmp, cover)) as image:
temp_cover = os.path.join(tmp, "cover-lq.jpg") temp_cover = os.path.join(tmp, "cover-lq.jpg")
if image.mode in ["RGBA", "P"]:
# remove alpha channel
image = image.convert("RGB")
image.save(temp_cover, quality=85, optimize=True) image.save(temp_cover, quality=85, optimize=True)
image_smol = image image_smol = image
@ -107,14 +112,14 @@ with open(temp_cover, 'r+b') as cover_file:
with Image.open(temp_cover) as image: with Image.open(temp_cover) as image:
if song_format == "ogg": if song_format == "ogg":
# i hate this # i hate this
cover = Picture() embed_cover = Picture()
cover.data = data embed_cover.data = data
cover.type = mutagen.id3.PictureType.COVER_FRONT embed_cover.type = mutagen.id3.PictureType.COVER_FRONT
cover.mime = "image/jpeg" embed_cover.mime = "image/jpeg"
cover.width = image.size[0] embed_cover.width = image.size[0]
cover.height = image.size[1] embed_cover.height = image.size[1]
cover.depth = image.bits embed_cover.depth = image.bits
cover = base64.b64encode(cover.write()).decode("ascii") embed_cover = base64.b64encode(embed_cover.write()).decode("ascii")
else: else:
log(f"Format {song_format} is not fully supported - cover images will not be modified", 1) log(f"Format {song_format} is not fully supported - cover images will not be modified", 1)
@ -131,7 +136,7 @@ for song in song_names:
album = get_tag(m, "album") album = get_tag(m, "album")
# embed cover art # embed cover art
if song_format == "ogg": if song_format == "ogg":
m["metadata_block_picture"] = [cover] m["metadata_block_picture"] = [embed_cover]
m.save() m.save()
if len(artists) > 1 and "Various Artists" not in artists: if len(artists) > 1 and "Various Artists" not in artists:
@ -157,11 +162,11 @@ while artist is None:
destination = os.path.join(args.destination, artist, album) destination = os.path.join(args.destination, artist, album)
log(f"Moving files to {destination}...") log(f"Moving files to {destination}...")
os.makedirs(destination, exist_ok = True) os.makedirs(destination, exist_ok=True)
for source_name, dest_name in songs.items(): for source_name, dest_name in songs.items():
shutil.move(os.path.join(tmp, source_name), os.path.join(destination, dest_name)) shutil.move(os.path.join(tmp, source_name), os.path.join(destination, dest_name))
shutil.move(os.path.join(tmp, "cover.jpg"), os.path.join(destination, "cover.jpg")) shutil.move(os.path.join(tmp, cover), os.path.join(destination, cover))
tmp.cleanup() tmpd.cleanup()
log("Done!") log("Done!")