mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-08-22 06:13:25 -07:00
Merge 97957761c7
into 940c2ae6cd
This commit is contained in:
commit
9e16b6b11b
19 changed files with 139 additions and 28 deletions
|
@ -10,14 +10,15 @@ Variable names: data {dict}
|
|||
data :: Usable parameters
|
||||
|
||||
== Global keys ==
|
||||
session_key Returns a unique session id for the active stream
|
||||
session_key Returns a unique session id for the active stream.
|
||||
rating_key Returns the unique identifier for the media item.
|
||||
media_index Returns the index of the media item.
|
||||
parent_media_index Returns the index of the media item's parent.
|
||||
media_type Returns the type of session. Either 'track', 'episode' or 'movie'.
|
||||
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
||||
bif_thumb Returns the location of the item's bif thumbnail. Use with pms_image_proxy.
|
||||
art Returns the location of the item's artwork
|
||||
art Returns the location of the item's artwork.
|
||||
originally_available_at Returns the air date of the item.
|
||||
progress_percent Returns the current progress of the item. 0 to 100.
|
||||
user Returns the name of the user owning the session.
|
||||
user_id Returns the Plex user id if available.
|
||||
|
@ -62,7 +63,7 @@ DOCUMENTATION :: END
|
|||
% if session is not None:
|
||||
<%
|
||||
from collections import defaultdict
|
||||
from plexpy.helpers import cast_to_int, get_percent, page, short_season
|
||||
from plexpy.helpers import cast_to_int, get_percent, page, short_season, format_date_based_show
|
||||
from plexpy.common import VIDEO_RESOLUTION_OVERRIDES, AUDIO_CODEC_OVERRIDES, EXTRA_TYPES
|
||||
import plexpy
|
||||
%>
|
||||
|
@ -76,6 +77,12 @@ DOCUMENTATION :: END
|
|||
user_href = page('user', data['user_id']) if data['user_id'] else '#'
|
||||
season = short_season(data['parent_title'])
|
||||
%>
|
||||
% if not data['media_index']:
|
||||
<%
|
||||
data['originally_available_at'] = format_date_based_show(data['originally_available_at'])
|
||||
%>
|
||||
% endif
|
||||
|
||||
<div class="dashboard-activity-instance" id="activity-instance-${sk}" data-key="${sk}" data-id="${data['session_id']}"
|
||||
data-rating_key="${data['rating_key']}" data-parent_rating_key="${data['parent_rating_key']}" data-grandparent_rating_key="${data['grandparent_rating_key']}"
|
||||
data-guid="${data['guid']}">
|
||||
|
@ -502,8 +509,12 @@ DOCUMENTATION :: END
|
|||
% if data['media_type'] == 'movie':
|
||||
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
|
||||
% elif data['media_type'] == 'episode':
|
||||
<a href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${season}</a>
|
||||
· <a href="${href}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
|
||||
% if data['media_index']:
|
||||
<a href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${season}</a>
|
||||
· <a href="${href}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
|
||||
% else:
|
||||
<a href="${href}" title="Episode ${data['originally_available_at']}" class="sub-heading">E${data['originally_available_at']}</a>
|
||||
% endif
|
||||
% elif data['media_type'] == 'track':
|
||||
<a id="metadata-parent_title-${sk}" href="${parent_href}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a>
|
||||
% elif data['media_type'] == 'photo':
|
||||
|
|
|
@ -43,7 +43,7 @@ DOCUMENTATION :: END
|
|||
|
||||
from plexpy import notifiers
|
||||
from plexpy.common import MEDIA_TYPE_HEADERS, MEDIA_FLAGS_AUDIO, MEDIA_FLAGS_VIDEO
|
||||
from plexpy.helpers import page, get_percent, cast_to_int, short_season
|
||||
from plexpy.helpers import page, get_percent, cast_to_int, short_season, format_date_based_show
|
||||
|
||||
# Get audio codec file
|
||||
def af(codec):
|
||||
|
@ -83,9 +83,14 @@ DOCUMENTATION :: END
|
|||
<%
|
||||
data = defaultdict(lambda: None, **metadata)
|
||||
media_info = defaultdict(lambda: None, **(data['media_info'][0] if data['media_info'] else {}))
|
||||
episode = ''
|
||||
season = ''
|
||||
if data['media_type'] == 'episode':
|
||||
season = short_season(data['parent_title'])
|
||||
if data['media_index']:
|
||||
episode = data['media_index']
|
||||
else:
|
||||
episode = format_date_based_show(data['originally_available_at'])
|
||||
elif data['media_type'] == 'season':
|
||||
season = short_season(data['title'])
|
||||
%>
|
||||
|
@ -140,7 +145,7 @@ DOCUMENTATION :: END
|
|||
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
|
||||
<li><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a></li>
|
||||
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
|
||||
<li class="active metadata-xml">Episode ${data['media_index']} - ${data['title']}</li>
|
||||
<li class="active metadata-xml">Episode ${episode} - ${data['title']}</li>
|
||||
% elif data['media_type'] == 'artist':
|
||||
<li><a href="${page('library', data['section_id'])}">${data['library_name']}</a></li>
|
||||
<span class="breadcrumb-arrow"><i class="fa fa-chevron-right"></i></span>
|
||||
|
@ -251,9 +256,11 @@ DOCUMENTATION :: END
|
|||
% elif data['media_type'] == 'episode':
|
||||
<h1>${data['grandparent_title']}</h1>
|
||||
<h2>${data['title']}</h2>
|
||||
% if data['media_index']:
|
||||
<h3 class="hidden-xs">${season} · E${data['media_index']}</h3>
|
||||
% endif
|
||||
% if data['media_index']:
|
||||
<h3 class="hidden-xs">${season} · E${episode}</h3>
|
||||
% else:
|
||||
<h3 class="hidden-xs">E${episode}</h3>
|
||||
% endif
|
||||
% endif
|
||||
% elif data['media_type'] in ('movie', 'show', 'artist', 'collection', 'playlist', 'photo_album'):
|
||||
<h1> </h1><h1>${data['title']}</h1>
|
||||
|
@ -263,7 +270,11 @@ DOCUMENTATION :: END
|
|||
% elif data['media_type'] == 'episode':
|
||||
<h1><a href="${page('info', data['grandparent_rating_key'])}">${data['grandparent_title']}</a></h1>
|
||||
<h2>${data['title']}</h2>
|
||||
<h3 class="hidden-xs">${season} · E${data['media_index']}</h3>
|
||||
% if data['media_index']:
|
||||
<h3 class="hidden-xs">${season} · E${episode}</h3>
|
||||
% else:
|
||||
<h3 class="hidden-xs">E${episode}</h3>
|
||||
% endif
|
||||
% elif data['media_type'] == 'album':
|
||||
<h1><a href="${page('info', data['parent_rating_key'])}">${data['parent_title']}</a></h1>
|
||||
<h2>${data['title']}</h2>
|
||||
|
@ -766,9 +777,14 @@ DOCUMENTATION :: END
|
|||
% if metadata:
|
||||
<%
|
||||
data = defaultdict(None, **metadata)
|
||||
episode = ''
|
||||
season = ''
|
||||
if data['media_type'] == 'episode':
|
||||
season = short_season(data['parent_title'])
|
||||
if data['media_index']:
|
||||
episode = data['media_index']
|
||||
else:
|
||||
episode = format_date_based_show(data['originally_available_at'])
|
||||
elif data['media_type'] == 'season':
|
||||
season = short_season(data['title'])
|
||||
%>
|
||||
|
@ -812,7 +828,7 @@ DOCUMENTATION :: END
|
|||
% elif data['media_type'] == 'season':
|
||||
${data['parent_title']}<br />${data['title']}
|
||||
% elif data['media_type'] == 'episode':
|
||||
${data['grandparent_title']}<br />${data['title']}<br />${season} · E${data['media_index']}
|
||||
${data['grandparent_title']}<br />${data['title']}<br />${season} · E${episode}
|
||||
% elif data['media_type'] == 'artist':
|
||||
${data['title']}
|
||||
% elif data['media_type'] == 'album':
|
||||
|
|
|
@ -19,6 +19,7 @@ data['children_list'] :: Usable paramaters
|
|||
== Global keys ==
|
||||
rating_key Returns the unique identifier for the media item.
|
||||
media_index Returns the episode number.
|
||||
originally_available_at Returns the air date of the item.
|
||||
title Returns the name of the episode.
|
||||
thumb Returns the location of the item's thumbnail. Use with pms_image_proxy.
|
||||
parent_thumb Returns the location of the item's parent thumbnail. Use with pms_image_proxy.
|
||||
|
@ -28,7 +29,7 @@ DOCUMENTATION :: END
|
|||
|
||||
% if data != None:
|
||||
<%
|
||||
from plexpy.helpers import cast_to_int, page, short_season
|
||||
from plexpy.helpers import cast_to_int, page, short_season, format_date_based_show
|
||||
%>
|
||||
% if data['children_count'] > 0:
|
||||
<div class="item-children-wrapper">
|
||||
|
@ -176,7 +177,7 @@ DOCUMENTATION :: END
|
|||
<div class="item-children-poster-face episode-item" style="background-image: url(${page('pms_image_proxy', child['thumb'], child['rating_key'], 500, 280, fallback='art')});">
|
||||
<div class="item-children-card-overlay">
|
||||
<div class="item-children-overlay-text">
|
||||
Episode ${child['media_index'] or child['originally_available_at']}
|
||||
Episode ${child['media_index'] or format_date_based_show(child['originally_available_at'])}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
var date_format = 'YYYY-MM-DD';
|
||||
var time_format = 'hh:mm a';
|
||||
var date_based_tv_show_format = 'YYYY\u00b7MM\u00b7DD';
|
||||
var history_to_delete = [];
|
||||
|
||||
$.ajax({
|
||||
|
@ -8,6 +9,7 @@ $.ajax({
|
|||
success: function(data) {
|
||||
date_format = data.date_format;
|
||||
time_format = data.time_format;
|
||||
date_based_tv_show_format = data.date_based_tv_show_format;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -179,9 +181,11 @@ history_table_options = {
|
|||
thumb_popover = '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 300, 450, null, null, null, fallback) + '" data-height="120" data-width="80">' + cellData + parent_info + '</span>';
|
||||
$(td).html('<div class="history-title"><a href="' + page('info', rowData['rating_key'], rowData['guid'], history, rowData['live']) + '"><div style="float: left;">' + media_type + ' ' + thumb_popover + '</div></a></div>');
|
||||
} else if (rowData['media_type'] === 'episode') {
|
||||
rowData['originally_available_at'] = moment(rowData['originally_available_at']).format(date_based_tv_show_format);
|
||||
icon = (rowData['live']) ? 'fa-broadcast-tower' : 'fa-television';
|
||||
icon_title = (rowData['live']) ? 'Live TV' : 'Episode';
|
||||
if (!isNaN(parseInt(rowData['parent_media_index'])) && !isNaN(parseInt(rowData['media_index']))) { parent_info = ' (' + short_season(rowData['parent_title']) + ' · E' + rowData['media_index'] + ')'; }
|
||||
else if (isNaN(parseInt(rowData['media_index'])) && rowData['originally_available_at']) { parent_info = ' (' + rowData['originally_available_at'] + ')'; }
|
||||
else if (rowData['live'] && rowData['originally_available_at']) { parent_info = ' (' + rowData['originally_available_at'] + ')'; }
|
||||
media_type = '<span class="media-type-tooltip" data-toggle="tooltip" title="' + icon_title + '"><i class="fa ' + icon + ' fa-fw"></i></span>';
|
||||
thumb_popover = '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 300, 450, null, null, null, fallback) + '" data-height="120" data-width="80">' + cellData + parent_info + '</span>';
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
var date_format = 'YYYY-MM-DD';
|
||||
var time_format = 'hh:mm a';
|
||||
var date_based_tv_show_format = 'YYYY\u00b7MM\u00b7DD';
|
||||
|
||||
$.ajax({
|
||||
url: 'get_date_formats',
|
||||
|
@ -7,6 +8,7 @@ $.ajax({
|
|||
success: function(data) {
|
||||
date_format = data.date_format;
|
||||
time_format = data.time_format;
|
||||
date_based_tv_show_format = data.date_based_tv_show_format;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -112,9 +114,11 @@ history_table_modal_options = {
|
|||
thumb_popover = '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 300, 450, null, null, null, fallback) + '" data-height="120" data-width="80">' + cellData + parent_info + '</span>';
|
||||
$(td).html('<div class="history-title"><a href="' + page('info', rowData['rating_key'], rowData['guid'], true, rowData['live']) + '"><div style="float: left;">' + media_type + ' ' + thumb_popover + '</div></a></div>');
|
||||
} else if (rowData['media_type'] === 'episode') {
|
||||
rowData['originally_available_at'] = moment(rowData['originally_available_at']).format(date_based_tv_show_format);
|
||||
icon = (rowData['live']) ? 'fa-broadcast-tower' : 'fa-television';
|
||||
icon_title = (rowData['live']) ? 'Live TV' : 'Episode';
|
||||
if (!isNaN(parseInt(rowData['parent_media_index'])) && !isNaN(parseInt(rowData['media_index']))) { parent_info = ' (' + short_season(rowData['parent_title']) + ' · E' + rowData['media_index'] + ')'; }
|
||||
else if (isNaN(parseInt(rowData['media_index'])) && rowData['originally_available_at']) { parent_info = ' (' + rowData['originally_available_at'] + ')'; }
|
||||
else if (rowData['live'] && rowData['originally_available_at']) { parent_info = ' (' + rowData['originally_available_at'] + ')'; }
|
||||
media_type = '<span class="media-type-tooltip" data-toggle="tooltip" title="' + icon_title + '"><i class="fa ' + icon + ' fa-fw"></i></span>';
|
||||
thumb_popover = '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 300, 450, null, null, null, fallback) + '" data-height="120" data-width="80">' + cellData + parent_info + '</span>';
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
var date_format = 'YYYY-MM-DD';
|
||||
var time_format = 'hh:mm a';
|
||||
var date_based_tv_show_format = 'YYYY\u00b7MM\u00b7DD';
|
||||
|
||||
$.ajax({
|
||||
url: 'get_date_formats',
|
||||
|
@ -7,6 +8,7 @@ $.ajax({
|
|||
success: function (data) {
|
||||
date_format = data.date_format;
|
||||
time_format = data.time_format;
|
||||
date_based_tv_show_format = data.date_based_tv_show_format;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -94,7 +96,10 @@ media_info_table_options = {
|
|||
$(td).html('<div class="history-title"><a href="' + page('info', rowData['rating_key']) + '"><div style="float: left; padding-left: 15px;">' + media_type + ' ' + thumb_popover + '</div></a></div>');
|
||||
} else if (rowData['media_type'] === 'episode') {
|
||||
media_type = '<span class="media-type-tooltip" data-toggle="tooltip" title="Episode"><i class="fa fa-television fa-fw"></i></span>';
|
||||
thumb_popover = '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 500, 280, null, null, null, 'art') + '" data-height="80" data-width="140">E' + rowData['media_index'] + ' - ' + rowData['title'] + '</span>';
|
||||
thumb_popover = (rowData['media_index']) ?
|
||||
'<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 500, 280, null, null, null, 'art') + '" data-height="80" data-width="140">E' + rowData['media_index'] + ' - ' + rowData['title'] + '</span>'
|
||||
: '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 500, 280, null, null, null, 'art') + '" data-height="80" data-width="140">E' + moment(rowData['originally_available_at']).format(date_based_tv_show_format)
|
||||
+ ' - ' + rowData['title'] + '</span>';
|
||||
$(td).html('<div class="history-title"><a href="' + page('info', rowData['rating_key']) + '"><div style="float: left; padding-left: 30px;">' + media_type + ' ' + thumb_popover + '</div></a></div>');
|
||||
} else if (rowData['media_type'] === 'artist') {
|
||||
media_type = '<span class="media-type-tooltip" data-toggle="tooltip" title="Artist"><i class="fa fa-music fa-fw"></i></span>';
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
var users_to_delete = [];
|
||||
var users_to_purge = [];
|
||||
var date_based_tv_show_format = 'YYYY\u00b7MM\u00b7DD';
|
||||
|
||||
$.ajax({
|
||||
url: 'get_date_formats',
|
||||
type: 'GET',
|
||||
success: function (data) {
|
||||
date_based_tv_show_format = data.date_based_tv_show_format;
|
||||
}
|
||||
});
|
||||
|
||||
function toggleEditNames() {
|
||||
if ($('.edit-control').hasClass('hidden')) {
|
||||
|
@ -211,7 +220,9 @@ users_list_table_options = {
|
|||
} else if (rowData['media_type'] === 'episode') {
|
||||
icon = (rowData['live']) ? 'fa-broadcast-tower' : 'fa-television';
|
||||
icon_title = (rowData['live']) ? 'Live TV' : 'Episode';
|
||||
rowData['originally_available_at'] = moment(rowData['originally_available_at']).format(date_based_tv_show_format);
|
||||
if (!isNaN(parseInt(rowData['parent_media_index'])) && !isNaN(parseInt(rowData['media_index']))) { parent_info = ' (' + short_season(rowData['parent_title']) + ' · E' + rowData['media_index'] + ')'; }
|
||||
else if (isNaN(parseInt(rowData['media_index'])) && rowData['originally_available_at']) { parent_info = ' (' + rowData['originally_available_at'] + ')'; }
|
||||
else if (rowData['live'] && rowData['originally_available_at']) { parent_info = ' (' + rowData['originally_available_at'] + ')'; }
|
||||
media_type = '<span class="media-type-tooltip" data-toggle="tooltip" title="' + icon_title + '"><i class="fa ' + icon + ' fa-fw"></i></span>';
|
||||
thumb_popover = '<span class="thumb-tooltip" data-toggle="popover" data-img="' + page('pms_image_proxy', rowData['thumb'], rowData['rating_key'], 300, 450, null, null, null, fallback) + '" data-height="120" data-width="80">' + cellData + parent_info + '</span>';
|
||||
|
|
|
@ -19,6 +19,7 @@ parent_title Returns the name of the artist.
|
|||
grandparent_title Returns the name of the show.
|
||||
media_index Returns the index number of the episode.
|
||||
parent_media_index Returns the index number of the season.
|
||||
originally_available_at Returns the air date of the media item.
|
||||
section_id Returns the library section number of the media item.
|
||||
library_name Returns the library section name of the media item.
|
||||
year Returns the release year of the movie, episode, or album.
|
||||
|
@ -32,7 +33,7 @@ DOCUMENTATION :: END
|
|||
|
||||
% if data:
|
||||
<%
|
||||
from plexpy.helpers import page, short_season
|
||||
from plexpy.helpers import page, short_season, format_date_based_show
|
||||
|
||||
%>
|
||||
<div class="dashboard-recent-media-row">
|
||||
|
@ -78,8 +79,12 @@ DOCUMENTATION :: END
|
|||
<a href="${page('info', item['rating_key'])}" title="${item['title']}">${item['title']}</a>
|
||||
</h3>
|
||||
<h3 class="text-muted">
|
||||
% if item['media_index']:
|
||||
<a href="${page('info', item['parent_rating_key'])}" title="${item['parent_title']}">${short_season(item['parent_title'])}</a>
|
||||
· <a href="${page('info', item['rating_key'])}" title="Episode ${item['media_index']}">E${item['media_index']}</a>
|
||||
% else:
|
||||
<a href="${page('info', item['rating_key'])}" title="Episode ${format_date_based_show(item['originally_available_at'])}">E${format_date_based_show(item['originally_available_at'])}</a>
|
||||
% endif
|
||||
</h3>
|
||||
% elif item['media_type'] == 'movie':
|
||||
<h3>
|
||||
|
|
|
@ -19,6 +19,7 @@ parent_title Returns the name of the artist.
|
|||
grandparent_title Returns the name of the show.
|
||||
media_index Returns the index number of the episode.
|
||||
parent_media_index Returns the index number of the season.
|
||||
originally_available_at Returns the air date of the media item.
|
||||
section_id Returns the library section number of the media item.
|
||||
library_name Returns the library section name of the media item.
|
||||
year Returns the release year of the movie, episode, or album.
|
||||
|
@ -32,7 +33,7 @@ DOCUMENTATION :: END
|
|||
|
||||
% if data != None:
|
||||
<%
|
||||
from plexpy.helpers import cast_to_int, page, short_season
|
||||
from plexpy.helpers import cast_to_int, page, short_season, format_date_based_show
|
||||
%>
|
||||
% if data:
|
||||
<div class="dashboard-recent-media-row">
|
||||
|
@ -146,9 +147,14 @@ DOCUMENTATION :: END
|
|||
<a href="${page('info', item['rating_key'])}" title="${item['title']}">${item['title']}</a>
|
||||
</h3>
|
||||
<h3 class="text-muted">
|
||||
% if item['media_index']:
|
||||
<a href="${page('info', item['parent_rating_key'])}" title="${item['parent_title']}">${short_season(item['parent_title'])}</a>
|
||||
·
|
||||
<a href="${page('info', item['rating_key'])}" title="Episode ${item['media_index']}">E${item['media_index']}</a>
|
||||
% else:
|
||||
<a href="${page('info', item['rating_key'])}" title="Episode ${format_date_based_show(item['originally_available_at'])}">
|
||||
E${format_date_based_show(item['originally_available_at'])}</a>
|
||||
% endif
|
||||
</h3>
|
||||
</div>
|
||||
% elif item['media_type'] == 'album':
|
||||
|
|
|
@ -126,6 +126,15 @@
|
|||
</div>
|
||||
<p class="help-block">Set your preferred time format. <a href="javascript:void(0)" data-target="#dateTimeOptionsModal" data-toggle="modal">Click here</a> to see the parameter list.</p>
|
||||
</div>
|
||||
<div class="form-group advanced-setting">
|
||||
<label for="date_based_tv_show_format">Date Based TV Show Format</label>
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<input type="text" class="form-control" id="date_based_tv_show_format" name="date_based_tv_show_format" value="${config['date_based_tv_show_format']}" data-parsley-trigger="change" required>
|
||||
</div>
|
||||
</div>
|
||||
<p class="help-block">Set your preferred display format for date based tv shows.</p>
|
||||
</div>
|
||||
<div class="checkbox advanced-setting">
|
||||
<label>
|
||||
<input type="checkbox" id="week_start_monday" name="week_start_monday" value="1" ${config['week_start_monday']}> Week Starting on Monday
|
||||
|
|
|
@ -21,6 +21,7 @@ parent_title Returns the name of the artist.
|
|||
grandparent_title Returns the name of the show.
|
||||
media_index Returns the index number of the episode.
|
||||
parent_media_index Returns the index number of the season.
|
||||
originally_available_at Returns the air date of the media item.
|
||||
year Returns the release year of the movie, episode, or album.
|
||||
|
||||
DOCUMENTATION :: END
|
||||
|
@ -28,7 +29,7 @@ DOCUMENTATION :: END
|
|||
|
||||
% if data:
|
||||
<%
|
||||
from plexpy.helpers import page, short_season
|
||||
from plexpy.helpers import page, short_season, format_date_based_show
|
||||
%>
|
||||
<div class="dashboard-recent-media-row">
|
||||
<div id="recently-watched-row-scroller">
|
||||
|
@ -59,6 +60,9 @@ DOCUMENTATION :: END
|
|||
</a>
|
||||
<div class="dashboard-recent-media-metacontainer">
|
||||
% if item['media_type'] == 'episode':
|
||||
% if not item['media_index']:
|
||||
item['originally_available_at'] = format_date_based_show(item['originally_available_at'])
|
||||
% endif
|
||||
% if item['live']:
|
||||
<h3>
|
||||
<a href="${page('info', item['rating_key'], history=True, live=item['live'])}" title="${item['grandparent_title']}">${item['grandparent_title']}</a>
|
||||
|
@ -68,8 +72,12 @@ DOCUMENTATION :: END
|
|||
</h3>
|
||||
% if item['media_index']:
|
||||
<h3 class="text-muted">
|
||||
% if item['media_index']:
|
||||
<a href="${page('info', item['rating_key'], history=True, live=item['live'])}" title="${item['parent_title']}">${short_season(item['parent_title'])}</a>
|
||||
· <a href="${page('info', item['rating_key'], history=True, live=item['live'])}" title="Episode ${item['media_index']}">E${item['media_index']}</a>
|
||||
% else:
|
||||
<a href="${page('info', item['rating_key'], history=True, live=item['live'])}" title="Episode ${item['originally_available_at']}">E${item['originally_available_at']}</a>
|
||||
% endif
|
||||
</h3>
|
||||
% else:
|
||||
<h3 class="text-muted">
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
% if data:
|
||||
<%
|
||||
import plexpy
|
||||
from plexpy.helpers import grouper, get_img_service
|
||||
from plexpy.helpers import grouper, get_img_service, format_date_based_show
|
||||
|
||||
recently_added = data['recently_added']
|
||||
if plexpy.CONFIG.NEWSLETTER_SELF_HOSTED and plexpy.CONFIG.HTTP_BASE_URL:
|
||||
|
@ -755,10 +755,13 @@
|
|||
<p class="nowrap mb5" style="font-family: 'Open Sans', Helvetica, Arial, sans-serif;font-weight: 400;margin: 0;margin-bottom: 5px;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;max-width: 325px;color: #ffffff;">
|
||||
% for i, season in enumerate(show['season'][:8]):
|
||||
% if season['episode_count'] == 1:
|
||||
${season['title']} · Episode ${season['episode'][0]['media_index']} - ${season['episode'][0]['title']}
|
||||
% else:
|
||||
${season['title']} · Episodes ${season['episode_range']}
|
||||
% endif
|
||||
% if season['episode'][0]['media_index']:
|
||||
${season['title']} · Episode ${season['episode'][0]['media_index']} - ${season['episode'][0]['title']}
|
||||
% else:
|
||||
${season['title']} · Episode ${format_date_based_show(season['episode'][0]['originally_available_at'])}
|
||||
- ${season['episode'][0]['title']}
|
||||
${season['title']} · Episodes ${season['episode_range']}
|
||||
% endif
|
||||
% if i < min(show['season_count'], 7):
|
||||
<br>
|
||||
% elif i == 7 and show['season_count'] > 8:
|
||||
|
|
|
@ -42,6 +42,7 @@ FILENAME = "config.ini"
|
|||
_CONFIG_DEFINITIONS = {
|
||||
'ALLOW_GUEST_ACCESS': (int, 'General', 0),
|
||||
'DATE_FORMAT': (str, 'General', 'YYYY-MM-DD'),
|
||||
'DATE_BASED_TV_SHOW_FORMAT': (str, 'Advanced', 'YYYY·MM·DD'),
|
||||
'PMS_CLIENT_ID': (str, 'PMS', ''),
|
||||
'PMS_IDENTIFIER': (str, 'PMS', ''),
|
||||
'PMS_IP': (str, 'PMS', '127.0.0.1'),
|
||||
|
@ -240,6 +241,7 @@ SETTINGS = [
|
|||
'CLOUDINARY_API_SECRET',
|
||||
'CLOUDINARY_CLOUD_NAME',
|
||||
'DATE_FORMAT',
|
||||
'DATE_BASED_TV_SHOW_FORMAT',
|
||||
'EXPORT_DIR',
|
||||
'GIT_BRANCH',
|
||||
'GIT_PATH',
|
||||
|
|
|
@ -25,6 +25,7 @@ from collections import OrderedDict
|
|||
from datetime import date, datetime, timezone
|
||||
from functools import reduce, wraps
|
||||
import hashlib
|
||||
import html
|
||||
import imghdr
|
||||
from itertools import groupby
|
||||
from future.moves.itertools import islice, zip_longest
|
||||
|
@ -417,6 +418,8 @@ def clean_filename(filename, replace='_'):
|
|||
cleaned_filename = ''.join(c if c in whitelist else replace for c in cleaned_filename)
|
||||
return cleaned_filename
|
||||
|
||||
def format_date_based_show(date):
|
||||
return str(arrow.get(date).format(html.unescape(plexpy.CONFIG.DATE_BASED_TV_SHOW_FORMAT)))
|
||||
|
||||
def split_strip(s, delimiter=','):
|
||||
return [x.strip() for x in str(s).split(delimiter) if x.strip()]
|
||||
|
|
|
@ -502,6 +502,7 @@ class Libraries(object):
|
|||
# If no cache was imported, get all library children items
|
||||
cached_items = {d['rating_key']: d['file_size'] for d in rows} if not refresh else {}
|
||||
|
||||
# TODO: Auto trigger for update - needs to be triggered to get date based episode support
|
||||
if refresh or not rows:
|
||||
pms_connect = pmsconnect.PmsConnect()
|
||||
|
||||
|
@ -540,6 +541,7 @@ class Libraries(object):
|
|||
'year': item['year'],
|
||||
'media_index': item['media_index'],
|
||||
'parent_media_index': item['parent_media_index'],
|
||||
'originally_available_at': item['originally_available_at'],
|
||||
'thumb': item['thumb'],
|
||||
'container': item.get('container', ''),
|
||||
'bitrate': item.get('bitrate', ''),
|
||||
|
|
|
@ -763,7 +763,17 @@ class RecentlyAdded(Newsletter):
|
|||
for (index, title), children in groupby(filtered_children,
|
||||
key=lambda x: (x['parent_media_index'], x['parent_title'])):
|
||||
episodes = list(children)
|
||||
num, num00 = format_group_index([helpers.cast_to_int(d['media_index']) for d in episodes])
|
||||
|
||||
isDateBased = True
|
||||
for e in episodes:
|
||||
if e['media_index']:
|
||||
isDateBased = False
|
||||
break
|
||||
|
||||
if isDateBased:
|
||||
num00 = helpers.format_date_based_show(episodes[0]['originally_available_at']) + " - " + helpers.format_date_based_show(episodes[len(episodes)-1]['originally_available_at'])
|
||||
else:
|
||||
num, num00 = format_group_index([helpers.cast_to_int(d['media_index']) for d in episodes])
|
||||
|
||||
seasons.append({'media_index': index,
|
||||
'title': title,
|
||||
|
|
|
@ -915,8 +915,11 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, m
|
|||
track_name = notify_params['title']
|
||||
season_num = str(notify_params['parent_media_index']).zfill(1)
|
||||
season_num00 = str(notify_params['parent_media_index']).zfill(2)
|
||||
episode_num = str(notify_params['media_index']).zfill(1)
|
||||
episode_num00 = str(notify_params['media_index']).zfill(2)
|
||||
if notify_params['media_index']:
|
||||
episode_num = str(notify_params['media_index']).zfill(1)
|
||||
episode_num00 = str(notify_params['media_index']).zfill(2)
|
||||
else:
|
||||
episode_num = episode_num00 = helpers.format_date_based_show(notify_params['originally_available_at'])
|
||||
disc_num = str(notify_params['parent_media_index']).zfill(1)
|
||||
disc_num00 = str(notify_params['parent_media_index']).zfill(2)
|
||||
track_num = str(notify_params['media_index']).zfill(1)
|
||||
|
|
|
@ -2873,6 +2873,7 @@ class PmsConnect(object):
|
|||
'sort_title': helpers.get_xml_attr(item, 'titleSort'),
|
||||
'media_index': helpers.get_xml_attr(item, 'index'),
|
||||
'parent_media_index': helpers.get_xml_attr(item, 'parentIndex'),
|
||||
'originally_available_at': helpers.get_xml_attr(item, 'originallyAvailableAt'),
|
||||
'year': helpers.get_xml_attr(item, 'year'),
|
||||
'thumb': helpers.get_xml_attr(item, 'thumb'),
|
||||
'parent_thumb': helpers.get_xml_attr(item, 'thumb'),
|
||||
|
|
|
@ -21,6 +21,7 @@ from io import open, BytesIO
|
|||
import json
|
||||
import linecache
|
||||
import os
|
||||
import html
|
||||
import shutil
|
||||
import ssl as _ssl
|
||||
import sys
|
||||
|
@ -271,7 +272,7 @@ class WebInterface(object):
|
|||
json:
|
||||
{"date_format": "YYYY-MM-DD",
|
||||
"time_format": "HH:mm",
|
||||
}
|
||||
"date_based_tv_show_format": "YYYY\u00b7MM\u00b7DD"}
|
||||
```
|
||||
"""
|
||||
if plexpy.CONFIG.DATE_FORMAT:
|
||||
|
@ -282,9 +283,14 @@ class WebInterface(object):
|
|||
time_format = plexpy.CONFIG.TIME_FORMAT
|
||||
else:
|
||||
time_format = 'HH:mm'
|
||||
if plexpy.CONFIG.DATE_BASED_TV_SHOW_FORMAT:
|
||||
date_based_tv_show_format = html.unescape(plexpy.CONFIG.DATE_BASED_TV_SHOW_FORMAT)
|
||||
else:
|
||||
date_based_tv_show_format = html.unescape('YYYY·MM·DD')
|
||||
|
||||
formats = {'date_format': date_format,
|
||||
'time_format': time_format}
|
||||
'time_format': time_format,
|
||||
'date_based_tv_show_format': date_based_tv_show_format}
|
||||
|
||||
return formats
|
||||
|
||||
|
@ -769,6 +775,7 @@ class WebInterface(object):
|
|||
"media_type": "show",
|
||||
"parent_media_index": "",
|
||||
"parent_rating_key": "",
|
||||
"originally_available_at": "2011-08-21",
|
||||
"play_count": 15,
|
||||
"rating_key": "1219",
|
||||
"section_id": 2,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue