Files
biliup/ykdl/embedextractor.py
T
2019-06-15 15:23:35 +08:00

115 lines
3.1 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from importlib import import_module
from logging import getLogger
from .common import alias, url_to_module
class EmbedExtractor():
"""
this class is to help video embed site to handle
video from other site.
we just need to know the source URL, or source site name, and video ID
that's enough.
with site name and VID, develop can easily to find out the real URL.
embedextractor.video_info['url'] = url
or
embedextractor.video_info['site'] = site
embedextractor.video_info['vid'] = vid
compatible: also receive the video info which will return directly.
embedextractor.video_info['info'] = info
because embed site don't have video info, so they don't need stream_info.
"""
def __init__(self):
self.video_info = None
self.video_info_list = None
self.logger = getLogger(self.name)
@staticmethod
def new_video_info():
return {'extra': {}}
def prepare(self):
"""
this API is to do real job to get source URL, or site and VID
sometimes title
MUST override!!
"""
pass
def prepare_playlist(self):
"""
this API is to do real job to get source URL, or site and VID
sometimes title
MUST override!!
"""
pass
def list_only(self):
"""
this API is to check if only the list informations is included
if true, go to parser list mode
MUST override!!
"""
pass
def _parser(self, video_info):
if 'info' in video_info:
return video_info['info']
elif 'site' in video_info:
site = video_info['site']
vid = video_info['vid']
if site in alias.keys():
site = alias[site]
s = import_module('.'.join(['ykdl','extractors',site])).site
info = s.parser(vid)
elif 'url' in video_info:
url = video_info['url']
s, u = url_to_module(url)
info = s.parser(u)
if 'title' in video_info:
info.title = video_info['title']
if 'artist' in video_info:
info.artist = video_info['artist']
if 'extra' in video_info and video_info['extra']:
info.extra.update(video_info['extra'])
return info
def parser(self, url):
self.url = url
if self.list_only():
return self.parser_list(url)
self.video_info = self.new_video_info()
self.prepare()
if not self.video_info:
raise NotImplementedError(self.url + ' is not supported')
return self._parser(self.video_info)
def parser_list(self, url):
self.url = url
self.video_info_list = []
self.prepare_playlist()
if not self.video_info_list:
raise NotImplementedError('Playlist is not supported for ' + self.name + 'with url: ' + self.url)
for v in self.video_info_list:
yield self._parser(v)
def __getattr__(self, attr):
return None