77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
from engine.plugins import FFmpegdl, SDownload, YDownload, logger
|
|
from ykdl.common import url_to_module
|
|
|
|
|
|
class Handler:
|
|
def __init__(self, successor=None):
|
|
self.successor = successor
|
|
|
|
def handle(self):
|
|
"""
|
|
Handle request and stop.
|
|
If can't - call next handler in chain.
|
|
As an alternative you might even in case of success
|
|
call the next handler.
|
|
"""
|
|
if not self.check_stream() and self.successor:
|
|
return self.successor.handle()
|
|
return self
|
|
|
|
def check_stream(self):
|
|
pass
|
|
|
|
|
|
class FallbackHandler(Handler):
|
|
def check_stream(self):
|
|
return False
|
|
|
|
def __eq__(self, other):
|
|
return self.__class__.__name__ == other.__class__.__name__
|
|
|
|
|
|
class StreamLink(SDownload, Handler):
|
|
def __init__(self, fname, url, successor=None):
|
|
super().__init__(fname, url, suffix='flv')
|
|
self.successor = successor
|
|
|
|
|
|
class YoutubeDl(YDownload, Handler):
|
|
def __init__(self, fname, url, successor=None):
|
|
super().__init__(fname, url, suffix='mp4')
|
|
self.successor = successor
|
|
|
|
|
|
class Generic(FFmpegdl):
|
|
def __init__(self, fname, url, suffix='flv'):
|
|
super().__init__(fname, url, suffix)
|
|
self.handler = self
|
|
|
|
def check_stream(self):
|
|
logger.debug(self.fname)
|
|
streamlink = StreamLink(self.fname, self.url, FallbackHandler())
|
|
youtube_dl = YoutubeDl(self.fname, self.url, streamlink)
|
|
try:
|
|
site, url = url_to_module(self.url)
|
|
info = site.parser(url)
|
|
# except AssertionError:
|
|
# self.handler = youtube_dl.handle()
|
|
# return self.handler != FallbackHandler()
|
|
|
|
stream_id = info.stream_types[0]
|
|
urls = info.streams[stream_id]['src']
|
|
self.raw_stream_url = urls[0]
|
|
# print(info.title)
|
|
except:
|
|
self.handler = youtube_dl.handle()
|
|
self.suffix = self.handler.suffix
|
|
return self.handler != FallbackHandler()
|
|
return True
|
|
|
|
def download(self, filename):
|
|
if self.handler == self:
|
|
return super(Generic, self).download(filename)
|
|
return self.handler.download(filename)
|
|
|
|
|
|
__plugin__ = Generic
|