Mercurial > hg > config
comparison python/example/m3u.py @ 752:e6fb1a8fe66b
add example for m3u playlists [status: unknown]
| author | Jeff Hammel <k0scist@gmail.com> |
|---|---|
| date | Fri, 03 Jul 2015 14:33:01 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 751:753b1c2bd64c | 752:e6fb1a8fe66b |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 # -*- coding: utf-8 -*- | |
| 3 | |
| 4 """ | |
| 5 m3u playlist manipulator | |
| 6 | |
| 7 See: | |
| 8 - https://pypi.python.org/pypi/m3u8 | |
| 9 - http://gonze.com/playlists/playlist-format-survey.html#M3U | |
| 10 - http://www.assistanttools.com/articles/m3u_playlist_format.shtml | |
| 11 - http://en.wikipedia.org/wiki/M3U | |
| 12 - http://tools.ietf.org/html/draft-pantos-http-live-streaming-08#section-3.3.1 | |
| 13 """ | |
| 14 | |
| 15 # imports | |
| 16 import argparse | |
| 17 import m3u8 | |
| 18 import os | |
| 19 import subprocess | |
| 20 import sys | |
| 21 | |
| 22 # module globals | |
| 23 __all__ = ['main', 'M3UParser'] | |
| 24 here = os.path.dirname(os.path.realpath(__file__)) | |
| 25 string = (str, unicode) | |
| 26 | |
| 27 class Playlist(object): | |
| 28 def __init__(self, playlists=(), base_path=None): | |
| 29 self.clips = [] | |
| 30 for playlist in playlists: | |
| 31 assert os.path.isfile(playlist) | |
| 32 _base_path = os.path.abspath(base_path or os.path.dirname(os.path.abspath(playlist))) # TODO: this doesn't fix URLs | |
| 33 content = open(playlist).read() | |
| 34 m3u = m3u8.M3U8(content, base_path=_base_path) | |
| 35 for segment in m3u.segments: | |
| 36 path = segment.uri | |
| 37 title = segment.title | |
| 38 self.clips.append((title, path)) | |
| 39 | |
| 40 def __str__(self): | |
| 41 retval = [] | |
| 42 for title, path in self.clips: | |
| 43 if title: | |
| 44 line = '{} # {}'.format(os.path.abspath(path), title) | |
| 45 else: | |
| 46 line = os.path.abspath(path) | |
| 47 retval.append(line) | |
| 48 return '\n'.join(retval) | |
| 49 | |
| 50 class M3UParser(argparse.ArgumentParser): | |
| 51 """CLI option parser""" | |
| 52 def __init__(self, **kwargs): | |
| 53 kwargs.setdefault('description', __doc__) | |
| 54 argparse.ArgumentParser.__init__(self, **kwargs) | |
| 55 self.add_argument('playlists', metavar='playlist', nargs='+', | |
| 56 help="playlist to parse") | |
| 57 self.add_argument('-b', '--base', dest='base_path', default=os.getcwd(), | |
| 58 help="base path [DEFAULT: %(default)s]") | |
| 59 self.options = None | |
| 60 | |
| 61 def parse_args(self, *args, **kw): | |
| 62 options = argparse.ArgumentParser.parse_args(self, *args, **kw) | |
| 63 self.validate(options) | |
| 64 self.options = options | |
| 65 return options | |
| 66 | |
| 67 def validate(self, options): | |
| 68 """validate options""" | |
| 69 if not os.path.exists(options.base_path): | |
| 70 self.error("Base path '{}' does not exist".format(options.base_path)) | |
| 71 missing = [i for i in options.playlists | |
| 72 if not os.path.exists(i)] | |
| 73 if missing: | |
| 74 self.error("Playlist not found: {}".format(', '.join(missing))) | |
| 75 | |
| 76 def main(args=sys.argv[1:]): | |
| 77 """CLI""" | |
| 78 | |
| 79 # parse command line options | |
| 80 parser = M3UParser() | |
| 81 options = parser.parse_args(args) | |
| 82 | |
| 83 # create playlist | |
| 84 playlist = Playlist(options.playlists, options.base_path) | |
| 85 | |
| 86 # print out some things | |
| 87 print ('{}'.format(playlist)) | |
| 88 | |
| 89 if __name__ == '__main__': | |
| 90 main() |
