115 lines
3.1 KiB
Python
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
|