theme-mtyy/resources/views/thememtyy/episode.blade.php
Clemencia John 5b66dae4a9 first commit
2026-04-20 23:23:59 -07:00

486 lines
24 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@extends('themes::thememtyy.layout')
@section('content')
<div class="box-width">
<div class="player-style-2">
<div class="player-top box radius">
<style>.MacPlayer {
width: 100%;
height: 100%;
}
#jwplayer {
height: 100% !important;
}
.active-server {
background: #505054 !important;
}
</style>
<div class="MacPlayer">
<div id="player-wrapper" style="height: 100%!important;"></div>
</div>
</div>
</div>
<div class="player-info cor4">
<div class="fun flex between radius">
<a class="play-tips-bnt item cor5 load-icon-on"><i class="fa r6"></i>Chọn Server</a>
</div>
<div class="tips-box radius none">
<div class="video-info-aux">
@foreach ($currentMovie->episodes->where('slug', $episode->slug)->where('server', $episode->server) as $server)
<a onclick="chooseStreamingServer(this)" data-type="{{ $server->type }}" id="streaming-sv"
data-id="{{ $server->id }}"
data-link="{{ $server->link }}" class="streaming-server tag-link "
style="background: #303033;color: #FFF;padding: 10px;border-radius: 10px;margin: 5px">
Nguồn #{{ $loop->index + 1 }}
</a>
@endforeach
</div>
</div>
<div class="player-info-text cor4 top20 slide-desc-box">
<div class="title">
<h2 class="title-h cor4">
<a target="_self" href="{{ $currentMovie->getUrl() }}" class="ds-line22 more">
<span>{{ $currentMovie->name }}</span>
<span class="this-get"><i class="this-hide">Chi tiết</i><i class="fa ds-jiantouyou"></i></span>
</a>Tập {{ $episode->name }} </h2>
</div>
<div class="this-desc-labels flex">
<span class="this-tag this-b"><i class="focus-item-label-rank">Năm</i>{{ $currentMovie->publish_year }}</span>
</div>
<div class="this-desc-info">
<span class="this-desc-score cor6"><i class="ds-shoucang fa"></i> {{$currentMovie->getRatingStar()}}</span>
{!! $currentMovie->regions->map(function ($region) {
return '<span>' . $region->name . '</span>';
})->implode('') !!}
{!! $currentMovie->directors->map(function ($director) {
return '<span>' . $director->name . '</span>';
})->implode('') !!}
</div>
<div class="rating-content">
<div id="movies-rating-star" style="height: 18px;"></div>
<div style="margin-top: 5px">
({{$currentMovie->getRatingStar()}}
sao
/
{{$currentMovie->getRatingCount()}} đánh giá)
</div>
<div id="movies-rating-msg"></div>
</div>
<div class="this-desc-tags" style="margin-top: 10px">
{!! $currentMovie->tags->map(function ($tag) {
return ' <span>' . $tag->name . '</span>';
})->implode('') !!}
</div>
<div class="this-desc">
<div id="height_limit" class="text">
<em class="cor5">Nội dung</em> {!! strip_tags($currentMovie->content) !!}
</div>
<div class="text-open">
<span class="tim-bnt"><i class="fa r6 ease"></i>Xem thêm</span>
</div>
</div>
<div class="wow fadeInUp wr-list animated" style="visibility: visible; animation-name: fadeInUp;">
<div class="actor-new public-r">
<div class="ds-r-hide actor-roll swiper-initialized swiper-horizontal swiper-pointer-events swiper-backface-hidden">
<ul class="swiper-wrapper">
@foreach($currentMovie->actors as $actor)
<li class="public-list-box public-pic-e swiper-slide swiper-slide-active"
style="width: 146.556px; margin-right: 30px;">
<div class="public-list-div">
<a target="_self" class="public-list-exp"
href="{{$actor->getUrl()}}"
title="{{$actor->name}}">
<img class="lazy lazy3 mask-1 br-100 entered loaded"
alt="{{$actor->name}}"
referrerpolicy="no-referrer"
src=""
data-src=""
data-ll-status="loaded">
</a>
</div>
<div class="public-list-button">
<a target="_self" class="time-title hide ft4"
href="{{$actor->getUrl()}}"
title="{{$actor->name}}">{{$actor->name}}</a>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
<script>
new Swiper('.actor-roll', {
slidesPerView: 6,
slidesPerGroup: 6,
observer: true,
spaceBetween: 8,
navigation: {nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev',},
breakpoints: {
1692: {slidesPerView: 11, slidesPerGroup: 11, spaceBetween: 30,},
1330: {slidesPerView: 9, slidesPerGroup: 9, spaceBetween: 30,},
993: {slidesPerView: 7, slidesPerGroup: 7, spaceBetween: 30,},
560: {slidesPerView: 5, slidesPerGroup: 5, spaceBetween: 15,},
}
});
</script>
</div>
<div class="title flex between top20">
<div class="title-left">
<h4 class="title-h cor4">Danh sách tập</h4>
</div>
</div>
@foreach ($currentMovie->episodes->sortBy([['server', 'asc']])->groupBy('server') as $server => $data)
<div class="anthology-tab nav-swiper top10 swiper-initialized swiper-horizontal swiper-pointer-events swiper-free-mode">
<div class="swiper-wrapper"
style="transition-duration: 300ms; transform: translate3d(0px, 0px, 0px);">
<a class="vod-playerUrl swiper-slide on nav-dt"
role="group"
aria-label="1 / 2"><i class="fa"></i>{{ $server }}</a>
</div>
<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span>
</div>
<div class="player-list-box top20">
<div class="anthology-list select-a">
<div class="anthology-list-box none dx">
<ul class="anthology-list-play size">
@foreach ($data->sortBy('name', SORT_NATURAL)->groupBy('name') as $name => $item)
<li class="box border on ecnav-dt">
<a class="hide cor4" href="{{ $item->sortByDesc('type')->first()->getUrl() }}">
<span>{{ $name }}</span>
@if ($item->contains($episode)) <em class="play-on"><i></i><i></i><i></i><i></i></em> @endif</a>
</li>
@endforeach
</ul>
</div>
</div>
</div>
@endforeach
<div class="ds-comments top20">
<div class="title top10">
<h4 class="title-h cor4">Bình luận</h4>
</div>
<div style="width: 100%; background-color: #fff;margin-top: 10px">
<div class="fb-comments w-full" data-href="{{ $currentMovie->getUrl() }}" data-width="100%"
data-numposts="5" data-colorscheme="light" data-lazy="true">
</div>
</div>
</div>
</div>
</div>
<div class="box-width tv4 wow fadeInUp wr-list">
<div class="title top10">
<h4 class="title-h cor4">Đề xuất</h4>
</div>
<div class="flex wrap border-box public-r hide-b-12">
<div class="ds-r-hide list-swiper-b">
<div class="swiper-wrapper">
@foreach ($movie_related as $movie)
<div class="public-list-box public-pic-b swiper-slide">
<div class="public-list-div public-list-bj">
<a target="_self" class="public-list-exp" href="{{$movie->getUrl()}}"
title="{{$movie->name}}">
<img class="lazy lazy1 gen-movie-img mask-0" referrerpolicy="no-referrer"
src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=="
alt="{{$movie->name}} {{ $movie->origin_name }}"
data-src="{{$movie->getThumbUrl()}}">
<span class="public-bg"></span>
<span class="public-list-prb hide ft2">{{$movie->language}} {{$movie->quality}}</span>
<span class="public-play"><i
class="fa ds-bofang1"></i></span>
</a>
</div>
<div class="public-list-button">
<a target="_self" class="time-title hide ft4" href="{{$movie->getUrl()}}"
title="{{$movie->name}}">{{$movie->name}}</a>
</div>
</div>
@endforeach
</div>
<a class="swiper-button-prev fa ds-fanhui" href="javascript:"></a><a
class="swiper-button-next fa ds-jiantouyou" href="javascript:"></a></div>
</div>
</div>
@endsection
@push('scripts')
<script src="{{ asset('/themes/mtyy/plugins/jquery-raty/jquery.raty.js') }}"></script>
<link href="{{ asset('/themes/mtyy/plugins/jquery-raty/jquery.raty.css') }}" rel="stylesheet" type="text/css"/>
<script>
var rated = false;
$('#movies-rating-star').raty({
score: {{$currentMovie->getRatingStar()}},
number: 10,
numberMax: 10,
hints: ['quá tệ', 'tệ', 'không hay', 'không hay lắm', 'bình thường', 'xem được', 'có vẻ hay', 'hay',
'rất hay', 'siêu phẩm'
],
starOff: '{{ asset('/themes/mtyy/plugins/jquery-raty/images/star-off.png') }}',
starOn: '{{ asset('/themes/mtyy/plugins/jquery-raty/images/star-on.png') }}',
starHalf: '{{ asset('/themes/mtyy/plugins/jquery-raty/images/star-half.png') }}',
click: function (score, evt) {
if (rated) return
fetch("{{ route('movie.rating', ['movie' => $currentMovie->slug]) }}", {
method: 'POST',
headers: {
"Content-Type": "application/json",
'X-CSRF-TOKEN': document.querySelector(
'meta[name="csrf-token"]')
.getAttribute(
'content')
},
body: JSON.stringify({
rating: score
})
});
rated = true;
$('#movies-rating-star').data('raty').readOnly(true);
$('#movies-rating-msg').html(`Bạn đã đánh giá ${score} sao cho phim này!`);
}
});
</script>
<script src="/themes/mtyy/player/js/p2p-media-loader-core.min.js"></script>
<script src="/themes/mtyy/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>
var episode_id = {{ $episode->id }};
const wrapper = document.getElementById('player-wrapper');
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('active-server');
})
el.classList.add('active-server');
link.replace('http://', 'https://');
renderPlayer(type, link, id);
}
function renderPlayer(type, link, id) {
if (type == 'embed') {
if (vastAds) {
wrapper.innerHTML = `<div id="fake_jwplayer"></div>`;
const fake_player = jwplayer("fake_jwplayer");
const objSetupFake = {
key: "{{ Setting::get('jwplayer_license') }}",
aspectratio: "16:9",
width: "100%",
file: "/themes/vung/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 width="100%" height="100%" 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 width="100%" height="100%" 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 width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
allowfullscreen="" allow='autoplay'></iframe>`
fake_player.remove();
});
} else {
if (wrapper) {
wrapper.innerHTML = `<iframe width="100%" height="100%" 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%",
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