diff --git a/.travis.yml b/.travis.yml index 2e1ee27..3bccf52 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ install: # Dependencies - sudo apt-get -qq update - sudo pip install --upgrade -qq pip - - sudo apt-get -qq install cdparanoia cdrdao flac libcdio-dev libiso9660-dev libsndfile1-dev python-cddb python-gobject python-musicbrainzngs python-mutagen python-setuptools sox swig libcdio-utils + - sudo apt-get -qq install cdparanoia cdrdao flac gir1.2-glib-2.0 libcdio-dev libiso9660-dev libsndfile1-dev python-cddb python-gi python-musicbrainzngs python-mutagen python-setuptools sox swig libcdio-utils - sudo pip install pycdio==0.21 requests # Testing dependencies diff --git a/README.md b/README.md index 361b4ad..6ed5ebb 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ https://web.archive.org/web/20160528213242/https://thomas.apestaart.org/thomas/t - Performs Test & Copy rips - Verifies rip accuracy using the [AccurateRip database](http://www.accuraterip.com/) - Uses [MusicBrainz](https://musicbrainz.org/doc/About) for metadata lookup -- Supports reading the [pre-emphasis](http://wiki.hydrogenaud.io/index.php?title=Pre-emphasis) flag embedded into some CDs (and correctly tags the resulting rip) +- Supports reading the [pre-emphasis](http://wiki.hydrogenaud.io/index.php?title=Pre-emphasis) flag embedded into some CDs (and correctly tags the resulting rip). _Currently whipper only reports the pre-emphasis flag value stored in the TOC._ - Detects and rips _non digitally silent_ [Hidden Track One Audio](http://wiki.hydrogenaud.io/index.php?title=HTOA) (HTOA) - Provides batch ripping capabilities - Provides templates for file and directory naming @@ -78,7 +78,8 @@ Whipper relies on the following packages in order to run correctly and provide a - [cd-paranoia](https://www.gnu.org/software/libcdio/), for the actual ripping - To avoid bugs it's advised to use `cd-paranoia` **10.2+0.94+2-2** - [cdrdao](http://cdrdao.sourceforge.net/), for session, TOC, pre-gap, and ISRC extraction -- [python-gobject-2](https://packages.debian.org/en/jessie/python-gobject-2), required by `task.py` +- [GObject Introspection](https://wiki.gnome.org/Projects/GObjectIntrospection), to provide GLib-2.0 methods used by `task.py` +- [PyGObject](https://pypi.org/project/PyGObject/), required by `task.py` - [python-musicbrainzngs](https://github.com/alastair/python-musicbrainzngs), for metadata lookup - [python-mutagen](https://pypi.python.org/pypi/mutagen), for tagging support - [python-setuptools](https://pypi.python.org/pypi/setuptools), for installation, plugins support diff --git a/whipper/command/cd.py b/whipper/command/cd.py index 10a164f..502709f 100644 --- a/whipper/command/cd.py +++ b/whipper/command/cd.py @@ -24,7 +24,6 @@ import os import glob import sys import logging -import gobject from whipper.command.basecommand import BaseCommand from whipper.common import ( accurip, config, drive, program, task @@ -32,8 +31,6 @@ from whipper.common import ( from whipper.program import cdrdao, cdparanoia, utils from whipper.result import result -gobject.threads_init() - logger = logging.getLogger(__name__) diff --git a/whipper/command/image.py b/whipper/command/image.py index bdb90ca..2c5517c 100644 --- a/whipper/command/image.py +++ b/whipper/command/image.py @@ -18,12 +18,10 @@ # You should have received a copy of the GNU General Public License # along with whipper. If not, see . -import os import sys from whipper.command.basecommand import BaseCommand from whipper.common import accurip, config, program -from whipper.common import encode from whipper.extern.task import task from whipper.image import image from whipper.result import result @@ -32,78 +30,6 @@ import logging logger = logging.getLogger(__name__) -class Retag(BaseCommand): - summary = "retag image files" - description = """ -Retags the image from the given .cue files with tags obtained from MusicBrainz. -""" - - def add_arguments(self): - self.parser.add_argument('cuefile', nargs='+', action='store', - help="cue file to load rip image from") - self.parser.add_argument( - '-R', '--release-id', - action="store", dest="release_id", - help="MusicBrainz release id to match to (if there are multiple)" - ) - self.parser.add_argument( - '-p', '--prompt', - action="store_true", dest="prompt", - help="Prompt if there are multiple matching releases" - ) - self.parser.add_argument( - '-c', '--country', - action="store", dest="country", - help="Filter releases by country" - ) - - def do(self): - - prog = program.Program(config.Config(), stdout=sys.stdout) - runner = task.SyncRunner() - - for arg in self.options.cuefile: - sys.stdout.write('Retagging image %r\n' % arg) - arg = arg.decode('utf-8') - cueImage = image.Image(arg) - cueImage.setup(runner) - - mbdiscid = cueImage.table.getMusicBrainzDiscId() - sys.stdout.write('MusicBrainz disc id is %s\n' % mbdiscid) - - sys.stdout.write("MusicBrainz lookup URL %s\n" % - cueImage.table.getMusicBrainzSubmitURL()) - prog.metadata = prog.getMusicBrainz(cueImage.table, mbdiscid, - release=self.options.release_id, # noqa: E501 - country=self.options.country, - prompt=self.options.prompt) - - if not prog.metadata: - print('Not in MusicBrainz database, skipping') - continue - - prog.metadata.discid = mbdiscid - - # FIXME: this feels like we're poking at internals. - prog.cuePath = arg - prog.result = result.RipResult() - for track in cueImage.table.tracks: - path = cueImage.getRealPath(track.indexes[1].path) - - taglist = prog.getTagList(track.number) - logger.debug( - 'possibly retagging %r from cue path %r with taglist %r', - path, arg, taglist) - t = encode.SafeRetagTask(path, taglist) - runner.run(t) - path = os.path.basename(path) - if t.changed: - print('Retagged %s' % path) - else: - print('%s already tagged correctly' % path) - print() - - class Verify(BaseCommand): summary = "verify image" description = """ @@ -145,10 +71,8 @@ class Image(BaseCommand): summary = "handle images" description = """ Handle disc images. Disc images are described by a .cue file. -Disc images can be encoded to another format (for example, to make a -compressed encoding), retagged and verified. +Disc images can be verified. """ subcommands = { 'verify': Verify, - 'retag': Retag } diff --git a/whipper/command/offset.py b/whipper/command/offset.py index b2422ae..d7f7e24 100644 --- a/whipper/command/offset.py +++ b/whipper/command/offset.py @@ -23,15 +23,12 @@ import os import sys import tempfile import logging -import gobject from whipper.command.basecommand import BaseCommand from whipper.common import accurip, common, config, drive from whipper.common import task as ctask from whipper.program import arc, cdrdao, cdparanoia, utils from whipper.extern.task import task -gobject.threads_init() - logger = logging.getLogger(__name__) # see http://www.accuraterip.com/driveoffsets.htm diff --git a/whipper/common/program.py b/whipper/common/program.py index 09e16b2..e0277cb 100644 --- a/whipper/common/program.py +++ b/whipper/common/program.py @@ -542,11 +542,6 @@ class Program: trackResult.filename = t.path logger.info('Filename changed to %r', trackResult.filename) - def retagImage(self, runner, taglists): - cueImage = image.Image(self.cuePath) - t = image.ImageRetagTask(cueImage, taglists) - runner.run(t) - def verifyImage(self, runner, table): """ verify table against accuraterip and cue_path track lengths diff --git a/whipper/extern/task/task.py b/whipper/extern/task/task.py index 60c4c85..3c2b4a6 100644 --- a/whipper/extern/task/task.py +++ b/whipper/extern/task/task.py @@ -18,9 +18,15 @@ # You should have received a copy of the GNU General Public License # along with whipper. If not, see . +import logging import sys -import gobject +try: + from gi.repository import GLib as gobject +except ImportError: + import gobject + +logger = logging.getLogger(__name__) class TaskException(Exception): @@ -70,21 +76,14 @@ class LogStub(object): I am a stub for a log interface. """ - # log stubs def log(self, message, *args): - pass + logger.info(message, *args) def debug(self, message, *args): - pass - - def info(self, message, *args): - pass + logger.debug(message, *args) def warning(self, message, *args): - pass - - def error(self, message, *args): - pass + logger.warning(message, *args) class Task(LogStub):