Update cache time, add cache to home page, fixe some errors, add permission watch on movie/tv show, update home movie/tv show from plex server, update install

pull/9/head
root 4 years ago
parent e13fc24d45
commit b8b98c2754

@ -21,10 +21,10 @@ class Controller_Home extends Controller_Template
if(null === $user)
Response::redirect('/login');
$server = $sessionServer ? Model_Server::find_by_pk($sessionServer->id) : (Model_Server::find_one_by('user_id', $user->id) ?: Model_Server::find_by([
$server = $sessionServer ? Model_Server::find_by_pk($sessionServer->id) : (Model_Server::find_one_by('user_id', $user->id) ?: Model_Server::find_one_by([
['online', '=', 1],
['disable', '=', 0],
], null, null, 10)[0]
], null, null)[0]
);
if(!$server)
@ -73,7 +73,7 @@ class Controller_Home extends Controller_Template
$episodes = $this->template->MenuServer->getThirtyLastedTvShows();
$movies = $this->template->MenuServer->getThirtyLastedMovies($this->template->MenuServer);
$movies = $this->template->MenuServer->getThirtyLastedMovies();
$body->set('episodes', $episodes);
$body->set('movies', $movies);

@ -161,7 +161,7 @@ class Controller_Rest_Install extends Controller_Rest
'title' => array('constraint' => 255, 'type' => 'varchar'),
'contentRating' => array('constraint' => 255, 'type' => 'varchar', 'null' => true),
'summary' => array('type' => 'text', 'null' => true),
'rating' => array('constraint' => 3, 'type' => 'varchar', 'null' => true),
'rating' => array('constraint' => 4, 'type' => 'varchar', 'null' => true),
'year' => array('constraint' => 11, 'type' => 'int', 'null' => true),
'thumb' => array('constraint' => 255, 'type' => 'varchar', 'null' => true),
'art' => array('constraint' => 255, 'type' => 'varchar', 'null' => true),
@ -217,7 +217,7 @@ class Controller_Rest_Install extends Controller_Rest
'title' => array('constraint' => 255, 'type' => 'varchar'),
'originalTitle' => array('constraint' => 255, 'type' => 'varchar', 'null' => true),
'summary' => array('type' => 'text', 'null' => true),
'rating' => array('constraint' => 3, 'type' => 'varchar', 'null' => true),
'rating' => array('constraint' => 4, 'type' => 'varchar', 'null' => true),
'year' => array('constraint' => 11, 'type' => 'int', 'null' => true),
'thumb' => array('constraint' => 255, 'type' => 'varchar', 'null' => true),
'art' => array('constraint' => 255, 'type' => 'varchar', 'null' => true),
@ -273,7 +273,7 @@ class Controller_Rest_Install extends Controller_Rest
'id' => array('constraint' => 36, 'type' => 'varchar'),
'permission_id' => array('constraint' => 36, 'type' => 'varchar'),
'library_id' => array('constraint' => 36, 'type' => 'varchar'),
'value' => array('constraint' => 36, 'type' => 'varchar'),
'value' => array('constraint' => 36, 'type' => 'varchar', 'null' => true),
'disable' => array('constraint' => 1, 'type' => 'int', 'default' => 0)
),
array('id'), false, 'InnoDB', 'utf8_unicode_ci'
@ -493,11 +493,11 @@ class Controller_Rest_Install extends Controller_Rest
$logs .= 'Foreign key create!'."\r\n";
DB::insert('permission',['name', 'parameters'])
->values(['RIGHT_WATCH'])
->values(['RIGHT_WATCH_DISABLED'])
->values(['RIGHT_MAX_WATCH', 1])
->values(['RIGHT_MAX_QUALITY', 1])
->values(['RIGHT_MAX_CONCURRENT_STREAM', 1])
->values(['RIGHT_DOWNLOAD', 1])
->values(['RIGHT_DOWNLOAD_DISABLED'])
->values(['RIGHT_MAX_DOWNLOAD', 1])
;

@ -11,6 +11,7 @@ class Controller_Rest_Movie extends Controller_Rest
public function get_stream()
{
try {
$movie_id = Input::get('movie_id');
if (!$movie_id)
@ -21,6 +22,9 @@ class Controller_Rest_Movie extends Controller_Rest
if (!$movie)
throw new FuelException('No movie found');
if(!Model_Permission::isGranted('RIGHT_WATCH_DISABLED', $movie))
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')

@ -46,9 +46,9 @@ class Controller_Settings extends Controller_Template
;
});
$this->template->countServers = count($servers);
$this->template->countServers = $servers ? count($servers) : 0;
$this->template->countLibraries = count($libraries);
$this->template->countLibraries = $libraries ? count($libraries): 0;
$this->template->servers = $servers;
@ -96,6 +96,7 @@ class Controller_Settings extends Controller_Template
$body = View::forge('settings/servers');
$body->set('countServers',$this->template->countServers);
$body->set('servers', $this->template->servers);
$body->set('user', Session::get('user'));

@ -13,6 +13,7 @@ class Controller_Settings_Libraries extends Controller_Settings
$body = View::forge('settings/libraries');
$body->set('countLibraries', $this->template->countLibraries);
$body->set('libraries', $this->template->libraries);
$body->set('user', Session::get('user'));
@ -29,6 +30,11 @@ class Controller_Settings_Libraries extends Controller_Settings
$library_id = $this->param('library_id');
$library = Model_Library::find_by_pk($library_id);
if($library === null)
Response::redirect('/settings/libraries');
$permissions = Model_Permission::find_all();
$library_permissions = Model_Library_Permission::find_by('library_id', $library_id);
@ -44,7 +50,7 @@ class Controller_Settings_Libraries extends Controller_Settings
$library_permissions = $temp;
$body->set('library_id', $library_id);
$body->set('library', $library);
$body->set('permissions', $permissions);
$body->set('library_permissions', $library_permissions);
$body->set('user', Session::get('user'));

@ -145,13 +145,13 @@ class Model_Movie extends Model_Overwrite
try {
$curl->execute();
} catch (Exception $exception) {
Cache::set($this->id . $path_cache, null);
Cache::set($this->id . $path_cache, null, 24 * 60 * 60);
}
if ($curl->response()->status !== 200)
return false;
Cache::set($this->id . $path_cache, $curl->response()->body);
Cache::set($this->id . $path_cache, $curl->response()->body, 24 * 60 * 60);
}
public function getThumb($width = null, $height = null)
@ -254,7 +254,7 @@ class Model_Movie extends Model_Overwrite
}
}
Cache::set($this->id . '.metadata', $this->metadata);
Cache::set($this->id . '.metadata', $this->metadata, 7 * 24 * 60 * 60);
return $this->metadata;
} catch (Exception $exception) {
throw new FuelException($exception->getMessage(),$exception->getCode());
@ -375,7 +375,7 @@ class Model_Movie extends Model_Overwrite
|| (!isset($this->metadata['Media']['Part']) && !isset($this->metadata['Media'][0]['Part']))
|| (!isset($this->metadata['Media']['Part']['@attributes']) && !isset($this->metadata['Media'][0]['Part']['@attributes']))
|| (!isset($this->metadata['Media']['Part']['@attributes']['key']) && !isset($this->metadata['Media'][0]['Part']['@attributes']['key'])) ) {
Cache::set($this->id . '.download', null);
Cache::set($this->id . '.download', null,24 * 60 * 60);
return null;
}
@ -390,7 +390,7 @@ class Model_Movie extends Model_Overwrite
$this->download = $curl;
Cache::set($this->id . '.download', $curl);
Cache::set($this->id . '.download', $curl, 24 * 60 * 60);
return $this->download;
} catch (Exception $exception) {
throw new FuelException($exception->getMessage(),$exception->getCode());

@ -2,6 +2,15 @@
class Model_Permission extends Model_Overwrite
{
/**
* RIGHT_WATCH_DISABLED
* RIGHT_DOWNLOAD_DISABLED
* RIGHT_MAX_DOWNLOAD
* RIGHT_MAX_WATCH
* RIGHT_MAX_QUALITY
* RIGHT_MAX_CONCURRENT_STREAM
*/
protected static $_table_name = 'permission';
protected static $_primary_key = 'id';
protected static $_properties = array(
@ -9,4 +18,76 @@ class Model_Permission extends Model_Overwrite
'name',
'disable'
);
/**
* @param string $permission
* @param Model_Movie $movie
* @return bool
*/
public static function isGranted($permission, Model_Movie $movie)
{
if ($movie === null)
return false;
$library = $movie->getLibrary();
if ($library === null)
return false;
$permission = Model_Permission::find_one_by('name', $permission);
if ($permission === null)
return true;
$library_permission = Model_Library_Permission::find_one_by([
['library_id', '=', $library->id],
['permission_id', '=', $permission->id],
['disable', '=', 0]
]);
if ($library_permission === null)
return true;
if ($permission->name === 'RIGHT_WATCH_DISABLED')
return false;
if ($permission->name === 'RIGHT_DOWNLOAD_DISABLED')
return false;
if ($permission->name === 'RIGHT_MAX_DOWNLOAD') {
/** @TODO IF (NUMBER_DOWNLOAD <= MAX_DOWNLOAD)
* RETURN TRUE
* ELSE
* RETURN FALSE
*/
return true;
}
if ($permission->name === 'RIGHT_MAX_WATCH') {
/** @TODO IF (NUMBER_WATCH <= MAX_WATCH)
* RETURN TRUE
* ELSE
* RETURN FALSE
*/
return true;
}
if ($permission->name === 'RIGHT_MAX_QUALITY') {
/** @TODO IF (VIDEO SETTINGS QUALITY <= MAX_QUALITY)
* RETURN TRUE
* ELSE
* RETURN FALSE
*/
return true;
}
if ($permission->name === 'RIGHT_MAX_CONCURRENT_STREAM') {
/** @TODO IF (VIDEO SETTINGS QUALITY <= MAX_QUALITY)
* RETURN TRUE
* ELSE
* RETURN FALSE
*/
return true;
}
}
}

@ -104,7 +104,7 @@ class Model_Season extends Model_Overwrite
if ($curl->response()->status !== 200)
return false;
Cache::set($this->id . $path_cache, $curl->response()->body);
Cache::set($this->id . $path_cache, $curl->response()->body, 24 * 60 * 60);
}
/**

@ -1,5 +1,7 @@
<?php
use Fuel\Core\Cache;
use Fuel\Core\CacheNotFoundException;
use Fuel\Core\Database_Query_Builder_Select;
use Fuel\Core\DB;
use Fuel\Core\Debug;
@ -122,6 +124,13 @@ class Model_Server extends Model_Overwrite
public function getThirtyLastedTvShows()
{
try {
$getThirtyLastedTvShows = Cache::get($this->id . '.getThirtyLastedTvShows');
if ($getThirtyLastedTvShows)
return $getThirtyLastedTvShows;
} catch (CacheNotFoundException $e) {
$curl = Request::forge(($this->https === '1' ? 'https' : 'http').'://' . $this->url . ($this->port ? ':' . $this->port : '') . '/hubs/home/recentlyAdded?type=2&X-Plex-Token=' . $this->token, 'curl');
if($this->https) {
@ -151,9 +160,11 @@ class Model_Server extends Model_Overwrite
}
}
Cache::set($this->id . '.getThirtyLastedTvShows', $tvshows, 6 * 60);
return $tvshows;
}catch (Exception $exception){
} catch (Exception $exception){
Debug::dump($exception);
}
@ -188,6 +199,14 @@ class Model_Server extends Model_Overwrite
public function getThirtyLastedMovies()
{
try {
$getThirtyLastedMovies = Cache::get($this->id . '.getThirtyLastedMovies');
if ($getThirtyLastedMovies)
return $getThirtyLastedMovies;
} catch (CacheNotFoundException $e) {
$curl = Request::forge(($this->https === '1' ? 'https' : 'http').'://' . $this->url . ($this->port ? ':' . $this->port : '') . '/hubs/home/recentlyAdded?type=1&X-Plex-Token=' . $this->token, 'curl');
if($this->https) {
@ -212,9 +231,11 @@ class Model_Server extends Model_Overwrite
$movies[] = Model_Movie::find_one_by('plex_key', $movie->key) ?: new Model_Movie();
}
Cache::set($this->id . '.getThirtyLastedMovies', $movies, 6 * 60);
return $movies;
}catch (Exception $exception){
} catch (Exception $exception){
Debug::dump($exception);
}
//return Model_Movie::find(function ($query) use ($server) {

@ -1,19 +0,0 @@
<?php
class Model_Settings extends Model_Overwrite
{
protected static $_table_name = 'user_settings';
protected static $_primary_key = 'id';
protected static $_rules = array(
'user_id' => 'required',
);
protected static $_properties = array(
'id',
'user_id',
'language',
'trailer_type',
'trailer',
'subtitle',
'maxdownloadspeed',
);
}

@ -1,5 +1,7 @@
<?php
use Fuel\Core\Debug;
class Model_Trailer
{
private $_title;
@ -51,10 +53,12 @@ class Model_Trailer
$media = $html->response()->body;
$regex = '/<a id="[a-z0-9_]*" data-id="[a-z0-9]*" data-media-type="movie" data-media-adult="[a-z]*" class="[a-z]*" href="(\/movie\/[\d]*\?language\=us)" title=".*" alt=".*">/i';
$regex = '/<a data-id="[a-z0-9]*" data-media-type="movie" data-media-adult="[a-z]*" class="[a-z]*" href="(\/movie\/[\d]*\?language\=us)">/i';
preg_match($regex, $media, $urls);
//Debug::dump($urls);die();
if (!isset($urls[1]))
return false;

@ -1,6 +1,7 @@
<?php
use Fuel\Core\CacheNotFoundException;
use Fuel\Core\Debug;
use Fuel\Core\FuelException;
class Model_Tvshow extends Model_Overwrite
@ -103,7 +104,7 @@ class Model_Tvshow extends Model_Overwrite
if ($curl->response()->status !== 200)
return false;
Cache::set($this->id . $path_cache, $curl->response()->body);
Cache::set($this->id . $path_cache, $curl->response()->body, 24 * 60 * 60);
}
public function getMetaData()
@ -135,7 +136,7 @@ class Model_Tvshow extends Model_Overwrite
//ROLES
$this->metadata['Role'] = isset($array['Directory']['Role']) ? $array['Directory']['Role'] : null;
Cache::set($this->id . '.metadata', $this->metadata);
Cache::set($this->id . '.metadata', $this->metadata, 7 * 24 * 60 * 60);
return $this->metadata;
}
}

@ -1,14 +1,14 @@
<?php return [
'RIGHT_WATCH' => 'Allow Watch',
'RIGHT_WATCH_DESCRIPTION' => 'Allow use to watch movie/tv show.',
'RIGHT_MAX_WATCH' => 'Max Play in 24H',
'RIGHT_MAX_WATCH_DESCRIPTION' => 'Maximum number to play movie/tv show in 24H.',
'RIGHT_WATCH_DISABLED' => 'Block Watch',
'RIGHT_WATCH_DISABLED_DESCRIPTION' => 'Block user to watch movie/tv show.',
'RIGHT_MAX_WATCH' => 'Max watch in 24H',
'RIGHT_MAX_WATCH_DESCRIPTION' => 'Maximum number to watch movie/tv show in 24H by user.',
'RIGHT_MAX_QUALITY' => 'Stream Quality',
'RIGHT_MAX_QUALITY_DESCRIPTION' => 'The maximum quality to play a move/tv show.',
'RIGHT_MAX_CONCURRENT_STREAM' => 'Concurrent stream ',
'RIGHT_MAX_CONCURRENT_STREAM_DESCRIPTION' => 'Number of concurrent stream allowed.',
'RIGHT_DOWNLOAD' => 'Allow Download',
'RIGHT_DOWNLOAD_DESCRIPTION' => 'Give the permission at user to download movie/tv show.',
'RIGHT_MAX_CONCURRENT_STREAM' => 'Concurrent stream',
'RIGHT_MAX_CONCURRENT_STREAM_DESCRIPTION' => 'Number of concurrent stream allowed by user.',
'RIGHT_DOWNLOAD_DISABLED' => 'Block Download',
'RIGHT_DOWNLOAD_DISABLED_DESCRIPTION' => 'Remove the permission to a user to download movie/tv show.',
'RIGHT_MAX_DOWNLOAD' => 'Max Download',
'RIGHT_MAX_DOWNLOAD_DESCRIPTION' => 'The maximum number of download allow to a use in 24H.',
'RIGHT_MAX_DOWNLOAD_DESCRIPTION' => 'The maximum number of download allow to a user in 24H.',
];

@ -16,4 +16,5 @@
'trailers_type' => 'Cinema Trailers Type',
'trailers_number' => 'Cinema Trailers to Play Before Movies',
'permissions' => 'Permissions',
'last_update' => 'Last Update',
];

@ -357,7 +357,8 @@
}).done(function (view) {
launchPlayer(view);
}).fail(function (data) {
console.error(data);
console.error(data.responseText);
show_alert('error', data.responseText);
});
});
$('.PosterCardImg-imageContainer-1Ar4M[data-movie-id]').each(function (index, element) {

@ -15,7 +15,9 @@
style="visibility: visible;">
<div class="HubCellHeader-hubCellHeader-2pvYN">
<div class="HubCellTitle-hubCellTitle-2abIn">
<a href="#" role="link" class="Link-link-2XYrU Link-default-32xSO"><?php echo strtoupper(__('recently.tv_shows')); ?></a>
<a href="#" role="link" class="Link-link-2XYrU Link-default-32xSO"><?php use Fuel\Core\Debug;
echo strtoupper(__('recently.tv_shows')); ?></a>
<span class="PrePlayStatusButton-statusButton-28XJ7 Button-button--JvPI Button-small-3Zwli"><?php echo $episodes !== null ? count($episodes) : 0; ?></span>
</div>
<div class="HubCell-hubActions-28w1- tv-shows-hubcell">
@ -40,7 +42,7 @@
<?php
$translate = -150;
foreach ($episodes as $episode) :
?>
?>
<div class=" virtualized-cell-3KPHx "
style="position: absolute; width: 127px; height: 260px; transform: translate3d(<?php echo $translate += 152; ?>px, 10px, 0px);">
<div class="MetadataPosterCard-cardContainer-2gRcQ">
@ -68,16 +70,18 @@
<?php endif; ?>
role="link"
class="MetadataPosterCardOverlay-link-1Swhl Link-link-2XYrU Link-default-32xSO">
<button data-id="<?php echo ($episode instanceof Model_Movie) ? $episode->id : ''; ?>"
tabindex="-1"
role="button"
class="MetadataPosterCardOverlay-playButton-1fjhk PlayButton-playButton-3WX8X MetadataPosterCardOverlay-button-M43H- Link-link-2XYrU Link-default-32xSO"
type="button">
<div class="MetadataPosterCardOverlay-playCircle-M67q6 PlayButton-playCircle-3Evfd MetadataPosterCardOverlay-centerCircle-1Mg-s">
<i class="plex-icon-play-560 PlayButton-playIcon-dt3sk"
aria-hidden="true"></i></div>
</button>
</a>
</a>
<?php if ($episode instanceof Model_Movie) : ?>
<button data-id="<?php echo ($episode instanceof Model_Movie) ? $episode->id : ''; ?>"
tabindex="-1"
role="button"
class="MetadataPosterCardOverlay-playButton-1fjhk PlayButton-playButton-3WX8X MetadataPosterCardOverlay-button-M43H- Link-link-2XYrU Link-default-32xSO"
type="button">
<div class="MetadataPosterCardOverlay-playCircle-M67q6 PlayButton-playCircle-3Evfd MetadataPosterCardOverlay-centerCircle-1Mg-s">
<i class="plex-icon-play-560 PlayButton-playIcon-dt3sk"
aria-hidden="true"></i></div>
</button>
<?php endif; ?>
</div>
</div>
</div>

@ -196,8 +196,9 @@
dataType: 'html'
}).done(function(view) {
launchPlayer(view);
}).fail(function(data) {
console.error(data);
}).fail(function (data) {
console.error(data.responseText);
show_alert('error', data.responseText);
});
});
});

@ -1,7 +1,9 @@
<div class="settings-container">
<div class="filter-bar">
<div class="filter-bar-right">
<?php if($countLibraries > 0) : ?>
<button class="toggle-advanced-btn btn btn-sm btn-default refresh"><?php echo __('refresh_libraries'); ?> &nbsp;<i class="glyphicon refresh"></i></button>
<?php endif; ?>
</div>
<span id="primary-server-dropdown" class="dropdown">
<a class="dropdown-toggle" href="#primary-server-dropdown" data-toggle="dropdown">
@ -64,7 +66,9 @@
</h4>
<div class="card-details">
<div class="pull-right">
<div class="last-seen text-muted"><i class="plex-icon-watch-later-560"></i> <?php echo $library->getLastUpdate(); ?></div>
<div class="last-seen text-muted" data-toggle="tooltip" data-original-title="<?php echo __('last_update'); ?>">
<i class="plex-icon-watch-later-560"></i> <?php echo $library->getLastUpdate(); ?>
</div>
<span class="sync-info hidden">
<span class="glyphicon circle-arrow-down sync-icon"></span>
<span class="sync-count">123</span> / <span class="sync-size">456</span>
@ -73,11 +77,6 @@
<span class="version text-muted"><?php echo $library->type; ?></span>
<div class="device-info-container">
<div class="product"><?php echo $library->getServer()->name; ?></div>
<div class="device text-muted"></div>
<div class="platform-info text-muted">
<span class="platform">Linux</span>
<span class="platform-version">Debian 8</span>
</div>
</div>
</div>
</div>
@ -88,6 +87,7 @@
</div>
</div>
</div>
<?php if($countLibraries > 0) : ?>
<script type="text/javascript">
$(window).on('load', function() {
// LIBRARY BUTTON REFRESH
@ -159,4 +159,5 @@
});
});
});
</script>
</script>
<?php endif; ?>

@ -1,5 +1,6 @@
<div class="settings-container">
<div class="filter-bar"></div>
<div class="filter-bar"><?php echo $library->getServer()->name; ?> > <?php echo $library->name; ?></div>
<div class="filter-bar" style="color: darkgrey;">By default a user can do everything without restriction. Use -1 to unlimited and 0 to block.</div>
<?php if ($permissions) : ?>
<?php foreach ($permissions as $permission) : ?>
<div class="SettingsFormSection-sectionWrapper-1-gPg" style="background-color: rgba(0,0,0,0.15); margin-bottom: 15px; border-bottom: 1px solid rgb(97,97,97)">
@ -29,7 +30,7 @@
url: '/rest/library/permission',
method: 'post',
data: {
library_id: '<?php echo $library_id; ?>',
library_id: '<?php echo $library->id; ?>',
right_name: $(this).data('name'),
checked: $(this).is(':checked'),
parameter: $('input[data-permission-name="' + $(this).data('name') + '"]').val()

@ -2,7 +2,9 @@
<div class="filter-bar">
<button class="toggle-advanced-btn btn btn-sm Button-primary-2LQVw pull-left add"
data-placement="top" data-toggle="tooltip" data-original-title="Add server"><i class="glyphicon circle-plus"></i></button>
<?php if ($countServers > 0) : ?>
<button class="toggle-advanced-btn btn btn-sm btn-default pull-right refresh"><?php echo __('refresh_servers'); ?> &nbsp;<i class="glyphicon refresh"></i></button>
<?php endif; ?>
</div>
<div class="devices-container row">
<div class="device-list-container col-sm-12 col-md-12">
@ -35,7 +37,9 @@
<h4 class="name"><?php echo $server->name; ?> <span data-placement="top" data-toggle="tooltip" data-original-title="<?php echo $server->online ? __('online') : __('offline') ; ?>" class="glyphicon <?php echo $server->online ? 'server text-success' : 'server-ban text-danger' ; ?>"></span></h4>
<div class="card-details">
<div class="pull-right">
<div class="last-seen text-muted"><i class="plex-icon-watch-later-560"></i> <?php echo $server->getLastCheck(); ?></div>
<div class="last-seen text-muted" data-toggle="tooltip" data-original-title="<?php echo __('last_update'); ?>">
<i class="plex-icon-watch-later-560"></i> <?php echo $server->getLastCheck(); ?>
</div>
<span class="sync-info hidden">
<span class="glyphicon circle-arrow-down sync-icon"></span>
<span class="sync-count">123</span> / <span class="sync-size">456</span>
@ -95,6 +99,7 @@
setTimeout(function(){location.reload()}, 200);
});
});
<?php if ($countServers > 0) : ?>
// SERVER BUTTON ACTION
$('button.refresh-server-btn').on('click', function () {
var server_id = $(this).data('server-id');
@ -165,5 +170,6 @@
alert_status.html('Browse all your server is GOOD!');
});
});
<?php endif; ?>
});
</script>

@ -1,293 +0,0 @@
<input id="data_movie" type="hidden" data-src="<?php echo $movie->getStreamUrl($user_settings); ?>" data-movie-type="<?php echo $movie->type; ?>"/>
<input id="data_movie_id" type="hidden" data-movie-id="<?php echo $movie->id; ?>" />
<button aria-label="Lire" role="playCenter" type="button"
class="PlayPauseOverlay-playButton-25OfW PlayButton-playButton-3WX8X Link-link-2XYrU Link-default-32xSO"
style="z-index: 0">
<div class="PlayPauseOverlay-playCircle-3ydPY PlayButton-playCircle-3Evfd"><i
class="plex-icon-play-560 PlayPauseOverlay-playIcon-21tOf PlayButton-playIcon-dt3sk"
aria-hidden="true"></i></div>
</button>
<div class="AudioVideoFullPlayer-topBar-2XUGM AudioVideoFullPlayer-bar-dDYeo" style="z-index: 0">
<div class="FullPlayerTopControls-topControls-2gkcE">
<div>
<button aria-label="Réduire le lecteur" title="Réduire le lecteur" data-qa-id="minimizePlayerButton"
role="button"
class="FullPlayerTopControls-topButton-2iGrJ PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO"
type="button"><i class="plex-icon-player-minimize-560" aria-hidden="true"></i></button>
</div>
<div>
<button aria-haspopup="true" id="id-1451" role="button"
class="FullPlayerTopControls-castButton-1CwQ3 FullPlayerTopControls-topButton-2iGrJ PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 DisclosureArrowButton-disclosureArrowButton-3tbYZ DisclosureArrowButton-medium-3-Y37 Link-link-2XYrU Link-default-32xSO"
type="button"><i class="plex-icon-player-companion-cast-560" aria-hidden="true"></i>
<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"></div>
</button>
<button aria-label="Entrer en mode plein écran" title="Entrer en mode plein écran"
data-qa-id="fullscreenButton" role="button"
class="FullPlayerTopControls-topButton-2iGrJ PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO"
type="button"><i class="plex-icon-player-fullscreen-560" aria-hidden="true"></i></button>
</div>
</div>
</div>
<div class="AudioVideoFullPlayer-content-37T7O hidden" style="bottom: 86px;">
<div class="AudioVideoPlayQueue-container-mD38o" style="background: #1b1b1b;">
<div class="AudioVideoFullPlayerContentHeadingContainer-headingContainer-2UyXv">
<div class="AudioVideoFullPlayerContentHeading-heading-1XO9q">Lire la liste de lecture</div>
<div class="AudioVideoPlayQueue-topContainer-3udEG">
<div class="AudioVideoPlayQueue-topLeft-_-AJU">
<span class="AudioVideoPlayQueue-count-1zBsg"><?php echo count($episodes); ?> élément</span>
</div>
</div>
<div class="AudioVideoFullPlayerContentHeadingContainer-divider-1A1d_"></div>
</div>
<div class="AudioVideoPlayQueue-content-28l4x Scroller-vertical-VScFL Scroller-scroller-3GqQc Scroller-vertical-VScFL Scroller-auto-LsWiW" style="overflow-y: auto;">
<?php foreach ($episodes as $episode) : ?>
<div class="AudioVideoPlayQueueItemDragSource-container-3ncn7">
<div class="AudioVideoPlayQueueItem-container-2_nsg AudioVideoPlayQueueItem-isCurrentItem-3g1KW"
data-qa-id="playQueueItem">
<div class="AudioVideoPlayQueueItem-leftContainer-2xVS6">
<div class="EqualizerIcon-equalizer-2SoFA" style="width: 14px; height: 14px;">
<?php if($movie->id === $episode->id) : ?>
<div class="EqualizerIcon-bar-1nPot"
style="left: 0px; width: 3px; background-color: rgb(249, 190, 3); transition-duration: 467.145ms; transform: scaleY(0.9);"></div>
<div class="EqualizerIcon-bar-1nPot"
style="left: 5px; width: 3px; background-color: rgb(249, 190, 3); transition-duration: 409.912ms; transform: scaleY(0.9);"></div>
<div class="EqualizerIcon-bar-1nPot"
style="left: 9.5px; width: 3px; background-color: rgb(249, 190, 3); transition-duration: 477.391ms; transform: scaleY(0.9);"></div>
<?php endif; ?>
</div>
</div>
<div class="AudioVideoPlayQueueItem-metadataContainer-w326I AudioVideoPlayerPlayQueueMetadata-container-sM2h0">
<div class="AudioVideoPlayerPlayQueueMetadata-cardContainer-vcGvj">
<?php if ($episode->type === 'movie') : ?>
<div class="AudioVideoPlayerPlayQueueMetadata-card-18P30 QuickSearchMetadataPosterCard-card-3_XFi MetadataPosterButtonCard-card-2T8TR" style="width: 36px; height: 54px;">
<?php else : ?>
<div class="AudioVideoPlayerPlayQueueMetadata-card-18P30 QuickSearchMetadataPosterCard-card-3_XFi MetadataPosterButtonCard-card-2T8TR" style="width: 64px; height: 36px;">
<?php endif; ?>
<div class="PosterCardImg-imageContainer-1Ar4M">
<?php if ($episode->type === 'movie') : ?>
<div style="background-image: url('/cover/movie?movie_id=<?php echo $episode->id; ?>&width=36&height=54'); background-size: cover; background-position: center center; background-repeat: no-repeat; width: 100%; height: 100%; position: absolute; z-index: 2;"class=""></div>
<?php else : ?>
<div style="background-image: url('/cover/movie?movie_id=<?php echo $episode->id; ?>&width=64&height=36&thumb=true'); background-size: cover; background-position: center center; background-repeat: no-repeat; width: 100%; height: 100%; position: absolute; z-index: 2;"class=""></div>
<?php endif; ?>
</div>
<button aria-label="<?php echo $episode->year; ?>"
data-qa-id="metadataPosterPlayButton" tabindex="-1" role="button"
class="MetadataPosterButtonCard-playButton-aOV1E PlayButton-playButton-3WX8X Link-link-2XYrU Link-default-32xSO "
type="button">
<div class="MetadataPosterButtonCard-playCircle-366hc PlayButton-playCircle-3Evfd">
<i class="plex-icon-play-560 PlayButton-playIcon-dt3sk" aria-hidden="true"></i>
</div>
</button>
</div>
</div>
<div class="AudioVideoPlayerPlayQueueMetadata-titlesContainer-2G9lR" data-qa-id="playQueueTitleContainer">
<a data-qa-id="metadataTitleLink" title="<?php echo $episode->title; ?>" href="<?php echo ($episode->type === 'movie' ? '/movie/' : '/episode/') . $episode->id; ?>"
role="link" class="MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F Link-link-2XYrU Link-default-32xSO"><?php echo $episode->title; ?></a>
<?php if ($episode->type === 'movie') : ?>
<span class=" MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F MetadataPosterTitle-isSecondary-2VUxY "
data-qa-id="metadataYear"><?php echo $episode->year; ?>
</span>
<?php else : ?>
<span class=" MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F MetadataPosterTitle-isSecondary-2VUxY ">
<span>
<a title="Saison 1" href="#" role="link" class=" Link-link-2n0yJ Link-default-2XA2b">S1</a>
<span class="DashSeparator-separator-2a3yn">·</span>
<a title="VOSTFR (BDRip" href="#" role="link" class=" Link-link-2n0yJ Link-default-2XA2b">E26</a>
</span>
<span class="DashSeparator-separator-2a3yn"></span>
<a data-qa-id="metadataTitleLink" title="VOSTFR (BDRip" href="#" role="link" class=" Link-link-2n0yJ Link-default-2XA2b">VOSTFR (BDRip</a>
</span>
<?php endif; ?>
</div>
<div class="AudioVideoPlayQueueItem-metadataDurationContainer-184Jw AudioVideoPlayerPlayQueueMetadata-durationContainer-2dgI9">
<?php echo $episode->getDuration(); ?>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<!-- Quality choice -->
<div class="AudioVideoPlaybackSettings-container-2pTAj AudioVideoStripeContainer-container-MI02O"
style="transform: translateY(246px)">
<div class="AudioVideoPlaybackSettings-title-2MRYF">Configuration de la lecture</div>
<div class="AudioVideoPlaybackSettings-menusContainer-2bvbj" data-qa-id="playbackSettingsContainer">
<div class="AudioVideoSettingsRow-row-2CrSz ">
<div class="AudioVideoSettingsRow-label-2h0yy AudioVideoSettingsRow-cell-24KvK">Qualité</div>
<div class="AudioVideoSettingsRow-cell-24KvK">
<button aria-haspopup="true" id="id-221" data-qa-id="videoQuality" role="button"
class="DisclosureArrowButton-disclosureArrowButton-3tbYZ DisclosureArrowButton-medium-3-Y37 DisclosureArrowButton-isSelected-oswRN Link-link-2XYrU Link-default-32xSO Link-medium-2KGbN Link-isSelected-3GpAs "
type="button">Convertir (Maximum)
<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>
</div>
</div>
<div class="AudioVideoSettingsRow-row-2CrSz ">
<div class="AudioVideoSettingsRow-label-2h0yy AudioVideoSettingsRow-cell-24KvK">Flux Audio</div>
<div class="AudioVideoSettingsRow-cell-24KvK"><span data-qa-id="audioStream">Inconnu
<span class="DashSeparator-separator-2a3yn"></span>MP3 Stéréo
</span></div>
</div>
<div class="AudioVideoSettingsRow-row-2CrSz ">
<div class="AudioVideoSettingsRow-label-2h0yy AudioVideoSettingsRow-cell-24KvK">Sous-titres</div>
<div class="AudioVideoSettingsRow-cell-24KvK"><span><span data-qa-id="subtitleStream">Aucun
</span></span></div>
</div>
</div>
<div class="Measure-scrollContainer-3vb4J">
<div class="Measure-expandContent-1JQfL"></div>
</div>
<div class="Measure-scrollContainer-3vb4J">
<div class="Measure-shrinkContent-32Udi Measure-expandContent-1JQfL"></div>
</div>
</div>
<div class="Next hidden" style="position: absolute;bottom: 120px;right: 100px;">
<button name="close" type="button" class="AudioVideoPlayerControls-closeButton-2ULmA btn btn-danger">
<span class="btn-label">Fermer</span>
</button>
<?php foreach ($episodes as $index => $episode) : ?>
<?php if($movie->id === $episode->id && isset($episodes[$index + 1])) : ?>
<button id="next" type="button" class="submit-btn btn btn-primary" data-id="<?php echo $episodes[$index + 1]->id; ?>">
<span class="btn-label">Episode suivant</span>
</button>
<?php endif; ?>
<?php endforeach; ?>
</div>
<div class="AudioVideoFullPlayer-bottomBar-2yixi AudioVideoFullPlayer-bar-dDYeo"
style="bottom: -86px; height: 86px; z-index: 0">
<div class="AudioVideoBottomBar-controlsContainer-2c743">
<div>
<div class="AudioVideoBottomBar-seekBar-2ai3z SeekBar-seekBar-2UK3i Slider-slider-2oLVT Slider-hasAutoHideThumb-tpdhC">
<div class="SeekBar-seekBarTrack-3Gu5R Slider-track-28JOS">
<div class="SeekBar-seekBarBuffer-3bUz9 Slider-secondaryFill-31_05 Slider-fill-35GFq "
style="transform: scaleX(0);"></div>
<div class="SeekBar-seekBarFill-1Lcu0 Slider-fill-35GFq "
style="transform: scaleX(0);"></div>
</div>
<div class="Slider-thumbTrack-21hGV" style="transform: translateX(-100%);">
<button id="buttonTrack" role="slider" aria-valuemin="0"
aria-valuemax="<?php echo $movie->duration; ?>" aria-valuenow="0"
class="Slider-thumb-2QGiU Link-link-2XYrU Link-link-2XYrU Link-default-32xSO"
type="range"></button>
</div>
</div>
</div>
<div class="AudioVideoPlayerControls-controls-OwK1f">
<div class="AudioVideoPlayerControls-buttonGroupLeft-3kwFX AudioVideoPlayerControls-buttonGroup-ShnOa">
<div class="AudioVideoPlayerControls-titlesButtonGroup-2V4Qg AudioVideoPlayerControls-buttonGroup-ShnOa">
<div class="AudioVideoPlayerControls-metadataContainer-3h2Oi AudioVideoPlayerControlsMetadata-container-2PqUx ">
<?php if ($movie->type === 'episode') : ?>
<div class="AudioVideoPlayerControlsMetadata-titlesContainer-1oLik">
<a title="<?php echo $movie->getTvShow()->title; ?>"
href="/tvshow/<?php echo $movie->getTvShow()->id; ?>" role="link"
class=" MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F Link-link-2XYrU Link-default-32xSO">
<?php echo $movie->getTvShow()->title; ?>
</a>
<span class=" MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F MetadataPosterTitle-isSecondary-2VUxY ">
<span>
<a title="Saison <?php echo $movie->getSeason()->number; ?>"
href="/season/<?php echo $movie->getSeason()->id; ?>" role="link"
class=" Link-link-2XYrU Link-default-32xSO">S<?php echo $movie->getSeason()->number; ?></a>
<span class="DashSeparator-separator-2a3yn">·</span>
<a title="<?php echo $movie->title; ?>" href="#" role="link"
class=" Link-link-2XYrU Link-default-32xSO">E<?php echo $movie->number; ?></a>
</span>
<span class="DashSeparator-separator-2a3yn"></span>
<a data-qa-id="metadataTitleLink" title="<?php echo $movie->title; ?>" href="#"
role="link" class=" Link-link-2XYrU Link-default-32xSO">
<?php echo $movie->title; ?>
</a>
</span>
</div>
<?php else : ?>
<div class="AudioVideoPlayerControlsMetadata-titlesContainer-1oLik">
<a title="<?php echo $movie->title; ?>" href="/movie/<?php echo $movie->id; ?>"
role="link"
class=" MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F Link-link-2XYrU Link-default-32xSO">
<?php echo $movie->title; ?>
</a>
<span class="MetadataPosterTitle-singleLineTitle-24_DN MetadataPosterTitle-title-3tU5F MetadataPosterTitle-isSecondary-2VUxY ">
<?php echo $movie->year; ?>
</span>
</div>
<?php endif; ?>
</div>
</div>
<div class="AudioVideoPlayerControls-durationContainer-3TK0D">
<button data-qa-id="mediaDuration" role="button"
class="DurationRemaining-container-1F4w8 Link-link-2XYrU Link-default-32xSO"
type="button"><span class="media-time">00:00</span> / <span
class="media-duration"><?php echo $movie->getDurationMovie(); ?></span></button>
</div>
</div>
<div class="AudioVideoPlayerControls-buttonGroupCenter-Vok98 AudioVideoPlayerControls-buttonGroup-ShnOa">
<button aria-label="Répéter" title="Répéter" data-qa-id="repeatButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-repeat-560" aria-hidden="true"></i></button>
<button aria-label="Précédent" title="Précédent" data-qa-id="previousButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 IconButton-isDisabled-2Wi5U Link-link-2XYrU Link-default-32xSO isDisabled "
type="button" disabled=""><i class="plex-icon-player-prev-560" aria-hidden="true"></i>
</button>
<button aria-label="Reculer (30 secondes)" title="Reculer (30 secondes)" data-qa-id="skipBackButton"
role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-skip-back-560" aria-hidden="true"></i></button>
<button aria-label="Lire" title="Lire" data-qa-id="resumeButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-play-560" aria-hidden="true"></i></button>
<button aria-label="Avancer (30 secondes)" title="Avancer (30 secondes)"
data-qa-id="skipForwardButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-skip-forward-560" aria-hidden="true"></i></button>
<button aria-label="Suivant" title="Suivant" data-qa-id="nextButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-next-560" aria-hidden="true"></i></button>
<button aria-label="Ordre aléatoire." title="Ordre aléatoire." data-qa-id="shuffleButton"
role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-shuffle-560" aria-hidden="true"></i></button>
</div>
<div class="AudioVideoPlayerControls-buttonGroupRight-17650 AudioVideoPlayerControls-buttonGroup-ShnOa">
<div class="AudioVideoPlayerControls-auxButtons-2YhIh"><span><button aria-label="Plus d'actions"
title="Plus d'actions"
id="id-1453"
data-qa-id="moreButton"
role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i
class="plex-icon-player-more-560" aria-hidden="true"></i></button>
</span>
<button aria-label="Réglages" title="Réglages" data-qa-id="videoSettingsButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-video-settings-560" aria-hidden="true"></i>
</button>
</div>
<div>
<button aria-label="Lire la liste de lecture" title="Lire la liste de lecture"
data-qa-id="playQueueButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-queue-560" aria-hidden="true"></i></button>
<span><button aria-label="Sourdine" title="Sourdine" data-qa-id="volumeButton" role="button"
class="PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-player-volume-high-560"
aria-hidden="true"></i></button><div
class="VolumeSlider-slider-1QXdT Slider-slider-2oLVT Slider-hasAutoHideThumb-tpdhC"><div
class="VolumeSlider-track-2WJDz Slider-track-28JOS"><div
class="VolumeSlider-fill-3XkYy Slider-fill-35GFq"
style="transform: scaleX(1);"></div></div><div
class="Slider-thumbTrack-21hGV" style="transform: translateX(-100%);">
<button id="buttonVolume"
role="slider" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100"
class="Slider-thumb-2QGiU Link-link-2XYrU Link-default-32xSO "
type="range"></button></div></div></span>
<button aria-label="Fermer le Lecteur" title="Fermer le Lecteur" data-qa-id="closeButton"
role="button"
class="AudioVideoPlayerControls-closeButton-2ULmA PlayerIconButton-playerButton-1DmNp IconButton-button-2FVq6 Link-link-2XYrU Link-default-32xSO "
type="button"><i class="plex-icon-close-560" aria-hidden="true"></i></button>
</div>
</div>
</div>
</div>
</div>
Loading…
Cancel
Save