summaryrefslogtreecommitdiff
path: root/rapid/metadatavideo.py
diff options
context:
space:
mode:
authorJulien Valroff <julien@kirya.net>2011-04-29 18:38:10 +0200
committerJulien Valroff <julien@kirya.net>2011-04-29 18:38:10 +0200
commit890778d8bc097acb3b7cff0fd134c2fe89e22c78 (patch)
tree195e65c397ca43f2dc7a8851df32963dd2fa313f /rapid/metadatavideo.py
parentab35ecfe638a0eb072a5669263a18a60ae1d6611 (diff)
parentc0a71b15d1fc070d1a55ee94ed8a7bd81aa3608a (diff)
Merge branch 'experimental'
Diffstat (limited to 'rapid/metadatavideo.py')
-rw-r--r--rapid/metadatavideo.py223
1 files changed, 223 insertions, 0 deletions
diff --git a/rapid/metadatavideo.py b/rapid/metadatavideo.py
new file mode 100644
index 0000000..7b6bc6c
--- /dev/null
+++ b/rapid/metadatavideo.py
@@ -0,0 +1,223 @@
+#!/usr/bin/python
+# -*- coding: latin1 -*-
+
+### Copyright (C) 2007-11 Damon Lynch <damonlynch@gmail.com>
+
+### This program 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 2 of the License, or
+### (at your option) any later version.
+
+### This program 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, write to the Free Software
+### Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+DOWNLOAD_VIDEO = True
+
+import os
+import datetime
+import time
+import subprocess
+import tempfile
+
+import multiprocessing
+import logging
+logger = multiprocessing.get_logger()
+
+import gtk
+import paths
+
+import rpdfile
+
+try:
+ from hachoir_core.cmd_line import unicodeFilename
+ from hachoir_parser import createParser
+ from hachoir_metadata import extractMetadata
+except ImportError:
+ DOWNLOAD_VIDEO = False
+
+if DOWNLOAD_VIDEO:
+
+ def version_info():
+ from hachoir_metadata.version import VERSION
+ return VERSION
+
+ def get_video_THM_file(full_filename):
+ """
+ Checks to see if a thumbnail file (THM) is in the same directory as the
+ file. Expects a full path to be part of the file name.
+
+ Returns the filename, including path, if found, else returns None.
+ """
+
+ f = None
+ name, ext = os.path.splitext(full_filename)
+ for e in rpdfile.VIDEO_THUMBNAIL_FILE_EXTENSIONS:
+ if os.path.exists(name + '.' + e):
+ f = name + '.' + e
+ break
+ if os.path.exists(name + '.' + e.upper()):
+ f = name + '.' + e.upper()
+ break
+
+ return f
+
+ class VideoMetaData():
+ def __init__(self, filename):
+ """
+ Initialize by loading metadata using hachoir
+ """
+
+ self.filename = filename
+ self.u_filename = unicodeFilename(filename)
+ self.metadata = None
+
+ def _kaa_get(self, key, missing, stream=None):
+ if not hasattr(self, 'info'):
+ try:
+ from kaa.metadata import parse
+ except ImportError:
+ msg = """The package Kaa metadata does not exist.
+It is needed to access FPS and codec video file metadata."""
+ logger.error(msg)
+ self.info = None
+ else:
+ self.info = parse(self.filename)
+ if self.info:
+ if stream != None:
+ v = self.info['video'][stream][key]
+ else:
+ v = self.info[key]
+ else:
+ v = None
+ if v:
+ return str(v)
+ else:
+ return missing
+
+ def _load_hachoir_metadata_parser(self):
+ self.parser = createParser(self.u_filename, self.filename)
+ self.metadata = extractMetadata(self.parser)
+
+ def _get(self, key, missing):
+ if self.metadata is None:
+ self._load_hachoir_metadata_parser()
+
+ try:
+ v = self.metadata.get(key)
+ except:
+ v = missing
+ return v
+
+ def date_time(self, missing=''):
+ return self._get('creation_date', missing)
+
+ def time_stamp(self, missing=''):
+ """
+ Returns a float value representing the time stamp, if it exists
+ """
+ dt = self.date_time(missing=None)
+ if dt:
+ # convert it to a time stamp (not optimal, but better than nothing!)
+ v = time.mktime(dt.timetuple())
+ else:
+ v = missing
+ return v
+
+ def codec(self, stream=0, missing=''):
+ return self._kaa_get('codec', missing, stream)
+
+ def length(self, missing=''):
+ """
+ return the duration (length) of the video, rounded to the nearest second, in string format
+ """
+ delta = self.metadata.get('duration')
+ l = '%.0f' % (86400 * delta.days + delta.seconds + float('.%s' % delta.microseconds))
+ return l
+
+
+ def width(self, missing=''):
+ v = self._get('width', missing)
+ if v != None:
+ return str(v)
+ else:
+ return None
+
+ def height(self, missing=''):
+ v = self._get('height', missing)
+ if v != None:
+ return str(v)
+ else:
+ return None
+
+ def frames_per_second(self, stream=0, missing=''):
+ fps = self._kaa_get('fps', missing, stream)
+ try:
+ fps = '%.0f' % float(fps)
+ except:
+ pass
+ return fps
+
+ def fourcc(self, stream=0, missing=''):
+ return self._kaa_get('fourcc', missing, stream)
+
+
+
+class DummyMetaData():
+ """
+ Class which gives metadata values for an imaginary video.
+
+ Useful for displaying in preference examples etc. when no video is ready to
+ be downloaded.
+
+ See VideoMetaData class for documentation of class methods.
+ """
+ def __init__(self, filename):
+ pass
+
+ def date_time(self, missing=''):
+ return datetime.datetime.now()
+
+ def codec(self, stream=0, missing=''):
+ return 'H.264 AVC'
+
+ def length(self, missing=''):
+ return '57'
+
+ def width(self, stream=0, missing=''):
+ return '1920'
+
+ def height(self, stream=0, missing=''):
+ return '1080'
+
+ def frames_per_second(self, stream=0, missing=''):
+ return '24'
+
+ def fourcc(self, stream=0, missing=''):
+ return 'AVC1'
+
+
+if __name__ == '__main__':
+ import sys
+
+
+ if (len(sys.argv) != 2):
+ print 'Usage: ' + sys.argv[0] + ' path/to/video/containing/metadata'
+ sys.exit(0)
+
+ else:
+ m = VideoMetaData(sys.argv[1])
+ dt = m.date_time()
+ if dt:
+ print dt.strftime('%Y%m%d-%H:%M:%S')
+ print "codec: %s" % m.codec()
+ print "%s seconds" % m.length()
+ print "%sx%s" % (m.width(), m.height())
+ print "%s fps" % m.frames_per_second()
+ print "Fourcc: %s" % (m.fourcc())
+