complete.py (2665B)
1 import json 2 import sys 3 import logging 4 import os 5 import urllib.request 6 7 import lxml.etree 8 9 logging.basicConfig(level=logging.DEBUG) 10 logg = logging.getLogger() 11 12 13 class YTMeta: 14 15 def __init__(self, tree=None, remote=None): 16 self.o = lxml.etree.fromstring('<?xml version="1.0" ?><episodedetails></episodedetails>') 17 self.fp = None 18 self.base = None 19 self.wd = None 20 self.remote = remote 21 22 23 def load_nfo(self, fp): 24 s = os.path.basename(fp) 25 self.wd = os.path.dirname(fp) 26 v = os.path.splitext(s) 27 self.base = v[0] 28 self.fp = fp 29 f = open(fp, 'r') 30 s = f.read() 31 f.close() 32 self.o = lxml.etree.fromstring(s) 33 34 35 def load_json(self, fp): 36 if self.o == None: 37 raise AttributeError('no nfo tree') 38 f = open(fp, 'r') 39 o = json.load(f) 40 f.close() 41 self.process(o) 42 43 44 def process(self, o): 45 self.process_tags(o) 46 self.process_thumb(o) 47 48 49 def process_tags(self, o): 50 if self.o.findall('tag'): 51 logg.info('found tag, skipping tag processing') 52 return 53 for v in o['tags']: 54 logg.info('add tag {}'.format(v)) 55 element = lxml.etree.Element('tag') 56 element.text = v 57 self.o.append(element) 58 59 60 def process_thumb(self, o): 61 s = o['thumbnail'] 62 logg.debug('downloading thumbnail {}'.format(s)) 63 ext = os.path.splitext(s)[1] 64 ext = ext.split('?')[0] 65 fp = None 66 with urllib.request.urlopen(s) as response: 67 b = response.read() 68 fp = '{}-poster{}'.format(self.base, ext) 69 fp = os.path.join(self.wd, fp) 70 f = open(fp, 'wb') 71 f.write(b) 72 f.close() 73 74 #element = lxml.etree.Element("thumb") 75 #element.text = fp 76 #self.o.append(element) 77 78 79 def save(self, w=None): 80 close = False 81 if w == None: 82 if self.fp == None: 83 raise AttributeError('missing file path') 84 w = open(self.fp, 'w') 85 close = True 86 w.write(str(self)) 87 if close: 88 w.close() 89 90 91 def __str__(self): 92 return lxml.etree.tostring(self.o).decode('utf-8') 93 94 95 def main(): 96 ofp = os.path.realpath(sys.argv[1]) 97 d = os.path.dirname(ofp) 98 try: 99 ifp = os.path.realpath(sys.argv[2]) 100 except IndexError: 101 ifp = os.path.splitext(ofp)[0] + '.info.json' 102 103 o = YTMeta() 104 logg.debug('json {}, nfo {}'.format(ifp, ofp)) 105 106 o.load_nfo(ofp) 107 o.load_json(ifp) 108 o.save() 109 110 111 if __name__ == '__main__': 112 main()