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,
+ }