Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Date Based TV Show Support #1960

Open
wants to merge 8 commits into
base: nightly
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 16 additions & 5 deletions data/interfaces/default/current_activity_instance.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@
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.
Expand Down Expand Up @@ -62,7 +63,7 @@
% 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
%>
Expand All @@ -76,6 +77,12 @@
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']}">
Expand Down Expand Up @@ -499,8 +506,12 @@
% 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>
&middot; <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>
&middot; <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':
Expand Down
30 changes: 23 additions & 7 deletions data/interfaces/default/info.html
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@

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):
Expand Down Expand Up @@ -81,9 +81,14 @@
<%
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'])
%>
Expand Down Expand Up @@ -138,7 +143,7 @@
<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>
Expand Down Expand Up @@ -249,9 +254,11 @@ <h1>&nbsp;</h1><h1>${data['title']}</h1>
% elif data['media_type'] == 'episode':
<h1>${data['grandparent_title']}</h1>
<h2>${data['title']}</h2>
% if data['media_index']:
<h3 class="hidden-xs">${season} &middot; E${data['media_index']}</h3>
% endif
% if data['media_index']:
<h3 class="hidden-xs">${season} &middot; 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>&nbsp;</h1><h1>${data['title']}</h1>
Expand All @@ -261,7 +268,11 @@ <h3 class="hidden-xs">${season}</h3>
% 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} &middot; E${data['media_index']}</h3>
% if data['media_index']:
<h3 class="hidden-xs">${season} &middot; 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>
Expand Down Expand Up @@ -754,9 +765,14 @@ <h2>${data['title']}</h2>
% 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'])
%>
Expand Down Expand Up @@ -800,7 +816,7 @@ <h4 class="modal-title">Recently Added Notification</h4>
% elif data['media_type'] == 'season':
${data['parent_title']}<br />${data['title']}
% elif data['media_type'] == 'episode':
${data['grandparent_title']}<br />${data['title']}<br />${season} &middot; E${data['media_index']}
${data['grandparent_title']}<br />${data['title']}<br />${season} &middot; E${episode}
% elif data['media_type'] == 'artist':
${data['title']}
% elif data['media_type'] == 'album':
Expand Down
5 changes: 3 additions & 2 deletions data/interfaces/default/info_children_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
== 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.
Expand All @@ -28,7 +29,7 @@

% 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">
Expand Down Expand Up @@ -166,7 +167,7 @@ <h3>
<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>
Expand Down
4 changes: 4 additions & 0 deletions data/interfaces/default/js/tables/history_table.js
Original file line number Diff line number Diff line change
@@ -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({
Expand All @@ -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;
}
});

Expand Down Expand Up @@ -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 + '&nbsp;' + 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']) + ' &middot; 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>';
Expand Down
4 changes: 4 additions & 0 deletions data/interfaces/default/js/tables/history_table_modal.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
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',
type: 'GET',
success: function(data) {
date_format = data.date_format;
time_format = data.time_format;
date_based_tv_show_format = data.date_based_tv_show_format;
}
});

Expand Down Expand Up @@ -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 + '&nbsp;' + 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']) + ' &middot; 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>';
Expand Down
7 changes: 6 additions & 1 deletion data/interfaces/default/js/tables/media_info_table.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
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',
type: 'GET',
success: function (data) {
date_format = data.date_format;
time_format = data.time_format;
date_based_tv_show_format = data.date_based_tv_show_format;
}
});

Expand Down Expand Up @@ -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 + '&nbsp;' + 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 + '&nbsp;' + 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>';
Expand Down
11 changes: 11 additions & 0 deletions data/interfaces/default/js/tables/users.js
Original file line number Diff line number Diff line change
@@ -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')) {
Expand Down Expand Up @@ -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']) + ' &middot; 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>';
Expand Down
7 changes: 6 additions & 1 deletion data/interfaces/default/library_recently_added.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
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.
Expand All @@ -32,7 +33,7 @@

% 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">
Expand Down Expand Up @@ -78,8 +79,12 @@ <h3 class="text-muted">
<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>
&middot; <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>
Expand Down