From e2ca8f8e09ee5ed584bda7ffde880e1ab8ff840f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=86=E3=82=AF=E3=83=8B=E3=82=AB=E3=83=AB=E8=AB=8F?= =?UTF-8?q?=E8=A8=AA=E5=AD=90?= Date: Wed, 15 Dec 2021 18:43:03 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=81=E3=83=A3=E3=83=B3=E3=83=8D=E3=83=AB?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Peertube/Channel.php | 35 + public/css/peertube/channel.css | 640 +++++++++++++++++- resources/views/pages/peertube/c.blade.php | 5 + .../techsuwa/component/peertube/c.blade.php | 5 + .../component/peertube/parts/c/head.blade.php | 7 + .../peertube/parts/c/head/banner.blade.php | 3 + .../peertube/parts/c/head/info.blade.php | 48 ++ .../peertube/parts/c/head/owner.blade.php | 22 + .../peertube/parts/c/links.blade.php | 12 + .../peertube/parts/c/videos.blade.php | 83 +++ .../peertube/parts/manifest.blade.php | 1 + .../component/peertube/parts/meta.blade.php | 1 + .../peertube/parts/stylelink.blade.php | 1 + routes/view/peertube.php | 1 + 14 files changed, 863 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Peertube/Channel.php create mode 100644 resources/views/pages/peertube/c.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/c.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/parts/c/head.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/parts/c/head/banner.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/parts/c/head/info.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/parts/c/head/owner.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/parts/c/links.blade.php create mode 100644 resources/views/theme/techsuwa/component/peertube/parts/c/videos.blade.php diff --git a/app/Http/Controllers/Peertube/Channel.php b/app/Http/Controllers/Peertube/Channel.php new file mode 100644 index 0000000..0b39b1f --- /dev/null +++ b/app/Http/Controllers/Peertube/Channel.php @@ -0,0 +1,35 @@ +common = new Common; + $this->count = 25; + } + + public function index ($id, $cat='videos', $page=0) { + $res = []; + $res['page'] = 'channel'; + $res['cat'] = $cat; + $res['paginate'] = $page; + $res['channel'] = $this->getChannel($id); + $res['video'] = $this->getVideo($id, ($page*$this->count), $this->count); + return view('pages.peertube.c', ['res' => $res]); + } + + function getChannel ($id) { + return $this->ptapi_get('/api/v1/video-channels/'.$id); + } + + function getVideo ($id, $start, $count) { + return $this->ptapi_get('/api/v1/video-channels/'.$id.'/videos?start='.$start.'&count='.$count.'&sort=-publishedAt&skipCount=false&nsfw=both'); + } +} diff --git a/public/css/peertube/channel.css b/public/css/peertube/channel.css index 7068cde..25cc4e5 100644 --- a/public/css/peertube/channel.css +++ b/public/css/peertube/channel.css @@ -1 +1,639 @@ -/**/ \ No newline at end of file +.root { + --myGlobalTopPadding: 60px; + --myChannelImgMargin: 30px; + --myFontSize: 16px; + --myGreyChannelFontSize: 16px; + --myGreyOwnerFontSize: 14px; +} + +.banner img { + position: absolute; + width: 100%; + height: 100%; + top: 0; +} + +.banner { + position: relative; + height: 0; + width: 100%; + padding-top: 16.66666666%; +} + +.channel-info { + padding-inline-end: var(--gridVideosMiniatureMargins)!important; + padding-inline-start: var(--gridVideosMiniatureMargins)!important; + --gridVideosMiniatureMargins: var(--videosHorizontalMarginContent); + display: grid; + grid-template-columns: 1fr auto; + grid-template-rows: auto auto; + background-color: var(--channelBackgroundColor); + margin-bottom: 45px; + padding-top: var(--myGlobalTopPadding); + font-size: var(--myFontSize); +} + +.channel-info, .account-info, .channel, .miniature-show-channel, description-html { + background-color: #5e3c62 !important; +} + +@media screen and (max-width: 1400px) { + .channel-avatar-row { + grid-column: 1/3; + } +} + +.channel-avatar-row { + display: flex; + grid-column: 1; + margin-bottom: 30px; +} + +.channel-avatar-row .main-avatar { + display: inline-block; + width: 120px; + height: 120px; + min-width: 120px; + min-height: 120px; +} + +.channel-avatar-row > div { + margin-inline-start: var(--myChannelImgMargin); + min-width: 1px; +} + +.section-label { + margin-bottom: 5px !important; +} + +.inner-form-title, .section-label { + color: #ea81e8 !important; +} + +.channel-avatar-row .actor-info { + display: flex; +} + +.actor-info { + min-width: 1px; + width: 100%; +} + +.channel-avatar-row .actor-info > div:first-child { + flex-grow: 1; + min-width: 1px; +} + +.channel-avatar-row .actor-display-name { + word-break: break-word; + word-wrap: break-word; + overflow-wrap: break-word; + -webkit-hyphens: auto; + hyphens: auto; + display: flex; + flex-wrap: wrap; +} + +.channel-avatar-row h1 { + font-size: 28px; + font-weight: 700; + margin: 0; +} + +.channel-avatar-row .actor-handle, .channel-avatar-row .actor-counters { + color: var(--greyForegroundColor); + font-size: var(--myGreyChannelFontSize); +} + +.channel-avatar-row .actor-handle { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.channel-buttons.right { + margin-inline-start: 45px; +} + +.channel-buttons { + display: flex; + flex-wrap: wrap; +} + +@media screen and (max-width: 1100px) { + .channel-buttons.bottom { + display: flex; + justify-content: center; + margin-bottom: 30px; + } +} + +.channel-buttons.bottom { + display: none; +} + +.channel-buttons { + display: flex; + flex-wrap: wrap; +} + +.channel-buttons > *:not(:last-child) { + margin-inline-end: 15px; +} + +.orange-button, .orange-button:active, .orange-button:focus { + color: #fff; + background-color: var(--mainColor); +} + +.peertube-button-link { + padding-inline-end: 17px; +} + +.peertube-button-link { + padding-inline-start: 13px; +} + +.peertube-button-link { + padding-top: 0; + padding-bottom: 0; + border: 0; + font-weight: 600; + font-size: 15px; + height: 30px; + line-height: 30px; + border-radius: 3px!important; + text-align: center; + cursor: pointer; + display: inline-block; +} + +.support-button { + display: inline-flex; + align-items: center; + line-height: normal!important; +} + +[type=button]:not(:disabled), [type=reset]:not(:disabled), [type=submit]:not(:disabled), button:not(:disabled) { + cursor: pointer; +} + +.orange-button-inverted, .orange-button-inverted:active, .orange-button-inverted:focus { + color: var(--mainColor); + background-color: var(--mainBackgroundColor); +} + +.orange-button-inverted { + border: 2px solid var(--mainColor); + font-weight: 600; +} + +.peertube-button { + padding-inline-end: 17px; +} + +.peertube-button { + padding-inline-start: 13px; +} + +.peertube-button { + padding-top: 0; + padding-bottom: 0; + border: 0; + font-weight: 600; + font-size: 15px; + height: 30px; + line-height: 30px; + border-radius: 3px!important; + text-align: center; + cursor: pointer; +} + +button { + background: unset; +} + +button, input[type=button], input[type=file]::-webkit-file-upload-button, input[type=reset], input[type=submit] { + border-radius: 0; +} + +[type=button], [type=reset], [type=submit], button { + -webkit-appearance: button; +} + +button, select { + text-transform: none; +} + +button, input { + overflow: visible; +} + +button, input, optgroup, select, textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button { + border-radius: 0; +} + +.support-button my-global-icon { + margin-inline-end: 0; + position: relative; + width: 21px; + top: -1px; +} + +.support-button { + display: inline-flex; + align-items: center; + line-height: normal!important; +} + +.channel-description { + grid-column: 1; + word-break: break-word; + padding-bottom: var(--myGlobalTopPadding); +} + +@media screen and (max-width: 1400px) { + .owner-card { + margin-inline-start: 60px; + grid-row: 2; + } +} + +.owner-card { + margin-inline-start: 105px; +} + +.owner-card { + grid-column: 2; + grid-row: 1/3; + place-self: end; +} + +@media screen and (max-width: 1100px) { + .bottom-owner { + display: block; + width: 100%; + border-bottom: 2px solid rgba(0,0,0,.1); + padding: var(--myGlobalTopPadding) 45px; + margin-bottom: 60px; + } +} + +.bottom-owner { + display: none; +} + +.owner-block { + background-color: rgba(48, 26, 48, 0.6) !important; + padding: 10px !important; + width: 300px; + font-size: var(--myFontSize); +} + +.section-label { + color: var(--mainColor); + font-size: 12px; + margin-bottom: 15px; + font-weight: 700; + letter-spacing: 2.5px; +} + +.section-label { + margin-bottom: 5px !important; +} + +.inner-form-title, .section-label { + color: #ea81e8 !important; +} + +.owner-block .avatar-row { + display: flex; + margin-bottom: 15px; +} + +my-actor-avatar { + display: inline-block; + width: 36px; + height: 36px; + min-width: 36px; + min-height: 36px; + margin-inline-end: 10px; + margin-inline-start: 0; + margin-top: 10px; + margin-bottom: 0; +} + +.owner-block .avatar-row .actor-info { + margin-inline-start: 15px; +} + +.owner-block .avatar-row h4 { + font-size: 18px; + margin: 0; +} + +.actor-info > h4, .actor-info > .actor-handle { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.owner-block .avatar-row h4 a { + color: var(--mainForegroundColor); +} + +.owner-block .avatar-row .actor-handle { + font-size: var(--myGreyOwnerFontSize); + color: var(--greyForegroundColor); +} + +.actor-info > h4, .actor-info > .actor-handle { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.owner-block .owner-description { + position: relative; + overflow: hidden; + max-height: 140px; + word-break: break-word; +} + +.owner-description, .icon.icon-logo { + display: none !important; +} + +.view-account.short, .view-account.short:active, .view-account.short:focus { + color: var(--mainColor); + background-color: var(--mainBackgroundColor); +} + +.view-account.short:focus, .view-account.short.focus-visible { + box-shadow: 0 0 0 .2rem var(--mainColorLightest); +} + +.view-account.short:hover, .view-account.short:focus, .view-account.short:active { + text-decoration: none!important; + outline: none!important; +} + +.view-account.short { + padding-inline-end: 17px; +} + +.view-account.short { + padding-inline-start: 13px; +} + +.view-account.short { + padding-top: 0; + padding-bottom: 0; + border: 0; + font-size: 15px; + height: 30px; + line-height: 30px; + border-radius: 3px!important; + text-align: center; + cursor: pointer; + display: inline-block; + border: 2px solid var(--mainColor); + font-weight: 600; + margin-top: 30px; +} + +.view-account.complete { + display: none; +} + +.links { + margin-inline-end: var(--gridVideosMiniatureMargins)!important; + margin-inline-start: var(--gridVideosMiniatureMargins)!important; + --gridVideosMiniatureMargins: var(--videosHorizontalMarginContent); +} + +.margin-content { + margin-inline-end: var(--gridVideosMiniatureMargins)!important; + margin-inline-start: var(--gridVideosMiniatureMargins)!important; + --gridVideosMiniatureMargins: var(--videosHorizontalMarginContent); +} + +.main-col .margin-content { + margin: 0 var(--horizontalMarginContent); + flex-grow: 1; +} + +.videos-header { + display: grid; + grid-template-columns: auto 1fr auto; + margin-bottom: 30px; +} + +.videos-header .title-subscription.no-title { + margin-top: 10px; +} + +.videos-header .title-subscription { + grid-row: 2; + font-size: 14px; + color: var(--greyForegroundColor); +} + +.videos-header .title, .videos-header .title-subscription { + grid-column: 1; +} + +.videos-header my-feed { + margin-inline-start: 5px; + display: inline-block; + width: 16px; + color: var(--mainColor); + position: relative; + top: -2px; +} + +.feed { + width: 100%; +} + +@media screen and (min-width: 500px) { + .margin-content .videos, .margin-content .playlists { + --miniatureMinWidth: 255px; + --miniatureMaxWidth: 280px; + display: grid; + grid-column-gap: 30px; + column-gap: 30px; + grid-template-columns: repeat(auto-fill,minmax(var(--miniatureMinWidth),1fr)); + } +} + + +@media screen and (min-width: 500px) { + .margin-content .videos .video-wrapper, .margin-content .videos .playlist-wrapper, .margin-content .playlists .video-wrapper, .margin-content .playlists .playlist-wrapper { + margin: 0 auto; + width: 100%; + } +} + +@media screen and (min-width: 500px) { + .margin-content .videos .video-wrapper my-video-miniature, .margin-content .videos .video-wrapper my-video-playlist-miniature, .margin-content .videos .playlist-wrapper my-video-miniature, .margin-content .videos .playlist-wrapper my-video-playlist-miniature, .margin-content .playlists .video-wrapper my-video-miniature, .margin-content .playlists .video-wrapper my-video-playlist-miniature, .margin-content .playlists .playlist-wrapper my-video-miniature, .margin-content .playlists .playlist-wrapper my-video-playlist-miniature { + display: block; + min-width: var(--miniatureMinWidth); + max-width: var(--miniatureMaxWidth); + } +} + +.video-miniature:not(.display-as-row) { + display: flex; + flex-direction: column; + padding-bottom: 15px; + width: 100%; +} + +.video-miniature:not(.display-as-row) my-video-thumbnail { + position: relative; + height: 0; + width: 100%; + padding-top: 56.25%; +} + +.video-miniature:not(.display-as-row) my-video-thumbnail .video-thumbnail { + position: absolute; + width: 100%; + height: 100%; + top: 0; +} + +.video-thumbnail { + display: flex; + flex-direction: column; + position: relative; + border-radius: 3px; + width: 100%; + height: 100%; + overflow: hidden; + background-color: #ececec; + transition: filter .2s ease; +} + +.video-thumbnail img { + width: inherit; + height: inherit; +} + +.video-thumbnail-label-overlay.warning { + background-color: orange; +} + +.video-thumbnail-label-overlay.danger { + background-color: red; +} + +.video-thumbnail-label-overlay { + position: absolute; + padding: 0 5px; + left: 5px; + top: 5px; + font-weight: 700; +} + +.video-thumbnail-watch-later-overlay, .video-thumbnail-label-overlay, .video-thumbnail-duration-overlay, .video-thumbnail-live-overlay { + display: inline-block; + background-color: #000000b3; + color: #fff; + border-radius: 3px; + font-size: 12px; + font-weight: 600; + line-height: 1.1; + z-index: 10; +} + +.video-thumbnail .play-overlay, .video-thumbnail .play-overlay .icon { + transition: all .2s ease; +} + +.video-thumbnail .play-overlay { + position: absolute; + right: 0; + bottom: 0; + width: inherit; + height: inherit; + opacity: 0; + background-color: #0000004d; +} + +.video-thumbnail .play-overlay .icon { + width: 0; + height: 0; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%,-50%) scale(.5); + border-top: 13px solid transparent; + border-bottom: 13px solid transparent; + border-left: 18px solid rgba(255,255,255,.95); +} + +.progress-bar { + height: 3px; + width: 100%; + position: absolute; + bottom: 0; + background-color: #0003; +} + +.progress-bar div { + height: 100%; + background-color: var(--mainColor); +} + +.video-miniature:not(.display-as-row) .video-bottom { + display: flex; + width: 100%; + min-width: 1px; +} + +.video-miniature-information { + width: calc(100% - 40px); +} + +.video-miniature:not(.display-as-row) .video-miniature-name { + margin-top: 10px; + margin-bottom: 5px; +} + +.video-miniature-name { + display: block; + display: -webkit-box; + -webkit-line-clamp: 2; + font-size: 1.1em; + line-height: 1.1em; + overflow: hidden; + text-overflow: ellipsis; + max-height: 2.2em; + word-break: break-word; + word-wrap: break-word; + overflow-wrap: break-word; + transition: color .2s; + font-weight: 600; + color: var(--mainForegroundColor); +} + +.video-miniature:not(.display-as-row) .video-miniature-created-at-views { + display: block; +} + +.video-miniature-created-at-views { + font-size: 13px; +} + +.video-info-privacy, .video-info-blocked .blocked-label, .video-info-nsfw { + font-weight: 600; +} \ No newline at end of file diff --git a/resources/views/pages/peertube/c.blade.php b/resources/views/pages/peertube/c.blade.php new file mode 100644 index 0000000..c6cc33d --- /dev/null +++ b/resources/views/pages/peertube/c.blade.php @@ -0,0 +1,5 @@ +@extends('theme.'.env('THEME').'.peertube') + +@section('content') + @include('theme.'.env('THEME').'.component.peertube.c') +@endsection diff --git a/resources/views/theme/techsuwa/component/peertube/c.blade.php b/resources/views/theme/techsuwa/component/peertube/c.blade.php new file mode 100644 index 0000000..3f49848 --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/c.blade.php @@ -0,0 +1,5 @@ +
+ @include('theme.'.env('THEME').'.component.peertube.parts.c.head') + @include('theme.'.env('THEME').'.component.peertube.parts.c.links') + @include('theme.'.env('THEME').'.component.peertube.parts.c.videos') +
\ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/c/head.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/c/head.blade.php new file mode 100644 index 0000000..c17dd3f --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/parts/c/head.blade.php @@ -0,0 +1,7 @@ +
+
+ @include('theme.'.env('THEME').'.component.peertube.parts.c.head.banner') + @include('theme.'.env('THEME').'.component.peertube.parts.c.head.info') + @include('theme.'.env('THEME').'.component.peertube.parts.c.head.owner', ['class' => 'bottom-owner']) +
+
\ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/c/head/banner.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/c/head/banner.blade.php new file mode 100644 index 0000000..7ab4393 --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/parts/c/head/banner.blade.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/c/head/info.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/c/head/info.blade.php new file mode 100644 index 0000000..d201669 --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/parts/c/head/info.blade.php @@ -0,0 +1,48 @@ +
+
+ + チャンネルのアバター + +
+ +
+
+
+

{{ $res['channel']->displayName }}

+
+
+ @worldorder +
+
+ {{ $res['channel']->followersCount }}人登録者 + {{ $res['video']->total }}枚動画 +
+
+
+ @include('theme.'.env('THEME').'.component.peertube.parts.common.subscribe') + +
+
+
+
+
+
+

+ description); ?> +

+
+
+ @include('theme.'.env('THEME').'.component.peertube.parts.c.head.owner', ['class' => 'owner-card']) +
\ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/c/head/owner.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/c/head/owner.blade.php new file mode 100644 index 0000000..e3e20f1 --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/parts/c/head/owner.blade.php @@ -0,0 +1,22 @@ +
+
+ +
+ +
+

+ {{ $res['channel']->ownerAccount->displayName }} +

+
{{ '@'.$res['channel']->ownerAccount->name }}{{ $res['channel']->ownerAccount->host != 'video.076.ne.jp' ? '@'.$res['channel']->ownerAccount->host : '' }}
+
+
+
+
+
+ + +
\ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/c/links.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/c/links.blade.php new file mode 100644 index 0000000..98d07d6 --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/parts/c/links.blade.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/c/videos.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/c/videos.blade.php new file mode 100644 index 0000000..639a6fa --- /dev/null +++ b/resources/views/theme/techsuwa/component/peertube/parts/c/videos.blade.php @@ -0,0 +1,83 @@ + + +
+
+
+ Subscribe to RSS feed "動画" + +
+ + + +
+
+
+
+
+ +
+
+
+ +@if ($res['paginate'] != 0) 戻り @endif +@if (($res['paginate']*25) < $res['video']->total) @endif \ No newline at end of file diff --git a/resources/views/theme/techsuwa/component/peertube/parts/manifest.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/manifest.blade.php index 5a89a25..7f66b37 100644 --- a/resources/views/theme/techsuwa/component/peertube/parts/manifest.blade.php +++ b/resources/views/theme/techsuwa/component/peertube/parts/manifest.blade.php @@ -4,6 +4,7 @@ if (isset($res['page'])) { if ($res['page'] == 'watch') $name = $res['detail']->name; else if ($res['page'] == 'account') $name = $res['owner']->displayName.'さんのチャンネル一覧'; + else if ($res['page'] == 'channel') $name = $res['channel']->displayName.'さんのチャンネル'; } ?> diff --git a/resources/views/theme/techsuwa/component/peertube/parts/meta.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/meta.blade.php index a5bf89c..55a7bd3 100644 --- a/resources/views/theme/techsuwa/component/peertube/parts/meta.blade.php +++ b/resources/views/theme/techsuwa/component/peertube/parts/meta.blade.php @@ -4,6 +4,7 @@ if (isset($res['page'])) { if ($res['page'] == 'watch') $name = $res['detail']->name; else if ($res['page'] == 'account') $name = $res['owner']->displayName.'さんのチャンネル一覧'; + else if ($res['page'] == 'channel') $name = $res['channel']->displayName.'さんのチャンネル'; } ?> diff --git a/resources/views/theme/techsuwa/component/peertube/parts/stylelink.blade.php b/resources/views/theme/techsuwa/component/peertube/parts/stylelink.blade.php index 2fc5611..4d7e26c 100644 --- a/resources/views/theme/techsuwa/component/peertube/parts/stylelink.blade.php +++ b/resources/views/theme/techsuwa/component/peertube/parts/stylelink.blade.php @@ -4,6 +4,7 @@ if (isset($res['page'])) { if ($res['page'] == 'watch') $name = $res['detail']->name; else if ($res['page'] == 'account') $name = $res['owner']->displayName.'さんのチャンネル一覧'; + else if ($res['page'] == 'channel') $name = $res['channel']->displayName.'さんのチャンネル'; } ?> diff --git a/routes/view/peertube.php b/routes/view/peertube.php index 7b541a4..647c635 100644 --- a/routes/view/peertube.php +++ b/routes/view/peertube.php @@ -2,5 +2,6 @@ Route::group(['prefix' => 'peertube'], function () { Route::any('/a/{id}', 'Peertube\Account@index'); + Route::any('/c/{id}/{cat?}/{page?}', 'Peertube\Channel@index'); Route::any('/w/{id}', 'Peertube\Watch@index'); });