From f61214a23811078a47f55c8ce4f9c83f67ed65e1 Mon Sep 17 00:00:00 2001 From: ABCbum Date: Mon, 23 Dec 2019 23:03:49 +0700 Subject: [PATCH 1/3] Support fetching cover art images from the Cover Art Archive Add option `--cover-art` to `whipper cd rip` command which accepts three values: - `file`: save the downloaded cover image as standalone file in the rip folder (named `cover.jpg`) - `embed`: embed the download cover image into all the ripped audio tracks (no standalone file will be kept) - `complete`: save standalone cover image as standalone file and embed it into all the ripped audio tracks (`file` + `embed`) Every cover art is fetched from the Cover Art Archive as JPEG thumbnail with a maximum dimension of 500px. Other supported values for the thumbnails are 250, 500 and 1200 (currently only some images have a corresponding 1200px sized thumbnail). This feature introduces an optional dependency on the `Pillow` module which is required for the decoding of the cover file (required by the `embed` and `complete` option values). Problem: - EmbedPicTureTask shouldn't be a task. Signed-off-by: ABCbum Co-authored-by: JoeLametta Signed-off-by: JoeLametta --- whipper/command/cd.py | 30 ++++++++++++++- whipper/common/encode.py | 71 ++++++++++++++++++++++++++++++++++- whipper/common/program.py | 35 ++++++++++++++++- whipper/program/cdparanoia.py | 5 ++- 4 files changed, 135 insertions(+), 6 deletions(-) diff --git a/whipper/command/cd.py b/whipper/command/cd.py index a5ecc49..488faef 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -20,6 +20,7 @@ import argparse import cdio +import importlib.util import os import glob import logging @@ -290,6 +291,14 @@ Log files will log the path to tracks relative to this directory. help="whether to continue ripping if " "the disc is a CD-R", default=False) + self.parser.add_argument('-C', '--cover-art', + action="store", dest="fetch_cover_art", + help="Fetch cover art and save it as " + "standalone file, embed into FLAC files " + "or perform both actions: file, embed, " + "complete option values respectively", + choices=['file', 'embed', 'complete'], + default=None) def handle_arguments(self): self.options.output_directory = os.path.expanduser( @@ -342,6 +351,19 @@ Log files will log the path to tracks relative to this directory. logger.info("creating output directory %s", dirname) os.makedirs(dirname) + self.coverArtPath = None + if (self.options.fetch_cover_art in {"embed", "complete"} and + importlib.util.find_spec("PIL") is None): + logger.warning("the cover art option '%s' won't be honored " + "because the 'pillow' module isn't available", + self.options.fetch_cover_art) + elif self.options.fetch_cover_art in {"file", "embed", "complete"}: + self.coverArtPath = self.program.getCoverArt( + dirname, + self.program.metadata.mbid) + if self.options.fetch_cover_art == "file": + self.coverArtPath = None # NOTE: avoid image embedding (hacky) + # FIXME: turn this into a method def _ripIfNotRipped(number): logger.debug('ripIfNotRipped for track %d', number) @@ -412,7 +434,8 @@ Log files will log the path to tracks relative to this directory. what='track %d of %d%s' % ( number, len(self.itable.tracks), - extra)) + extra), + coverArtPath=self.coverArtPath) break # FIXME: catching too general exception (Exception) except Exception as e: @@ -474,6 +497,11 @@ Log files will log the path to tracks relative to this directory. continue _ripIfNotRipped(i + 1) + if (self.options.fetch_cover_art == "embed" and + self.coverArtPath is not None): + logger.debug('deleting cover art file at: %r', self.coverArtPath) + os.remove(self.coverArtPath) + logger.debug('writing cue file for %r', discName) self.program.writeCue(discName) diff --git a/whipper/common/encode.py b/whipper/common/encode.py index 237daa9..667ab51 100644 --- a/whipper/common/encode.py +++ b/whipper/common/encode.py @@ -19,7 +19,8 @@ # along with whipper. If not, see . -from mutagen.flac import FLAC +from mutagen.flac import FLAC, Picture +from mutagen.id3 import PictureType from whipper.extern.task import task @@ -89,3 +90,71 @@ class TaggingTask(task.Task): w.save() self.stop() + + +class EmbedPictureTask(task.Task): + description = 'Embed picture to FLAC' + + def __init__(self, track_path, cover_art_path): + self.track_path = track_path + self.cover_art_path = cover_art_path + + def start(self, runner): + task.Task.start(self, runner) + self.schedule(0.0, self._embed_picture) + + def _make_flac_picture(self, cover_art_filename): + """ + Given a path to a jpg/png file, return a FLAC picture for embedding. + + The embedding will be performed using the mutagen module. + + :param cover_art_filename: path to cover art image file + :type cover_art_filename: str + :returns: a valid FLAC picture for embedding + :rtype: mutagen.flac.Picture or None + """ + if not cover_art_filename: + return + + from PIL import Image + + im = Image.open(cover_art_filename) + # NOTE: the cover art thumbnails we're getting from the Cover Art + # Archive should be always in the JPEG format: this check is currently + # useless but will leave it here to better handle unexpected formats. + if im.format == 'JPEG': + mime = 'image/jpeg' + elif im.format == 'PNG': + mime = 'image/png' + else: + # we only support png and jpeg + logger.warning("no cover art will be added because the fetched " + "image format is unsupported") + return + + pic = Picture() + with open(cover_art_filename, 'rb') as f: + pic.data = f.read() + + pic.type = PictureType.COVER_FRONT + pic.mime = mime + pic.width, pic.height = im.size + if im.mode not in ('P', 'RGB', 'SRGB'): + logger.warning("no cover art will be added because the fetched " + "image mode is unsupported") + return + + return pic + + def _embed_picture(self): + """ + Get flac picture generated from mutagen.flac.Picture then embed + it to given track if the flac picture exists. + """ + flac_pic = self._make_flac_picture(self.cover_art_path) + if flac_pic: + w = FLAC(self.track_path) + w.add_picture(flac_pic) + + self.stop() diff --git a/whipper/common/program.py b/whipper/common/program.py index 1d829ae..dd1f824 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -27,6 +27,7 @@ import re import os import time +from tempfile import NamedTemporaryFile from whipper.common import accurip, cache, checksum, common, mbngs, path from whipper.program import cdrdao, cdparanoia from whipper.image import image @@ -470,6 +471,35 @@ class Program: stop = track.getIndex(1).absolute - 1 return start, stop + def getCoverArt(self, path, release_id): + """ + Get cover art image from Cover Art Archive. + + :param path: where to store the fetched image + :type path: str + :param release_id: a release id (self.program.metadata.mbid) + :type release_id: str + :returns: path to the downloaded cover art, else `None` + :rtype: str or None + """ + cover_art_path = os.path.join(path, 'cover.jpg') + + logger.debug('fetching cover art for release: %r', release_id) + try: + data = musicbrainzngs.get_image_front(release_id, 500) + except musicbrainzngs.ResponseError as e: + logger.error('error fetching cover art: %r', e) + return + + if data: + with NamedTemporaryFile(suffix='.cover.jpg', delete=False) as f: + f.write(data) + os.chmod(f.name, 0o644) + os.replace(f.name, cover_art_path) + logger.debug('cover art fetched at: %r', cover_art_path) + return cover_art_path + return + @staticmethod def verifyTrack(runner, trackResult): is_wave = not trackResult.filename.endswith('.flac') @@ -490,7 +520,7 @@ class Program: return ret def ripTrack(self, runner, trackResult, offset, device, taglist, - overread, what=None): + overread, what=None, coverArtPath=None): """ Ripping the track may change the track's filename as stored in trackResult. @@ -516,7 +546,8 @@ class Program: offset=offset, device=device, taglist=taglist, - what=what) + what=what, + coverArtPath=coverArtPath) runner.run(t) diff --git a/whipper/program/cdparanoia.py b/whipper/program/cdparanoia.py index f071674..d410d0c 100644 --- a/whipper/program/cdparanoia.py +++ b/whipper/program/cdparanoia.py @@ -427,7 +427,7 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): _tmppath = None def __init__(self, path, table, start, stop, overread, offset=0, - device=None, taglist=None, what="track"): + device=None, taglist=None, what="track", coverArtPath=None): """ :param path: where to store the ripped track :type path: str @@ -493,8 +493,9 @@ class ReadVerifyTrackTask(task.MultiSeparateTask): self.tasks.append(checksum.CRC32Task(tmppath)) self.tasks.append(encode.SoxPeakTask(tmppath)) - # TODO: Move tagging outside of cdparanoia + # TODO: Move tagging and embed picture outside of cdparanoia self.tasks.append(encode.TaggingTask(tmpoutpath, taglist)) + self.tasks.append(encode.EmbedPictureTask(tmpoutpath, coverArtPath)) self.checksum = None From 8181cacca5fc7f67d7416a86744406bb69edde97 Mon Sep 17 00:00:00 2001 From: ABCbum Date: Mon, 23 Dec 2019 23:08:28 +0700 Subject: [PATCH 2/3] Update README, dependencies and supporting files for cover art feature Signed-off-by: ABCbum Co-authored-by: JoeLametta Signed-off-by: JoeLametta --- .travis.yml | 2 +- Dockerfile | 1 + README.md | 7 +++++++ setup.py | 3 +++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3dd3a75..7425673 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ install: # Dependencies - sudo apt-get -qq update - pip install --upgrade -qq pip - - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libgirepository1.0-dev libiso9660-dev libsndfile1-dev sox swig libcdio-utils libdiscid0 + - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libgirepository1.0-dev libiso9660-dev libsndfile1-dev sox swig libcdio-utils libdiscid0 python3-pil # newer version of pydcio requires newer version of libcdio than travis has - pip install pycdio==0.21 # install rest of dependencies diff --git a/Dockerfile b/Dockerfile index 73cb13d..ba85f15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ python3-gi \ python3-musicbrainzngs \ python3-mutagen \ + python3-pil \ python3-pip \ python3-requests \ python3-ruamel.yaml \ diff --git a/README.md b/README.md index 57a25d4..27e8be0 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,13 @@ PyPI installable dependencies are listed in the [requirements.txt](https://githu `pip install -r requirements.txt` +### Optional dependencies +- [pillow](https://pypi.org/project/Pillow/), for completely supporting the cover art feature (`embed` and `complete` option values won't work otherwise). + +This dependency isn't listed in the `requirements.txt`, to install it just issue the following command: + +`pip install Pillow` + ### Fetching the source code Change to a directory where you want to put whipper source code (for example, `$HOME/dev/ext` or `$HOME/prefix/src`) diff --git a/setup.py b/setup.py index 96bebf5..d5d41e3 100644 --- a/setup.py +++ b/setup.py @@ -16,6 +16,9 @@ setup( libraries=['sndfile'], sources=['src/accuraterip-checksum.c']) ], + extras_require={ + 'cover_art': ["pillow"] + }, entry_points={ 'console_scripts': [ 'whipper = whipper.command.main:main' From e2942b07e31a88e4e13d96af302701dc6e703f1e Mon Sep 17 00:00:00 2001 From: ABCbum Date: Sat, 4 Jan 2020 01:07:25 +0700 Subject: [PATCH 3/3] Add test case to check getCoverArt's functionality Mock two functions `getCoverArt`, `get_image_front` and use a locally available cover art to check if the created cover art exists. Problems: - How to check image's quality. - Not sure if only this check is enough (do we need to check the embedding part?). Signed-off-by: ABCbum --- whipper/command/cd.py | 4 ++ .../76df3287-6cda-33eb-8e9a-044b5e15ffdd.jpg | Bin 0 -> 35043 bytes whipper/test/test_common_program.py | 53 ++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 whipper/test/76df3287-6cda-33eb-8e9a-044b5e15ffdd.jpg diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 488faef..7060f86 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -497,6 +497,10 @@ Log files will log the path to tracks relative to this directory. continue _ripIfNotRipped(i + 1) + # NOTE: Seems like some kind of with … or try: … finally: … clause + # would be more appropriate, since otherwise this would potentially + # leave stray files lying around in case of crashes etc. + # if (self.options.fetch_cover_art == "embed" and self.coverArtPath is not None): logger.debug('deleting cover art file at: %r', self.coverArtPath) diff --git a/whipper/test/76df3287-6cda-33eb-8e9a-044b5e15ffdd.jpg b/whipper/test/76df3287-6cda-33eb-8e9a-044b5e15ffdd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07179a3ed67645e106c425e173d66bf92c4b5ada GIT binary patch literal 35043 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

{^wT=6Wo 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 fN%u5SKp}S$Sb9;83G||h1~f=Z0a8&#F*E