Commit Graph

67 Commits

Author SHA1 Message Date
Frederik “Freso” S. Olesen
a8af9b79ab s/morituri/whipper/ in GPL copyright blurbs. 2017-04-26 16:09:13 +02:00
Merlijn Wajer
efd75ab110 EncodeTaskFlac -> FlacEncodeTask
Untested.
2017-04-23 23:06:54 +02:00
Merlijn Wajer
e7767694af Rip out all code that directly uses gstreamer
We can now rip CDs without gstreamer.

This is not the most clean attempt, but I have tried to remove most of the
code that depends on gstreamer. I hope there is not a lot of code left that
depends on code that I have removed - I can at least rip a CD fully.
2017-02-09 23:05:34 +01:00
Merlijn Wajer
6ddb5d0114 Add gstreamer-less flac encoder and tagging (#121)
* Add encoding using Xiph.org 'flac' program.

This adds a FlacEncodeTask that encodes wave files to flac files.
This commit also replaces morituri's EncodeTask with FlacEncodeTask, however, in
morituri, EncodeTask also does the tagging.

FlacEncodeTask will not perform the tagging.
So we will need an extra task for the tagging - this will be added soon.

Meanwhile, do not merge this commit to master yet.

* Add tagging using mutagen.

Replace the gstreamer tagging code with mutagen tagging code.
getTagList is rewritten to return a dictionary of tags, which are then simply
passed to mutagen.

The way it is set up right now is not the best - I don't think it makes sense
for tagging to take place in program/cdparanoia.py ; but this is how the current
code did it.

I suggest that, when we rip out all the gstreamer code, we also move the tagging
to a more sensible place; and then also make the tagging not be an actual
'task.Task'.

* Add gstreamer-less CRC32 version

Only works on wave files at this point. Should not be a problem, I think.

* Use proper musicbrainz tags and ALBUM tag.

* Add mutagen to .travis.yml
2017-02-02 21:50:47 +01:00
Samantha Baldwin
d1ed80d62a argparse & logging (#92)
* introduce logcommand.Lager, Whipper(); use argparse for whipper image commands, stub logging

* update Lager docstring to mention config.Config()

* make incorrect subcommand and --version work on toplevel command

* migrate accurip show, expand Lager, do not attempt to return from Lager.__init__.

* migrate offset find, add Lager.error

* correct offset find drive symlink handling

* migrate drive

* change Lager.__init__(prog) to arg from kwarg

* but actually

* remove Whipper.usage

* add and use Lager.device_option() context manager

* help I married an axe murderer

* use unified options namespace for entire command tree

* migrate whipper cd without comprehensive config loading

* switch to logging module

- use logging instead of flog for non-extern modules
- use WHIPPER_DEBUG and WHIPPER_LOGFILE env variables

* convert self.log calls to logger.debug

* convert self.error calls to logger.error

* remove log.Loggable, use logger not logging

* Logging conversion continues

- Convert log.* calls to logger.*
- Remove morituri.common.log imports

* remove morituri.common.log from tests

* remove extern/flog, bare minimum Debug conversion

* update README for logging changes

* update soxi to use logging

* refactor Lager for more declarative subcommands

* Refactor Lager.device_option:

- inline into __init__
- throw IOError instead of Exception for missing drives
- remove CommandError checking in rip/main

* rename rip to whipper in rip.main

* convert rip.debug commands

* Rename logcommand.Lager to command.BaseCommand

- remove command.CommandError occurrences
- remove python-command external module

* remove submodules from README, update rclog formatter

* update minor ambiguity in readme for command invocation

* update version number to match setup.py

* remove gitmodules

* update version number in tests as well (boo)

* convert logger.error to logger.critical

* Change morituri.rip to morituri.command

- mv common.command to command.basecommand
- move TEMPLATES used only by rip.cd out of rip.common
- update entry point for command to command.main

* update basecommand documentation

* go pyflaking: import fixing

* replace self.stdout with sys.stdout

* remove BaseCommand.config, alphabetise imports

* convert self.stdXXX leftovers

* convert last getRootCommand to config.Config

* convert last getExceptionMessage's to str

* change musicbrainz useragent to whipper
2016-12-20 23:11:30 +01:00
Samantha Baldwin
d455b77e8a Merge pull request #80 from chrysn-pull-requests/error-reporting-enhancements-noassert
Error reporting enhancements (conditional-raise-instead-of-assert version)
2016-12-15 15:37:31 -05:00
chrysn
6581812d19 image: add check to give more meaningful error message 2016-11-29 13:30:11 +01:00
chrysn
ba10b573a2 Use soxi instead of gstreamer to determine a track's length
Contributes-To: https://github.com/JoeLametta/whipper/issues/29
2016-11-29 12:56:18 +01:00
Merlijn Wajer
bce359f9d5 Use Fast version of AccurateRipChecksumTask
There are still some changes required to make whipper handle ARv2 checksums,
currently doesn't call the Task for a V2 checksum. V1 should keep working as-is.
2016-10-15 19:15:27 +02:00
JoeLametta
9ade743d63 Various short bugfixes
thomasvs/morituri#139
2015-11-29 16:25:38 +01:00
Thomas Vander Stichele
4a24671bce better debugging when sampleLength is claimed unknown 2013-01-18 19:36:38 +01:00
Thomas Vander Stichele
99936325ae rename frame to sample to avoid confusion with cd frames 2013-01-18 19:30:13 +01:00
Thomas Vander Stichele
20cb0b3180 debug better 2013-01-18 19:24:09 +01:00
Thomas Vander Stichele
0fab4515c6 pep8 fixes 2012-11-11 23:00:37 +00:00
Thomas Vander Stichele
25d2bdf7b6 pep8 fixes 2012-11-11 22:32:31 +00:00
Thomas Vander Stichele
e617d40b47 * morituri.spec.in:
Spec fix.
	* morituri/image/image.py:
	  Log fix.
2012-01-21 18:04:00 +00:00
Thomas Vander Stichele
fb39764923 make things more loggable 2011-09-20 08:07:11 +00:00
Thomas Vander Stichele
8ec7bcbb9d * morituri/common/checksum.py:
* morituri/common/common.py:
	* morituri/common/encode.py:
	* morituri/image/image.py:
	* morituri/test/test_common_encode.py:
	  Moved quoteParse.
2011-08-05 19:18:10 +00:00
Thomas Vander Stichele
798a209195 * morituri/extern/task (added):
* morituri/extern/task/taskgtk.py (added):
	* morituri/extern/task/gstreamer.py (added):
	* morituri/extern/task/task.py (added):
	* morituri/common/taskgtk.py (deleted):
	* morituri/common/gstreamer.py (deleted):
	* morituri/common/task.py (deleted):
	  Move task-related modules into an extern directory so other
	  projects can use them.
	* morituri/common/checksum.py:
	* morituri/common/encode.py:
	* morituri/image/image.py:
	* morituri/program/cdparanoia.py:
	* morituri/program/cdrdao.py:
	* morituri/rip/cd.py:
	* morituri/rip/debug.py:
	* morituri/rip/image.py:
	* morituri/rip/main.py:
	* morituri/rip/offset.py:
	* morituri/test/test_common_checksum.py:
	* morituri/test/test_common_encode.py:
	* morituri/test/test_image_image.py:
	  Adapt.  Tests work.
2011-08-05 18:50:51 +00:00
Thomas Vander Stichele
48e3d7ca99 * morituri/image/image.py:
Actually set exception so MultiTask tells us what went wrong.
2011-05-24 10:41:54 +00:00
Thomas Vander Stichele
8771d439dc * morituri/common/gstreamer.py:
Add a cvar to stop going to playing.
	* morituri/image/image.py:
	  Convert AudioLengthTask to GstPipelineTask.
	* morituri/test/test_image_image.py:
	  Adapt to new typefind error we run in.
2011-05-24 10:27:06 +00:00
Thomas Vander Stichele
965043dbf5 * morituri/common/gstreamer.py:
Remove unused imports.
	* morituri/image/image.py:
	  Remove halfbaked code.
2011-05-22 11:14:46 +00:00
Thomas Vander Stichele
6c2f3cc378 * morituri/common/checksum.py:
* morituri/image/image.py:
	* morituri/test/test_common_checksum.py:
	* morituri/common/gstreamer.py (added):
	  Factor out GstException and GstPipelineTask.
2011-05-21 17:01:19 +00:00
Thomas Vander Stichele
5b965a757b * morituri/image/image.py:
Remove dead code.
2010-04-13 22:10:58 +00:00
Thomas Vander Stichele
297451ea0e * morituri/common/program.py:
Add a retagging command.
	  Add a getMusicBrainz() method.
	* morituri/rip/cd.py:
	  Use it.
	* morituri/image/image.py:
	  Add a task to retag an image.
	* morituri/rip/image.py:
	  Add a command to retag an image.
2010-04-13 21:57:29 +00:00
Thomas Vander Stichele
f978907fcf * morituri/common/task.py:
* morituri/image/cue.py:
	  Add logCategory.
	* morituri/image/image.py:
	  If subtasks had an exception, retrigger the exception and stop.
2010-04-05 23:31:34 +00:00
Thomas Vander Stichele
8ea1dc025d * morituri/image/image.py:
Fix AudioLengthTask for the case where we don't have the decoder,
	  by instead of doing get_state, waiting for an ASYNC_DONE or ERROR
	  message.  Properly raise a gst.GError in that case.
	* morituri/common/task.py:
	  Add some debug.
	* morituri/test/test_image_image.py:
	  After this fix, we now catch the TYPE_NOT_FOUND because of an
	  empty stream instead of the later gst.QueryError.
	* morituri/test/test_common_encode.py:
	  Let us know what it is if not a gst.QueryError.
2010-04-05 23:20:40 +00:00
Thomas Vander Stichele
3000f0a1e7 * morituri/common/common.py:
add quoteParse function to quote properly for gst.parse_launch()
	* morituri/common/checksum.py:
	  Fix single quote problem.
	  use self.setException()
	* morituri/common/encode.py:
	  Fix single quote problem.
	* morituri/image/image.py:
	  Fix single quote problem.
	  Reraise gst.QueryError.
	* morituri/test/test_common_encode.py:
	* morituri/test/test_common_encode.py (added):
	  Add tests for unicode/single/double quote.
	* morituri/test/test_image_image.py:
	* morituri/test/test_common_checksum.py:
	  Add tests for single/double quote.
	* morituri/test/common.py:
	  add twisted-like failUnlessRaises to TestCase that returns
	  the exception, so we can check wrapped exceptions in TaskException.
2010-04-04 23:20:52 +00:00
Thomas Vander Stichele
22a3554381 * morituri/common/encode.py:
* morituri/common/program.py:
	* morituri/image/image.py:
	* morituri/program/cdparanoia.py:
	* morituri/rip/cd.py:
	* morituri/rip/image.py:
	* morituri/rip/offset.py:
	  Move all gst-using imports inside functions and classes
	  to avoid 'import gst' eating our options.
	  Fixes #12.
2010-04-04 19:29:49 +00:00
Thomas Vander Stichele
83027a710a apparently this can also throw indexerror 2009-12-09 17:37:41 +00:00
Thomas Vander Stichele
fe68f676c9 * morituri/image/image.py:
Add ImageEncodeTask to encode a disk image to a different profile
	  and directory.
	* morituri/common/encode.py:
	  Add lossy encoding profiles for mp3 and vorbis.
	  Rename muxer to tagger since that's what we use it for.
	  Do progress probe after level to make sure we get samples for
	  offsets.
	* morituri/rip/image.py:
	  Add rip image encode command.
2009-10-17 13:53:58 +00:00
Thomas Vander Stichele
9a15e890e0 * morituri/image/cue.py:
* morituri/image/toc.py:
	* morituri/test/test_image_cue.py:
	* morituri/test/test_image_toc.py:
	  Read input file as utf-8.  Fix logging of paths.
	* morituri/image/image.py:
	  Document and add asserts for unicodeness of paths.
	  Encode path in launch lines as utf-8
2009-09-11 15:37:02 +00:00
Thomas Vander Stichele
53e8d9275c pychecker fix 2009-06-24 18:39:07 +00:00
Thomas Vander Stichele
d75066d1bb pychecker cleanup 2009-06-07 13:46:26 +00:00
Thomas Vander Stichele
3c57682a5a catch queryerror 2009-06-06 11:16:53 +00:00
Thomas Vander Stichele
631b1478b8 * morituri/program/cdparanoia.py:
* morituri/image/image.py:
	  Correctly chain up to parent __init__ for MultiTasks
2009-05-25 14:47:07 +00:00
Thomas Vander Stichele
a3783c2be4 pychecker fixes 2009-05-23 18:18:50 +00:00
Thomas Vander Stichele
7dfc1fbc6c * morituri/common/accurip.py:
* morituri/image/image.py:
	* morituri/test/Makefile.am:
	* morituri/test/test_image_image.py:
	* morituri/test/test_common_accurip.py (added):
	  Move accuraterip stuff to the accurip module.
	  Move/create new test file.
2009-05-23 18:14:11 +00:00
Thomas Vander Stichele
41c92fcda4 pychecker fixes 2009-05-22 20:44:10 +00:00
Thomas Vander Stichele
0a56fc129e * morituri/image/cue.py:
* morituri/image/image.py:
	* morituri/image/table.py:
	* morituri/image/toc.py:
	* morituri/program/cdparanoia.py:
	* morituri/program/cdrdao.py:
	* morituri/test/test_image_cue.py:
	* morituri/test/test_image_table.py:
	  Rename IndexTable to Table.
2009-05-16 09:31:38 +00:00
Thomas Vander Stichele
09fe46ee99 * morituri/image/cue.py:
* morituri/image/image.py:
	* morituri/image/table.py:
	* morituri/image/toc.py:
	* morituri/program/cdrdao.py:
	* morituri/test/test_image_cue.py:
	* morituri/test/test_image_table.py:
	  Rename ITTrack to Track.
2009-05-16 09:29:01 +00:00
Thomas Vander Stichele
59cb5d0dcb * morituri/common/checksum.py:
* morituri/common/common.py:
	* morituri/image/image.py:
	* morituri/image/table.py:
	* morituri/program/cdparanoia.py:
	  Move constants to common
2009-05-16 09:21:55 +00:00
Thomas Vander Stichele
e5ad3bde58 * morituri/common/task.py:
* morituri/image/image.py:
	  Remove prints.  Describe tasks.
2009-05-07 11:11:22 +00:00
Thomas Vander Stichele
2f464207db * morituri/image/table.py:
Add logging.
	  Add methods to clear a table of files, and to absolutize indexes
	  as long as the source is the same file, and to set a File on a
	  given index, adjusting all following indexes that match the
	  duration, and check if the IndexTable has all information for a TOC.
	* morituri/image/toc.py:
	  Add logging.
	  Use a counter for the source.
	  Fix up index offset calculation.
	* morituri/program/cdrdao.py:
	  Use a real IndexTable as the result, instead of a TocFile.
	* morituri/image/cue.py:
	  Use a real IndexTable to store tracks.
	* morituri/test/test_image_toc.py:
	  The toc file now has a table which has the tracks.
	  Fix the tests to adjust for wrong index calculations.
	* morituri/test/test_image_cue.py:
	* morituri/test/test_image_image.py:
	* morituri/image/image.py:
	  The cue file now has a table which has the tracks.
	* morituri/test/test_image_table.py:
	  Add assertions to make sure when the table can serve as a TOC.
	* examples/readdisc.py:
	  Adjust for changes.  Fix up to include AccurateRip results.
	  First time we can do a complete normal rip including verifying
	  against AccurateRip results!
2009-05-05 10:01:41 +00:00
Thomas Vander Stichele
c17a28d7ae * examples/movecue.py:
* examples/readcue.py:
	* morituri/image/cue.py:
	* morituri/image/image.py:
	* morituri/image/toc.py:
	* morituri/program/cdrdao.py:
	* morituri/test/test_image_cue.py:
	* morituri/test/test_image_toc.py:
	  Cue -> CueFile
	  TOC -> TocFile
2009-05-04 16:01:19 +00:00
Thomas Vander Stichele
22e81b4665 * morituri/image/cue.py:
* morituri/image/image.py:
	* morituri/image/table.py:
	* morituri/program/cdparanoia.py:
	* morituri/test/test_image_cue.py:
	  Move to using a shared IndexTable for everything.
	  Sadly mixed with a MultiTask rename.
2009-05-04 08:40:42 +00:00
Thomas Vander Stichele
881019b844 debug fix 2009-05-03 09:53:36 +00:00
Thomas Vander Stichele
076644b879 * morituri/common/task.py:
* morituri/image/image.py:
	  Add some debugging.
2009-05-02 09:27:14 +00:00
Thomas Vander Stichele
4982f588c7 * morituri/image/image.py:
* morituri/image/table.py:
	* morituri/test/test_image_image.py:
	* morituri/test/test_image_table.py:
	  Rename toc.TOC to table.Table
2009-04-27 22:15:51 +00:00
Thomas Vander Stichele
03ef79ec84 * morituri/image/cue.py:
getRealPath should be here, it doesn't need anything outside
	  the .cue file
	* morituri/image/image.py:
	  Proxy it here.
2009-04-25 16:06:23 +00:00