mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
live tv updates
This commit is contained in:
parent
97a67a7cf8
commit
ac4c65ac9a
23 changed files with 318 additions and 156 deletions
|
@ -183,7 +183,7 @@
|
|||
$('#scenesCollapsible', page).hide();
|
||||
} else {
|
||||
$('#scenesCollapsible', page).show();
|
||||
renderScenes(page, item, 6);
|
||||
renderScenes(page, item, 5);
|
||||
}
|
||||
if (!item.LocalTrailerCount && !item.RemoteTrailers.length) {
|
||||
$('#trailersCollapsible', page).addClass('hide');
|
||||
|
|
|
@ -213,6 +213,10 @@
|
|||
|
||||
return "<img src='css/images/clients/mbkinect.png' alt='MB Kinect' />";
|
||||
}
|
||||
if (clientLowered == "xbmc") {
|
||||
|
||||
return "<img src='css/images/clients/xbmc.png' alt='Xbmc' />";
|
||||
}
|
||||
|
||||
return connection.Client;
|
||||
},
|
||||
|
|
|
@ -33,14 +33,15 @@
|
|||
var checkSortOption = $('.radioSortBy:checked', page);
|
||||
$('.viewSummary', page).html(LibraryBrowser.getViewSummaryHtml(query, checkSortOption)).trigger('create');
|
||||
|
||||
if (view == "Poster") {
|
||||
html += LibraryBrowser.getPosterDetailViewHtml({
|
||||
items: result.Items,
|
||||
context: "tv",
|
||||
shape: "backdrop"
|
||||
});
|
||||
$('.itemsContainer', page).removeClass('timelineItemsContainer');
|
||||
}
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
useAverageAspectRatio: true,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true
|
||||
});
|
||||
|
||||
$('.itemsContainer', page).removeClass('timelineItemsContainer');
|
||||
|
||||
html += LibraryBrowser.getPagingHtml(query, result.TotalRecordCount);
|
||||
|
||||
|
|
|
@ -327,7 +327,7 @@
|
|||
try {
|
||||
var birthday = parseISO8601Date(item.PremiereDate, { toLocal: true }).toDateString();
|
||||
|
||||
$('#itemBirthday', page).show().html("Birthday: " + birthday);
|
||||
$('#itemBirthday', page).show().html("Born: " + birthday);
|
||||
}
|
||||
catch (err) {
|
||||
$('#itemBirthday', page).hide();
|
||||
|
@ -341,7 +341,7 @@
|
|||
try {
|
||||
var deathday = parseISO8601Date(item.EndDate, { toLocal: true }).toDateString();
|
||||
|
||||
$('#itemDeathDate', page).show().html("Death day: " + deathday);
|
||||
$('#itemDeathDate', page).show().html("Died: " + deathday);
|
||||
}
|
||||
catch (err) {
|
||||
$('#itemBirthday', page).hide();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
var LibraryBrowser = (function (window, document, $, screen, localStorage) {
|
||||
|
||||
var defaultBackground = "#999;";
|
||||
var defaultBackground = "#555;";
|
||||
|
||||
return {
|
||||
|
||||
|
@ -867,9 +867,9 @@
|
|||
|
||||
if (options.showParentTitle) {
|
||||
|
||||
html += "<div class='" + cssclass + "'>";
|
||||
html += "<div class='" + cssclass + "'><b>";
|
||||
html += item.SeriesName || item.Album || " ";
|
||||
html += "</div>";
|
||||
html += "</b></div>";
|
||||
}
|
||||
|
||||
if (options.showTitle) {
|
||||
|
@ -1983,6 +1983,11 @@
|
|||
|
||||
text = date.toLocaleDateString();
|
||||
miscInfo.push(text);
|
||||
|
||||
if (item.Type != "Recording") {
|
||||
text = LiveTvHelpers.getDisplayTime(date);
|
||||
miscInfo.push(text);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
console.log("Error parsing date: " + item.PremiereDate);
|
||||
|
@ -2057,18 +2062,6 @@
|
|||
miscInfo.push(item.OfficialRating);
|
||||
}
|
||||
|
||||
if (item.Type == "Recording") {
|
||||
|
||||
if (item.IsHD) {
|
||||
miscInfo.push("HD");
|
||||
}
|
||||
|
||||
if (item.IsRepeat) {
|
||||
miscInfo.push("Repeat");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (item.Video3DFormat) {
|
||||
miscInfo.push("3D");
|
||||
}
|
||||
|
@ -2080,7 +2073,7 @@
|
|||
|
||||
var overview = item.OverviewHtml || item.Overview || '';
|
||||
|
||||
elem.html(overview).show().trigger('create');
|
||||
elem.html(overview).trigger('create');
|
||||
|
||||
$('a', elem).each(function () {
|
||||
$(this).attr("target", "_blank");
|
||||
|
@ -2114,31 +2107,26 @@
|
|||
|
||||
renderGenres: function (elem, item, context) {
|
||||
|
||||
if (item.Genres && item.Genres.length) {
|
||||
var html = '';
|
||||
|
||||
var html = '';
|
||||
var genres = item.Genres || [];
|
||||
|
||||
for (var i = 0, length = item.Genres.length; i < length; i++) {
|
||||
for (var i = 0, length = genres.length; i < length; i++) {
|
||||
|
||||
if (i > 0) {
|
||||
html += ' / ';
|
||||
}
|
||||
|
||||
var param = item.Type == "Audio" || item.Type == "MusicArtist" || item.Type == "MusicAlbum" ? "musicgenre" : "genre";
|
||||
|
||||
if (item.MediaType == "Game") {
|
||||
param = "gamegenre";
|
||||
}
|
||||
|
||||
html += '<a class="textlink" href="itembynamedetails.html?context=' + context + '&' + param + '=' + ApiClient.encodeName(item.Genres[i]) + '">' + item.Genres[i] + '</a>';
|
||||
if (i > 0) {
|
||||
html += ' / ';
|
||||
}
|
||||
|
||||
elem.show().html(html).trigger('create');
|
||||
var param = item.Type == "Audio" || item.Type == "MusicArtist" || item.Type == "MusicAlbum" ? "musicgenre" : "genre";
|
||||
|
||||
if (item.MediaType == "Game") {
|
||||
param = "gamegenre";
|
||||
}
|
||||
|
||||
} else {
|
||||
elem.hide();
|
||||
html += '<a class="textlink" href="itembynamedetails.html?context=' + context + '&' + param + '=' + ApiClient.encodeName(genres[i]) + '">' + genres[i] + '</a>';
|
||||
}
|
||||
|
||||
elem.html(html).trigger('create');
|
||||
},
|
||||
|
||||
renderPremiereDate: function (elem, item) {
|
||||
|
|
|
@ -100,6 +100,16 @@
|
|||
} else {
|
||||
html += minutes;
|
||||
}
|
||||
|
||||
if (program.SeriesTimerId) {
|
||||
html += '<div class="timerCircle seriesTimerCircle"></div>';
|
||||
html += '<div class="timerCircle seriesTimerCircle"></div>';
|
||||
html += '<div class="timerCircle seriesTimerCircle"></div>';
|
||||
}
|
||||
else if (program.TimerId) {
|
||||
|
||||
html += '<div class="timerCircle"></div>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
|
@ -234,6 +244,61 @@
|
|||
date = date.replace('0:00', '0').replace(':00 ', '').replace(' ', '');
|
||||
|
||||
return date;
|
||||
},
|
||||
|
||||
renderMiscProgramInfo: function(elem, obj) {
|
||||
|
||||
var html = [];
|
||||
|
||||
if (obj.IsSeries && !obj.IsRepeat) {
|
||||
|
||||
html.push('<span class="newTvProgram">NEW</span>');
|
||||
|
||||
}
|
||||
|
||||
if (obj.IsLive) {
|
||||
|
||||
html.push('<span class="liveTvProgram">LIVE</span>');
|
||||
|
||||
}
|
||||
|
||||
if (obj.ChannelId) {
|
||||
html.push('<a class="textlink" href="livetvchannel.html?id=' + obj.ChannelId + '">' + obj.ChannelName + '</a>');
|
||||
}
|
||||
|
||||
if (obj.IsHD) {
|
||||
|
||||
html.push('HD');
|
||||
|
||||
}
|
||||
|
||||
if (obj.Audio) {
|
||||
|
||||
html.push(obj.Audio);
|
||||
|
||||
}
|
||||
|
||||
elem.html(html.join(' ')).trigger('create');
|
||||
},
|
||||
|
||||
renderOriginalAirDate: function(elem, item) {
|
||||
|
||||
var airDate = item.OriginalAirDate;
|
||||
|
||||
if (airDate) {
|
||||
|
||||
try {
|
||||
airDate = parseISO8601Date(airDate, { toLocal: true }).toLocaleDateString();
|
||||
}
|
||||
catch (e) {
|
||||
console.log("Error parsing date: " + airDate);
|
||||
}
|
||||
|
||||
|
||||
elem.html('Original air date: ' + airDate).show();
|
||||
} else {
|
||||
elem.hide();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -11,11 +11,7 @@
|
|||
$('.itemName', page).html(program.Name);
|
||||
$('.itemChannelNumber', page).html('Channel: <a href="livetvchannel.html?id=' + program.ChannelId + '">' + program.ChannelName + '</a>').trigger('create');
|
||||
|
||||
if (program.EpisodeTitle) {
|
||||
$('.itemEpisodeName', page).html('Episode: ' + program.EpisodeTitle);
|
||||
} else {
|
||||
$('.itemEpisodeName', page).html('');
|
||||
}
|
||||
$('.itemEpisodeName', page).html(program.EpisodeTitle || '');
|
||||
|
||||
if (program.CommunityRating) {
|
||||
$('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(program)).show();
|
||||
|
@ -166,7 +162,9 @@
|
|||
|
||||
$('#btnCancel', page).on('click', function () {
|
||||
|
||||
Dashboard.navigate('livetvchannel.html?id=' + currentProgram.ChannelId);
|
||||
var programId = getParameterByName('programid');
|
||||
|
||||
Dashboard.navigate('livetvprogram.html?id=' + programId);
|
||||
|
||||
});
|
||||
|
||||
|
|
|
@ -18,13 +18,8 @@
|
|||
Dashboard.setPageTitle(name);
|
||||
|
||||
$('.itemName', page).html(name);
|
||||
$('.itemChannelNumber', page).html('Channel: <a href="livetvchannel.html?id=' + item.ChannelId + '">' + item.ChannelName + '</a>').trigger('create');
|
||||
|
||||
if (item.EpisodeTitle) {
|
||||
$('.itemEpisodeName', page).html('Episode: ' + item.EpisodeTitle);
|
||||
} else {
|
||||
$('.itemEpisodeName', page).html('');
|
||||
}
|
||||
$('.itemEpisodeName', page).html(item.EpisodeTitle || '');
|
||||
|
||||
if (item.CommunityRating) {
|
||||
$('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(item)).show();
|
||||
|
@ -38,6 +33,8 @@
|
|||
LibraryBrowser.renderOverview($('.itemOverview', page), item);
|
||||
$('.itemMiscInfo', page).html(LibraryBrowser.getMiscInfoHtml(item));
|
||||
|
||||
LiveTvHelpers.renderMiscProgramInfo($('.miscTvProgramInfo', page), item);
|
||||
|
||||
if (ApiClient.isWebSocketOpen()) {
|
||||
|
||||
var vals = [item.Type, item.Id, item.Name];
|
||||
|
@ -47,6 +44,8 @@
|
|||
ApiClient.sendWebSocketMessage("Context", vals.join('|'));
|
||||
}
|
||||
|
||||
$('#recordButtonContainer', page).show();
|
||||
|
||||
if (MediaPlayer.canPlay(item)) {
|
||||
$('#playButtonContainer', page).show();
|
||||
} else {
|
||||
|
@ -63,6 +62,8 @@
|
|||
|
||||
});
|
||||
|
||||
LiveTvHelpers.renderOriginalAirDate($('.airDate', page), item);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
});
|
||||
}
|
||||
|
@ -71,6 +72,14 @@
|
|||
|
||||
var page = this;
|
||||
|
||||
$('#btnRecord', page).on('click', function() {
|
||||
|
||||
var id = getParameterByName('id');
|
||||
|
||||
Dashboard.navigate('livetvnewrecording.html?programid=' + id);
|
||||
|
||||
});
|
||||
|
||||
}).on('pageshow', "#liveTvProgramPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
|
|
@ -20,6 +20,15 @@
|
|||
|
||||
});
|
||||
}
|
||||
|
||||
function play() {
|
||||
|
||||
var userdata = currentItem.UserData || {};
|
||||
|
||||
var mediaType = currentItem.MediaType;
|
||||
|
||||
LibraryBrowser.showPlayMenu(this, currentItem.Id, currentItem.Type, mediaType, userdata.PlaybackPositionTicks);
|
||||
}
|
||||
|
||||
function renderRecording(page, item) {
|
||||
|
||||
|
@ -33,13 +42,8 @@
|
|||
Dashboard.setPageTitle(name);
|
||||
|
||||
$('.itemName', page).html(name);
|
||||
$('.itemChannelNumber', page).html('Channel: <a href="livetvchannel.html?id=' + item.ChannelId + '">' + item.ChannelName + '</a>').trigger('create');
|
||||
|
||||
if (item.EpisodeTitle) {
|
||||
$('.itemEpisodeName', page).html('Episode: ' + item.EpisodeTitle);
|
||||
} else {
|
||||
$('.itemEpisodeName', page).html('');
|
||||
}
|
||||
$('.itemEpisodeName', page).html(item.EpisodeTitle || '');
|
||||
|
||||
if (item.CommunityRating) {
|
||||
$('.itemCommunityRating', page).html(LibraryBrowser.getRatingHtml(item)).show();
|
||||
|
@ -53,6 +57,8 @@
|
|||
LibraryBrowser.renderOverview($('.itemOverview', page), item);
|
||||
$('.itemMiscInfo', page).html(LibraryBrowser.getMiscInfoHtml(item));
|
||||
|
||||
LiveTvHelpers.renderMiscProgramInfo($('.miscTvProgramInfo', page), item);
|
||||
|
||||
if (ApiClient.isWebSocketOpen()) {
|
||||
|
||||
var vals = [item.Type, item.Id, item.Name];
|
||||
|
@ -69,12 +75,6 @@
|
|||
}
|
||||
|
||||
$('.status', page).html('Status: ' + item.Status);
|
||||
|
||||
if (item.Audio) {
|
||||
$('.audio', page).html('Audio: ' + item.Audio).show();
|
||||
} else {
|
||||
$('.audio', page).hide();
|
||||
}
|
||||
|
||||
Dashboard.getCurrentUser().done(function (user) {
|
||||
|
||||
|
@ -86,6 +86,8 @@
|
|||
|
||||
});
|
||||
|
||||
LiveTvHelpers.renderOriginalAirDate($('.airDate', page), item);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
|
@ -107,6 +109,7 @@
|
|||
var page = this;
|
||||
|
||||
$('#btnDelete', page).on('click', deleteRecording);
|
||||
$('#btnPlay', page).on('click', play);
|
||||
|
||||
}).on('pagebeforeshow', "#liveTvRecordingPage", function () {
|
||||
|
||||
|
|
|
@ -480,18 +480,21 @@
|
|||
// Account for screen rotation. Use the larger dimension as the width.
|
||||
var screenWidth = Math.max(screen.height, screen.width);
|
||||
|
||||
var mediaStreams = item.MediaStreams || [];
|
||||
|
||||
var baseParams = {
|
||||
audioChannels: 2,
|
||||
audioBitrate: 128000,
|
||||
videoBitrate: 2000000,
|
||||
maxWidth: Math.min(screenWidth, 1280),
|
||||
StartTimeTicks: 0,
|
||||
SubtitleStreamIndex: getInitialSubtitleStreamIndex(item.MediaStreams, user),
|
||||
AudioStreamIndex: getInitialAudioStreamIndex(item.MediaStreams, user),
|
||||
deviceId: ApiClient.deviceId()
|
||||
SubtitleStreamIndex: getInitialSubtitleStreamIndex(mediaStreams, user),
|
||||
AudioStreamIndex: getInitialAudioStreamIndex(mediaStreams, user),
|
||||
deviceId: ApiClient.deviceId(),
|
||||
Type: item.Type
|
||||
};
|
||||
|
||||
var videoStream = item.MediaStreams.filter(function (i) {
|
||||
var videoStream = mediaStreams.filter(function (i) {
|
||||
return i.Type == "Video";
|
||||
})[0];
|
||||
|
||||
|
@ -573,7 +576,7 @@
|
|||
|
||||
$('#qualityButton', nowPlayingBar).show();
|
||||
|
||||
if (item.MediaStreams.filter(function (i) {
|
||||
if (mediaStreams.filter(function (i) {
|
||||
return i.Type == "Audio";
|
||||
}).length) {
|
||||
$('#audioTracksButton', nowPlayingBar).show();
|
||||
|
@ -581,7 +584,7 @@
|
|||
$('#audioTracksButton', nowPlayingBar).hide();
|
||||
}
|
||||
|
||||
if (item.MediaStreams.filter(function (i) {
|
||||
if (mediaStreams.filter(function (i) {
|
||||
return i.Type == "Subtitle";
|
||||
}).length) {
|
||||
$('#subtitleButton', nowPlayingBar).show();
|
||||
|
@ -589,7 +592,7 @@
|
|||
$('#subtitleButton', nowPlayingBar).hide();
|
||||
}
|
||||
|
||||
if (item.Chapters.length) {
|
||||
if (item.Chapters && item.Chapters.length) {
|
||||
$('#chaptersButton', nowPlayingBar).show();
|
||||
} else {
|
||||
$('#chaptersButton', nowPlayingBar).hide();
|
||||
|
@ -1361,15 +1364,17 @@
|
|||
|
||||
var currentTicks = getCurrentTicks();
|
||||
|
||||
for (var i = 0, length = item.Chapters.length; i < length; i++) {
|
||||
var chapters = item.Chapters || [];
|
||||
|
||||
var chapter = item.Chapters[i];
|
||||
for (var i = 0, length = chapters.length; i < length; i++) {
|
||||
|
||||
var chapter = chapters[i];
|
||||
|
||||
var isSelected = false;
|
||||
|
||||
if (currentTicks >= chapter.StartPositionTicks) {
|
||||
|
||||
var nextChapter = item.Chapters[i + 1];
|
||||
var nextChapter = chapters[i + 1];
|
||||
|
||||
isSelected = !nextChapter || currentTicks < nextChapter.StartPositionTicks;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
SortBy: "DateCreated",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Limit: 7,
|
||||
Limit: 6,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,DateCreated,UserData",
|
||||
Filters: "IsUnplayed"
|
||||
|
@ -32,7 +32,7 @@
|
|||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Filters: "IsResumable",
|
||||
Limit: 7,
|
||||
Limit: 6,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,DateCreated,UserData"
|
||||
};
|
||||
|
@ -59,7 +59,7 @@
|
|||
SortBy: "DateCreated",
|
||||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Trailer",
|
||||
Limit: 7,
|
||||
Limit: 6,
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,DateCreated,UserData",
|
||||
Filters: "IsUnplayed"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue