mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-11 07:46:07 -07:00
395 lines
20 KiB
HTML
395 lines
20 KiB
HTML
<%doc>
|
|
USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE
|
|
|
|
For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/
|
|
|
|
Filename: info.html
|
|
Version: 0.1
|
|
Variable names: data [list]
|
|
|
|
data :: Usable parameters (if not applicable for media type, blank value will be returned)
|
|
|
|
== Global keys ==
|
|
rating_key Returns the unique identifier for the media item.
|
|
type Returns the type of media. Either 'movie', 'episode' or 'show' or 'season'.
|
|
art Returns the location of the item's artwork
|
|
title Returns the name of the episode, show, season or movie.
|
|
duration Returns the standard runtime of the media.
|
|
content_rating Returns the age rating for the media.
|
|
summary Returns a brief description of the media plot.
|
|
grandparent_title Returns the name of the TV show.
|
|
parent_index Returns the season number of the TV show.
|
|
index Returns the episode number.
|
|
parent_thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
|
writers Returns an array of writers.
|
|
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
|
parent_title Returns the name of the TV show.
|
|
rating Returns the 5 star rating value for the movie. Between 1 and 5.
|
|
year Returns the release year of the movie.
|
|
genres Returns an array of genres.
|
|
actors Returns an array of actors.
|
|
directors Returns an array of directors.
|
|
studio Returns the name of the studio.
|
|
originally_available_at Returns the air date of the item.
|
|
|
|
DOCUMENTATION :: END
|
|
</%doc>
|
|
|
|
<%inherit file="base.html"/>
|
|
|
|
<%def name="headIncludes()">
|
|
<link rel="stylesheet" href="interfaces/default/css/dataTables.bootstrap.css">
|
|
<link rel="stylesheet" href="interfaces/default/css/dataTables.colVis.css">
|
|
<link rel="stylesheet" href="interfaces/default/css/plexpy-dataTables.css">
|
|
</%def>
|
|
|
|
<%def name="body()">
|
|
% if data:
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div>
|
|
<div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)">
|
|
<div class="summary-wrapper">
|
|
<div class="summary-overlay">
|
|
<div class="row">
|
|
<div class="col-md-9">
|
|
<div class="summary-content-poster hidden-xs hidden-sm">
|
|
% if data['type'] == 'episode':
|
|
<a href="info?item_id=${data['parent_rating_key']}">
|
|
% if data['parent_thumb']:
|
|
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['parent_thumb']}&width=300&height=450&fallback=poster);"></div>
|
|
% else:
|
|
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['grandparent_thumb']}&width=300&height=450&fallback=poster);"></div>
|
|
%endif
|
|
</a>
|
|
% elif data['type'] == 'season':
|
|
<a href="info?item_id=${data['parent_rating_key']}">
|
|
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster);"></div>
|
|
</a>
|
|
% else:
|
|
<div class="poster-face" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster);"></div>
|
|
% endif
|
|
</div>
|
|
<div class="summary-content">
|
|
<div class="summary-content-title">
|
|
% if data['type'] == 'movie':
|
|
<h1>${data['title']}</h1>
|
|
% elif data['type'] == 'season':
|
|
<h1><a href="info?item_id=${data['parent_rating_key']}">${data['parent_title']}</a> (${data['title']})</h1>
|
|
% elif data['type'] == 'episode':
|
|
<h1><a href="info?item_id=${data['grandparent_rating_key']}">${data['grandparent_title']}</a> - ${data['title']}
|
|
(<a href="info?item_id=${data['parent_rating_key']}">Season ${data['parent_index']}</a>, Episode ${data['index']})</h1>
|
|
% else:
|
|
<h1>${data['title']}</h1>
|
|
% endif
|
|
</div>
|
|
% if (data['type'] == 'movie' or data['type'] == 'show' or data['type'] == 'episode') and data['rating']:
|
|
<div id="stars" class="rateit hidden-xs hidden-sm" data-rateit-value=""
|
|
data-rateit-ispreset="true" data-rateit-readonly="true"></div>
|
|
% endif
|
|
<div class="summary-content-details-wrapper">
|
|
<div class="summary-content-director">
|
|
% if (data['type'] == 'episode' or data['type'] == 'movie') and data['directors']:
|
|
Directed by <strong> ${data['directors'][0]}</strong>
|
|
% endif
|
|
</div>
|
|
<div class="summary-content-studio">
|
|
% if (data['type'] == 'show' or data['type'] == 'movie') and data['studio']:
|
|
Studio <strong> ${data['studio']}</strong>
|
|
% endif
|
|
</div>
|
|
<div class="summary-content-airdate">
|
|
% if data['type'] == 'movie':
|
|
Year <strong> ${data['year']}</strong>
|
|
% elif data['type'] == 'show':
|
|
Aired <strong> ${data['year']}</strong>
|
|
% elif data['type'] == 'episode':
|
|
Aired <strong> <span id="airdate">${data['originally_available_at']}</span></strong>
|
|
% endif
|
|
</div>
|
|
<div class="summary-content-duration">
|
|
Runtime <strong> <span id="runtime">${data['duration']}</span> mins</strong>
|
|
</div>
|
|
<div class="summary-content-content-rating">
|
|
% if (data['type'] == 'episode' or data['type'] == 'movie' or data['type'] == 'show') and data['content_rating']:
|
|
Rated <strong> ${data['content_rating']} </strong>
|
|
% endif
|
|
</div>
|
|
</div>
|
|
<div class="summary-content-summary">
|
|
<p> ${data['summary']} </p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="summary-content-people-wrapper hidden-xs hidden-sm">
|
|
% if (data['type'] == 'episode' or data['type'] == 'movie') and data['writers']:
|
|
<div class="summary-content-writers">
|
|
<strong>Written by</strong>
|
|
<ul>
|
|
% for writer in data['writers']:
|
|
% if loop.index < 5:
|
|
<li>
|
|
${writer}
|
|
</li>
|
|
% endif
|
|
% endfor
|
|
</ul>
|
|
</div>
|
|
% endif
|
|
% if (data['type'] == 'movie' or data['type'] == 'show') and data['actors']:
|
|
<div class="summary-content-actors">
|
|
<strong>Starring</strong>
|
|
<ul>
|
|
% for actor in data['actors']:
|
|
% if loop.index < 5:
|
|
<li>
|
|
${actor}
|
|
</li>
|
|
% endif
|
|
% endfor
|
|
</ul>
|
|
</div>
|
|
% endif
|
|
</div>
|
|
<div class="summary-content-people-wrapper hidden-xs hidden-sm">
|
|
% if (data['type'] == 'movie' or data['type'] == 'show') and data['genres']:
|
|
<div class="summary-content-genres">
|
|
<strong>Genres</strong>
|
|
<ul>
|
|
% for genre in data['genres']:
|
|
% if loop.index < 5:
|
|
<li>
|
|
${genre}
|
|
</li>
|
|
% endif
|
|
% endfor
|
|
</ul>
|
|
</div>
|
|
% endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
% if data['type'] == 'movie' or data['type'] == 'episode' or data['type'] == 'show':
|
|
<div class='container-fluid'>
|
|
<div class='row'>
|
|
<div class='col-md-12'>
|
|
<div class='table-card-header'>
|
|
<div class="header-bar">
|
|
<span>Watch History for <strong>${data['title']}</strong></span>
|
|
</div>
|
|
<div class="button-bar">
|
|
<span data-toggle="popover" data-placement="left" data-content="Select rows to delete. Data is deleted upon exiting delete mode." id="delete-message">
|
|
<button class="btn btn-danger" data-toggle="button" aria-pressed="false" autocomplete="off" id="row-edit-mode">
|
|
<i class="fa fa-trash-o"></i> Delete mode
|
|
</button> 
|
|
</span>
|
|
<div class="colvis-button-bar hidden-xs"></div>
|
|
</div>
|
|
</div>
|
|
<div class="table-card-back">
|
|
<table class="display" id="history_table" width="100%">
|
|
<thead>
|
|
<tr>
|
|
<th align='left' id="delete">Delete</th>
|
|
<th align='left' id="time">Time</th>
|
|
<th align='left' id="friendly_name">User</th>
|
|
<th align='left' id="ip_address">IP Address</th>
|
|
<th align='left' id="platform">Platform</th>
|
|
<th align='left' id="title">Title</th>
|
|
<th align='left' id="started">Started</th>
|
|
<th align='left' id="paused_counter">Paused</th>
|
|
<th align='left' id="stopped">Stopped</th>
|
|
<th align='left' id="duration">Duration</th>
|
|
<th align='left' id="percent_complete"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="info-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="info-modal">
|
|
</div>
|
|
<div class="modal fade" id="ip-info-modal" tabindex="-1" role="dialog" aria-labelledby="ip-info-modal">
|
|
</div>
|
|
<div class="modal fade" id="confirm-modal" tabindex="-1" role="dialog" aria-labelledby="confirm-modal">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
|
|
<h4 class="modal-title" id="myModalLabel">Confirm Delete</h4>
|
|
</div>
|
|
<div class="modal-body" style="text-align: center;">
|
|
<p>Are you REALLY sure you want to delete <strong><span id="deleteCount"></span></strong> history item(s)?</p>
|
|
<p>This is permanent and cannot be undone!</p>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-dark" data-dismiss="modal">Cancel</button>
|
|
<button type="button" class="btn btn-danger btn-ok" data-dismiss="modal" id="confirm-delete">Delete</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
% elif data['type'] == 'season':
|
|
<div class='container-fluid'>
|
|
<div class='row'>
|
|
<div class='col-md-12'>
|
|
<div class='table-card-header'>
|
|
<div class="header-bar">
|
|
<span>Episode List for <strong>${data['title']}</strong></span>
|
|
</div>
|
|
</div>
|
|
<div class='table-card-back'>
|
|
<div id="episode-list"></div>
|
|
</div>
|
|
% endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
% else:
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-md-10">
|
|
<h3>Error retrieving item data. This media may not be available in the Plex Media Server database
|
|
anymore.</h3>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
% endif
|
|
</%def>
|
|
|
|
<%def name="javascriptIncludes()">
|
|
<script src="interfaces/default/js/jquery.rateit.min.js"></script>
|
|
<script src="interfaces/default/js/jquery.dataTables.min.js"></script>
|
|
<script src="interfaces/default/js/dataTables.colVis.js"></script>
|
|
<script src="interfaces/default/js/dataTables.bootstrap.min.js"></script>
|
|
<script src="interfaces/default/js/dataTables.bootstrap.pagination.js"></script>
|
|
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
|
|
|
% if data:
|
|
% if data['type'] == 'movie' or data['type'] == 'show' or data['type'] == 'episode':
|
|
<script>
|
|
// Convert rating to 5 star rating type
|
|
var starRating = Math.round(${data['rating']} / 2)
|
|
$('#stars').attr('data-rateit-value', starRating)
|
|
</script>
|
|
% endif
|
|
% if data['type'] == 'movie' or data['type'] == 'episode':
|
|
<script src="interfaces/default/js/tables/history_table.js"></script>
|
|
<script>
|
|
$(document).ready(function () {
|
|
history_table_options.ajax = {
|
|
"url": "get_history",
|
|
type: 'post',
|
|
data: function ( d ) {
|
|
return { 'json_data': JSON.stringify( d ),
|
|
'rating_key': ${data['rating_key']}
|
|
};
|
|
}
|
|
}
|
|
history_table = $('#history_table').DataTable(history_table_options);
|
|
|
|
var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] });
|
|
$(colvis.button()).appendTo('div.colvis-button-bar');
|
|
|
|
clearSearchButton('history_table', history_table);
|
|
|
|
$('#row-edit-mode').on('click', function() {
|
|
$('#delete-message').popover();
|
|
|
|
if ($(this).hasClass('active')) {
|
|
if (history_to_delete.length > 0) {
|
|
$('#deleteCount').text(history_to_delete.length);
|
|
$('#confirm-modal').modal();
|
|
$('#confirm-modal').one('click', '#confirm-delete', function () {
|
|
for (var i = 0; i < history_to_delete.length; i++) {
|
|
$.ajax({
|
|
url: 'delete_history_rows',
|
|
data: { row_id: history_to_delete[i] },
|
|
async: true,
|
|
success: function (data) {
|
|
var msg = "User history purged";
|
|
showMsg(msg, false, true, 2000);
|
|
}
|
|
});
|
|
}
|
|
history_table.draw();
|
|
});
|
|
}
|
|
|
|
$('.delete-control').each(function () {
|
|
$(this).find('button.btn-danger').toggleClass('btn-warning').toggleClass('btn-danger');
|
|
$(this).addClass('hidden');
|
|
});
|
|
|
|
} else {
|
|
history_to_delete = [];
|
|
$('.delete-control').each(function() {
|
|
$(this).removeClass('hidden');
|
|
});
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
% elif data['type'] == 'show':
|
|
<script src="interfaces/default/js/tables/history_table.js"></script>
|
|
<script>
|
|
$(document).ready(function () {
|
|
history_table_options.ajax = {
|
|
"url": "get_history",
|
|
type: 'post',
|
|
data: function ( d ) {
|
|
return { 'json_data': JSON.stringify( d ),
|
|
'grandparent_rating_key': ${data['rating_key']}
|
|
};
|
|
}
|
|
}
|
|
history_table = $('#history_table').DataTable(history_table_options);
|
|
var colvis = new $.fn.dataTable.ColVis(history_table, { buttonText: '<i class="fa fa-columns"></i> Select columns', buttonClass: 'btn btn-dark', exclude: [0, 10] });
|
|
$(colvis.button()).appendTo('div.colvis-button-bar');
|
|
|
|
clearSearchButton('history_table', history_table);
|
|
|
|
$('#row-edit-mode').click(function() {
|
|
if ($(this).hasClass('active')) {
|
|
$('.delete-control').each(function() {
|
|
$(this).addClass('hidden');
|
|
});
|
|
} else {
|
|
$('.delete-control').each(function() {
|
|
$(this).removeClass('hidden');
|
|
});
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
% endif
|
|
|
|
% if data['type'] == 'season':
|
|
<script>
|
|
$.ajax({
|
|
url: 'get_children',
|
|
type: "GET",
|
|
async: true,
|
|
data: { rating_key : ${data['rating_key']} },
|
|
complete: function(xhr, status) {
|
|
$("#episode-list").html(xhr.responseText);
|
|
}
|
|
});
|
|
</script>
|
|
% endif
|
|
<script>
|
|
$("#airdate").html(moment($("#airdate").text()).format('MMM DD, YYYY'));
|
|
$("#runtime").html(millisecondsToMinutes($("#runtime").text(), true));
|
|
</script>
|
|
% endif
|
|
</%def>
|