From 143e84f8dcc12035cc2bceb91825a76b8bcb6bbd Mon Sep 17 00:00:00 2001 From: Justin Forest Date: Sun, 14 Mar 2010 21:28:13 +0100 Subject: [PATCH] GStreamer-based episode length detection (bug 882) --- src/gpodder/gstreamer.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ src/gpodder/sync.py | 5 ++++ 2 files changed, 71 insertions(+) create mode 100644 src/gpodder/gstreamer.py diff --git a/src/gpodder/gstreamer.py b/src/gpodder/gstreamer.py new file mode 100644 index 00000000..1adfa110 --- /dev/null +++ b/src/gpodder/gstreamer.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# +# gPodder - A media aggregator and podcast client +# Copyright (c) 2005-2010 Thomas Perl and the gPodder Team +# +# gPodder is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# gPodder is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +try: + import gobject + import pygst + pygst.require('0.10') + import gst + from gst.extend.discoverer import Discoverer + have_gst = True +except: + have_gst = False + +class GstFile: + def __init__(self): + self.mainloop = gobject.MainLoop() + self.result = None + + def run(self, filename): + gobject.idle_add(self.on_idle, filename) + self.mainloop.run() + return self.result / gst.MSECOND + + def on_idle(self, filename): + d = Discoverer(filename) + d.connect('discovered', self.on_data) + d.discover() + return False + + def on_data(self, discoverer, ismedia): + if discoverer.is_video: + self.result = discoverer.videolength + elif discoverer.is_audio: + self.result = discoverer.audiolength + gobject.idle_add(self.mainloop.quit) + +def get_track_length(filename): + """ + Returns track length in microseconds. + + Prefers video streams to audio streams. If no supported streams were found, + returns None. + """ + if not have_gst: + return None + return GstFile().run(filename) + +__all__ = ['get_track_length'] + +# vim: set ts=4 sts=4 sw=4 et: diff --git a/src/gpodder/sync.py b/src/gpodder/sync.py index bb2f4afe..0cee9c17 100644 --- a/src/gpodder/sync.py +++ b/src/gpodder/sync.py @@ -27,6 +27,7 @@ import gpodder from gpodder import util from gpodder import services from gpodder import libconverter +from gpodder import gstreamer from gpodder.liblogger import log @@ -94,6 +95,10 @@ def open_device(config): return None def get_track_length(filename): + length = gstreamer.get_track_length(filename) + if length is not None: + return length + if util.find_command('mplayer') is not None: try: mplayer_output = os.popen('mplayer -msglevel all=-1 -identify -vo null -ao null -frames 0 "%s" 2>/dev/null' % filename).read() -- 2.11.4.GIT