チャンネルページ

このコミットが含まれているのは:
守矢諏訪子 2021-12-15 18:43:03 +09:00
コミット e2ca8f8e09
14個のファイルの変更863行の追加1行の削除

35
app/Http/Controllers/Peertube/Channel.php ノーマルファイル
ファイルの表示

@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Peertube;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Channel extends Common {
private $common;
private $count;
public function __construct () {
$this->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');
}
}

ファイルの表示

@ -1 +1,639 @@
/**/
.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;
}

5
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

ファイルの表示

@ -0,0 +1,5 @@
<div id="content" tabindex="-1" class="main-col">
@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')
</div>

ファイルの表示

@ -0,0 +1,7 @@
<div class="main-row">
<div class="root ng-star-inserted">
@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'])
</div>
</div>

ファイルの表示

@ -0,0 +1,3 @@
<div class="banner ng-star-inserted">
<img alt="Channel banner" src="https://video.076.ne.jp{{ $res['channel']->banner->path }}">
</div>

ファイルの表示

@ -0,0 +1,48 @@
<div class="channel-info">
<div class="channel-avatar-row">
<my-actor-avatar class="main-avatar">
<img class="avatar channel ng-star-inserted" src="https://video.076.ne.jp{{ $res['channel']->avatar->path }}" alt="チャンネルのアバター">
</my-actor-avatar>
<div>
<div class="section-label">動画チャンネル</div>
<div class="actor-info">
<div>
<div class="actor-display-name">
<h1 title="Channel created on {{ date('Y/m/d', strtotime($res['channel']->createdAt)) }}">{{ $res['channel']->displayName }}</h1>
</div>
<div class="actor-handle">
<span>@worldorder</span>
</div>
<div class="actor-counters">
<span>{{ $res['channel']->followersCount }}人登録者</span>
<span class="videos-count ng-star-inserted"> {{ $res['video']->total }}枚動画 </span>
</div>
</div>
<div class="channel-buttons right">
@include('theme.'.env('THEME').'.component.peertube.parts.common.subscribe')
<button class="support-button peertube-button orange-button-inverted ng-star-inserted">
<my-global-icon iconname="support" aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 947.70386 999.3125" width="947.70386" height="999.3125">
<g transform="translate(2.669496,27.625894)">
<g transform="matrix(0.1,0,0,-0.1,0,511)">
<path d="m 3744.3542,4564.3712 c -217.4,-34.2 -520.3,-200.3 -693.7,-376.2 -263.8,-263.8 -388.4,-571.6 -388.4,-952.6 0,-256.5 44,-437.2 173.4,-684 75.7,-144.1 197.9,-280.9 747.5,-842.7 1106.5,-1133.40001 1138.2,-1165.20001 1253,-1194.50001 188.1,-51.3 214.9,-29.3 1162.7,938.00001 498.3,508.1 911.1,950.2 962.4,1030.8 263.8,415.3 283.3,964.9 48.8,1409.4 -180.8,342 -581.3,620.4 -972.2,676.6 -332.2,48.9 -671.7,-36.6 -967.3,-236.9 l -156.3,-109.9 -119.7,87.9 c -158.8,117.2 -351.8,202.7 -554.5,244.3 -183.1,39.1 -295.4,41.6 -495.7,9.8 z" fill="currentColor"></path>
<path d="m 7991.4051,47.633899 c -39.1,-19.5 -473.9,-437.299999 -964.9,-925.800029 l -891.6,-891.59997 h -830.5 c -757.2,0 -837.8,4.9 -913.6,44 -207.6,112.4 -227.2,415.2 -39.1,561.8 66,53.7 83,53.7 950.2,53.7 989.3,0 1008.8,2.5 1094.3,173.49997 56.2,105 56.2,317.50003 4.9,427.50003 -83.1,175.9 4.8,168.5 -1915.1,168.5 h -1722 l -173.4,-63.5 c -95.3,-34.2 -232.1,-102.6 -305.3,-151.5 -73.3,-48.9 -442.1,-400.60003 -823.2,-779.2 l -688.80006,-693.7 664.40006,-647.3 c 366.4,-354.2 779.2,-754.8 918.4,-889.1 l 251.6,-241.8 481.2,481.2 481.2,481.2 h 1487.6 c 1294.6,0 1494.9,4.9 1565.8,39.1 58.6,26.9 339.6,368.8 1028.4,1248.2 522.8,666.89997 964.9,1243.3 982,1284.9 41.5,92.8 2.5,212.499999 -95.3,297.999999 -66,53.7 -95.3,61.1 -273.6,61.1 -132,-0.1 -224.8,-12.3 -273.6,-39.2 z" fill="currentColor"></path>
</g>
</g>
</svg>
</my-global-icon>
<span class="icon-text">支持</span>
</button>
</div>
</div>
</div>
</div>
<div class="channel-description">
<div class="description-html">
<p>
<?php echo nl2br($res['channel']->description); ?>
</p>
</div>
</div>
@include('theme.'.env('THEME').'.component.peertube.parts.c.head.owner', ['class' => 'owner-card'])
</div>

ファイルの表示

@ -0,0 +1,22 @@
<div class="{{ $class }}">
<div class="owner-block ng-star-inserted">
<div class="section-label">OWNER ACCOUNT</div>
<div class="avatar-row">
<my-actor-avatar class="account-avatar">
<a title="{{ $res['channel']->ownerAccount->name }} (アカウントページへ) " href="/peertube/a/{{ $res['channel']->ownerAccount->name }}{{ $res['channel']->ownerAccount->host != 'video.076.ne.jp' ? '@'.$res['channel']->ownerAccount->host : '' }}" class="ng-star-inserted">
<img class="account avatar ng-star-inserted" src="https://video.076.ne.jp{{ $res['channel']->ownerAccount->avatar->path }}" alt="アカウントのアバター">
</a>
</my-actor-avatar>
<div class="actor-info">
<h4>
<a title="視聴回数" href="/peertube/a/{{ $res['channel']->ownerAccount->name }}{{ $res['channel']->ownerAccount->host != 'video.076.ne.jp' ? '@'.$res['channel']->ownerAccount->host : '' }}">{{ $res['channel']->ownerAccount->displayName }}</a>
</h4>
<div class="actor-handle">{{ '@'.$res['channel']->ownerAccount->name }}{{ $res['channel']->ownerAccount->host != 'video.076.ne.jp' ? '@'.$res['channel']->ownerAccount->host : '' }}</div>
</div>
</div>
<div class="owner-description">
<div class="description-html"></div>
</div>
<a class="view-account short" href="/peertube/a/{{ $res['channel']->ownerAccount->name }}{{ $res['channel']->ownerAccount->host != 'video.076.ne.jp' ? '@'.$res['channel']->ownerAccount->host : '' }}">視聴回数</a>
<a class="view-account complete" href="/peertube/a/{{ $res['channel']->ownerAccount->name }}{{ $res['channel']->ownerAccount->host != 'video.076.ne.jp' ? '@'.$res['channel']->ownerAccount->host : '' }}"> View owner account </a>
</div>

ファイルの表示

@ -0,0 +1,12 @@
<div class="links">
<my-list-overflow>
<div class="d-flex align-items-center text-nowrap w-100 list-overflow-parent">
<span id="pe_0" class="ng-star-inserted" style="visibility: inherit;">
<a routerlinkactive="active" class="title-page ng-star-inserted active" href="/peertube/c/{{ $res['channel']->name }}{{ $res['channel']->host != 'video.076.ne.jp' ? '@'.$res['channel']->host : '' }}/videos">動画</a>
</span>
<span id="pe_1" class="ng-star-inserted" style="visibility: inherit;">
<a routerlinkactive="active" class="title-page ng-star-inserted" href="/peertube/c/{{ $res['channel']->name }}{{ $res['channel']->host != 'video.076.ne.jp' ? '@'.$res['channel']->host : '' }}/video-playlists">プレイリスト</a>
</span>
</div>
</my-list-overflow>
</div>

ファイルの表示

@ -0,0 +1,83 @@
<my-video-channel-videos class="ng-star-inserted" style="">
<my-videos-list class="ng-star-inserted">
<div class="margin-content">
<div class="videos-header">
<div class="title-subscription no-title ng-star-inserted">
Subscribe to RSS feed "動画"
<my-feed>
<div class="feed">
<my-global-icon role="button" aria-label="Open syndication dropdown" placement="bottom left auto" iconname="syndication" class="icon-syndication ng-star-inserted">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="feather feather-rss"><path d="M4 11a9 9 0 0 1 9 9"></path><path d="M4 4a16 16 0 0 1 16 16"></path><circle cx="5" cy="19" r="1"></circle></svg>
</my-global-icon>
</div>
</my-feed>
</div>
<div class="action-block"></div>
</div>
<div class="videos">
@foreach ($res['video']->data as $v)
<div class="video-wrapper ng-star-inserted">
<my-video-miniature>
<div class="video-miniature">
<my-video-thumbnail>
<a class="video-thumbnail ng-star-inserted" href="/peertube/w/{{ $v->shortUUID }}">
<img alt="" aria-label="{{ $v->name }}" src="https://video.076.ne.jp{{ $v->thumbnailPath }}" class="ng-star-inserted">
<div class="video-thumbnail-actions-overlay ng-star-inserted">
<div placement="left" container="body" class="video-thumbnail-watch-later-overlay ng-star-inserted">
<my-global-icon iconname="clock" role="button" aria-label="「後で見る」に追加する">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-clock"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>
</my-global-icon>
</div>
</div>
<div class="video-thumbnail-label-overlay warning ng-star-inserted"></div>
<div class="video-thumbnail-label-overlay danger ng-star-inserted"></div>
@php
$seconds = $v->duration;
$hours = floor($seconds / 3600);
$seconds -= $hours * 3600;
$minutes = floor($seconds / 60);
$seconds -= $minutes * 60;
@endphp
<div class="video-thumbnail-duration-overlay ng-star-inserted">{{ $hours != 0 ? $hours.':' : '' }}{{ $minutes != 0 ? $minutes.':' : '0:' }}{{ $seconds }}</div>
<div class="play-overlay ng-star-inserted">
<div class="icon"></div>
</div>
<div class="progress-bar ng-star-inserted">
<div style="width: 100%;"></div>
</div>
</a>
</my-video-thumbnail>
<div class="video-bottom">
<div class="video-miniature-information">
<div class="d-flex video-miniature-meta">
<div class="w-100 d-flex flex-column">
<my-link tabindex="-1" class="video-miniature-name" style="max-height: 3em;">
<a tabindex="-1" title="{{ $v->name }}" href="/peertube/w/{{ $v->shortUUID }}" class="ng-star-inserted"> {{ $v->name }} </a>
</my-link>
<span class="video-miniature-created-at-views">
<my-date-toggle class="ng-star-inserted">
<span class="date-toggle" title="{{ date('Y/m/d', strtotime($v->createdAt)) }}"> {{ date('Y年m月d日 H:i:s T', strtotime($v->createdAt)) }} </span>
</my-date-toggle>
<span class="views" title="">
<my-video-views-counter class="ng-star-inserted">
<span title=""> {{ $v->views }} 回視聴 </span>
</my-video-views-counter>
</span>
</span>
<div class="video-info-privacy"></div>
</div>
</div>
</div>
<div class="video-actions"></div>
</div>
</div>
</my-video-miniature>
</div>
@endforeach
</div>
</div>
</my-videos-list>
</my-video-channel-videos>
@if ($res['paginate'] != 0) <a href="/peertube/c/{{ $res['channel']->name }}{{ $res['channel']->host != 'video.076.ne.jp' ? '@'.$res['channel']->host : '' }}/{{ $res['cat'] }}/{{ $res['paginate']-1 }}" class="block-title">戻り</a> @endif
@if (($res['paginate']*25) < $res['video']->total) <a href="/peertube/c/{{ $res['channel']->name }}{{ $res['channel']->host != 'video.076.ne.jp' ? '@'.$res['channel']->host : '' }}/{{ $res['cat'] }}/{{ $res['paginate']+1 }}" class="block-title"></a> @endif

ファイルの表示

@ -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.'さんのチャンネル';
}
?>

ファイルの表示

@ -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.'さんのチャンネル';
}
?>

ファイルの表示

@ -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.'さんのチャンネル';
}
?>

ファイルの表示

@ -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');
});