97 lines
3.6 KiB
Python
97 lines
3.6 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import time
|
|
import re
|
|
|
|
from datetime import timedelta, datetime
|
|
from .base.weboobmc import Weboobmc
|
|
from weboob.capabilities.video import BaseVideo
|
|
from weboob.capabilities.image import BaseImage
|
|
from weboob.capabilities.collection import Collection
|
|
|
|
|
|
class Videoobmc(Weboobmc):
|
|
def __init__(self, count=10, nsfw=False):
|
|
Weboobmc.__init__(self, count=count)
|
|
self.backends = list(self.get_loaded_backends('CapVideo'))
|
|
_nsfw = 'on' if nsfw else 'off'
|
|
self._call_weboob('videoob', 'nsfw', argument=_nsfw)
|
|
|
|
def search(self, pattern, backend=''):
|
|
#videoob search pattern -f json
|
|
options = {'--select': 'id,title,date,description,author,duration,thumbnail,url'}
|
|
if backend:
|
|
options['-b'] = backend
|
|
_videos = self._json_call_weboob('videoob', 'search', argument=pattern, options=options)
|
|
if _videos:
|
|
for _video in _videos:
|
|
yield self.create_video_from_json(_video)
|
|
|
|
def create_video_from_json(self, _video):
|
|
video = BaseVideo()
|
|
video.id = u'%s' % _video['id']
|
|
video.backend = u'%s' % _video['id'].split('@')[-1]
|
|
|
|
if 'url' in _video.keys():
|
|
video.url = u'%s' % _video['url']
|
|
|
|
if 'thumbnail' in _video.keys() and _video['thumbnail'] and 'url' in _video['thumbnail'].keys():
|
|
video.thumbnail = BaseImage()
|
|
video.thumbnail.url = u'%s' % _video['thumbnail']['url']
|
|
else:
|
|
video.thumbnail.url = u''
|
|
video.title = u'%s' % _video['title']
|
|
|
|
if _video['date']:
|
|
_date = re.search('(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*', _video['date'])
|
|
|
|
try:
|
|
datetime.strptime(_date.group(1), '%Y-%m-%d %H:%M:%S')
|
|
except TypeError:
|
|
datetime(*(time.strptime(_date.group(1), '%Y-%m-%d %H:%M:%S')[0:6]))
|
|
|
|
video.description = u'%s' % _video['description']
|
|
video.author = u'%s' % _video['author']
|
|
|
|
if _video['duration']:
|
|
_duration = _video['duration'].split(':')
|
|
video.duration = timedelta(hours=int(_duration[0]), minutes=int(_duration[1]), seconds=int(_duration[2]))
|
|
|
|
return video
|
|
|
|
def get_video(self, video, backend):
|
|
#videoob info _id -f json
|
|
_video = self._json_call_weboob('videoob', 'info', argument=video.id)
|
|
if _video and len(_video) > 0:
|
|
return self.create_video_from_json(_video[0])
|
|
|
|
def ls(self, backend, path=''):
|
|
options = {'-b': backend, '-n': 50}
|
|
result = self._json_call_weboob('videoob', 'ls', options=options, argument=path)
|
|
return self.separate_collections_and_videos(result)
|
|
|
|
def separate_collections_and_videos(self, objs):
|
|
videos = []
|
|
categories = []
|
|
for obj in objs:
|
|
if self.is_category(obj):
|
|
categories.append(self.create_category_from_json(obj))
|
|
else:
|
|
video = BaseVideo()
|
|
video.id = obj['id'].split('@')[0]
|
|
video.backend = obj['id'].split('@')[-1]
|
|
videos.append(video)
|
|
return categories, videos
|
|
|
|
def create_category_from_json(self, obj):
|
|
collection = Collection(obj['split_path'].split('/'))
|
|
collection.title = obj['title']
|
|
collection.id = obj['id'].split('@')[0]
|
|
collection.backend = obj['id'].split('@')[1]
|
|
return collection
|
|
|
|
def download(self, _id, path, backend):
|
|
#videoob download _id path
|
|
options = {'-b': backend}
|
|
self._call_weboob('videoob', 'download', options=options, argument=u'%s %s' % (_id, path))
|