diff --git a/modules/peertube/__init__.py b/modules/peertube/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e070b900fe1dba80ac81521c0fc8dfe8c33cf4ab --- /dev/null +++ b/modules/peertube/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2018 Vincent A +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from __future__ import unicode_literals + + +from .module import PeertubeModule + + +__all__ = ['PeertubeModule'] diff --git a/modules/peertube/browser.py b/modules/peertube/browser.py new file mode 100644 index 0000000000000000000000000000000000000000..3ae230e08ce90fdd9b732f5d9a03f7ee137b633b --- /dev/null +++ b/modules/peertube/browser.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2018 Vincent A +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from __future__ import unicode_literals + +from weboob.browser.browsers import APIBrowser +from weboob.capabilities.video import BaseVideo +from weboob.capabilities.image import Thumbnail +from weboob.capabilities.file import LICENSES +from weboob.tools.compat import urljoin + + +class PeertubeBrowser(APIBrowser): + # source: server/initializers/constants.ts + SITE_LICENSES = { + 1: LICENSES.CCBY, + 2: LICENSES.CCBYSA, + 3: LICENSES.CCBYND, + 4: LICENSES.CCBYNC, + 5: LICENSES.CCBYNCSA, + 6: LICENSES.CCBYNCND, + 7: LICENSES.PD, + } + + def __init__(self, baseurl, *args, **kwargs): + super(PeertubeBrowser, self).__init__(*args, **kwargs) + self.BASEURL = baseurl + + def search_videos(self, pattern, sortby): + j = self.request('/api/v1/search/videos?count=10&sort=-match', params={ + 'search': pattern, + 'start': 0, + }) + + for item in j['data']: + video = BaseVideo() + self._parse_video(video, item) + yield video + + def get_video(self, id, video=None): + item = self.request('/api/v1/videos/%s' % id) + + if not video: + video = BaseVideo() + + self._parse_video(video, item) + + video._torrent = item['files'][0]['magnetUri'] + video.url = item['files'][0]['fileUrl'] + video.ext = video.url.rsplit('.', 1)[-1] + video.size = item['files'][0]['size'] + + return video + + def _parse_video(self, video, item): + video.id = item['uuid'] + video.nsfw = item['nsfw'] + video.title = item['name'] + video.description = item['description'] + video.author = item['account']['name'] + video.duration = item['duration'] + video.license = self.SITE_LICENSES[item['licence']['id']] + video.thumbnail = Thumbnail(self.absurl(item['thumbnailPath'])) diff --git a/modules/peertube/module.py b/modules/peertube/module.py new file mode 100644 index 0000000000000000000000000000000000000000..1155c2a0b57f9835511b2f69aa7911646a767df9 --- /dev/null +++ b/modules/peertube/module.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2018 Vincent A +# +# This file is part of weboob. +# +# weboob is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# weboob is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with weboob. If not, see . + +from __future__ import unicode_literals + +from weboob.tools.backend import Module, BackendConfig +from weboob.tools.value import Value +from weboob.capabilities.video import CapVideo, BaseVideo + +from .browser import PeertubeBrowser + + +__all__ = ['PeertubeModule'] + + +class PeertubeModule(Module, CapVideo): + NAME = 'peertube' + DESCRIPTION = 'Peertube' + MAINTAINER = 'Vincent A' + EMAIL = 'dev@indigo.re' + LICENSE = 'AGPLv3+' + VERSION = '1.4' + + CONFIG = BackendConfig( + Value('url', label='Base URL of the PeerTube instance'), + ) + + BROWSER = PeertubeBrowser + + def create_default_browser(self): + return self.create_browser(self.config['url'].get()) + + def get_video(self, id): + return self.browser.get_video(id) + + def search_videos(self, pattern, sortby=CapVideo.SEARCH_RELEVANCE, nsfw=False): + for video in self.browser.search_videos(pattern, sortby): + if nsfw or not video.nsfw: + yield video + + def fill_video(self, obj, fields): + if set(('url', 'size')) & set(fields): + self.browser.get_video(obj.id, obj) + + OBJECTS = { + BaseVideo: fill_video, + }