ports/122142: cplay with mplayer support and other fix

Paul B. Mahol onemda at gmail.com
Thu Mar 27 00:10:02 UTC 2008


>Number:         122142
>Category:       ports
>Synopsis:       cplay with mplayer support and other fix
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 27 00:10:02 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Paul B. Mahol
>Release:        FreeBSD-8.0
>Organization:
>Environment:
FreeBSD Voyager 8.0-CURRENT FreeBSD 8.0-CURRENT #14: Mon Mar 17 16:17:50 CET 2008     paul at Voyager:/usr/local/obj/usr/local/src/sys/KERNEL  i386
>Description:
Added mplayer support.
Fixed possible security issue (race with CONTROL_FIFO).
>How-To-Repeat:

>Fix:
Patch attached.

Patch attached with submission follows:

--- 1/cplay	2003-12-05 09:20:56.000000000 +0100
+++ 2/cplay	2008-03-27 00:36:13.000000000 +0100
@@ -63,7 +63,7 @@
 
 # ------------------------------------------
 XTERM = re.search("rxvt|xterm", os.environ["TERM"])
-CONTROL_FIFO = "/var/tmp/cplay_control"
+CONTROL_FIFO = "%s/cplay-control-%s" % (os.environ.get("TMPDIR", "/tmp"), os.environ["USER"])
 
 # ------------------------------------------
 def which(program):
@@ -906,11 +906,20 @@
 
     def command_change_viewpoint(self, klass=PlaylistEntry):
         if not globals().get("ID3"):
+            global ID3, ogg, codecs
+            have_meta = 0
             try:
-                global ID3, ogg, codecs
-                import ID3, ogg.vorbis, codecs
+                import ID3
+                have_meta = 1
+            except ImportError:
+                pass
+            try:
+                import ogg.vorbis, codecs
+                have_meta = 1
+            except ImportError:
+                pass
+            if have_meta:
                 klass.vps.append([_("metadata"), klass.vp_metadata])
-            except ImportError: pass
         TagListWindow.command_change_viewpoint(self, klass)
 
     def get_title(self):
@@ -962,9 +971,11 @@
         try:
             if os.path.isdir(pathname):
                 app.status(_("Working..."))
-                self.add_dir(pathname)
+                self.add_dir(os.path.abspath(pathname))
             elif VALID_PLAYLIST(pathname):
                 self.add_playlist(pathname)
+            elif os.path.isfile(pathname):
+                self.append(PlaylistEntry(os.path.abspath(pathname)))
             else:
                 pathname = self.fix_url(pathname)
                 self.append(PlaylistEntry(pathname))
@@ -1301,6 +1312,17 @@
             self.set_position(head, head+tail, [head, tail])
 
 # ------------------------------------------
+class MplayerOffsetPlayer(Player):
+    re_progress = re.compile("(\d+).*\sof (\d+)")
+
+    def parse_buf(self):
+        match = self.re_progress.search(self.buf)
+        if match:
+            s1, s2 = map(string.atoi, match.groups())
+            head, tail = s1, s2-s1
+            self.set_position(head, head+tail, [head,tail])
+
+# ------------------------------------------
 class NoOffsetPlayer(Player):
 
     def parse_buf(self):
@@ -1334,8 +1356,6 @@
 # ------------------------------------------
 class FIFOControl:
     def __init__(self):
-        try: self.fd = open(CONTROL_FIFO, "rb+", 0)
-        except: self.fd = None
         self.commands = {"pause" : app.toggle_pause,
                          "next" : app.next_song,
                          "prev" : app.prev_song,
@@ -1346,6 +1366,15 @@
                          "volup" : app.inc_volume,
                          "voldown" : app.dec_volume,
                          "quit" : app.quit}
+        self.fd = None
+        try:
+            if os.path.exists(CONTROL_FIFO):
+                os.unlink(CONTROL_FIFO)
+            os.mkfifo(CONTROL_FIFO, 0600)
+            self.fd = open(CONTROL_FIFO, "rb+", 0)
+        except IOError:
+            # warn that we're disabling the fifo because someone raced us?
+            return
 
     def handle_command(self):
         command = string.strip(self.fd.readline())
@@ -1419,6 +1448,11 @@
         XTERM and sys.stderr.write("\033]0;%s\a" % "xterm")
         tty and tty.tcsetattr(sys.stdin.fileno(), tty.TCSADRAIN, self.tcattr)
         print
+        # remove temporary files
+        try:
+            if os.path.exists(CONTROL_FIFO): os.unlink(CONTROL_FIFO)
+        except IOError:
+            pass
 
     def run(self):
         while 1:
@@ -1615,7 +1649,7 @@
             if opt == "-v": app.mixer("toggle")
         if args or playlist:
             for i in args or playlist:
-                app.win_playlist.add(os.path.abspath(i))
+                app.win_playlist.add(i)
             app.win_tab.change_window()
         app.run()
     except SystemExit:
@@ -1627,15 +1661,17 @@
 
 # ------------------------------------------
 PLAYERS = [
-    FrameOffsetPlayer("ogg123 -q -v -k %d %s", "\.ogg$"),
+    FrameOffsetPlayer("ogg123 -q -v -k %d %s", "\.(ogg|flac)$"),
     FrameOffsetPlayer("splay -f -k %d %s", "(^http://|\.mp[123]$)", 38.28),
     FrameOffsetPlayer("mpg123 -q -v -k %d %s", "(^http://|\.mp[123]$)", 38.28),
     FrameOffsetPlayer("mpg321 -q -v -k %d %s", "(^http://|\.mp[123]$)", 38.28),
     TimeOffsetPlayer("madplay -v --display-time=remaining -s %d %s", "\.mp[123]$"),
+    MplayerOffsetPlayer("mplayer -vo null -noconsolecontrols -ss %d %s", "\.(mp[123]|ogg|flac|wav|aiff|wma)$"),
     NoOffsetPlayer("mikmod -q -p0 %s", "\.(mod|xm|fm|s3m|med|col|669|it|mtm)$"),
     NoOffsetPlayer("xmp -q %s", "\.(mod|xm|fm|s3m|med|col|669|it|mtm|stm)$"),
     NoOffsetPlayer("play %s", "\.(aiff|au|cdr|mp3|ogg|wav)$"),
-    NoOffsetPlayer("speexdec %s", "\.spx$")
+    NoOffsetPlayer("speexdec %s", "\.spx$"),
+    NoOffsetPlayer("mplayer -noconsolecontrols -playlist %s", "\.(ram|pls|asx)$")
     ]
 
 def VALID_SONG(name):


>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list