fix player, fix install, start implement subtitle selection in episode view

pull/12/head
Chewbaka 2 years ago
parent 3e49afc08a
commit 6f8e985c85

@ -1,4 +1,4 @@
![PHP](https://img.shields.io/badge/PHP->=_5.6-738bd7.svg?style=flat-square)
![PHP](https://img.shields.io/badge/PHP->=_8.0-738bd7.svg?style=flat-square)
![PHP](https://img.shields.io/badge/FuelPhp-1.8.2-8304d7.svg?style=flat-square)
![Extension](https://img.shields.io/badge/Needed-Curl-blue.svg?style=flat-square)
![Database](https://img.shields.io/badge/Needed-MySQL-blue.svg?style=flat-square)
@ -8,7 +8,7 @@
Web Application standalone that provide the management of local users, many server and the libraries.
# Description
With this web application, some one can create an account directly this app.
With this web application, anyone can create an account directly this app.
Every body can add his PlexServer to the list.
When you are connected by default you have access to all servers.
But the admin can manage permission by user or by library like limit of number streaming, the quality and other
@ -20,7 +20,7 @@ With only one interface and without plex.tv registration, everybody can have acc
# Features
- Register and Login without plex.tv account
- Manage some PlexServer to share theirs libraries
- Manage permission to limit acces to the users
- Manage permission to limit access to the users
# Tehcnologies
- MySQL

@ -5,7 +5,7 @@
"keywords": ["application", "website", "development", "framework", "PHP", "PHP7"],
"license": "MIT",
"require": {
"php": ">=5.6.33",
"php": ">=8.0",
"composer/installers": "~1.0",
"fuel/core": "dev-1.9/develop",
"fuel/auth": "1.8.*",
@ -15,10 +15,11 @@
"fuel/parser": "1.8.*",
"fuelphp/upload": "2.0.6",
"monolog/monolog": "^1.18",
"phpseclib/phpseclib": "2.0.31",
"phpseclib/phpseclib": "2.0.0",
"michelf/php-markdown": "1.7.0"
},
"require-dev": {
"roave/security-advisories": "dev-latest",
"fuel/docs": "1.8.*"
},
"suggest": {

@ -27,10 +27,12 @@ class Controller_Episode extends Controller_Home
$seasons = $episode->getTvShow()->getSeasons();
$episodes = $episode->getSeason()->getEpisodes();
$subtitles = $episode->getMetaData()['Stream']['SubTitle'];
$body->set('episode', $episode);
$body->set('seasons', $seasons);
$body->set('episodes', $episodes);
$body->set('subtitles', $subtitles);
$this->template->body = $body;
}

@ -12,6 +12,16 @@ use function PHPSTORM_META\type;
class Controller_Rest_Install extends Controller_Rest
{
public function before()
{
parent::before();
$lock = Config::load('lock', true);
if($lock)
Response::redirect('/login');
}
public function post_require()
{
$result = [];
@ -562,13 +572,11 @@ class Controller_Rest_Install extends Controller_Rest
{
try {
$url = Input::post('url');
//@TODO CHECK AND REMOVE HTTP AND HTTPS
$https = Input::post('https');
$port = Input::post('port');
$token = Input::post('token');
$curl = Request::forge('http://' . $url . ($port ? ':' . $port : '') . '/?X-Plex-Token=' . $token, 'curl');
$curl = Request::forge(($https === '1' ? 'https' : 'http') . '://' . $url . ($port ? ':' . $port : '') . '/?X-Plex-Token=' . $token, 'curl');
$result = $curl->execute();
if(!$result)
@ -578,8 +586,8 @@ class Controller_Rest_Install extends Controller_Rest
$server = Model_Server::forge();
$server->set([
'user_id' => $user->id,
'https' => 0,
'user_id' => $user->id,
'https' => (int)$https,
'url' => $url,
'port' => (int)$port,
'token' => $token,

@ -1,14 +1,16 @@
<?php
use Fuel\Core\Controller_Rest;
use Fuel\Core\File;
use Fuel\Core\Input;
use Fuel\Core\Num;
use Fuel\Core\Session;
use Fuel\Core\View;
use Fuel\Core\FuelException;
class Controller_Rest_Movie extends Controller_Rest
class Controller_Rest_Movie extends Controller_Rest_Index
{
public function get_stream()
public function get_stream(): object
{
try {
@ -20,18 +22,22 @@ class Controller_Rest_Movie extends Controller_Rest
/** @var Model_Movie $movie */
$movie = Model_Movie::find_by_pk($movie_id);
if (!$movie)
if (!$movie) {
throw new FuelException('No movie found');
}
if (!Model_Permission::isGranted('RIGHT_WATCH_DISABLED', $movie->getLibrary()))
if (!Model_Permission::isGranted('RIGHT_WATCH_DISABLED', $movie->getLibrary())) {
throw new FuelException('You dont have the permission to watch in this library!');
}
$user_settings = Model_Setting::find_one_by('user_id', Session::get('user')->id);
if ($movie->type !== 'movie')
$episodes = $movie->getSeason()->getEpisodes();
else
if ($movie->type !== 'movie') {
$episodes = $movie->getSeason()?->getEpisodes();
}
else {
$episodes = [$movie];
}
$view = View::forge('player/index');
@ -64,7 +70,7 @@ class Controller_Rest_Movie extends Controller_Rest
'movie_id' => $movie_id,
'ended_time' => $totaltime,
'watching_time' => $timeplay,
'is_ended' => ($isFinish === 'true' ? true : false)
'isFinish' => ($isFinish === 'true' ? true : false)
]);
$watching->save();
@ -75,4 +81,66 @@ class Controller_Rest_Movie extends Controller_Rest
return $this->response($exception->getMessage(), 500);
}
}
}
public function get_download() {
try {
$movie_id = Input::get('movie_id');
if (!$movie_id)
throw new FuelException('No movie id');
/** @var Model_Movie $movie */
$movie = Model_Movie::find_by_pk($movie_id);
if (!$movie)
throw new FuelException('No movie found');
if ( !Model_Permission::isGranted('RIGHT_DOWNLOAD_DISABLED', $movie->getLibrary()) )
throw new FuelException('You dont have the permission to watch in this library!');
$url = $movie->getDownloadLink();
$filename = '';
$size = 0;
if(isset($this->metadata['Media'][0])) {
$filename = $movie->getMetaData()['Media'][0]['Part']['@attributes']['file'];
$size = $movie->getMetaData()['Media'][0]['Part']['@attributes']['size'];
} else {
$filename = $movie->getMetaData()['Media']['Part']['@attributes']['file'];
$size = $movie->getMetaData()['Media']['Part']['@attributes']['size'];
}
$filename = explode('/', $filename);
$filename = $filename[count($filename) - 1];
ini_set('memory_limit', -1);
ini_set('max_execution_time', -1);
ini_set('max_input_time', -1);
$this->headers = array (
'Cache-Control' => 'no-cache, no-store, max-age=0, must-revalidate',
'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT',
'Pragma' => 'no-cache',
"Content-Description" => "File Transfer",
"Content-Transfer-Encoding" => "binary",
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'inline; attachment; filename="'.$filename.'"',
'Content-Length' => $size
);
if(!File::exists(APPPATH.'tmp/'.$filename)) {
$file = file_get_contents($url);
File::create(APPPATH . 'tmp/', $filename, $file);
}
$file_info = File::file_info(APPPATH.'tmp/'.$filename);
File::download(APPPATH.'tmp/'.$filename, $filename, $file_info['mimetype'], null, true);
} catch (Exception $exception) {
return $this->response($exception->getMessage(), 500);
}
}
}

@ -58,9 +58,9 @@ class Server
public function checkNotFound()
{
$this->_checkMovies();
$this->_checkSeasons();
$this->_checkTvShows();
$this->_checkSeasons();
$this->_checkMovies();
}
private function _checkMovies()
@ -89,6 +89,7 @@ class Server
$curl->execute();
} catch (RequestStatusException $exception) {
$movie->set([
'updatedAt' => time(),
'disable' => 1
]);
@ -256,7 +257,5 @@ class Server
foreach ($seasons as $season) {
Model_Season::getMovies($server,$season);
}
//$this->browseMovies($server);
}
}

@ -228,14 +228,24 @@
</span>
</div>
</div>
<div class="PrePlayDetailsGroupItem-groupItem-3Tut9">
<div id="current-sub-titles" class="PrePlayDetailsGroupItem-groupItem-3Tut9">
<div class="PrePlayDetailsGroupItem-label-2Ee43"><?php echo __('subtitles'); ?></div>
<div class="PrePlayDetailsGroupItem-content-1aRNU">
<span>
<?php if(count($episode->getMetaData()['Stream']['SubTitle']) > 0): ?>
<?php echo isset($episode->getMetaData()['Stream']['SubTitle'][0]['language']) ? $episode->getMetaData()['Stream']['SubTitle'][0]['language'] : ''; ?>
<span class="DashSeparator-separator-2a3yn"></span>
<?php echo isset($episode->getMetaData()['Stream']['SubTitle'][0]['displayTitle']) ? $episode->getMetaData()['Stream']['SubTitle'][0]['displayTitle'] : $movie->getMetaData()['Stream']['SubTitle'][0]['title']; ?>
<?php if(count($subtitles) > 0): ?>
<?php if(count($subtitles) > 1): ?>
<button aria-haspopup="true" id="id-248" role="button" class="DisclosureArrowButton-disclosureArrowButton-3tbYZ DisclosureArrowButton-medium-3-Y37 DisclosureArrowButton-isSelected-oswRN Link-link-2XYrU Link-default-32xSO Link-isSelected-3GpAs " type="button">
<?php echo isset($episode->getMetaData()['Stream']['SubTitle'][0]['language']) ? $episode->getMetaData()['Stream']['SubTitle'][0]['language'] : ''; ?>
<span class="DashSeparator-separator-2a3yn"></span>
<?php echo isset($episode->getMetaData()['Stream']['SubTitle'][0]['displayTitle']) ? $episode->getMetaData()['Stream']['SubTitle'][0]['displayTitle'] : $movie->getMetaData()['Stream']['SubTitle'][0]['title']; ?>
<div class="DisclosureArrowButton-disclosureArrow-34Wg3 DisclosureArrow-disclosureArrow-1sBFv DisclosureArrowButton-down-bd2wx DisclosureArrowButton-medium-3-Y37 DisclosureArrow-down-1U7WW DisclosureArrow-up-rjGpc DisclosureArrow-default-3_FCW DisclosureArrow-medium-3VjTd DisclosureArrow-isSelected-VMAVr"></div>
</button>
<?php else: ?>
<?php echo isset($episode->getMetaData()['Stream']['SubTitle'][0]['language']) ? $episode->getMetaData()['Stream']['SubTitle'][0]['language'] : ''; ?>
<span class="DashSeparator-separator-2a3yn"></span>
<?php echo isset($episode->getMetaData()['Stream']['SubTitle'][0]['displayTitle']) ? $episode->getMetaData()['Stream']['SubTitle'][0]['displayTitle'] : $movie->getMetaData()['Stream']['SubTitle'][0]['title']; ?>
<?php endif; ?>
<?php else: ?>
<?php echo __('none'); ?>
<?php endif;?>
@ -280,6 +290,7 @@
<div class="Measure-shrinkContent-32Udi Measure-expandContent-1JQfL"></div>
</div>
</div>
<div class="Menu-select-season hidden" style="position: absolute; top: 60px;">
<div id="id-1865">
<div role="menu" class="MenuContainer-menu-3Gtlw MenuContainer-medium-2XOYJ">
@ -303,6 +314,9 @@
<a role="menuitem" href="/episode/<?php echo $one_episode->id; ?>" class="<?php echo $one_episode->id === $episode->id ? 'SelectedMenuItem-isSelected-3zuEi' : ''; ?> MenuItem-menuItem-25266 MenuItem-default-tX5Cl Link-link-2XYrU Link-default-32xSO">
<div class="SelectedMenuItem-menuItemContainer-7SpJZ">
<div class="SelectedMenuItem-menuLabel-1tKeW"><?php echo $one_episode->number; ?> - <?php echo $one_episode->title; ?></div>
<?php if ($one_episode->id === $episode->id) : ?>
<div class="SelectedMenuItem-selectedIcon-3S2cy"><i class="plex-icon-selected-560" aria-hidden="false" aria-label="Sélectionné(e)"></i></div>
<?php endif; ?>
</div>
</a>
<?php endforeach; ?>
@ -310,6 +324,44 @@
</div>
</div>
</div>
<div class="Menu-select-subtitle hidden" style="position: fixed; top: 420px; left: 520px; will-change: transform;" x-placement="bottom-start">
<div data-reactroot="" id="id-25">
<div role="menu" class="MenuContainer-menu-3Gtlw MenuContainer-large-1Hnrd">
<div class="Menu-menuScroller-E0NwY Scroller-vertical-1bgGS Scroller-scroller-d5-b- Scroller-vertical-1bgGS Scroller-auto-3t4gM" style="max-height: 550px;">
<button role="menuitem" class=" MenuItem-menuItem-25266 MenuItem-default-tX5Cl Link-link-2XYrU Link-default-32xSO" type="button">
<div class="SelectedMenuItem-menuItemContainer-7SpJZ">
<div class="SelectedMenuItem-menuLabel-1tKeW">
<span>
<span>
Aucun
</span>
</span>
</div>
</div>
</button>
<?php foreach ($subtitles as $subtitle) : ?>
<button role="menuitem" class="<?php echo isset($subtitle['selected']) ? 'SelectedMenuItem-isSelected-3zuEi' : ''; ?> MenuItem-menuItem-25266 MenuItem-default-tX5Cl Link-link-2XYrU Link-default-32xSO" type="button">
<div class="SelectedMenuItem-menuItemContainer-7SpJZ">
<div class="SelectedMenuItem-menuLabel-1tKeW">
<span>
<span>
<?php echo $subtitle['displayTitle']; ?>
</span>
</span>
</div>
<?php if(isset($subtitle['selected'])): ?>
<div class="SelectedMenuItem-selectedIcon-3S2cy"><i class="plex-icon-selected-560" aria-hidden="false" aria-label="Sélectionné(e)"></i></div>
<?php endif; ?>
</div>
</button>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(window).on('load', function() {
/** READ MORE **/
@ -338,6 +390,16 @@
$('.Menu-select-episode').css('left', $(this).position().left + 'px');
$('.Menu-select-episode').toggleClass('hidden');
});
/** SHOW SUB-TITLE LIST **/
$('#id-248').on('click', function (event) {
event.stopPropagation();
$(this).find('.DisclosureArrow-disclosureArrow-1sBFv').toggleClass('DisclosureArrowButton-down-bd2wx DisclosureArrowButton-up-2fzdj');
$('.Menu-select-subtitle').css('left', $(this).position().left + 240 + 'px');
$('.Menu-select-subtitle').css('top', $(this).position().top + 150 + 'px');
$('.Menu-select-subtitle').toggleClass('hidden');
});
$(document).on('mouseup', function() {
if($('.Menu-select-season').css('display') !== 'none')
$('.PageHeaderBreadcrumbButton-button-1uaPj.Season').click();

@ -323,6 +323,17 @@
<div class="PageHeader-pageHeader-18RSw">
Plex information:
</div>
<div>
<label class="FormLabel-label-1sr1f" style="width: 50px; display: inline-block;" for="https">
HTTPS:
</label>
<div style="display: inline-block;">
<label class="switch">
<input id="https" name="https" type="checkbox" />
<span class="slider round"></span>
</label>
</div>
</div>
<div>
<label class="FormLabel-label-1sr1f " for="url">
Plex URL:

@ -360,4 +360,4 @@
$('.MetadataListPageContent-metadataListScroller-1uFgY.MetadataListPageContent-hasGutter-1EfyE.Scroller-scroller-d5-b-.Scroller-vertical-1bgGS').scroll();
});
</script>
</script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -201,11 +201,11 @@ function launchPlayer(view) {
$('.AudioVideoPlaybackSettings-container-2pTAj.AudioVideoStripeContainer-container-MI02O').css('transform', 'translateY(246px)');
});
/** MOUSE MOVE ON PLAYER KEEP VISIBLE NAVBAR **/
$(document).on('mousemove', '#divVideo, #movie_stream, button[role="playCenter"]', function () {
$(document).on('mousemove', '#movie_stream, button[role="playCenter"]', function () {
$('button[role="playCenter"], #movie_stream, video').css('cursor', 'pointer');
$('button[role="playCenter"], .AudioVideoFullPlayer-topBar-2XUGM, .AudioVideoFullPlayer-bottomBar-2yixi').mouseover();
lastTimeMouseMoved = new Date().getTime();
timeout = setInterval(function() {
timeout = setTimeout(function() {
var currentTime = new Date().getTime();
if ((currentTime - lastTimeMouseMoved) > 1000) {
$('button[role="playCenter"], #movie_stream, video').css('cursor', 'none');

Loading…
Cancel
Save