mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update closing of live streams
This commit is contained in:
parent
2efcbc740d
commit
3da30e8414
12 changed files with 48 additions and 35 deletions
|
@ -8,6 +8,7 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tvProgramSectionHeader {
|
.tvProgramSectionHeader {
|
||||||
|
@ -83,7 +84,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.channelTimeslotHeader {
|
.channelTimeslotHeader {
|
||||||
float: left;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotHeaders {
|
.timeslotHeaders {
|
||||||
|
@ -93,15 +94,14 @@
|
||||||
.programContainer {
|
.programContainer {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
.programGridContainer {
|
|
||||||
margin-left: 12.2vw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.channelPrograms {
|
.channelPrograms {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
contain: strict;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotHeadersInner {
|
.timeslotHeadersInner {
|
||||||
|
@ -285,6 +285,12 @@
|
||||||
|
|
||||||
.channelPrograms, .channelHeaderCell {
|
.channelPrograms, .channelHeaderCell {
|
||||||
height: 4em;
|
height: 4em;
|
||||||
|
contain: strict;
|
||||||
|
}
|
||||||
|
|
||||||
|
.channelPrograms {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.channelPrograms-tv, .channelHeaderCell-tv {
|
.channelPrograms-tv, .channelHeaderCell-tv {
|
||||||
|
@ -307,10 +313,6 @@
|
||||||
background-color: #444;
|
background-color: #444;
|
||||||
}
|
}
|
||||||
|
|
||||||
.channelList {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.programGrid {
|
.programGrid {
|
||||||
padding-bottom: 4px;
|
padding-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
@ -403,8 +405,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.channelList {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
.channelList, .programGrid {
|
.channelList, .programGrid {
|
||||||
height: auto !important;
|
contain: layout style;
|
||||||
}
|
}
|
||||||
|
|
||||||
.programCell, .channelHeaderCell, .btnSelectDate {
|
.programCell, .channelHeaderCell, .btnSelectDate {
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="smoothScrollY guideVerticalScroller programContainer guideScroller" style="flex-grow: 1;">
|
<div class="smoothScrollY guideVerticalScroller programContainer guideScroller" style="flex-grow: 1;">
|
||||||
|
|
||||||
<div class="channelList"></div>
|
<div class="channelList"></div>
|
||||||
|
|
||||||
<div class="programGridContainer programGrid smoothScrollX guideScroller" style="white-space: nowrap;">
|
<div class="programGridContainer programGrid smoothScrollX guideScroller" style="white-space: nowrap;">
|
||||||
|
|
|
@ -245,8 +245,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
if (options.showProgramTimeColumn) {
|
if (options.showProgramTimeColumn) {
|
||||||
html += '<div class="listItemBody listItemBody-nogrow listItemBody-rightborder"><div class="listItemBodyText">';
|
html += '<div class="listItemBody listItemBody-nogrow listItemBody-rightborder"><div class="listItemBodyText">';
|
||||||
html += datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate));
|
html += datetime.getDisplayTime(datetime.parseISO8601Date(item.StartDate));
|
||||||
html += ' - ';
|
|
||||||
html += datetime.getDisplayTime(datetime.parseISO8601Date(item.EndDate));
|
|
||||||
html += '</div></div>';
|
html += '</div></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +307,8 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
var mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText';
|
var mediaInfoClass = 'secondary listItemMediaInfo listItemBodyText';
|
||||||
|
|
||||||
html += '<div class="' + mediaInfoClass + '">' + mediaInfo.getPrimaryMediaInfoHtml(item, {
|
html += '<div class="' + mediaInfoClass + '">' + mediaInfo.getPrimaryMediaInfoHtml(item, {
|
||||||
episodeTitle: false
|
episodeTitle: false,
|
||||||
|
originalAirDate: false
|
||||||
}) + '</div>';
|
}) + '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -190,7 +190,7 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', '
|
||||||
miscInfo.push(itemHelper.getDisplayName(item));
|
miscInfo.push(itemHelper.getDisplayName(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (item.PremiereDate) {
|
else if (item.PremiereDate && options.originalAirDate !== false) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
date = datetime.parseISO8601Date(item.PremiereDate);
|
date = datetime.parseISO8601Date(item.PremiereDate);
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
|
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
|
||||||
|
|
||||||
var currentDialog;
|
var currentDialog;
|
||||||
var recordingUpdated = false;
|
|
||||||
var recordingDeleted = false;
|
var recordingDeleted = false;
|
||||||
var currentItemId;
|
var currentItemId;
|
||||||
var currentServerId;
|
var currentServerId;
|
||||||
|
var currentResolve;
|
||||||
|
|
||||||
function deleteTimer(apiClient, timerId) {
|
function deleteTimer(apiClient, timerId) {
|
||||||
|
|
||||||
|
@ -50,7 +50,6 @@
|
||||||
|
|
||||||
function closeDialog(isDeleted) {
|
function closeDialog(isDeleted) {
|
||||||
|
|
||||||
recordingUpdated = true;
|
|
||||||
recordingDeleted = isDeleted;
|
recordingDeleted = isDeleted;
|
||||||
|
|
||||||
dialogHelper.close(currentDialog);
|
dialogHelper.close(currentDialog);
|
||||||
|
@ -63,10 +62,9 @@
|
||||||
var apiClient = connectionManager.getApiClient(currentServerId);
|
var apiClient = connectionManager.getApiClient(currentServerId);
|
||||||
|
|
||||||
apiClient.getLiveTvTimer(currentItemId).then(function (item) {
|
apiClient.getLiveTvTimer(currentItemId).then(function (item) {
|
||||||
|
|
||||||
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
|
item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60;
|
||||||
item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
|
item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60;
|
||||||
apiClient.updateLiveTvTimer(item);
|
apiClient.updateLiveTvTimer(item).then(currentResolve);
|
||||||
});
|
});
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -110,11 +108,11 @@
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
|
|
||||||
recordingUpdated = false;
|
|
||||||
recordingDeleted = false;
|
recordingDeleted = false;
|
||||||
currentServerId = serverId;
|
currentServerId = serverId;
|
||||||
loading.show();
|
loading.show();
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
currentResolve = resolve;
|
||||||
|
|
||||||
require(['text!./recordingeditor.template.html'], function (template) {
|
require(['text!./recordingeditor.template.html'], function (template) {
|
||||||
|
|
||||||
|
@ -150,22 +148,20 @@
|
||||||
|
|
||||||
currentDialog = dlg;
|
currentDialog = dlg;
|
||||||
|
|
||||||
dlg.addEventListener('close', function () {
|
dlg.addEventListener('closing', function () {
|
||||||
|
|
||||||
if (!recordingDeleted) {
|
if (!recordingDeleted) {
|
||||||
this.querySelector('.btnSubmit').click();
|
dlg.querySelector('.btnSubmit').click();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
dlg.addEventListener('close', function () {
|
dlg.addEventListener('close', function () {
|
||||||
|
|
||||||
if (recordingUpdated) {
|
if (recordingDeleted) {
|
||||||
resolve({
|
resolve({
|
||||||
updated: true,
|
updated: true,
|
||||||
deleted: recordingDeleted
|
deleted: true
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
reject();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -832,11 +832,13 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'scrollStyles'], func
|
||||||
}
|
}
|
||||||
|
|
||||||
function onFrameClick(e) {
|
function onFrameClick(e) {
|
||||||
|
if (e.which == 1) {
|
||||||
var focusableParent = focusManager.focusableParent(e.target);
|
var focusableParent = focusManager.focusableParent(e.target);
|
||||||
if (focusableParent != document.activeElement) {
|
if (focusableParent != document.activeElement) {
|
||||||
focusableParent.focus();
|
focusableParent.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize.
|
* Initialize.
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
$('#chkSaveMetadataHidden', page).checked(config.SaveMetadataHidden);
|
$('#chkSaveMetadataHidden', page).checked(config.SaveMetadataHidden);
|
||||||
|
|
||||||
$('#txtMetadataPath', page).val(config.MetadataPath || '');
|
$('#txtMetadataPath', page).val(config.MetadataPath || '');
|
||||||
|
$('#txtMetadataNetworkPath', page).val(config.MetadataNetworkPath || '');
|
||||||
|
|
||||||
$('#chkPeopleActors', page).checked(config.PeopleMetadataOptions.DownloadActorMetadata);
|
$('#chkPeopleActors', page).checked(config.PeopleMetadataOptions.DownloadActorMetadata);
|
||||||
$('#chkPeopleComposers', page).checked(config.PeopleMetadataOptions.DownloadComposerMetadata);
|
$('#chkPeopleComposers', page).checked(config.PeopleMetadataOptions.DownloadComposerMetadata);
|
||||||
|
@ -70,6 +71,7 @@
|
||||||
config.EnableTmdbUpdates = $('#chkEnableTmdbUpdates', form).checked();
|
config.EnableTmdbUpdates = $('#chkEnableTmdbUpdates', form).checked();
|
||||||
config.EnableFanArtUpdates = $('#chkEnableFanartUpdates', form).checked();
|
config.EnableFanArtUpdates = $('#chkEnableFanartUpdates', form).checked();
|
||||||
config.MetadataPath = $('#txtMetadataPath', form).val();
|
config.MetadataPath = $('#txtMetadataPath', form).val();
|
||||||
|
config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val();
|
||||||
config.FanartApiKey = $('#txtFanartApiKey', form).val();
|
config.FanartApiKey = $('#txtFanartApiKey', form).val();
|
||||||
|
|
||||||
config.PeopleMetadataOptions.DownloadActorMetadata = $('#chkPeopleActors', form).checked();
|
config.PeopleMetadataOptions.DownloadActorMetadata = $('#chkPeopleActors', form).checked();
|
||||||
|
@ -122,16 +124,21 @@
|
||||||
|
|
||||||
picker.show({
|
picker.show({
|
||||||
|
|
||||||
callback: function (path) {
|
path: $('#txtMetadataPath', view).val(),
|
||||||
|
networkPath: $('#txtMetadataNetworkPath', view).val(),
|
||||||
|
callback: function (path, networkPath) {
|
||||||
if (path) {
|
if (path) {
|
||||||
$('#txtMetadataPath', view).val(path);
|
$('#txtMetadataPath', view).val(path);
|
||||||
|
$('#txtMetadataNetworkPath', view).val(networkPath);
|
||||||
}
|
}
|
||||||
picker.close();
|
picker.close();
|
||||||
},
|
},
|
||||||
|
|
||||||
header: Globalize.translate('HeaderSelectMetadataPath'),
|
header: Globalize.translate('HeaderSelectMetadataPath'),
|
||||||
|
|
||||||
instruction: Globalize.translate('HeaderSelectMetadataPathHelp')
|
instruction: Globalize.translate('HeaderSelectMetadataPathHelp'),
|
||||||
|
|
||||||
|
enableNetworkSharePath: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ h1, h1 a {
|
||||||
}
|
}
|
||||||
|
|
||||||
.dialog.background-theme-b {
|
.dialog.background-theme-b {
|
||||||
background: rgba(28,28,28,.88);
|
background: rgba(28,28,28,.84);
|
||||||
-webkit-backdrop-filter: blur(5px);
|
-webkit-backdrop-filter: blur(5px);
|
||||||
backdrop-filter: blur(5px);
|
backdrop-filter: blur(5px);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
<button type="button" is="paper-icon-button-light" id="btnSelectMetadataPath" title="${ButtonSelectDirectory}"><i class="md-icon">search</i></button>
|
<button type="button" is="paper-icon-button-light" id="btnSelectMetadataPath" title="${ButtonSelectDirectory}"><i class="md-icon">search</i></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="fieldDescription">${LabelMetadataPathHelp}</div>
|
<div class="fieldDescription">${LabelMetadataPathHelp}</div>
|
||||||
|
<input type="hidden" id="txtMetadataNetworkPath" />
|
||||||
</div>
|
</div>
|
||||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||||
<label>
|
<label>
|
||||||
|
|
|
@ -195,8 +195,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// For now don't do this in edge because we lose some native audio support
|
// For now don't do this in edge because we lose some native audio support
|
||||||
if (browser.edge) {
|
if (browser.edge && browser.mobile) {
|
||||||
//return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// hls.js is only in beta. needs more testing.
|
// hls.js is only in beta. needs more testing.
|
||||||
|
|
|
@ -1008,7 +1008,7 @@
|
||||||
// Huge hack alert. Safari doesn't seem to like if the segments aren't available right away when playback starts
|
// Huge hack alert. Safari doesn't seem to like if the segments aren't available right away when playback starts
|
||||||
// This will start the transcoding process before actually feeding the video url into the player
|
// This will start the transcoding process before actually feeding the video url into the player
|
||||||
// Edit: Also seeing stalls from hls.js
|
// Edit: Also seeing stalls from hls.js
|
||||||
if (!mediaSource.RunTimeTicks && isHls) {
|
if (!mediaSource.RunTimeTicks && isHls && (!browser.edge || !browser.mobile)) {
|
||||||
|
|
||||||
var hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8');
|
var hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8');
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue