[SCM] morituri/master: * examples/readtrack.py (added): Add an example that reads a track using cdparanoia.

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:08:51 UTC 2014


The following commit has been merged in the master branch:
commit 1f183d60b7903877bb1444a9686fcbf100d4c0ea
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Fri May 1 18:32:12 2009 +0000

    	* examples/readtrack.py (added):
    	  Add an example that reads a track using cdparanoia.

diff --git a/ChangeLog b/ChangeLog
index 72de491..2b5299b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2009-05-01  Thomas Vander Stichele  <thomas at apestaart dot org>
 
+	* examples/readtrack.py (added):
+	  Add an example that reads a track using cdparanoia.
+
+2009-05-01  Thomas Vander Stichele  <thomas at apestaart dot org>
+
 	* morituri/test/cdparanoia.progress (added):
 	* morituri/test/test_program_cdparanoia.py (added):
 	* morituri/program/__init__.py (added):
diff --git a/examples/readtrack.py b/examples/readtrack.py
new file mode 100644
index 0000000..40391e6
--- /dev/null
+++ b/examples/readtrack.py
@@ -0,0 +1,148 @@
+# -*- Mode: Python -*-
+# vi:si:et:sw=4:sts=4:ts=4
+
+import re
+import os
+import subprocess
+import tempfile
+
+from morituri.common import task, log, common
+from morituri.image import toc
+from morituri.program import cdparanoia
+from morituri.extern import asyncsub
+
+states = ['START', 'TRACK', 'LEADOUT', 'DONE']
+
+_ANALYZING_RE = re.compile(r'^Analyzing track (?P<track>\d+).*')
+_TRACK_RE = re.compile(r"""
+    ^(?P<track>[\d\s]{2})\s+ # Track
+    \w+\s+                   # Mode
+    \d\s+                    # Flags
+    \d\d:\d\d:\d\d           # Start in HH:MM:FF
+    \((?P<start>.+)\)\s+     # Start in frames
+    \d\d:\d\d:\d\d           # Length in HH:MM:FF
+    \(.+\)                   # Length in frames
+""", re.VERBOSE)
+_LEADOUT_RE = re.compile(r"""
+    ^Leadout\s
+    \w+\s+               # Mode
+    \d\s+                # Flags
+    \d\d:\d\d:\d\d       # Start in HH:MM:FF
+    \((?P<start>.+)\)    # Start in frames
+""", re.VERBOSE)
+
+# FIXME: handle errors
+
+class ReadTrackTask(task.Task):
+    """
+    I am a task that reads a track using cdparanoia.
+    """
+
+    description = "Reading Track..."
+
+
+    def __init__(self, path, start, stop, offset=0):
+        """
+        Read the given track.
+
+        @param path:   where to store the ripped track
+        @type  path:   str
+        @param start:  first frame to rip
+        @type  start:  int
+        @param stop:   last frame to rip (inclusive)
+        @type  stop:   int
+        @param offset: read offset, in samples
+        @type  offset: int
+        """
+        self.path = path
+        self._start = start
+        self._stop = stop
+        self._offset = offset
+        self._parser = cdparanoia.ProgressParser()
+
+        self._buffer = "" # accumulate characters
+
+    def start(self, runner):
+        task.Task.start(self, runner)
+
+        bufsize = 1024
+        argv = ["cdparanoia",
+            "--sample-offset=%d" % self._offset,
+            "--stderr-progress",
+            "[%s]-[%s]" % (
+                common.framesToHMSF(self._start),
+                common.framesToHMSF(self._stop)), self.path]
+        self.debug('Running %s' % (" ".join(argv), ))
+        self._popen = asyncsub.Popen(argv,
+            bufsize=bufsize,
+            stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE, close_fds=True)
+
+        self.runner.schedule(1.0, self._read, runner)
+
+    def _read(self, runner):
+        ret = self._popen.recv_err()
+        if not ret:
+            if self._popen.poll() is not None:
+                self._done()
+                return
+            self.runner.schedule(0.01, self._read, runner)
+            return
+
+        self._buffer += ret
+
+        # parse buffer into lines if possible, and parse them
+        if "\n" in self._buffer:
+            lines = self._buffer.split('\n')
+            if lines[-1] != "\n":
+                # last line didn't end yet
+                self._buffer = lines[-1]
+                del lines[-1]
+            else:
+                self._buffer = ""
+
+            for line in lines:
+                self._parser.parse(line)
+            # FIXME: self._parser.read *will* go past self._stop,
+            # and only indicates read frames, not written frames.
+            # but we can't rely on anything else.
+            num = float(self._parser.read) - self._start
+            den = float(self._stop) - self._start
+            progress = num / den
+            if progress < 1.0:
+                self.setProgress(progress)
+
+        # 0 does not give us output before we complete, 1.0 gives us output
+        # too late
+        self.runner.schedule(0.01, self._read, runner)
+
+    def _poll(self, runner):
+        if self._popen.poll() is None:
+            self.runner.schedule(1.0, self._poll, runner)
+            return
+
+        self._done()
+
+    def _done(self):
+            self.setProgress(1.0)
+            if self._popen.returncode != 0:
+                if self._errors:
+                    print "\n".join(self._errors)
+                else:
+                    print 'ERROR: exit code %r' % self._popen.returncode
+            else:
+                print
+                print 'done'
+                
+            self.stop()
+            return
+
+def main():
+    log.init()
+    runner = task.SyncRunner()
+    t = ReadTrackTask('/tmp/track.wav', 1000, 3000, offset=0)
+    runner.run(t)
+    print 'runner done'
+
+
+main()

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list