ytarchiver

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

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