channel.py (3517B)
1 import mimetypes 2 import sys 3 import logging 4 import os 5 import urllib.request 6 import json 7 import re 8 9 import lxml.etree 10 11 logging.basicConfig(level=logging.DEBUG) 12 logg = logging.getLogger() 13 14 15 class YTChannelMeta: 16 17 def __init__(self, tree=None, remote=None): 18 self.o = lxml.etree.fromstring('<?xml version="1.0" ?><tvshow></tvshow>') 19 self.fp = None 20 self.wd = None 21 self.base = None 22 self.remote = remote 23 24 25 def load_nfo(self, fp): 26 s = os.path.basename(fp) 27 self.wd = os.path.dirname(fp) 28 v = os.path.splitext(s) 29 self.base = v[0] 30 self.o = lxml.etree.fromstring('<?xml version="1.0" ?><tvshow></tvshow>') 31 self.fp = fp 32 33 34 def load_json(self, fp): 35 if self.o == None: 36 raise AttributeError('no nfo tree') 37 f = open(fp, 'r') 38 o = json.load(f) 39 f.close() 40 self.process(o) 41 42 43 def process(self, o): 44 v = lxml.etree.Element('title') 45 v.text = o['title'] 46 self.o.append(v) 47 48 v = lxml.etree.Element('originaltitle') 49 v.text = o['channel'] 50 self.o.append(v) 51 52 v = lxml.etree.Element('plot') 53 v.text = o['description'] 54 self.o.append(v) 55 56 v = lxml.etree.Element('uniqueid') 57 v.set('type', 'youtube') 58 v.set('default', 'true') 59 v.text = o['channel_id'] 60 self.o.append(v) 61 62 63 v = lxml.etree.Element('seasons') 64 v.text = '1' 65 self.o.append(v) 66 67 self.process_thumb(o) 68 self.process_tags(o) 69 70 71 def process_thumb(self, o): 72 c = None 73 s = None 74 for v in o['thumbnails']: 75 try: 76 pri = v['preference'] 77 except KeyError: 78 continue 79 if c == None or pri > c: 80 c = pri 81 s = v['url'] 82 83 if s == None: 84 raise AttributeError('thumbnail missing') 85 86 with urllib.request.urlopen(s) as response: 87 t = response.info().get_content_type() 88 b = response.read() 89 #fp = '{}-poster{}'.format(self.base, ext) 90 fp = 'poster' + mimetypes.guess_extension(t) 91 fp = os.path.join(self.wd, fp) 92 f = open(fp, 'wb') 93 f.write(b) 94 f.close() 95 96 97 def process_tags(self, o): 98 for v in o['tags']: 99 logg.info('add tag {}'.format(v)) 100 element = lxml.etree.Element('tag') 101 element.text = v 102 self.o.append(element) 103 104 105 def save(self, w=None): 106 close = False 107 if w == None: 108 # if self.fp == None: 109 # raise AttributeError('missing file path') 110 # w = open(self.fp, 'w') 111 fp = os.path.join(self.wd, 'tvshow.nfo') 112 w = open(fp, 'w') 113 close = True 114 w.write(str(self)) 115 if close: 116 w.close() 117 118 119 def __str__(self): 120 return lxml.etree.tostring(self.o).decode('utf-8') 121 122 123 def main(): 124 #ofp = os.path.realpath(sys.argv[1]) 125 #d = os.path.dirname(ofp) 126 #try: 127 # ifp = os.path.realpath(sys.argv[2]) 128 #except IndexError: 129 # ifp = os.path.splitext(ofp)[0] + '.info.json' 130 ifp = os.path.realpath(sys.argv[1]) 131 d = os.path.dirname(ifp) 132 ofp = os.path.splitext(ifp)[0] 133 ofp = os.path.splitext(ofp)[0] + '.nfo' 134 135 o = YTChannelMeta() 136 logg.debug('json {}, nfo {}'.format(ifp, ofp)) 137 138 o.load_nfo(ofp) 139 o.load_json(ifp) 140 o.save() 141 142 143 if __name__ == '__main__': 144 main()