diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-02-07 12:12:01 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-02-07 12:12:01 +0000 |
| commit | 9ce56f6a2bdd076843a3b56d1cc27f3496b8528f (patch) | |
| tree | f055ba1a871846d7aa2173db51a023924feaf82b /hacks/python-playback/film.py | |
| parent | b072d4a885bf02f642650a1717c69252861cc5d0 (diff) | |
Move some hacks into the git repo.
Diffstat (limited to 'hacks/python-playback/film.py')
| -rw-r--r-- | hacks/python-playback/film.py | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/hacks/python-playback/film.py b/hacks/python-playback/film.py new file mode 100644 index 000000000..3ad128027 --- /dev/null +++ b/hacks/python-playback/film.py @@ -0,0 +1,188 @@ +import os +import subprocess +import shlex +import shutil +import player + +class Film: + def __init__(self, data = None): + # File or directory containing content + self.content = None + # True if content is in DVD format + self.dvd = False + # DVD title number + self.dvd_title = 1 + # Directory containing metadata + self.data = None + # Film name + self.name = None + # Number of pixels by which to crop the content from each edge + self.left_crop = 0 + self.top_crop = 0 + self.right_crop = 0 + self.bottom_crop = 0 + # Use deinterlacing filter + self.deinterlace = False + # Target ratio + self.ratio = 1.85 + # Audio stream ID to play + self.aid = None + + self.width = None + self.height = None + self.fps = None + self.length = None + + if data is not None: + self.data = data + f = open(os.path.join(self.data, 'info'), 'r') + while 1: + l = f.readline() + if l == '': + break + + d = l.strip() + + s = d.find(' ') + if s != -1: + key = d[:s] + value = d[s+1:] + + if key == 'name': + self.name = value + elif key == 'content': + self.content = value + elif key == 'dvd': + self.dvd = int(value) == 1 + elif key == 'dvd_title': + self.dvd_title = int(value) + elif key == 'left_crop': + self.left_crop = int(value) + elif key == 'top_crop': + self.top_crop = int(value) + elif key == 'right_crop': + self.right_crop = int(value) + elif key == 'bottom_crop': + self.bottom_crop = int(value) + elif key == 'deinterlace': + self.deinterlace = int(value) == 1 + elif key == 'ratio': + self.ratio = float(value) + elif key == 'aid': + self.aid = int(value) + elif key == 'width': + self.width = int(value) + elif key == 'height': + self.height = int(value) + elif key == 'fps': + self.fps = float(value) + elif key == 'length': + self.length = float(value) + + if self.width is None or self.height is None or self.fps is None or self.length is None: + self.update_content_metadata() + + def write(self): + try: + os.mkdir(self.data) + except OSError: + pass + + f = open(os.path.join(self.data, 'info'), 'w') + self.write_datum(f, 'name', self.name) + self.write_datum(f, 'content', self.content) + self.write_datum(f, 'dvd', int(self.dvd)) + self.write_datum(f, 'dvd_title', self.dvd_title) + self.write_datum(f, 'left_crop', self.left_crop) + self.write_datum(f, 'top_crop', self.top_crop) + self.write_datum(f, 'right_crop', self.right_crop) + self.write_datum(f, 'bottom_crop', self.bottom_crop) + self.write_datum(f, 'deinterlace', int(self.deinterlace)) + self.write_datum(f, 'ratio', self.ratio) + self.write_datum(f, 'aid', self.aid) + self.write_datum(f, 'width', self.width) + self.write_datum(f, 'height', self.height) + self.write_datum(f, 'fps', self.fps) + self.write_datum(f, 'length', self.length) + + def write_datum(self, f, key, value): + if value is not None: + print >>f,'%s %s' % (key, str(value)) + + def thumbs_dir(self): + t = os.path.join(self.data, 'thumbs') + + try: + os.mkdir(t) + except OSError: + pass + + return t + + def thumb(self, n): + return os.path.join(self.thumbs_dir(), str('%08d.png' % (n + 1))) + + def thumbs(self): + return len(os.listdir(self.thumbs_dir())) + + def remove_thumbs(self): + shutil.rmtree(self.thumbs_dir()) + + def make_thumbs(self): + num_thumbs = 128 + cl = self.player_command_line() + if self.length is not None: + sstep = self.length / num_thumbs + else: + sstep = 100 + cl.extra = '-vo png -frames %d -sstep %d -nosound' % (num_thumbs, sstep) + os.chdir(self.thumbs_dir()) + os.system(cl.get(True)) + + def set_dvd(self, d): + self.dvd = d + self.remove_thumbs() + + def set_dvd_title(self, t): + self.dvd_title = t + self.remove_thumbs() + + def set_content(self, c): + if c == self.content: + return + + self.content = c + self.update_content_metadata() + + def player_command_line(self): + cl = player.CommandLine() + cl.dvd = self.dvd + cl.dvd_title = self.dvd_title + cl.content = self.content + return cl + + def update_content_metadata(self): + if self.content is None: + return + + self.width = None + self.height = None + self.fps = None + self.length = None + + cl = self.player_command_line() + cl.extra = '-identify -vo null -ao null -frames 0' + text = subprocess.check_output(shlex.split(cl.get(True))).decode('utf-8') + lines = text.split('\n') + for l in lines: + s = l.strip() + b = s.split('=') + if len(b) == 2: + if b[0] == 'ID_VIDEO_WIDTH': + self.width = int(b[1]) + elif b[0] == 'ID_VIDEO_HEIGHT': + self.height = int(b[1]) + elif b[0] == 'ID_VIDEO_FPS': + self.fps = float(b[1]) + elif b[0] == 'ID_LENGTH': + self.length = float(b[1]) |
