コミットを比較

...

12 コミット

84個のファイルの変更6270行の追加0行の削除

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

@ -0,0 +1,28 @@
<?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 About extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,45 @@
<?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 Account extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index ($id, $cat='video-channels') {
$res = [
'page' => 'account',
'cat' => $cat,
'userinfo' => $this->common->user,
];
$res['owner'] = $this->getOwner($id);
if (!empty($res['owner'])) $res['owner']->totalVideo = 0;
$res['channel'] = $this->getChannel($id);
if (!empty($res['owner'])) {
foreach ($res['channel']->data as $k => $v) {
$res['channel']->data[$k]->video = $this->getVideo($v->name.'@'.$v->host);
$res['owner']->totalVideo += $res['channel']->data[$k]->video->total;
}
}
return view('pages.peertube.a', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
function getChannel ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id.'/video-channels?start=0&count=20&sort=-updatedAt&withStats=false');
}
function getVideo ($id) {
return $this->ptapi_get('/api/v1/video-channels/'.$id.'/videos?start=0&count=5&sort=-publishedAt&nsfw=both');
}
}

34
app/Http/Controllers/Peertube/Admin/Users.php ノーマルファイル
ファイルの表示

@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers\Peertube\Admin;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Users extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
if ($this->common->user->me->adminFlags != 1) {
return redirect('/peertube/videos/local');
}
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,37 @@
<?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 = [
'page' => 'channel',
'cat' => $cat,
'paginate' => $page,
'userinfo' => $this->common->user,
];
$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');
}
}

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

@ -0,0 +1,73 @@
<?php
namespace App\Http\Controllers\Peertube;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Engine;
// use Illuminate\Support\Facades\Log;
class Common extends Engine {
public $user = [];
private $engine;
public function __construct () {
$this->user['local'] = $this->getLocal();
$this->user['me'] = $this->getMe();
$this->user['notify'] = $this->getNotify();
$this->engine = new Engine;
}
public function getLocal () {
return null;
return $this->ptapi_get('/api/v1/oauth-clients/local');
}
public function getMe () {
return null;
return $this->ptapi_get('/api/v1/users/me');
}
public function getNotify () {
return null;
return $this->ptapi_get('/api/v1/users/me/notifications?start=0&count=0&unread=true');
}
public function ptapi_get ($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, env('PEER_URI').$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$get = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
if (!$get) return $err;
$get = json_decode($get);
if (isset($get->status) && $get->status == 404) return [];
return $get;
}
public function vidlist ($get) {
$res = [
'today' => [],
'week' => [],
'month' => [],
'lastmonth' => [],
'moreearly' => [],
];
foreach ($get->data as $g) {
$ud = strtotime($g->createdAt);
if ($ud > time() - 86400 && $ud < time() + 86400) $res['today'][] = $g;
else if ($ud > time() - 604800 && $ud < time() + 604800) $res['week'][] = $g;
else if ($ud > time() - 2629800 && $ud < time() + 2629800) $res['month'][] = $g;
else if ($ud > time() - 5259600 && $ud < time() + 5259600) $res['lastmonth'][] = $g;
else $res['moreearly'][] = $g;
}
return $res;
}
}

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

@ -0,0 +1,28 @@
<?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 Home extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,32 @@
<?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 Login extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (isset($this->common->user->me) && !is_null($this->common->user->me)) {
return redirect('/peertube/videos/local');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,32 @@
<?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 Logout extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,32 @@
<?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 Myaccount extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,32 @@
<?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 Mylibrary extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Peertube\Mylibrary\History;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Videos extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/users/me/history/videos?start=0&count=5
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Peertube\Mylibrary;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Subscriptions extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/users/me/subscriptions?start=0&count=10
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Peertube\Mylibrary;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Videochannels extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/accounts/techsuwako/video-channels?start=0&count=20&sort=-updatedAt&withStats=true
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Peertube\Mylibrary;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Videoplaylists extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/users/me/subscriptions/videos?start=0&count=25&sort=-publishedAt&skipCount=true
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Peertube\Mylibrary;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Videos extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/users/me/videos?start=0&count=10&sort=-publishedAt
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,32 @@
<?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 Notification extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,32 @@
<?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 Signup extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (isset($this->common->user->me) && !is_null($this->common->user->me)) {
return redirect('/peertube/videos/local');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Peertube\Videos;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Local extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'videoslist',
'userinfo' => $this->common->user,
];
$res['video'] = $this->getVideo();
return view('pages.peertube.videos.local', ['res' => $res]);
}
function getVideo () {
$get = $this->ptapi_get('/api/v1/videos/?start=0&count=50&sort=-publishedAt&filter=local&skipCount=true&nsfw=both');
return $this->vidlist($get);
}
}

ファイルの表示

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Peertube\Videos;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Overview extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/overviews/videos?page=1
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Peertube\Videos;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Recentlyadded extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'videoslist',
'userinfo' => $this->common->user,
];
$res['video'] = $this->getVideo();
return view('pages.peertube.videos.recentlyadded', ['res' => $res]);
}
function getVideo () {
$get = $this->ptapi_get('/api/v1/videos/?start=0&count=25&sort=-publishedAt&skipCount=true&nsfw=both');
return $this->vidlist($get);
}
}

ファイルの表示

@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers\Peertube\Videos;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Subscriptions extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
if (!isset($this->common->user->me) || is_null($this->common->user->me)) {
return redirect('/peertube/login');
}
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/users/me/subscriptions/videos?start=0&count=25&sort=-publishedAt&skipCount=true
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Peertube\Videos;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Trending extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
//https://video.076.ne.jp/api/v1/videos/?start=0&count=25&sort=-trending&skipCount=true&nsfw=both
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

ファイルの表示

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Peertube\Videos;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Peertube\Common;
// use Illuminate\Support\Facades\Log;
class Upload extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index () {
$res = [
'page' => 'dummy',
'userinfo' => $this->common->user,
];
// $res['owner'] = $this->getOwner($id);
return view('pages.peertube.notyet', ['res' => $res]);
}
function getOwner ($id) {
return $this->ptapi_get('/api/v1/accounts/'.$id);
}
}

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

@ -0,0 +1,42 @@
<?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 Watch extends Common {
private $common;
public function __construct () {
$this->common = new Common;
}
public function index ($id) {
$res = [
'page' => 'watch',
'userinfo' => $this->common->user,
];
$res['detail'] = $this->getDetail($id);
$res['comment'] = $this->getComment($id);
$res['recommend'] = $this->getRecommend($res['detail']->tags);
return view('pages.peertube.w', ['res' => $res]);
}
function getDetail ($id) {
return $this->ptapi_get('/api/v1/videos/'.$id);
}
function getRecommend ($tags) {
$tag = '';
foreach ($tags as $t) {
$tag .= 'tagsOneOf='.urlencode($t).'&';
}
return $this->ptapi_get('/api/v1/search/videos?start=0&count=6&nsfw=both&'.$tag.'sort=-publishedAt&searchTarget=local');
}
function getComment ($id) {
return $this->ptapi_get('/api/v1/videos/'.$id.'/comment-threads');
}
}

1795
public/css/peertube/account.css vendored ノーマルファイル

ファイル差分が大きすぎるため省略します 差分を読み込み

639
public/css/peertube/channel.css vendored ノーマルファイル
ファイルの表示

@ -0,0 +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;
}

1682
public/css/peertube/common.css vendored ノーマルファイル

ファイル差分が大きすぎるため省略します 差分を読み込み

83
public/css/peertube/videoslist.css vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,83 @@
.margin-content {
margin-inline-end: var(--gridVideosMiniatureMargins)!important;
}
.margin-content {
margin-inline-start: var(--gridVideosMiniatureMargins)!important;
}
.margin-content {
--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 {
font-size: 18px;
color: var(--mainForegroundColor);
display: inline-block;
font-weight: 600;
margin-top: 30px;
margin-bottom: 0;
}
.videos-header .title, .videos-header .title-subscription {
grid-column: 1;
}
.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;
}
.videos-header my-feed {
display: inline-block;
width: 16px;
color: var(--mainColor);
position: relative;
top: -2px;
}
.feed {
width: 100%;
}
my-global-icon {
cursor: pointer;
width: 100%;
}
[role=button] {
cursor: pointer;
}
.date-title:not(:first-child) {
margin-top: .5rem;
padding-top: 20px;
border-top: 1px solid rgba(0,0,0,.1);
}
.date-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
grid-column: 1/-1;
}

12
public/css/peertube/watch.css vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,12 @@
.avatar-25 {
--avatarSize: 25px !important;
}
.avatar-and-textarea {
display: flex;
margin-bottom: 10px;
}
.avatar-and-textarea my-actor-avatar {
margin-inline-end: 10px;
}

5
resources/views/pages/peertube/a.blade.php ノーマルファイル
ファイルの表示

@ -0,0 +1,5 @@
@extends('theme.'.env('THEME').'.peertube')
@section('content')
@include('theme.'.env('THEME').'.component.peertube.a')
@endsection

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,7 @@
@extends('theme.'.env('THEME').'.peertube')
@section('content')
<div id="content" tabindex="-1" class="main-col">
開発中
</div>
@endsection

ファイルの表示

@ -0,0 +1,5 @@
@extends('theme.'.env('THEME').'.peertube')
@section('content')
@include('theme.'.env('THEME').'.component.peertube.videos.local')
@endsection

ファイルの表示

@ -0,0 +1,5 @@
@extends('theme.'.env('THEME').'.peertube')
@section('content')
@include('theme.'.env('THEME').'.component.peertube.videos.recentlyadded')
@endsection

5
resources/views/pages/peertube/w.blade.php ノーマルファイル
ファイルの表示

@ -0,0 +1,5 @@
@extends('theme.'.env('THEME').'.peertube')
@section('content')
@include('theme.'.env('THEME').'.component.peertube.w')
@endsection

ファイルの表示

@ -0,0 +1,9 @@
<div id="content" tabindex="-1" class="main-col">
<div class="main-row">
<div class="root ng-star-inserted">
@include('theme.'.env('THEME').'.component.peertube.parts.a.info')
@include('theme.'.env('THEME').'.component.peertube.parts.a.links')
@include('theme.'.env('THEME').'.component.peertube.parts.a.channels')
</div>
</div>
</div>

ファイルの表示

@ -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,14 @@
<my-account-video-channels class="ng-star-inserted">
<div class="margin-content">
<div class="channels">
@foreach ($res['channel']->data as $ch)
<?php $fullchan = $ch->name.($ch->host != 'video.076.ne.jp' ? '@'.$ch->host : ''); ?>
<div class="channel ng-star-inserted">
@include('theme.'.env('THEME').'.component.peertube.parts.a.channels.avatar')
@include('theme.'.env('THEME').'.component.peertube.parts.common.subscribe')
@include('theme.'.env('THEME').'.component.peertube.parts.a.channels.videos')
</div>
@endforeach
</div>
</div>
</my-account-video-channels>

ファイルの表示

@ -0,0 +1,18 @@
<div class="channel-avatar-row">
<my-actor-avatar title="この動画チャンネルを見る">
<a title="この動画チャンネルを見る" href="/peertube/c/{{ $fullchan }}" class="ng-star-inserted">
<img class="avatar channel ng-star-inserted" src="https://video.076.ne.jp{{ $ch->avatar->path }}" alt="チャンネルのアバター">
</a>
</my-actor-avatar>
<h2>
<a title="この動画チャンネルを見る" href="/peertube/c/{{ $fullchan }}"> {{ $ch->displayName }} </a>
</h2>
<div class="actor-counters">
<div class="followers">{{ $ch->followersCount }}人登録者</div><span class="videos-count ng-star-inserted"> {{ $ch->video->total }}枚動画 </span>
</div>
<div class="description-html">
<p>
<?php echo $ch->description; ?>
</p>
</div>
</div>

ファイルの表示

@ -0,0 +1,54 @@
<div class="videos">
@foreach ($ch->video->data as $v)
<my-video-miniature class="ng-star-inserted">
<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-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->publishedAt)) }}"> {{ date('Y/m/d', strtotime($v->publishedAt)) }} </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>
</div>
</div>
</div>
</div>
</my-video-miniature>
@endforeach
<div class="miniature-show-channel ng-star-inserted">
<a href="/peertube/c/{{ $fullchan }}">このチャンネルを表示&gt;</a>
</div>
</div>

ファイルの表示

@ -0,0 +1,36 @@
<div class="account-info">
<div class="account-avatar-row">
<my-actor-avatar class="main-avatar">
<img class="account avatar ng-star-inserted" src="https://video.076.ne.jp{{ $res['owner']->avatar->path }}" alt="アカウントのアバター">
</my-actor-avatar>
<div>
<div class="section-label">アカウント</div>
<div class="actor-info">
<div>
<div class="actor-display-name">
<h1 title="Created on {{ date('Y/m/d', strtotime($res['owner']->createdAt)) }}">{{ $res['owner']->displayName }}</h1>
</div>
<div class="actor-handle">
<span>{{ '@'.$res['owner']->name }}{{ $res['owner']->host != 'video.076.ne.jp' ? '@'.$res['owner']->host : '' }}</span>
<button title="Copy account handle" class="btn btn-outline-secondary btn-sm copy-button">
<span class="glyphicon glyphicon-duplicate"></span>
</button>
</div>
<div class="actor-counters">
<span>{{ $res['owner']->followersCount }}人登録者</span><span class="videos-count ng-star-inserted"> {{ $res['owner']->totalVideo }}枚動画 </span>
</div>
</div>
</div>
</div>
</div>
<div class="description">
<div class="description-html">
<p>
{{ $res['owner']->description }}
</p>
</div>
</div>
<div class="buttons">
@include('theme.'.env('THEME').'.component.peertube.parts.common.subscribe')
</div>
</div>

ファイルの表示

@ -0,0 +1,22 @@
<div class="links on-channel-page">
<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/a/{{ $res['owner']->name }}{{ $res['owner']->host != 'video.076.ne.jp' ? '@'.$res['owner']->host : '' }}/video-channels">チャンネル</a>
</span>
<span id="pe_1" class="ng-star-inserted" style="visibility: inherit;">
<a routerlinkactive="active" class="title-page ng-star-inserted" href="/peertube/a/{{ $res['owner']->name }}{{ $res['owner']->host != 'video.076.ne.jp' ? '@'.$res['owner']->host : '' }}/videos">動画</a>
</span>
</div>
</my-list-overflow>
<my-simple-search-input name="search-videos" icon-title="Search account videos" placeholder="アカウントの動画を検索する">
<div class="root" style="display: flex;">
<div class="input-group has-feedback has-clear">
<input type="text" placeholder="アカウントの動画を検索する" class="ng-untouched ng-pristine ng-valid">
</div>
<my-global-icon class="myglobalicon-alt" iconname="search" aria-label="Search" role="button" title="検索">
<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-search"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>
</my-global-icon>
</div>
</my-simple-search-input>
</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,5 @@
@if (!is_null($res['channel']->banner))
<div class="banner ng-star-inserted">
<img alt="Channel banner" src="https://video.076.ne.jp{{ $res['channel']->banner->path }}">
</div>
@endif

ファイルの表示

@ -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>{{ '@'.$res['channel']->name }}{{ $res['channel']->host != 'video.076.ne.jp' ? '@'.$res['channel']->host : '' }}</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,27 @@
<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)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@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

ファイルの表示

@ -0,0 +1,7 @@
<my-subscribe-button size="small">
<div class="btn-group-subscribe btn subscribe-button">
<button type="button" role="button" class="btn btn-sm ng-star-inserted">登録</button>
<button type="button" role="button" class="btn btn-sm ng-star-inserted">リモート登録</button>
<button type="button" role="button" class="btn btn-sm ng-star-inserted">RSSで登録</button>
</div>
</my-subscribe-button>

ファイルの表示

@ -0,0 +1,60 @@
<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>
@if ($res['page'] != 'channel')
<a tabindex="-1" class="video-miniature-channel ng-star-inserted" href="/peertube/c/{{ $v->channel->name }}{{ $v->channel->host != 'video.076.ne.jp' ? '@'.$v->channel->host : '' }}"> {{ $v->channel->name }}{{ $v->channel->host != 'video.076.ne.jp' ? '@'.$v->channel->host : '' }} </a>
@endif
<div class="video-info-privacy"></div>
</div>
</div>
</div>
<div class="video-actions"></div>
</div>
</div>
</my-video-miniature>
</div>

ファイルの表示

@ -0,0 +1,43 @@
<div _ngcontent-jba-c163="" class="videos">
@if (!empty($res['video']['today']))
<h2 _ngcontent-jba-c163="" class="date-title ng-star-inserted"> 今日 </h2>
@foreach ($res['video']['today'] as $v)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@endforeach
@endif
@if (!empty($res['video']['yesterday']))
<h2 _ngcontent-jba-c163="" class="date-title ng-star-inserted"> 今日 </h2>
@foreach ($res['video']['today'] as $v)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@endforeach
@endif
@if (!empty($res['video']['week']))
<h2 _ngcontent-jba-c163="" class="date-title ng-star-inserted"> 今週 </h2>
@foreach ($res['video']['week'] as $v)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@endforeach
@endif
@if (!empty($res['video']['month']))
<h2 _ngcontent-jba-c163="" class="date-title ng-star-inserted"> 今月 </h2>
@foreach ($res['video']['month'] as $v)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@endforeach
@endif
@if (!empty($res['video']['lastmonth']))
<h2 _ngcontent-jba-c163="" class="date-title ng-star-inserted"> 先月 </h2>
@foreach ($res['video']['lastmonth'] as $v)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@endforeach
@endif
@if (!empty($res['video']['moreearly']))
<h2 _ngcontent-jba-c163="" class="date-title ng-star-inserted"> もっと前 </h2>
@foreach ($res['video']['moreearly'] as $v)
@include('theme.'.env('THEME').'.component.peertube.parts.common.videominature')
@endforeach
@endif
</div>

ファイルの表示

@ -0,0 +1,64 @@
<div class="header">
<div class="top-left-block">
<a class="peertube-title c-hand">
<span class="icon icon-logo"></span>
<span class="instance-name">076動画</span>
</a>
<a class="peertube-title c-hand" href="http://{{ env('ONION_HOST') }}">
<span class="icon icon-logo"></span>
<span class="publish-button-label">Tor</span>
</a>
<a class="peertube-title c-hand" href="/feed">
<span class="icon icon-logo"></span>
<span class="publish-button-label">RSS</span>
</a>
</div>
<div class="header-right">
<my-header class="w-100 d-flex justify-content-end">
<my-search-typeahead class="w-100 d-flex justify-content-end">
<div id="typeahead-container" class="d-inline-flex position-relative">
<input type="text" id="search-video" name="search-video" placeholder="動画、プレイリスト、チャンネルを検索する…" aria-label="Search" autocomplete="off" class="ng-untouched ng-pristine ng-valid">
<my-global-icon title="検索" role="button" iconname="search" class="icon icon-search">
<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-search"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg>
</my-global-icon>
<!--div class="position-absolute jump-to-suggestions">
<ul role="listbox" class="p-0 m-0" hidden="">
</ul>
<div id="typeahead-instructions" class="overflow-hidden ng-star-inserted">
<span class="text-muted">Your query will be matched against video names or descriptions, channel names.</span>
<div class="d-flex justify-content-between mt-3">
<label class="small-title">高度な検索</label>
<div class="advanced-search-status c-help">
<span title="Determines whether you can resolve any distant content, or if this instance only allows doing so for instances it follows." class="text-success">
<span class="mr-1 ng-star-inserted">any instance</span>
<i class="glyphicon glyphicon-ok-sign"></i>
</span>
</div>
</div>
<ul>
<li>
<em>@channel_id@domain</em>
<span class="flex-auto text-muted">検索にマッチしたチャンネルを表示します</span>
</li>
<li>
<em>URL</em>
<span class="text-muted">検索にマッチしたチャンネルを表示します</span>
</li>
<li>
<em>UUID</em>
<span class="text-muted">検索にマッチした動画を表示します</span>
</li>
</ul>
</div>
</div-->
</div>
</my-search-typeahead>
<a routerlink="/videos/upload" class="publish-button" href="/peertube/videos/upload">
<my-global-icon iconname="upload" aria-hidden="true">
<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-upload-cloud"><polyline points="16 16 12 12 8 16"></polyline><line x1="12" y1="12" x2="12" y2="21"></line><path d="M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3"></path><polyline points="16 16 12 12 8 16"></polyline></svg>
</my-global-icon>
<span class="publish-button-label">投稿</span>
</a>
</my-header>
</div>
</div>

ファイルの表示

@ -0,0 +1,28 @@
<?php
$name = '';
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.'さんのチャンネル';
}
?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#fff">
<meta property="og:platform" content="PeerTube">
<link rel="manifest" href="https://video.076.ne.jp/manifest.webmanifest?bb691a77622cbc0c1178f4dbf7d7e93daaecb079">
<link rel="icon" type="image/png" href="/img/favicon.jpeg">
<link rel="apple-touch-icon" href="/img/favicon.jpeg" sizes="144x144">
<link rel="apple-touch-icon" href="/img/favicon.jpeg" sizes="192x192">
<base href="{{ env('APP_URL') }}/peertube/client/ja-JP/">
<title>
{{ $name }} - 076動画
</title>
<meta name="description" content="テクニカル諏訪子様の動画サイト" />

ファイルの表示

@ -0,0 +1,8 @@
<my-menu class="ng-star-inserted">
<div class="menu-wrapper">
<menu class="is-logged-in">
@include('theme.'.env('THEME').'.component.peertube.parts.menu.top')
@include('theme.'.env('THEME').'.component.peertube.parts.menu.footer')
</menu>
</div>
</my-menu>

ファイルの表示

@ -0,0 +1,10 @@
<div class="footer">
<div class="footer-block">
<a routerlink="/about" routerlinkactive="active" class="menu-link" href="/peertube/about">
<my-global-icon iconname="help" aria-hidden="true">
<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-help-circle"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>
</my-global-icon>
このインスタンスについて
</a>
</div>
</div>

ファイルの表示

@ -0,0 +1,9 @@
<div class="top-menu">
@if (!is_null($res['userinfo']) && (isset($res['userinfo']->me) && !is_null($res['userinfo']->me)))
@include('theme.'.env('THEME').'.component.peertube.parts.menu.top.loggedin')
@include('theme.'.env('THEME').'.component.peertube.parts.menu.top.inmylibrary')
@else
@include('theme.'.env('THEME').'.component.peertube.parts.menu.top.loginmenu')
@endif
@include('theme.'.env('THEME').'.component.peertube.parts.menu.top.oninstance')
</div>

ファイルの表示

@ -0,0 +1,29 @@
<div class="in-my-library menu-block ng-star-inserted">
<div class="block-title">
In my library
</div>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/my-library/videos">
<my-global-icon aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="material" width="24px" height="24px"><path d="M0 0h24v24H0z" fill="none"></path><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8 12.5v-9l6 4.5-6 4.5z"></path></svg>
</my-global-icon>
動画
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/my-library/video-playlists">
<my-global-icon aria-hidden="true">
<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-list"><line x1="8" y1="6" x2="21" y2="6"></line><line x1="8" y1="12" x2="21" y2="12"></line><line x1="8" y1="18" x2="21" y2="18"></line><line x1="3" y1="6" x2="3.01" y2="6"></line><line x1="3" y1="12" x2="3.01" y2="12"></line><line x1="3" y1="18" x2="3.01" y2="18"></line></svg>
</my-global-icon>
再生リスト
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/videos/subscriptions">
<my-global-icon aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="material" width="24px" height="24px"><path d="M20 8H4V6h16v2zm-2-6H6v2h12V2zm4 10v8c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2v-8c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2zm-6 4l-6-3.27v6.53L16 16z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg>
</my-global-icon>
登録チャンネル
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/my-library/history/videos">
<my-global-icon aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="material" width="24px" height="24px"><path d="M0 0h24v24H0z" fill="none"></path><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"></path></svg>
</my-global-icon>
履歴
</a>
</div>

ファイルの表示

@ -0,0 +1,51 @@
<div class="logged-in-block ng-star-inserted">
<div>
<div placement="bottom-left auto" autoclose="outside" class="logged-in-more dropdown">
<a href="/peertube/a/techsuwako">
<div class="dropdown-toggle" aria-expanded="false">
<my-actor-avatar size="34">
<img class="account avatar avatar-34 ng-star-inserted" src="https://video.076.ne.jp/lazy-static/avatars/aa9883c7-d4d0-48c3-8e3a-72a9f2d96784.png" alt="アカウントのアバター">
</my-actor-avatar>
<div class="logged-in-info">
<div class="logged-in-display-name">テクニカル諏訪子</div>
<div class="logged-in-username">@techsuwako</div>
</div>
<div class="dropdown-toggle-indicator">
<span class="glyphicon glyphicon-chevron-down"></span>
</div>
</div>
</a>
</div>
@include('theme.'.env('THEME').'.component.peertube.parts.menu.top.notification')
</div>
<div class="logged-in-menu">
<a routerlink="/my-account" routerlinkactive="active" class="menu-link" href="/peertube/my-account">
<my-global-icon iconname="user" aria-hidden="true">
<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-user"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>
</my-global-icon>
自分のアカウント
</a>
<a routerlink="/my-library" routerlinkactive="active" class="menu-link" href="/peertube/my-library">
<my-global-icon iconname="channel" aria-hidden="true">
<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-tv"><rect x="2" y="7" width="20" height="15" rx="2" ry="2"></rect><polyline points="17 2 12 7 7 2"></polyline></svg>
</my-global-icon>
自分のライブラリ
</a>
@if (!is_null($res['userinfo']) && (isset($res['userinfo']->me) && !is_null($res['userinfo']->me) && $res['userinfo']->me->adminFlags == 1))
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/admin/users">
<my-global-icon iconname="cog" aria-hidden="true">
<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-settings"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
</my-global-icon>
管理
</a>
@endif
@if (!is_null($res['userinfo']) && (isset($res['userinfo']->me) && !is_null($res['userinfo']->me)))
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/logout">
<my-global-icon iconname="cog" aria-hidden="true">
<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-log-out"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path><polyline points="16 17 21 12 16 7"></polyline><line x1="21" y1="12" x2="9" y2="12"></line></svg>
</my-global-icon>
ログアウト
</a>
@endif
</div>
</div>

ファイルの表示

@ -0,0 +1,4 @@
<div _ngcontent-hnj-c134="" class="login-buttons-block ng-star-inserted">
<a _ngcontent-hnj-c134="" routerlink="/login" class="peertube-button-link orange-button" href="/peertube/login">ログイン</a>
<a _ngcontent-hnj-c134="" routerlink="/signup" class="peertube-button-link create-account-button ng-star-inserted" href="/peertube/signup">登録</a>
</div>

ファイルの表示

@ -0,0 +1,9 @@
<my-notification>
<div autoclose="outside" placement="bottom" container="{this}" popoverclass="popover-notifications" title="通知を表示" class="notification-inbox-popover">
<a href="/peertube/notification" style="color: var(--menuForegroundColor);">
<my-global-icon iconname="bell">
<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-bell"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path><path d="M13.73 21a2 2 0 0 1-3.46 0"></path></svg>
</my-global-icon>
</a>
</div>
</my-notification>

ファイルの表示

@ -0,0 +1,33 @@
<div class="on-instance menu-block ng-star-inserted">
<div class="block-title">ON 076動画</div>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/home">
<my-global-icon aria-hidden="true">
<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-home"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
</my-global-icon>
ホーム
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/videos/overview">
<my-global-icon aria-hidden="true">
<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-globe"><circle cx="12" cy="12" r="10"></circle><line x1="2" y1="12" x2="22" y2="12"></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path></svg>
</my-global-icon>
ディスカバー
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/videos/trending">
<my-global-icon aria-hidden="true">
<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-trending-up"><polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline><polyline points="17 6 23 6 23 12"></polyline></svg>
</my-global-icon>
トレンド
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/videos/recently-added">
<my-global-icon aria-hidden="true">
<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-plus-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line></svg>
</my-global-icon>
最近投稿された動画
</a>
<a routerlinkactive="active" class="menu-link ng-star-inserted" href="/peertube/videos/local">
<my-global-icon aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8.4666667 8.4666667" x="0px" y="0px" class="misc"><path fill="currentColor" d="m 4.2330754,3.0330699e-4 c -1.9062912,0 -3.45664101,1.55086299301 -3.45663572,3.45715399301 0,1.041342 0.84545222,2.220339 1.65622812,3.201355 0.8107786,0.981014 1.6190225,1.736328 1.6190225,1.736328 a 0.26460984,0.26460984 0 0 0 0.3612197,0 c 0,0 0.8082439,-0.755314 1.6190224,-1.736328 0.810776,-0.981016 1.6582946,-2.160013 1.6582946,-3.201355 0,-1.906291 -1.5508605,-3.45715399301 -3.4571516,-3.45715399301 z m 0,0.52968500301 c 1.6203083,0 2.9279876,1.30716399 2.9279849,2.92746899 0,0.721961 -0.7497154,1.914917 -1.5353056,2.865459 -0.6952271,0.8412 -1.2416102,1.3482 -1.3926793,1.491898 C 4.0825513,7.6716453 3.5360226,7.1646033 2.840396,6.3229163 2.0548058,5.3723743 1.3035373,4.1794183 1.3035373,3.4574573 1.3035347,1.8371523 2.6127671,0.52998831 4.2330754,0.52998831 Z m 0.00878,0.91518899 a 0.26460979,0.26460979 0 0 0 -0.026355,5.16e-4 0.26460979,0.26460979 0 0 0 -0.1405599,0.05116 L 2.444037,2.6998813 a 0.26474432,0.26474432 0 1 0 0.3147086,0.425813 l 0.056327,-0.04134 v 1.224733 a 0.26460979,0.26460979 0 0 0 0.2640673,0.265615 h 2.30632 a 0.26460979,0.26460979 0 0 0 0.2656152,-0.265615 v -1.223698 l 0.054777,0.04031 A 0.2647471,0.2647471 0 1 0 6.0205633,2.6998813 L 5.5513406,2.3536473 a 0.26460979,0.26460979 0 0 0 -0.00775,-0.0057 L 4.3896558,1.4968523 a 0.26460979,0.26460979 0 0 0 -0.1477963,-0.05168 z m -0.00878,0.594278 0.8888333,0.655775 v 0.217556 1.132747 H 4.4971428 v -0.437697 a 0.26460984,0.26460984 0 0 0 -0.2676843,-0.267684 0.26460984,0.26460984 0 0 0 -0.262001,0.267684 v 0.437697 H 3.344758 v -1.132747 -0.219107 z"></path></svg>
</my-global-icon>
ローカル動画
</a>
</div>

ファイルの表示

@ -0,0 +1,29 @@
<?php
$name = '';
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.'さんのチャンネル';
}
?>
<meta property="og:type" content="video" />
<meta property="og:site_name" content="076動画" />
<meta property="og:title" content="{{ $name }}" />
<meta property="og:image" content="https://video.076.ne.jp/lazy-static/previews/8d97cbd1-50bb-4de3-9eb6-914027346996.jpg" />
<meta property="og:url" content="{{ env('APP_URL') }}/peertube/w/b8oKB37kqyCdt7gBtPWeWV" />
<meta property="og:description" content="" />
<meta property="og:video:url" content="https://video.076.ne.jp/videos/embed/52039d41-8b56-4690-b6fa-25dedfedd5c5" />
<meta property="og:video:secure_url" content="https://video.076.ne.jp/videos/embed/52039d41-8b56-4690-b6fa-25dedfedd5c5" />
<meta property="og:video:type" content="text/html" />
<meta property="og:video:width" content="560" />
<meta property="og:video:height" content="315" />
<meta property="name" content="{{ $name }}" />
<meta property="description" content="" />
<meta property="image" content="https://video.076.ne.jp/lazy-static/previews/8d97cbd1-50bb-4de3-9eb6-914027346996.jpg" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:site" content="@TechnicalSuwako" />
<meta property="twitter:title" content="{{ $name }}" />
<meta property="twitter:description" content="" />
<meta property="twitter:image" content="https://video.076.ne.jp/lazy-static/previews/8d97cbd1-50bb-4de3-9eb6-914027346996.jpg" />

ファイルの表示

@ -0,0 +1,4 @@
<link rel="stylesheet" href="{{ asset('css/peertube/common.css') }}" />
@if (isset($res['page']))
<link rel="stylesheet" href="{{ asset('css/peertube/'.$res['page'].'.css') }}" />
@endif

ファイルの表示

@ -0,0 +1,15 @@
<?php
$name = '';
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.'さんのチャンネル';
}
?>
<link rel="alternate" type="application/json+oembed" href="https://video.076.ne.jp/services/oembed?url=https%3A%2F%2Fvideo.076.ne.jp%2Fw%2Fb8oKB37kqyCdt7gBtPWeWV" title="{{ $name }}" />
<link rel="canonical" href="https://video.076.ne.jp/videos/watch/52039d41-8b56-4690-b6fa-25dedfedd5c5" />
<link rel="stylesheet" href="https://video.076.ne.jp/styles.b0a7806028b73e54111d.css" media="print" onload="this.media='all'">
<link rel="stylesheet" href="https://video.076.ne.jp/plugins/global.css?hash=ff020a79840a91918b51d4f8667572ba57f7965200454dfd3ec9cb1a3befdead" />

ファイルの表示

@ -0,0 +1,9 @@
<div class="margin-content video-bottom ng-star-inserted">
<div class="video-info">
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.first')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.description')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.attrib')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.comments')
</div>
@include('theme.'.env('THEME').'.component.peertube.parts.w.videorecommend')
</div>

ファイルの表示

@ -0,0 +1,53 @@
<my-video-attributes>
<div class="attribute">
<span class="attribute-label">公開設定</span>
<span class="attribute-value ng-star-inserted">{{ $res['detail']->privacy->label }}</span>
</div>
<div class="attribute">
<span class="attribute-label">カテゴリ</span>
@if (is_null($res['detail']->category->id)) <span class="attribute-value ng-star-inserted">{{ $res['detail']->category->label }}</span>
@else <a class="attribute-value ng-star-inserted" href="/peertube/search?categoryOneOf={{ $res['detail']->category->id }}">{{ $res['detail']->category->label }}</a> @endif
</div>
@if (!is_null($res['detail']->originallyPublishedAt))
<div class="attribute">
<span class="attribute-label">投稿日</span>
<span class="attribute-value ng-star-inserted">{{ date('Y年m月d日', strtotime($res['detail']->originallyPublishedAt)) }}</span>
</div>
@endif
<div class="attribute">
<span class="attribute-label">ライセンス</span>
<span class="attribute-value ng-star-inserted">{{ $res['detail']->licence->label }}</span>
</div>
<div class="attribute">
<span class="attribute-label">言語</span>
@if (is_null($res['detail']->language->id)) <span class="attribute-value ng-star-inserted">{{ $res['detail']->language->label }}</span>
@else <a class="attribute-value ng-star-inserted" href="/peertube/search?languageOneOf={{ $res['detail']->language->id }}">{{ $res['detail']->language->label }}</a> @endif
</div>
<div class="attribute attribute-tags">
<span class="attribute-label">タグ</span>
@if (count($res['detail']->tags) > 0)
<span class="attribute-label">
@foreach ($res['detail']->tags as $k => $v)
<a _ngcontent-lhk-c188="" class="attribute-value ng-star-inserted" href="/peertube/search?tagsOneOf={{ $v }}">{{ $v }}</a>{{ count($res['detail']->tags)-1 != $k ? ', ' : '' }}
@endforeach
</span>
@endif
</div>
<div class="attribute ng-star-inserted">
<span class="attribute-label">再生時間</span>
@php
$seconds = $res['detail']->duration;
$hours = floor($seconds / 3600);
$seconds -= $hours * 3600;
$minutes = floor($seconds / 60);
$seconds -= $minutes * 60;
@endphp
<span class="attribute-value">{{ $hours != 0 ? $hours.'時' : '' }}{{ $minutes != 0 ? $minutes.'分' : '' }}{{ $seconds.'秒' }}</span>
</div>
</my-video-attributes>

ファイルの表示

@ -0,0 +1,22 @@
<div class="video-info-channel-left d-flex">
<my-video-avatar-channel>
<div class="wrapper">
<my-actor-avatar class="channel">
<a title="{{ $res['detail']->account->name }}{{ $res['detail']->account->host != 'video.076.ne.jp' ? '@'.$res['detail']->account->host : '' }} (チャンネルページへ) " href="/peertube/c/{{ $res['detail']->account->name }}{{ $res['detail']->channel->host != 'video.076.ne.jp' ? '@'.$res['detail']->channel->host : '' }}" class="ng-star-inserted">
<img class="avatar channel ng-star-inserted" src="https://video.076.ne.jp{{ $res['detail']->channel->avatar->path }}" alt="チャンネルのアバター">
</a>
</my-actor-avatar>
<my-actor-avatar class="account">
<a title="{{ $res['detail']->account->name }}{{ $res['detail']->account->host != 'video.076.ne.jp' ? '@'.$res['detail']->account->host : '' }} (アカウントページへ) " href="/peertube/a/{{ $res['detail']->account->name }}{{ $res['detail']->account->host != 'video.076.ne.jp' ? '@'.$res['detail']->account->host : '' }}" class="ng-star-inserted">
<img class="account avatar ng-star-inserted" src="https://video.076.ne.jp{{ $res['detail']->account->avatar->path }}" alt="アカウントのアバター">
</a>
</my-actor-avatar>
</div>
</my-video-avatar-channel>
<div class="video-info-channel-left-links ml-1">
<a title="チャンネルページ" href="/peertube/c/{{ $res['detail']->account->name }}{{ $res['detail']->channel->host != 'video.076.ne.jp' ? '@'.$res['detail']->channel->host : '' }}" class="ng-star-inserted"> {{ $res['detail']->channel->displayName }} </a>
<a title="アカウントページ" href="/peertube/a/{{ $res['detail']->account->name }}{{ $res['detail']->account->host != 'video.076.ne.jp' ? '@'.$res['detail']->account->host : '' }}" class="ng-star-inserted">
<span>{{ $res['detail']->account->name }}{{ $res['detail']->account->host != 'video.076.ne.jp' ? '@'.$res['detail']->account->host : '' }} 制作</span>
</a>
</div>
</div>

ファイルの表示

@ -0,0 +1,90 @@
<my-video-comments class="border-top">
<div>
<div class="title-block">
<h2 class="title-page title-page-single"> {{ $res['comment']->totalNotDeletedComments }} コメント </h2>
<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 class="d-inline-block ml-4 dropdown-root dropdown">
<button id="dropdown-sort-comments" class="dropdown-toggle btn btn-sm btn-outline-secondary" aria-expanded="false">並べ替え</button>
<div aria-labelledby="dropdown-sort-comments" x-placement="bottom-left" class="dropdown-menu">
<button class="dropdown-item">新しい順(デフォルト)</button>
<button class="dropdown-item">多かった順</button>
</div>
</div-->
</div>
<my-video-comment-add class="ng-star-inserted">
<form novalidate="" class="ng-untouched ng-pristine ng-invalid">
<div class="avatar-and-textarea">
<my-actor-avatar size="25">
<img class="account avatar avatar-25 ng-star-inserted" src="https://video.076.ne.jp/lazy-static/avatars/aa9883c7-d4d0-48c3-8e3a-72a9f2d96784.png" alt="アカウントのアバター">
</my-actor-avatar>
<div class="form-group">
<textarea placeholder="コメントを入力..." myautoresize="" formcontrolname="text" rows="1" class="ng-untouched ng-pristine ng-invalid" style="overflow: hidden; height: 32px;"></textarea>
</div>
</div>
<div class="comment-buttons"></div>
</form>
</my-video-comment-add>
@if (count($res['comment']->data) == 0)
<div class="ng-star-inserted">コメントがありません。</div>
@else
@foreach ($res['comment']->data as $k => $v)
@if (!$v->isDeleted)
<div class="comment-threads ng-star-inserted">
<div>
<div id="highlighted-comment" class="anchor"></div>
<my-video-comment class="ng-star-inserted">
<div class="root-comment ng-star-inserted">
<div class="left">
<my-actor-avatar class="ng-star-inserted">
<a target="_blank" rel="noopener noreferrer" href="{{ $v->account->url }}" title="{{ $v->account->name }} (アカウントページへ) " class="ng-star-inserted">
<img class="account avatar ng-star-inserted" src="{{ !is_null($v->account->avatar) ? 'https://video.076.ne.jp'.$v->account->avatar->path : '/img/noicon.jpg' }}" alt="アカウントのアバター">
</a>
</my-actor-avatar>
<div class="vertical-border"></div>
</div>
<div class="right mb-3">
<div class="comment">
<div class="highlighted-comment ng-star-inserted">注目のコメント</div>
<div class="comment-account-date ng-star-inserted">
<div class="comment-account">
<a href="/peertube/a/{{ $v->account->name }}{{ $v->account->host != 'video.076.ne.jp' ? '@'.$v->account->host : '' }}">
<span class="comment-account-name"> {{ $v->account->displayName }} </span>
<span class="comment-account-fid ml-1">{{ $v->account->name }}{{ $v->account->host != 'video.076.ne.jp' ? '@'.$v->account->host : '' }}</span>
</a>
</div>
<a class="comment-date" title="{{ date('Y/m/d', strtotime($v->createdAt)) }}" href="/w/{{ request()->route('id') }}#threadId={{ $v->threadId }}">
{{ date('Y年m月d日 H:i:s T', strtotime($v->createdAt)) }}
</a>
</div>
<div mytimestamproutetransformer="" class="comment-html ng-star-inserted">
<?php echo $v->text; ?>
</div>
<div class="comment-actions ng-star-inserted">
<div tabindex="0" class="comment-action-reply">返事</div>
</div>
<div class="ng-star-inserted"></div>
</div>
</div>
</div>
<div class="ng-star-inserted"></div>
</my-video-comment>
</div>
</div>
@endif
@endforeach
@endif
<div class="comment-threads ng-star-inserted">
<div>
<div id="highlighted-comment" class="anchor"></div>
</div>
</div>
</div>
</my-video-comments>

ファイルの表示

@ -0,0 +1,7 @@
<my-video-description>
<div class="video-info-description">
<div mytimestamproutetransformer="" class="video-info-description-html">
<?php echo nl2br($res['detail']->description); ?>
</div>
</div>
</my-video-description>

ファイルの表示

@ -0,0 +1,27 @@
<div class="video-info-first-row">
<div>
<div class="d-flex justify-content-between flex-direction-column">
<div class="d-none d-md-block">
<h1 class="video-info-name">{{ $res['detail']->name }}</h1>
</div>
<div class="video-info-first-row-bottom">
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.viewsdate')
<my-action-buttons>
<div class="video-actions-rates">
<div class="video-actions full-width justify-content-end">
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.videorate')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.support')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.share')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.save')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.more')
</div>
</div>
</my-action-buttons>
</div>
</div>
<div class="pt-3 border-top video-info-channel d-flex">
@include('theme.'.env('THEME').'.component.peertube.parts.w.info.channel')
@include('theme.'.env('THEME').'.component.peertube.parts.common.subscribe')
</div>
</div>
</div>

ファイルの表示

@ -0,0 +1,6 @@
<button class="action-button">
<my-global-icon iconname="download" aria-hidden="true">
<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-download"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg>
</my-global-icon>
<span class="icon-text">ダウンロード</span>
</button>

ファイルの表示

@ -0,0 +1,53 @@
<!--div placement="bottom auto" role="button" autoclose="outside" class="action-dropdown ng-star-inserted dropdown">
<button class="dropdown-toggle action-button action-button-save" aria-expanded="false">
<my-global-icon iconname="playlist-add" aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 426.7 426.7">
<defs></defs>
<path fill="currentColor" d="M0 64h256v42.7H0zM0 149.3h256V192H0zM0 234.7h170.7v42.7H0z"></path>
<path fill="currentColor" d="M341.3 234.7v-85.4h-42.6v85.4h-85.4v42.6h85.4v85.4h42.6v-85.4h85.4v-42.6z"></path>
</svg>
</my-global-icon>
<span class="icon-text">保存する</span>
</button>
<div x-placement="bottom" class="dropdown-menu">
<my-video-add-to-playlist>
<div class="root">
<div class="header">
<div class="first-row">
<div class="title">保存</div>
</div>
</div>
<div class="input-container">
<input type="text" placeholder="再生リストを検索" class="ng-untouched ng-pristine ng-valid">
</div>
<div class="playlists">
<div class="playlist dropdown-item ng-star-inserted">
<div class="primary-row">
<my-peertube-checkbox class="ng-untouched ng-pristine ng-valid">
<div class="root flex-column">
<div class="d-flex">
<label class="form-group-checkbox">
<input type="checkbox" id="in-playlist-primary-4584" class="ng-untouched ng-pristine ng-valid">
<span role="checkbox" aria-checked="false"></span>
</label>
</div>
<div class="ml-4 d-flex flex-column">
<small class="wrapper mt-2 text-muted"></small>
<span class="wrapper mt-3"></span>
</div>
</div>
</my-peertube-checkbox>
<label class="display-name"> 東方夢時空 Phantasmagoria of Dim.Dream 全曲Win風アレンジ </label>
</div>
</div>
</div>
<div class="new-playlist-button dropdown-item">
<my-global-icon iconname="add" aria-hidden="true">
<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-plus-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line></svg>
</my-global-icon>
<span>非公開プレイリストを作成</span>
</div>
</div>
</my-video-add-to-playlist>
</div>
</div-->

ファイルの表示

@ -0,0 +1,6 @@
<button class="action-button">
<my-global-icon iconname="share" aria-hidden="true">
<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-share-2"><circle cx="18" cy="5" r="3"></circle><circle cx="6" cy="12" r="3"></circle><circle cx="18" cy="19" r="3"></circle><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line></svg>
</my-global-icon>
<span class="icon-text">シェアする</span>
</button>

ファイルの表示

@ -0,0 +1,13 @@
<button placement="bottom auto" class="action-button action-button-support ng-star-inserted" aria-label="この動画への寄付方法">
<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>

ファイルの表示

@ -0,0 +1,14 @@
<my-video-rate>
<button placement="bottom auto" class="action-button action-button-like" aria-pressed="false" aria-label="動画を高く評価">
<my-global-icon iconname="like">
<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-thumbs-up"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg>
</my-global-icon>
@if ($res['detail']->likes > 0) <span class="count ng-star-inserted">{{ $res['detail']->likes }}</span> @endif
</button>
<button placement="bottom auto" class="action-button action-button-dislike" aria-pressed="false" aria-label="動画を低く評価">
<my-global-icon iconname="dislike">
<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-thumbs-down"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg>
</my-global-icon>
@if ($res['detail']->dislikes > 0) <span class="count ng-star-inserted">{{ $res['detail']->dislikes }}</span> @endif
</button>
</my-video-rate>

ファイルの表示

@ -0,0 +1,10 @@
<div class="d-none d-md-block video-info-date-views">
<my-date-toggle class="ng-star-inserted">
<span class="date-toggle" title="{{ date('Y/m/d', strtotime($res['detail']->publishedAt)) }}">{{ date('Y年m月d日 H:i:s T', strtotime($res['detail']->publishedAt)) }}</span>
</my-date-toggle>
に投稿
<my-video-views-counter class="ng-star-inserted">
<span title="">{{ $res['detail']->views }} 回視聴</span>
</my-video-views-counter>
</div>

ファイルの表示

@ -0,0 +1,30 @@
<div id="video-wrapper">
<div id="videojs-wrapper">
<div id="vjs_video_3"
playsinline="true"
tabindex="-1"
lang="ja"
role="region"
aria-label="動画プレーヤー"
style="outline: none;"
>
<video
playsinline="playsinline"
tabindex="-1"
poster="https://video.076.ne.jp{{ $res['detail']->previewPath }}"
style="width: 813px; height: 458px;"
controls=""
>
@if (!empty($res['detail']->streamingPlaylists))
@foreach ($res['detail']->streamingPlaylists[0]->files as $k => $v)
<source src="{{ $v->fileUrl }}">
@endforeach
@else
@foreach ($res['detail']->files as $k => $v)
<source src="{{ $v->fileUrl }}">
@endforeach
@endif
</video>
</div>
</div>
</div>

ファイルの表示

@ -0,0 +1,61 @@
<my-recommended-videos>
<div class="other-videos">
<div class="title-page-container ng-star-inserted">
<h2 class="title-page title-page-single">他の動画</h2>
</div>
@foreach ($res['recommend']->data as $k => $v)
<my-video-miniature actorimagesize="32" class="ng-star-inserted">
<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-label-overlay warning ng-star-inserted"></div>
<div class="video-thumbnail-label-overlay danger ng-star-inserted"></div>
@php
$seconds = $res['detail']->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>
</a>
</my-video-thumbnail>
<div class="video-bottom">
<div class="video-miniature-information">
<div class="d-flex video-miniature-meta">
<my-actor-avatar class="ng-star-inserted">
<a title="{{ $v->channel->name }} (チャンネルページへ) " href="/c/{{ $v->channel->name }}" class="ng-star-inserted">
<img class="avatar avatar-32 channel ng-star-inserted" src="{{ !is_null($v->channel->avatar) ? 'https://video.076.ne.jp'.$v->channel->avatar->path : '/img/noicon.jpg' }}" alt="チャンネルのアバター">
</a>
</my-actor-avatar>
<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日 H:i:s T', strtotime($v->createdAt)) }}">{{ date('Y/m/d', 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>
<a tabindex="-1" class="video-miniature-account ng-star-inserted" href="/c/{{ $v->channel->host != 'video.076.ne.jp' ? '@'.$v->channel->host : '' }}"> {{ $v->account->name }}{{ $v->account->host != 'video.076.ne.jp' ? '@'.$v->account->host : '' }} </a>
<div class="video-info-privacy"></div>
</div>
</div>
</div>
<div class="video-actions"></div>
</div>
</div>
</my-video-miniature>
<hr class="ng-star-inserted">
@endforeach
</div>
</my-recommended-videos>

ファイルの表示

@ -0,0 +1,27 @@
<div _ngcontent-jba-c138="" id="content" tabindex="-1" class="main-col">
<div _ngcontent-jba-c138="" class="main-row">
<ng-component class="ng-star-inserted">
<ng-component class="ng-star-inserted">
<my-videos-list _nghost-jba-c163="">
<div _ngcontent-jba-c163="" class="margin-content">
<div _ngcontent-jba-c163="" class="videos-header">
<h1 _ngcontent-jba-c163="" placement="bottom" container="body" class="title ng-star-inserted"> ローカル動画 </h1>
<div _ngcontent-jba-c163="" class="title-subscription ng-star-inserted">
Subscribe to RSS feed "ローカル動画"
<my-feed _ngcontent-jba-c163="" _nghost-jba-c77="">
<div _ngcontent-jba-c77="" class="feed">
<my-global-icon _ngcontent-jba-c77="" role="button" aria-label="Open syndication dropdown" placement="bottom left auto" iconname="syndication" class="icon-syndication ng-star-inserted" _nghost-jba-c71="">
<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 _ngcontent-jba-c163="" class="action-block"></div>
</div>
@include('theme.'.env('THEME').'.component.peertube.parts.common.videosbydate')
</div>
</div>
</div>
</div>
</div>
</div>

ファイルの表示

@ -0,0 +1,27 @@
<div _ngcontent-jba-c138="" id="content" tabindex="-1" class="main-col">
<div _ngcontent-jba-c138="" class="main-row">
<ng-component class="ng-star-inserted">
<ng-component class="ng-star-inserted">
<my-videos-list _nghost-jba-c163="">
<div _ngcontent-jba-c163="" class="margin-content">
<div _ngcontent-jba-c163="" class="videos-header">
<h1 _ngcontent-jba-c163="" placement="bottom" container="body" class="title ng-star-inserted"> 最近投稿された動画 </h1>
<div _ngcontent-jba-c163="" class="title-subscription ng-star-inserted">
Subscribe to RSS feed "最近投稿された動画"
<my-feed _ngcontent-jba-c163="" _nghost-jba-c77="">
<div _ngcontent-jba-c77="" class="feed">
<my-global-icon _ngcontent-jba-c77="" role="button" aria-label="Open syndication dropdown" placement="bottom left auto" iconname="syndication" class="icon-syndication ng-star-inserted" _nghost-jba-c71="">
<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 _ngcontent-jba-c163="" class="action-block"></div>
</div>
@include('theme.'.env('THEME').'.component.peertube.parts.common.videosbydate')
</div>
</div>
</div>
</div>
</div>
</div>

ファイルの表示

@ -0,0 +1,10 @@
<div id="content" tabindex="-1" class="main-col">
<div class="main-row">
<my-video-watch class="ng-star-inserted">
<div class="root">
@include('theme.'.env('THEME').'.component.peertube.parts.w.player')
@include('theme.'.env('THEME').'.component.peertube.parts.w.info')
</div>
</my-video-watch>
</div>
</div>

ファイルの表示

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="ja">
<head>
@include('theme.'.env('THEME').'.component.peertube.parts.manifest')
@include('theme.'.env('THEME').'.component.peertube.parts.style')
@include('theme.'.env('THEME').'.component.peertube.parts.meta')
@include('theme.'.env('THEME').'.component.peertube.parts.stylelink')
</head>
<body id="custom-css">
<div class="peertube-container user-logged-in">
@include('theme.'.env('THEME').'.component.peertube.parts.header')
<div class="sub-header-container">
@include('theme.'.env('THEME').'.component.peertube.parts.menu')
@yield('content')
</div>
</div>
</body>
</html>

39
routes/view/peertube.php ノーマルファイル
ファイルの表示

@ -0,0 +1,39 @@
<?php
Route::group(['prefix' => 'peertube'], function () {
Route::any('/a/{id}/{cat?}', 'Peertube\Account@index');
Route::any('/c/{id}/{cat?}/{page?}', 'Peertube\Channel@index');
Route::any('/w/{id}', 'Peertube\Watch@index');
Route::any('/users', 'Peertube\Logout@index');
Route::any('/login', 'Peertube\Login@index');
Route::any('/signup', 'Peertube\Signup@index');
Route::any('/notification', 'Peertube\Notification@index');
Route::any('/about', 'Peertube\About@index');
Route::any('/my-account', 'Peertube\Myaccount@index');
Route::any('/my-library', 'Peertube\Mylibrary@index');
Route::group(['prefix' => 'admin'], function () {
Route::any('/users', 'Peertube\Admin\Users@index');
});
Route::group(['prefix' => 'my-library'], function () {
Route::any('/videos', 'Peertube\Mylibrary\Videos@index');
Route::any('/video-playlists', 'Peertube\Mylibrary\Videoplaylists@index');
Route::group(['prefix' => 'history'], function () {
Route::any('/videos', 'Peertube\Mylibrary\History\Videos@index');
});
});
Route::group(['prefix' => 'videos'], function () {
Route::any('/subscriptions', 'Peertube\Videos\Subscriptions@index');
Route::any('/overview', 'Peertube\Videos\Overview@index');
Route::any('/trending', 'Peertube\Videos\Trending@index');
Route::any('/recently-added', 'Peertube\Videos\Recentlyadded@index');
Route::any('/local', 'Peertube\Videos\Local@index');
Route::any('/upload', 'Peertube\Videos\Upload@index');
});
});

ファイルの表示

@ -25,4 +25,5 @@ require(__DIR__.'/api/user.php');
Route::get('/logout', 'User\Logout@index');
require(__DIR__.'/view/bash.php');
require(__DIR__.'/view/peertube.php');
require(__DIR__.'/view/site.php');