Initial commit
This commit is contained in:
20
resources/views/themeholy/catalog.blade.php
Normal file
20
resources/views/themeholy/catalog.blade.php
Normal file
@@ -0,0 +1,20 @@
|
||||
@extends('themes::themeholy.layout')
|
||||
@section('content')
|
||||
@include('themes::themeholy.inc.main_search')
|
||||
<section style="margin-top: 8vh;">
|
||||
<div class="container" style="margin-bottom: 5vh;">
|
||||
<h2 id="main" class="display-6 text-warning" style="font-size: calc(1.325rem + 0.9vw);text-align: center;">
|
||||
{{ $section_name }}</h2>
|
||||
<hr
|
||||
style="background: linear-gradient(90deg, var(--bs-cyan), var(--bs-yellow)), rgb(255,193,7);transform: scale(1);width: 100%;height: 2px;filter: saturate(200%);">
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="row row-cols-2 row-cols-sm-3 row-cols-md-4 row-cols-lg-4 row-cols-xl-5 row-cols-xxl-5">
|
||||
@foreach ($data as $movie)
|
||||
@include('themes::themeholy.inc.section_movies_item')
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
{{ $data->appends(request()->all())->links('themes::themeholy.inc.pagination') }}
|
||||
</section>
|
||||
@endsection
|
||||
291
resources/views/themeholy/episode.blade.php
Normal file
291
resources/views/themeholy/episode.blade.php
Normal file
@@ -0,0 +1,291 @@
|
||||
@extends('themes::themeholy.layout')
|
||||
|
||||
@section('content')
|
||||
<section class="clean-block clean-hero"
|
||||
style="color: rgba(20,20,20,0.85);background: url({{ $currentMovie->getPosterUrl() }}) center / cover no-repeat;margin-top: -28vh;filter: blur(0px);margin-bottom: 0px;">
|
||||
<div class="media-player text" id="pembed">
|
||||
<p style="text-align: center;">Đang tải, đợi tí nhé ...</p>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
<div class="text-center" style="margin-top: 3vh;">
|
||||
@foreach ($currentMovie->episodes->where('slug', $episode->slug)->where('server', $episode->server) as $server)
|
||||
<a data-id="{{ $server->id }}" data-link="{{ $server->link }}" data-type="{{ $server->type }}"
|
||||
onclick="chooseStreamingServer(this)" class="streaming-server btn btn-outline-secondary"
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;">Nguồn
|
||||
Phát
|
||||
#{{ $loop->index + 1 }}</a>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="container" style="margin-top: 1vw;">
|
||||
<div class="block-content">
|
||||
<h2 class="display-6 text-warning" style="font-size: calc(1.325rem + 0.9vw);text-align: center;">
|
||||
{{ $currentMovie->name }}</h2>
|
||||
<p class="text-center" style="color: rgb(255,255,255);">{{ $currentMovie->origin_name }}
|
||||
({{ $currentMovie->publish_year }})</p>
|
||||
|
||||
@foreach ($currentMovie->episodes->sortBy([['server', 'asc']])->groupBy('server') as $server => $data)
|
||||
<p class="text-center" style="color: rgb(255,255,255);margin-top: 2vw;">Danh Sách Tập {{ $server }}
|
||||
</p>
|
||||
<div class="text-center" style="margin-top: 3vh;">
|
||||
@foreach ($data->sortByDesc('name', SORT_NATURAL)->groupBy('name') as $name => $item)
|
||||
<a class='btn @if ($item->contains($episode)) btn-outline-warning @else btn-outline-secondary @endif'
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;"
|
||||
title='{{ $name }}' href='{{ $item->sortByDesc('type')->first()->getUrl() }}'
|
||||
>
|
||||
{{ $name }}
|
||||
</a>
|
||||
@endforeach
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@include('themes::themeholy.inc.comment')
|
||||
</div>
|
||||
|
||||
@include('themes::themeholy.inc.section_related')
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
<script src="/themes/holy/player/js/p2p-media-loader-core.min.js"></script>
|
||||
<script src="/themes/holy/player/js/p2p-media-loader-hlsjs.min.js"></script>
|
||||
<script src="/js/jwplayer-8.9.3.js"></script>
|
||||
<script src="/js/hls.min.js"></script>
|
||||
<script src="/js/jwplayer.hlsjs.min.js"></script>
|
||||
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
|
||||
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
var episode_id = {{ $episode->id }};
|
||||
const wrapper = document.getElementById('pembed');
|
||||
const vastAds = "{{ Setting::get('jwplayer_advertising_file') }}";
|
||||
|
||||
function chooseStreamingServer(el) {
|
||||
const type = el.dataset.type;
|
||||
const link = el.dataset.link.replace(/^http:\/\//i, 'https://');
|
||||
const id = el.dataset.id;
|
||||
|
||||
const newUrl =
|
||||
location.protocol +
|
||||
"//" +
|
||||
location.host +
|
||||
location.pathname.replace(`-${episode_id}`, `-${id}`);
|
||||
|
||||
history.pushState({
|
||||
path: newUrl
|
||||
}, "", newUrl);
|
||||
episode_id = id;
|
||||
|
||||
|
||||
Array.from(document.getElementsByClassName('streaming-server')).forEach(server => {
|
||||
server.classList.remove('btn-outline-warning');
|
||||
})
|
||||
el.classList.add('btn-outline-warning');
|
||||
|
||||
renderPlayer(type, link, id);
|
||||
}
|
||||
|
||||
function renderPlayer(type, link, id) {
|
||||
if (type == 'embed') {
|
||||
if (vastAds) {
|
||||
wrapper.innerHTML = `<div id="fake_jwplayer" style="height: 100%"></div>`;
|
||||
const fake_player = jwplayer("fake_jwplayer");
|
||||
const objSetupFake = {
|
||||
key: "{{ Setting::get('jwplayer_license') }}",
|
||||
aspectratio: "16:9",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
file: "/themes/holy/player/1s_blank.mp4",
|
||||
volume: 100,
|
||||
mute: false,
|
||||
autostart: true,
|
||||
advertising: {
|
||||
tag: "{{ Setting::get('jwplayer_advertising_file') }}",
|
||||
client: "vast",
|
||||
vpaidmode: "insecure",
|
||||
skipoffset: {{ (int) Setting::get('jwplayer_advertising_skipoffset') ?: 5 }}, // Bỏ qua quảng cáo trong vòng 5 giây
|
||||
skipmessage: "Bỏ qua sau xx giây",
|
||||
skiptext: "Bỏ qua"
|
||||
}
|
||||
};
|
||||
fake_player.setup(objSetupFake);
|
||||
fake_player.on('complete', function(event) {
|
||||
$("#fake_jwplayer").remove();
|
||||
wrapper.innerHTML =
|
||||
`<iframe src="${link}" frameborder="0" scrolling="no" allowfullscreen="" allow='autoplay'></iframe>`
|
||||
fake_player.remove();
|
||||
});
|
||||
|
||||
fake_player.on('adSkipped', function(event) {
|
||||
$("#fake_jwplayer").remove();
|
||||
wrapper.innerHTML =
|
||||
`<iframe src="${link}" frameborder="0" scrolling="no" allowfullscreen="" allow='autoplay'></iframe>`
|
||||
fake_player.remove();
|
||||
});
|
||||
|
||||
fake_player.on('adComplete', function(event) {
|
||||
$("#fake_jwplayer").remove();
|
||||
wrapper.innerHTML =
|
||||
`<iframe src="${link}" frameborder="0" scrolling="no" allowfullscreen="" allow='autoplay'></iframe>`
|
||||
fake_player.remove();
|
||||
});
|
||||
} else {
|
||||
if (wrapper) {
|
||||
wrapper.innerHTML =
|
||||
`<iframe src="${link}" frameborder="0" scrolling="no" allowfullscreen="" allow='autoplay'></iframe>`
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == 'm3u8' || type == 'mp4') {
|
||||
wrapper.innerHTML = `<div id="jwplayer"></div>`;
|
||||
const player = jwplayer("jwplayer");
|
||||
const objSetup = {
|
||||
key: "{{ Setting::get('jwplayer_license') }}",
|
||||
aspectratio: "16:9",
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
image: "{{ $currentMovie->getPosterUrl() }}",
|
||||
file: link,
|
||||
playbackRateControls: true,
|
||||
playbackRates: [0.25, 0.75, 1, 1.25],
|
||||
sharing: {
|
||||
sites: [
|
||||
"reddit",
|
||||
"facebook",
|
||||
"twitter",
|
||||
"googleplus",
|
||||
"email",
|
||||
"linkedin",
|
||||
],
|
||||
},
|
||||
volume: 100,
|
||||
mute: false,
|
||||
autostart: true,
|
||||
logo: {
|
||||
file: "{{ Setting::get('jwplayer_logo_file') }}",
|
||||
link: "{{ Setting::get('jwplayer_logo_link') }}",
|
||||
position: "{{ Setting::get('jwplayer_logo_position') }}",
|
||||
},
|
||||
advertising: {
|
||||
tag: "{{ Setting::get('jwplayer_advertising_file') }}",
|
||||
client: "vast",
|
||||
vpaidmode: "insecure",
|
||||
skipoffset: {{ (int) Setting::get('jwplayer_advertising_skipoffset') ?: 5 }}, // Bỏ qua quảng cáo trong vòng 5 giây
|
||||
skipmessage: "Bỏ qua sau xx giây",
|
||||
skiptext: "Bỏ qua"
|
||||
}
|
||||
};
|
||||
|
||||
if (type == 'm3u8') {
|
||||
const segments_in_queue = 50;
|
||||
|
||||
var engine_config = {
|
||||
debug: !1,
|
||||
segments: {
|
||||
forwardSegmentCount: 50,
|
||||
},
|
||||
loader: {
|
||||
cachedSegmentExpiration: 864e5,
|
||||
cachedSegmentsCount: 1e3,
|
||||
requiredSegmentsPriority: segments_in_queue,
|
||||
httpDownloadMaxPriority: 9,
|
||||
httpDownloadProbability: 0.06,
|
||||
httpDownloadProbabilityInterval: 1e3,
|
||||
httpDownloadProbabilitySkipIfNoPeers: !0,
|
||||
p2pDownloadMaxPriority: 50,
|
||||
httpFailedSegmentTimeout: 500,
|
||||
simultaneousP2PDownloads: 20,
|
||||
simultaneousHttpDownloads: 2,
|
||||
// httpDownloadInitialTimeout: 12e4,
|
||||
// httpDownloadInitialTimeoutPerSegment: 17e3,
|
||||
httpDownloadInitialTimeout: 0,
|
||||
httpDownloadInitialTimeoutPerSegment: 17e3,
|
||||
httpUseRanges: !0,
|
||||
maxBufferLength: 300,
|
||||
// useP2P: false,
|
||||
},
|
||||
};
|
||||
if (Hls.isSupported() && p2pml.hlsjs.Engine.isSupported()) {
|
||||
var engine = new p2pml.hlsjs.Engine(engine_config);
|
||||
player.setup(objSetup);
|
||||
jwplayer_hls_provider.attach();
|
||||
p2pml.hlsjs.initJwPlayer(player, {
|
||||
liveSyncDurationCount: segments_in_queue, // To have at least 7 segments in queue
|
||||
maxBufferLength: 300,
|
||||
loader: engine.createLoaderClass(),
|
||||
});
|
||||
} else {
|
||||
player.setup(objSetup);
|
||||
}
|
||||
} else {
|
||||
player.setup(objSetup);
|
||||
}
|
||||
|
||||
|
||||
const resumeData = 'OPCMS-PlayerPosition-' + id;
|
||||
player.on('ready', function() {
|
||||
if (typeof(Storage) !== 'undefined') {
|
||||
if (localStorage[resumeData] == '' || localStorage[resumeData] == 'undefined') {
|
||||
console.log("No cookie for position found");
|
||||
var currentPosition = 0;
|
||||
} else {
|
||||
if (localStorage[resumeData] == "null") {
|
||||
localStorage[resumeData] = 0;
|
||||
} else {
|
||||
var currentPosition = localStorage[resumeData];
|
||||
}
|
||||
console.log("Position cookie found: " + localStorage[resumeData]);
|
||||
}
|
||||
player.once('play', function() {
|
||||
console.log('Checking position cookie!');
|
||||
console.log(Math.abs(player.getDuration() - currentPosition));
|
||||
if (currentPosition > 180 && Math.abs(player.getDuration() - currentPosition) >
|
||||
5) {
|
||||
player.seek(currentPosition);
|
||||
}
|
||||
});
|
||||
window.onunload = function() {
|
||||
localStorage[resumeData] = player.getPosition();
|
||||
}
|
||||
} else {
|
||||
console.log('Your browser is too old!');
|
||||
}
|
||||
});
|
||||
|
||||
player.on('complete', function() {
|
||||
if (typeof(Storage) !== 'undefined') {
|
||||
localStorage.removeItem(resumeData);
|
||||
} else {
|
||||
console.log('Your browser is too old!');
|
||||
}
|
||||
})
|
||||
|
||||
function formatSeconds(seconds) {
|
||||
var date = new Date(1970, 0, 1);
|
||||
date.setSeconds(seconds);
|
||||
return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
const episode = '{{ $episode->id }}';
|
||||
let playing = document.querySelector(`[data-id="${episode}"]`);
|
||||
if (playing) {
|
||||
playing.click();
|
||||
return;
|
||||
}
|
||||
|
||||
const servers = document.getElementsByClassName('streaming-server');
|
||||
if (servers[0]) {
|
||||
servers[0].click();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{!! setting('site_scripts_facebook_sdk') !!}
|
||||
@endpush
|
||||
5
resources/views/themeholy/inc/comment.blade.php
Normal file
5
resources/views/themeholy/inc/comment.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<div class="box-comment" id="tabs-facebook" style="background: linear-gradient(to right, #ffff, #ffff);">
|
||||
<div class="fb-comments" data-href="{{ $currentMovie->getUrl() }}" data-width="100%" data-numposts="10"
|
||||
data-order-by="reverse_time" data-colorscheme="light">
|
||||
</div>
|
||||
</div>
|
||||
18
resources/views/themeholy/inc/main_search.blade.php
Normal file
18
resources/views/themeholy/inc/main_search.blade.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<section class="clean-block clean-hero"
|
||||
style="color: rgba(20,20,20,0.85); background: url(/themes/holy/img/MainPoster.webp) center/cover no-repeat; margin-top: -20vh; filter: blur(0px); ">
|
||||
<div class="text" style="margin-top: 20vh;">
|
||||
<h1 style="font-size: calc(1.325rem + 0.9vw);color: rgb(240,190,8);">Thế Giới Phim HD Vietsub</h1>
|
||||
<p style="font-style: italic;font-size: calc(1rem + 0.5vw);">"Từ khóa nào khiến bạn vui?<br>Bộ phim nào cho
|
||||
bạn cảm hứng?"</p>
|
||||
<div style="margin-bottom: 5vh;">
|
||||
<div style="margin-bottom: 5vh;">
|
||||
<form class="me-auto search-form" method="GET" action="/" id="form" target="_self" style="width: 80vw;min-width: 320px;max-width: 600px;">
|
||||
<div class="d-flex align-items-center" style="width: 100%;margin-right: auto;margin-left: auto;">
|
||||
<input class="form-control search-field" type="search" id="search-field-3" name="search"
|
||||
style="width: 100%;min-width: 320px;max-width: 600px;margin-right: auto;margin-left: auto;color: rgb(255,255,255);background: rgba(0,0,0,0.55);border-color: rgb(240,190,8);height: 40px;text-align: center;"
|
||||
placeholder="Tìm Kiếm Phim..." autocomplete="off" value="{{ request('search') }}"></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
41
resources/views/themeholy/inc/nav.blade.php
Normal file
41
resources/views/themeholy/inc/nav.blade.php
Normal file
@@ -0,0 +1,41 @@
|
||||
@php
|
||||
$logo = setting('site_logo', '');
|
||||
$brand = setting('site_brand', '');
|
||||
$title = isset($title) ? $title : setting('site_homepage_title', '');
|
||||
@endphp
|
||||
|
||||
<nav class="navbar navbar-dark navbar-expand-lg fixed-top clean-navbar"
|
||||
style="color: rgba(33,37,41,0.2);background: rgba(0,0,0,0.3);">
|
||||
<div class="container">
|
||||
<a class="navbar-brand logo" href="/" style="color: rgb(240,190,12);font-size: calc(1.325rem + 0.6vw);">
|
||||
@if ($logo)
|
||||
{!! $logo !!}
|
||||
@else
|
||||
{!! $brand !!}
|
||||
@endif
|
||||
</a>
|
||||
<button data-bs-toggle="collapse" class="navbar-toggler" data-bs-target="#navcol-1"><span
|
||||
class="visually-hidden">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
|
||||
<div class="collapse navbar-collapse" id="navcol-1">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
@foreach ($menu as $item)
|
||||
@if (count($item['children']))
|
||||
<li class="nav-item dropdown flex-nowrap" style="margin-top: 0px;">
|
||||
<a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown"
|
||||
href="{{ $item['link'] }}">{{ $item['name'] }}</a>
|
||||
<div class="dropdown-menu dropdown-menu-dark"
|
||||
style="background: linear-gradient(180deg, rgba(0,0,0,0.3), rgba(0,0,0,1.0));">
|
||||
@foreach ($item['children'] as $children)
|
||||
<a class="dropdown-item" href="{{ $children['link'] }}">{{ $children['name'] }}</a>
|
||||
@endforeach
|
||||
</div>
|
||||
</li>
|
||||
@else
|
||||
<li class="nav-item item"><a class="nav-link" href="{{ $item['link'] }}">{{ $item['name'] }}</a>
|
||||
</li>
|
||||
@endif
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
40
resources/views/themeholy/inc/pagination.blade.php
Normal file
40
resources/views/themeholy/inc/pagination.blade.php
Normal file
@@ -0,0 +1,40 @@
|
||||
@if ($paginator->hasPages())
|
||||
<div class="text-center" style="margin-top: 3vh;">
|
||||
{{-- Previous Page Link --}}
|
||||
@if ($paginator->onFirstPage())
|
||||
@else
|
||||
<a class="btn btn-outline-secondary" type="button"
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;"
|
||||
href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">« Previous</a>
|
||||
@endif
|
||||
{{-- Pagination Elements --}}
|
||||
@foreach ($elements as $element)
|
||||
{{-- "Three Dots" Separator --}}
|
||||
@if (is_string($element))
|
||||
<li class="disabled" aria-disabled="true"><span class="">{{ $element }}</span></li>
|
||||
@endif
|
||||
|
||||
{{-- Array Of Links --}}
|
||||
@if (is_array($element))
|
||||
@foreach ($element as $page => $url)
|
||||
@if ($page == $paginator->currentPage())
|
||||
<span aria-current="page"
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;"
|
||||
class="btn btn-outline-warning">{{ $page }}</span>
|
||||
@else
|
||||
<a class="btn btn-outline-secondary" type="button"
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;"
|
||||
href="{{ $url }}">{{ $page }}</a>
|
||||
@endif
|
||||
@endforeach
|
||||
@endif
|
||||
@endforeach
|
||||
{{-- Next Page Link --}}
|
||||
@if ($paginator->hasMorePages())
|
||||
<a class="btn btn-outline-secondary" type="button"
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;"
|
||||
href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">Next »</a>
|
||||
@else
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
7
resources/views/themeholy/inc/random_film.blade.php
Normal file
7
resources/views/themeholy/inc/random_film.blade.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<section style="margin-top: 8vh;">
|
||||
<div class="text-center" style="margin-top: 3vh;">
|
||||
<a class="btn btn-outline-warning" type="button" href="#" style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;">
|
||||
<b>Công Cụ Tìm Kiếm</b>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
26
resources/views/themeholy/inc/section_movies.blade.php
Normal file
26
resources/views/themeholy/inc/section_movies.blade.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<section style="margin-top: 8vh;">
|
||||
<div class="container" style="margin-bottom: 5vh;">
|
||||
<h2 class="display-6 text-warning" style="font-size: calc(1.325rem + 0.9vw);text-align: center;">
|
||||
{{ $item['label'] }}</h2>
|
||||
<p class="text-center text-light" style="font-size: calc(0.8rem + 0.1vw);">{{ $item['description'] }}</p>
|
||||
<hr
|
||||
style="background: linear-gradient(90deg, var(--bs-cyan), var(--bs-yellow)), rgb(255,193,7);transform: scale(1);width: 100%;height: 2px;filter: saturate(200%);">
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<div class="row row-cols-2 row-cols-sm-3 row-cols-md-4 row-cols-lg-4 row-cols-xl-5 row-cols-xxl-5">
|
||||
@foreach ($item['data'] as $movie)
|
||||
@include('themes::themeholy.inc.section_movies_item')
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if ($item['link'] !== '' && $item['link'] !== '#')
|
||||
<div class="text-center" style="margin-top: 3vh;">
|
||||
<a class="btn btn-outline-warning" type="button" href="{{ $item['link'] }}"
|
||||
style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);margin-bottom: 1vh;">
|
||||
<b>Xem Thêm</b>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</section>
|
||||
23
resources/views/themeholy/inc/section_movies_item.blade.php
Normal file
23
resources/views/themeholy/inc/section_movies_item.blade.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<div class="col-md-2.5" style="margin-bottom: 1vh;padding-right: 4px;padding-left: 4px;">
|
||||
<div class="card" style="background: rgb(20,20,20);">
|
||||
<a href="{{$movie->getUrl()}}">
|
||||
<img
|
||||
class="lazy card-img-top w-100 d-block"
|
||||
style="height: 145px"
|
||||
src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
|
||||
data-src="{{ $movie->getPosterUrl() }}" alt="{{$movie->name}} - {{$movie->origin_name}} ({{$movie->publish_year}})">
|
||||
</a>
|
||||
<div class="card-body" style="padding: 10px;padding-right: 1px;padding-left: 1px;">
|
||||
<h4 class="text-truncate card-title" style="text-align: center;color: rgb(255,193,10);font-size: calc(0.8rem + 0.4vw);width: 100%;">
|
||||
{{$movie->name}}
|
||||
</h4>
|
||||
<p class="text-truncate card-text"
|
||||
style="text-align: center;color: rgb(255,255,255);width: 100%;font-size: calc(0.8rem + 0.1vw);">
|
||||
({{$movie->publish_year}})</p>
|
||||
</div>
|
||||
<div class="mx-auto">
|
||||
<a class="btn btn-outline-warning btn-sm" type="button"
|
||||
href="{{$movie->getUrl()}}">Xem Phim</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
22
resources/views/themeholy/inc/section_related.blade.php
Normal file
22
resources/views/themeholy/inc/section_related.blade.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<section style="margin-top: 8vh;">
|
||||
<div class="container" style="margin-bottom: 5vh;">
|
||||
<h2 class="display-6 text-warning" style="font-size: calc(1.325rem + 0.9vw);text-align: center;">Phim cùng thể loại</h2>
|
||||
<p class="text-center text-light" style="font-size: calc(0.8rem + 0.1vw);">Biết đâu bạn thích?</p>
|
||||
<hr style="background: linear-gradient(90deg, var(--bs-cyan), var(--bs-yellow)), rgb(255,193,7);transform: scale(1);width: 100%;height: 2px;filter: saturate(200%);">
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<div class="row row-cols-2 row-cols-sm-3 row-cols-md-4 row-cols-lg-4 row-cols-xl-5 row-cols-xxl-5">
|
||||
|
||||
@foreach ($movie_related as $movie)
|
||||
@include('themes::themeholy.inc.section_movies_item')
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center" style="margin-top: 3vh;">
|
||||
<button class="btn btn-outline-warning" type="button" onclick="location.href='/';" style="margin-right: 1vw;padding-right: 15px;padding-left: 15px;padding-top: 5px;padding-bottom: 5px;font-size: calc(0.6rem + 0.4vw);font-weight: bold;margin-bottom: 1vh;">
|
||||
Công Cụ Tìm Kiếm
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
50
resources/views/themeholy/index.blade.php
Normal file
50
resources/views/themeholy/index.blade.php
Normal file
@@ -0,0 +1,50 @@
|
||||
@extends('themes::themeholy.layout')
|
||||
|
||||
|
||||
@php
|
||||
use VsMov\Core\Models\Movie;
|
||||
$data = Cache::remember('site.movies.latest', setting('site_cache_ttl', 5 * 60), function () {
|
||||
$lists = preg_split('/[\n\r]+/', get_theme_option('latest'));
|
||||
$data = [];
|
||||
foreach ($lists as $list) {
|
||||
if (trim($list)) {
|
||||
$list = explode('|', $list);
|
||||
[$label, $description, $relation, $field, $val, $sortKey, $alg, $limit, $link] = array_merge($list, ['Phim mới cập nhật', '', '', 'type', 'series', 'created_at', 'desc', 8, '/']);
|
||||
try {
|
||||
$data[] = [
|
||||
'label' => $label,
|
||||
'description' => $description,
|
||||
'data' => Movie::when($relation, function ($query) use ($relation, $field, $val) {
|
||||
$query->whereHas($relation, function ($rel) use ($field, $val) {
|
||||
$rel->where($field, $val);
|
||||
});
|
||||
})
|
||||
->when(!$relation, function ($query) use ($field, $val) {
|
||||
$query->where($field, $val);
|
||||
})
|
||||
->orderBy($sortKey, $alg)
|
||||
->limit($limit)
|
||||
->get(),
|
||||
'link' => $link ?: '#',
|
||||
];
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
});
|
||||
|
||||
@endphp
|
||||
|
||||
@section('content')
|
||||
@include('themes::themeholy.inc.main_search')
|
||||
<main class="page landing-page">
|
||||
@foreach ($data as $item)
|
||||
@include('themes::themeholy.inc.section_movies')
|
||||
@endforeach
|
||||
@include('themes::themeholy.inc.random_film')
|
||||
</main>
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
@endpush
|
||||
56
resources/views/themeholy/layout.blade.php
Normal file
56
resources/views/themeholy/layout.blade.php
Normal file
@@ -0,0 +1,56 @@
|
||||
@extends('themes::layout')
|
||||
|
||||
@php
|
||||
$menu = \VsMov\Core\Models\Menu::getTree();
|
||||
@endphp
|
||||
|
||||
@push('header')
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
<link href="{{ asset('/themes/holy/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet" />
|
||||
<link href="{{ asset('/themes/holy/css/fontstyle.css') }}" rel="stylesheet" />
|
||||
<link href="{{ asset('/themes/holy/fonts/simple-line-icons.min.css') }}" rel="stylesheet" />
|
||||
<link href="{{ asset('/themes/holy/css/styles.min.css') }}" rel="stylesheet" />
|
||||
<link href="{{ asset('/themes/holy/css/baguetteBox.min.css') }}" rel="stylesheet" />
|
||||
<link href="{{ asset('/themes/holy/css/custom.css') }}" rel="stylesheet" />
|
||||
{{-- <style>
|
||||
img.lazy {
|
||||
background-image: url('http://jquery.eisbehr.de/lazy/images/loading.gif');
|
||||
background-repeat: no-repeat;
|
||||
background-position: 50% 50%;
|
||||
}
|
||||
</style> --}}
|
||||
@endpush
|
||||
|
||||
@section('body')
|
||||
@include('themes::themeholy.inc.nav')
|
||||
<main class="page landing-page">
|
||||
@yield('content')
|
||||
</main>
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
@endpush
|
||||
|
||||
@section('footer')
|
||||
{!! get_theme_option('footer') !!}
|
||||
|
||||
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
|
||||
integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
|
||||
<!-- cdnjs -->
|
||||
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery.lazy/1.7.9/jquery.lazy.min.js"></script>
|
||||
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery.lazy/1.7.9/jquery.lazy.plugins.min.js">
|
||||
</script>
|
||||
<script>
|
||||
$(function() {
|
||||
$('.lazy').lazy({
|
||||
effect: "fadeIn",
|
||||
effectTime: 2000,
|
||||
threshold: 0
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script defer src="{{ asset('/themes/holy/bootstrap/js/bootstrap.min.js') }}"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/baguettebox.js/1.10.0/baguetteBox.min.js" integrity="sha512-4E202psbZszCpkybu3LZGLZk1Yfi7Mv8AhTzXzyJQ7lDKdXGC0ZJ+39q+PwBjEa9QbEzFyraZ0uab0nnhJ3fNg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="{{ asset('/themes/holy/js/script.min.js') }}"></script>
|
||||
{!! setting('site_scripts_google_analytics') !!}
|
||||
@endsection
|
||||
105
resources/views/themeholy/single.blade.php
Normal file
105
resources/views/themeholy/single.blade.php
Normal file
@@ -0,0 +1,105 @@
|
||||
@extends('themes::themeholy.layout')
|
||||
|
||||
@php
|
||||
$watchUrl = '#';
|
||||
if (!$currentMovie->is_copyright && count($currentMovie->episodes) && $currentMovie->episodes[0]['link'] != '') {
|
||||
$firstWatch = $currentMovie->episodes
|
||||
->sortBy([['server', 'asc']])
|
||||
->groupBy('server')
|
||||
->first()
|
||||
->sortByDesc('name', SORT_NATURAL)
|
||||
->groupBy('name')
|
||||
->last()
|
||||
->sortByDesc('type')
|
||||
->first();
|
||||
$watchUrl = $firstWatch->getUrl();
|
||||
}
|
||||
@endphp
|
||||
|
||||
@section('content')
|
||||
<section class="clean-block clean-hero"
|
||||
style="color: rgba(20,20,20,0.85);background: url({{ $currentMovie->getPosterUrl() }}) center/cover no-repeat;margin-top: -28vh;filter: blur(0px);">
|
||||
<div class="text" style="margin-top: 20vh;width: 80vw;max-width: 1280px;height: auto;">
|
||||
<h1 style="font-size: calc(1.325rem + 0.9vw);color: rgb(240,190,8);">{{ $currentMovie->name }}
|
||||
({{ $currentMovie->publish_year }})</h1>
|
||||
<p style="font-style: italic;font-size: calc(1rem + 0.5vw);">{{ $currentMovie->origin_name }}</p>
|
||||
<div class="mx-auto">
|
||||
<a class="btn btn-outline-warning btn-sm" type="button" href="{{ $watchUrl }}">Xem Phim</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="container" style="margin-top: 1vw;">
|
||||
<div class="text-light block-content">
|
||||
<div class="post-body">
|
||||
|
||||
<h3 style="color: rgb(255,193,7);text-align: justify;">{{ $currentMovie->name }}
|
||||
({{ $currentMovie->publish_year }})</h3>
|
||||
<div class="post-info" style="text-align: justify;"><span
|
||||
style="text-align: justify;"><b>{{ $currentMovie->origin_name }}</b></span>
|
||||
</div>
|
||||
|
||||
<p style="margin-top: 8px;text-align: justify;">
|
||||
<p>
|
||||
{!! $currentMovie->content !!}
|
||||
</p>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<p style="margin-top: 8px;">
|
||||
Lượt Xem: {{ $currentMovie->view_total }}<br />
|
||||
Quốc Gia: {!! $currentMovie->regions->map(function ($region) {
|
||||
return '<a href="' .
|
||||
$region->getUrl() .
|
||||
'" tite="Phim ' .
|
||||
$region->name .
|
||||
' rel="tag"">' .
|
||||
$region->name .
|
||||
'</a>';
|
||||
})->implode(', ') !!} <br />
|
||||
Năm Sản Xuất: {{ $currentMovie->publish_year }}<br />
|
||||
Thể Loại: {!! $currentMovie->categories->map(function ($category) {
|
||||
return '<a href="' .
|
||||
$category->getUrl() .
|
||||
'" tite="Phim ' .
|
||||
$category->name .
|
||||
' rel="tag"">' .
|
||||
$category->name .
|
||||
'</a>';
|
||||
})->implode(', ') !!}<br />
|
||||
|
||||
Diễn viên: {!! $currentMovie->actors->map(function ($actor) {
|
||||
return '<a href="' .
|
||||
$actor->getUrl() .
|
||||
'" tite="Diễn viên ' .
|
||||
$actor->name .
|
||||
' rel="tag"">' .
|
||||
$actor->name .
|
||||
'</a>';
|
||||
})->implode(', ') !!}<br />
|
||||
|
||||
Đạo diễn: {!! $currentMovie->directors->map(function ($director) {
|
||||
return '<a href="' .
|
||||
$director->getUrl() .
|
||||
'" tite="Đạo diễn ' .
|
||||
$director->name .
|
||||
' rel="tag"">' .
|
||||
$director->name .
|
||||
'</a>';
|
||||
})->implode(', ') !!}<br />
|
||||
|
||||
Tags: {!! $currentMovie->tags->map(function ($tag) {
|
||||
return '<a href="' . $tag->getUrl() . '" tite="Phim ' . $tag->name . ' rel="tag"">' . $tag->name . '</a>';
|
||||
})->implode(', ') !!}<br />
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@include('themes::themeholy.inc.comment')
|
||||
</div>
|
||||
|
||||
@include('themes::themeholy.inc.section_related')
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
{!! setting('site_scripts_facebook_sdk') !!}
|
||||
@endpush
|
||||
Reference in New Issue
Block a user