ytarchiver

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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()