mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'dev' into imageupload-fixes
This commit is contained in:
commit
b1f8bb93a3
90 changed files with 2201 additions and 2830 deletions
|
@ -15,7 +15,7 @@
|
|||
- [cvium](https://github.com/cvium)
|
||||
- [grafixeyehero](https://github.com/grafixeyehero)
|
||||
- [Drago96](https://github.com/drago-96)
|
||||
- [ViXXoR](https://github.com/vixxor)
|
||||
- [ViXXoR](https://github.com/ViXXoR)
|
||||
|
||||
# Emby Contributors
|
||||
|
||||
|
|
|
@ -35,44 +35,6 @@
|
|||
</p>
|
||||
<p id="nonServerMsg"></p>
|
||||
</form>
|
||||
|
||||
<div class="premiumPackage" style="display: none; margin-top: 1.5em;">
|
||||
<div>
|
||||
<form name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="post">
|
||||
<p id="regStatus">
|
||||
</p>
|
||||
<div class="supporterDescription">
|
||||
|
||||
<p>${MessagePluginRequiresSubscription}</p>
|
||||
|
||||
<p><a is="emby-linkbutton" class="button-link" href="https://github.com/jellyfin/jellyfin" target="_blank">${LinkLearnMoreAboutSubscription}</a></p>
|
||||
|
||||
</div>
|
||||
<div class="premiumDescription">
|
||||
|
||||
<p>${MessagePremiumPluginRequiresMembership}</p>
|
||||
|
||||
<p><a is="emby-linkbutton" class="button-link" href="https://github.com/jellyfin/jellyfin" target="_blank">${LinkLearnMoreAboutSubscription}</a></p>
|
||||
</div>
|
||||
<div class="premiumHasPrice" style="display: none">
|
||||
<p id="regPrice">
|
||||
</p>
|
||||
<input type="hidden" name="cmd" value="_xclick">
|
||||
<input type="hidden" id="payPalEmail" name="business" value="mb_1358534950_biz@reedsplace.com">
|
||||
<input type="hidden" name="currency_code" value="USD">
|
||||
<input type="hidden" id="featureName" name="item_name" value="">
|
||||
<input type="hidden" id="amount" name="amount" value="10">
|
||||
<input type="hidden" id="featureId" name="item_number" value="">
|
||||
<input type="hidden" name="notify_url" value="https://mb3admin.local/admin/service/services/ppipn.php">
|
||||
<input type="hidden" name="return" id="paypalReturnUrl" value="#">
|
||||
<button is="emby-button" type="submit" id="ppButton" class="raised block button-submit" style="background-color: #179BD7;color:#fff;">
|
||||
<span>${RegisterWithPayPal}</span>
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
|
|
47
src/bower_components/emby-apiclient/apiclient.js
vendored
47
src/bower_components/emby-apiclient/apiclient.js
vendored
|
@ -1,4 +1,4 @@
|
|||
define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeOnLan) {
|
||||
define(["events", "appStorage"], function(events, appStorage) {
|
||||
"use strict";
|
||||
|
||||
function redetectBitrate(instance) {
|
||||
|
@ -201,36 +201,6 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO
|
|||
ratio && (options.minScale && (ratio = Math.max(options.minScale, ratio)), options.width && (options.width = Math.round(options.width * ratio)), options.height && (options.height = Math.round(options.height * ratio)), options.maxWidth && (options.maxWidth = Math.round(options.maxWidth * ratio)), options.maxHeight && (options.maxHeight = Math.round(options.maxHeight * ratio))), options.quality = options.quality || instance.getDefaultImageQuality(options.type), instance.normalizeImageOptions && instance.normalizeImageOptions(options)
|
||||
}
|
||||
|
||||
function getCachedWakeOnLanInfo(instance) {
|
||||
var serverId = instance.serverId(),
|
||||
json = appStorage.getItem("server-" + serverId + "-wakeonlaninfo");
|
||||
return json ? JSON.parse(json) : []
|
||||
}
|
||||
|
||||
function refreshWakeOnLanInfoIfNeeded(instance) {
|
||||
wakeOnLan.isSupported() && instance.accessToken() && !1 !== instance.enableAutomaticBitrateDetection && (console.log("refreshWakeOnLanInfoIfNeeded"), setTimeout(refreshWakeOnLanInfo.bind(instance), 1e4))
|
||||
}
|
||||
|
||||
function refreshWakeOnLanInfo() {
|
||||
var instance = this;
|
||||
console.log("refreshWakeOnLanInfo"), instance.getWakeOnLanInfo().then(function(info) {
|
||||
var serverId = instance.serverId();
|
||||
return appStorage.setItem("server-" + serverId + "-wakeonlaninfo", JSON.stringify(info)), info
|
||||
}, function(err) {
|
||||
return []
|
||||
})
|
||||
}
|
||||
|
||||
function sendNextWakeOnLan(infos, index, resolve) {
|
||||
if (index >= infos.length) return void resolve();
|
||||
var info = infos[index];
|
||||
console.log("sending wakeonlan to " + info.MacAddress), wakeOnLan.send(info).then(function(result) {
|
||||
sendNextWakeOnLan(infos, index + 1, resolve)
|
||||
}, function() {
|
||||
sendNextWakeOnLan(infos, index + 1, resolve)
|
||||
})
|
||||
}
|
||||
|
||||
function compareVersions(a, b) {
|
||||
a = a.split("."), b = b.split(".");
|
||||
for (var i = 0, length = Math.max(a.length, b.length); i < length; i++) {
|
||||
|
@ -266,7 +236,7 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO
|
|||
}
|
||||
return this._serverAddress
|
||||
}, ApiClient.prototype.onNetworkChange = function() {
|
||||
this.lastDetectedBitrate = 0, this.lastDetectedBitrateTime = 0, setSavedEndpointInfo(this, null), redetectBitrate(this), refreshWakeOnLanInfoIfNeeded(this)
|
||||
this.lastDetectedBitrate = 0, this.lastDetectedBitrateTime = 0, setSavedEndpointInfo(this, null), redetectBitrate(this)
|
||||
}, ApiClient.prototype.getUrl = function(name, params, serverAddress) {
|
||||
if (!name) throw new Error("Url name cannot be empty");
|
||||
var url = serverAddress || this._serverAddress;
|
||||
|
@ -301,7 +271,7 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO
|
|||
}
|
||||
return this.fetchWithFailover(request, !0)
|
||||
}, ApiClient.prototype.setAuthenticationInfo = function(accessKey, userId) {
|
||||
this._currentUser = null, this._serverInfo.AccessToken = accessKey, this._serverInfo.UserId = userId, redetectBitrate(this), refreshWakeOnLanInfoIfNeeded(this)
|
||||
this._currentUser = null, this._serverInfo.AccessToken = accessKey, this._serverInfo.UserId = userId, redetectBitrate(this)
|
||||
}, ApiClient.prototype.serverInfo = function(info) {
|
||||
return info && (this._serverInfo = info), this._serverInfo
|
||||
}, ApiClient.prototype.getCurrentUserId = function() {
|
||||
|
@ -360,7 +330,7 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO
|
|||
contentType: "application/json"
|
||||
}).then(function(result) {
|
||||
var afterOnAuthenticated = function() {
|
||||
redetectBitrate(instance), refreshWakeOnLanInfoIfNeeded(instance), resolve(result)
|
||||
redetectBitrate(instance), resolve(result)
|
||||
};
|
||||
instance.onAuthenticated ? instance.onAuthenticated(instance, result).then(afterOnAuthenticated) : afterOnAuthenticated()
|
||||
}, reject)
|
||||
|
@ -1579,19 +1549,10 @@ define(["events", "appStorage", "wakeOnLan"], function(events, appStorage, wakeO
|
|||
return this.getJSON(this.getUrl("System/Endpoint")).then(function(endPointInfo) {
|
||||
return setSavedEndpointInfo(instance, endPointInfo), endPointInfo
|
||||
})
|
||||
}, ApiClient.prototype.getWakeOnLanInfo = function() {
|
||||
return this.getJSON(this.getUrl("System/WakeOnLanInfo"))
|
||||
}, ApiClient.prototype.getLatestItems = function(options) {
|
||||
return options = options || {}, this.getJSON(this.getUrl("Users/" + this.getCurrentUserId() + "/Items/Latest", options))
|
||||
}, ApiClient.prototype.getFilters = function(options) {
|
||||
return this.getJSON(this.getUrl("Items/Filters2", options))
|
||||
}, ApiClient.prototype.supportsWakeOnLan = function() {
|
||||
return !!wakeOnLan.isSupported() && getCachedWakeOnLanInfo(this).length > 0
|
||||
}, ApiClient.prototype.wakeOnLan = function() {
|
||||
var infos = getCachedWakeOnLanInfo(this);
|
||||
return new Promise(function(resolve, reject) {
|
||||
sendNextWakeOnLan(infos, 0, resolve)
|
||||
})
|
||||
}, ApiClient.prototype.setSystemInfo = function(info) {
|
||||
this._serverVersion = info.Version
|
||||
}, ApiClient.prototype.serverVersion = function() {
|
||||
|
|
|
@ -24,6 +24,6 @@ define(["events", "appStorage"], function(events, appStorage) {
|
|||
var existing = list.filter(function(s) {
|
||||
return s.Id === server.Id
|
||||
})[0];
|
||||
return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), server.WakeOnLanInfos && server.WakeOnLanInfos.length && (existing.WakeOnLanInfos = server.WakeOnLanInfos), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server)
|
||||
return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server)
|
||||
}, Credentials
|
||||
});
|
|
@ -806,6 +806,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||
}
|
||||
|
||||
var cssClass = options.centerText ? "cardText cardTextCentered" : "cardText";
|
||||
var serverId = item.ServerId || options.serverId;
|
||||
|
||||
var lines = [];
|
||||
var parentTitleUnderneath = item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'MusicVideo';
|
||||
|
@ -819,7 +820,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||
if (item.SeriesId) {
|
||||
lines.push(getTextActionButton({
|
||||
Id: item.SeriesId,
|
||||
ServerId: item.ServerId,
|
||||
ServerId: serverId,
|
||||
Name: item.SeriesName,
|
||||
Type: 'Series',
|
||||
IsFolder: true
|
||||
|
@ -859,8 +860,15 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||
var name = options.showTitle === 'auto' && !item.IsFolder && item.MediaType === 'Photo' ? '' : itemHelper.getDisplayName(item, {
|
||||
includeParentInfo: options.includeParentInfoInTitle
|
||||
});
|
||||
|
||||
lines.push(name);
|
||||
|
||||
lines.push(getTextActionButton({
|
||||
Id: item.Id,
|
||||
ServerId: serverId,
|
||||
Name: name,
|
||||
Type: item.Type,
|
||||
CollectionType: item.CollectionType,
|
||||
IsFolder: item.IsFolder
|
||||
}));
|
||||
}
|
||||
|
||||
if (showOtherText) {
|
||||
|
@ -869,7 +877,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||
if (isOuterFooter && item.AlbumArtists && item.AlbumArtists.length) {
|
||||
item.AlbumArtists[0].Type = 'MusicArtist';
|
||||
item.AlbumArtists[0].IsFolder = true;
|
||||
lines.push(getTextActionButton(item.AlbumArtists[0], null, item.ServerId));
|
||||
lines.push(getTextActionButton(item.AlbumArtists[0], null, serverId));
|
||||
} else {
|
||||
lines.push(isUsingLiveTvNaming(item) ? item.Name : (item.SeriesName || item.Series || item.Album || item.AlbumArtist || item.GameSystem || ""));
|
||||
}
|
||||
|
@ -960,7 +968,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana
|
|||
lines.push(getTextActionButton({
|
||||
|
||||
Id: item.ChannelId,
|
||||
ServerId: item.ServerId,
|
||||
ServerId: serverId,
|
||||
Name: item.ChannelName,
|
||||
Type: 'TvChannel',
|
||||
MediaType: item.MediaType,
|
||||
|
|
|
@ -145,10 +145,10 @@
|
|||
loadRecentlyAdded(elem, apiClient, user, userViews);
|
||||
}
|
||||
else if (section === 'librarytiles' || section === 'smalllibrarytiles' || section === 'smalllibrarytiles-automobile' || section === 'librarytiles-automobile') {
|
||||
return loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections);
|
||||
loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections);
|
||||
}
|
||||
else if (section === 'librarybuttons') {
|
||||
return loadlibraryButtons(elem, apiClient, user, userSettings, userViews, allSections);
|
||||
loadlibraryButtons(elem, apiClient, user, userSettings, userViews, allSections);
|
||||
}
|
||||
else if (section === 'resume') {
|
||||
loadResumeVideo(elem, apiClient, userId);
|
||||
|
@ -273,35 +273,12 @@
|
|||
}
|
||||
|
||||
function loadlibraryButtons(elem, apiClient, user, userSettings, userViews) {
|
||||
elem.classList.remove('verticalSection');
|
||||
var html = getLibraryButtonsHtml(userViews);
|
||||
|
||||
return Promise.all([getAppInfo(apiClient), getDownloadsSectionHtml(apiClient, user, userSettings)]).then(function (responses) {
|
||||
|
||||
var infoHtml = responses[0];
|
||||
var downloadsHtml = responses[1];
|
||||
|
||||
elem.classList.remove('verticalSection');
|
||||
|
||||
var html = getLibraryButtonsHtml(userViews);
|
||||
|
||||
elem.innerHTML = html + downloadsHtml + infoHtml;
|
||||
|
||||
bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings);
|
||||
|
||||
if (infoHtml) {
|
||||
bindAppInfoEvents(elem);
|
||||
}
|
||||
imageLoader.lazyChildren(elem);
|
||||
});
|
||||
}
|
||||
|
||||
function bindAppInfoEvents(elem) {
|
||||
|
||||
elem.querySelector('.appInfoSection').addEventListener('click', function (e) {
|
||||
|
||||
if (dom.parentWithClass(e.target, 'card')) {
|
||||
registrationServices.showPremiereInfo();
|
||||
}
|
||||
});
|
||||
elem.innerHTML = html;
|
||||
bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings);
|
||||
imageLoader.lazyChildren(elem);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -312,106 +289,6 @@
|
|||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
}
|
||||
|
||||
function getAppInfo(apiClient) {
|
||||
|
||||
var frequency = 172800000;
|
||||
|
||||
var cacheKey = 'lastappinfopresent5';
|
||||
var lastDatePresented = parseInt(appSettings.get(cacheKey) || '0');
|
||||
|
||||
// Don't show the first time, right after installation
|
||||
if (!lastDatePresented) {
|
||||
appSettings.set(cacheKey, new Date().getTime());
|
||||
return Promise.resolve('');
|
||||
}
|
||||
|
||||
if ((new Date().getTime() - lastDatePresented) < frequency) {
|
||||
return Promise.resolve('');
|
||||
}
|
||||
|
||||
return registrationServices.validateFeature('dvr', {
|
||||
|
||||
showDialog: false,
|
||||
viewOnly: true
|
||||
|
||||
}).then(function () {
|
||||
|
||||
appSettings.set(cacheKey, new Date().getTime());
|
||||
return '';
|
||||
|
||||
}, function () {
|
||||
|
||||
appSettings.set(cacheKey, new Date().getTime());
|
||||
|
||||
var infos = [getPremiereInfo];
|
||||
|
||||
if (appHost.supports('otherapppromotions')) {
|
||||
infos.push(getTheaterInfo);
|
||||
}
|
||||
|
||||
return infos[getRandomInt(0, infos.length - 1)]();
|
||||
});
|
||||
}
|
||||
|
||||
function getCard(img, shape) {
|
||||
|
||||
shape = shape || 'backdropCard';
|
||||
var html = '<div class="card scalableCard ' + shape + ' ' + shape + '-scalable"><div class="cardBox"><div class="cardScalable"><div class="cardPadder cardPadder-backdrop"></div>';
|
||||
|
||||
html += '<div class="cardContent">';
|
||||
|
||||
html += '<div class="cardImage lazy" data-src="' + img + '"></div>';
|
||||
|
||||
html += '</div>';
|
||||
|
||||
html += '</div></div></div>';
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function getTheaterInfo() {
|
||||
|
||||
var html = '';
|
||||
html += '<div class="verticalSection appInfoSection">';
|
||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">Discover Jellyfin Theater</h2>';
|
||||
html += '<button is="paper-icon-button-light" class="sectionTitleButton" onclick="this.parentNode.parentNode.remove();" class="autoSize"><i class="md-icon">close</i></button>';
|
||||
html += '</div>';
|
||||
|
||||
var nameText = 'Jellyfin Theater';
|
||||
html += '<div class="padded-left padded-right">';
|
||||
html += '<p class="sectionTitle-cards">A beautiful app for your TV and large screen tablet. ' + nameText + ' runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.</p>';
|
||||
html += '<div class="itemsContainer vertical-wrap" is="emby-itemscontainer">';
|
||||
html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png');
|
||||
html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png');
|
||||
html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png');
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
function getPremiereInfo() {
|
||||
|
||||
var html = '';
|
||||
html += '<div class="verticalSection appInfoSection">';
|
||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">Discover Emby Premiere</h2>';
|
||||
html += '<button is="paper-icon-button-light" class="sectionTitleButton" onclick="this.parentNode.parentNode.remove();" class="autoSize"><i class="md-icon">close</i></button>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="padded-left padded-right">';
|
||||
html += '<p class="sectionTitle-cards">Enjoy Emby DVR, get free access to Emby apps, and more.</p>';
|
||||
html += '<div class="itemsContainer vertical-wrap" is="emby-itemscontainer">';
|
||||
html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png');
|
||||
html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png');
|
||||
html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png');
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
function getFetchLatestItemsFn(serverId, parentId, collectionType) {
|
||||
|
||||
return function () {
|
||||
|
@ -588,72 +465,6 @@
|
|||
});
|
||||
}
|
||||
|
||||
function getDownloadsSectionHtml(apiClient, user, userSettings) {
|
||||
|
||||
if (!appHost.supports('sync') || !user.Policy.EnableContentDownloading) {
|
||||
return Promise.resolve('');
|
||||
}
|
||||
|
||||
var promise = apiClient.getLatestOfflineItems ? apiClient.getLatestOfflineItems({
|
||||
|
||||
Limit: 20,
|
||||
Filters: 'IsNotFolder'
|
||||
|
||||
}) : Promise.resolve([]);
|
||||
|
||||
return promise.then(function (items) {
|
||||
|
||||
var html = '';
|
||||
|
||||
html += '<div class="verticalSection">';
|
||||
|
||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
|
||||
|
||||
if (!layoutManager.tv) {
|
||||
|
||||
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('downloads') + '" class="more button-flat button-flat-mini sectionTitleTextButton">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||
html += globalize.translate('sharedcomponents#HeaderMyDownloads');
|
||||
html += '</h2>';
|
||||
html += '<i class="md-icon"></i>';
|
||||
html += '</a>';
|
||||
|
||||
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('managedownloads') + '" class="sectionTitleIconButton"><i class="md-icon"></i></a>';
|
||||
|
||||
} else {
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate('sharedcomponents#HeaderMyDownloads') + '</h2>';
|
||||
}
|
||||
html += '</div>';
|
||||
|
||||
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="scrollSlider focuscontainer-x padded-left padded-right">';
|
||||
|
||||
var cardLayout = false;
|
||||
|
||||
html += cardBuilder.getCardsHtml({
|
||||
items: items,
|
||||
preferThumb: 'auto',
|
||||
shape: 'autooverflow',
|
||||
overlayText: false,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
showDetailsMenu: true,
|
||||
overlayPlayButton: true,
|
||||
context: 'home',
|
||||
centerText: !cardLayout,
|
||||
allowBottomPadding: false,
|
||||
cardLayout: cardLayout,
|
||||
showYear: true,
|
||||
lines: 2
|
||||
});
|
||||
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
|
||||
return html;
|
||||
});
|
||||
}
|
||||
|
||||
function loadLibraryTiles(elem, apiClient, user, userSettings, shape, userViews, allSections) {
|
||||
|
||||
elem.classList.remove('verticalSection');
|
||||
|
@ -699,21 +510,9 @@
|
|||
html += '</div>';
|
||||
}
|
||||
|
||||
return Promise.all([getAppInfo(apiClient), getDownloadsSectionHtml(apiClient, user, userSettings)]).then(function (responses) {
|
||||
|
||||
var infoHtml = responses[0];
|
||||
var downloadsHtml = responses[1];
|
||||
|
||||
elem.innerHTML = html + downloadsHtml + infoHtml;
|
||||
|
||||
bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings);
|
||||
|
||||
if (infoHtml) {
|
||||
bindAppInfoEvents(elem);
|
||||
}
|
||||
|
||||
imageLoader.lazyChildren(elem);
|
||||
});
|
||||
elem.innerHTML = html;
|
||||
bindHomeScreenSettingsIcon(elem, apiClient, user.Id, userSettings);
|
||||
imageLoader.lazyChildren(elem);
|
||||
}
|
||||
|
||||
function getContinueWatchingFetchFn(serverId) {
|
||||
|
|
|
@ -1,732 +1,15 @@
|
|||
define(['appSettings', 'loading', 'apphost', 'iapManager', 'events', 'shell', 'globalize', 'dialogHelper', 'connectionManager', 'layoutManager', 'emby-button', 'emby-linkbutton'], function (appSettings, loading, appHost, iapManager, events, shell, globalize, dialogHelper, connectionManager, layoutManager) {
|
||||
define(['appSettings', 'loading', 'apphost', 'events', 'shell', 'globalize', 'dialogHelper', 'connectionManager', 'layoutManager', 'emby-button', 'emby-linkbutton'], function (appSettings, loading, appHost, events, shell, globalize, dialogHelper, connectionManager, layoutManager) {
|
||||
'use strict';
|
||||
|
||||
var currentDisplayingProductInfos = [];
|
||||
var currentDisplayingResolve = null;
|
||||
var currentValidatingFeature = null;
|
||||
var isCurrentDialogRejected = null;
|
||||
|
||||
function alertText(options) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['alert'], function (alert) {
|
||||
alert(options).then(resolve, reject);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showInAppPurchaseInfo(subscriptionOptions, unlockableProductInfo, dialogOptions) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['listViewStyle', 'formDialogStyle'], function () {
|
||||
showInAppPurchaseElement(subscriptionOptions, unlockableProductInfo, dialogOptions, resolve, reject);
|
||||
|
||||
currentDisplayingResolve = resolve;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showPeriodicMessage(feature, settingsKey) {
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['listViewStyle', 'emby-button', 'formDialogStyle'], function () {
|
||||
|
||||
var dlg = dialogHelper.createDialog({
|
||||
size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border',
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
});
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
|
||||
var html = '';
|
||||
var seconds = 11;
|
||||
|
||||
html += '<div class="continueTimeText formDialogFooterItem" style="margin: 1.5em 0 .5em;">' + globalize.translate('sharedcomponents#ContinueInSecondsValue', seconds) + '</div>';
|
||||
|
||||
html += '<button is="emby-button" type="button" class="raised button-cancel block btnContinue block formDialogFooterItem hide"><span>' + globalize.translate('sharedcomponents#Continue') + '</span></button>';
|
||||
|
||||
html += '</div>';
|
||||
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
|
||||
dlg.innerHTML = html;
|
||||
|
||||
var isRejected = true;
|
||||
|
||||
var timeTextInterval = setInterval(function () {
|
||||
|
||||
seconds -= 1;
|
||||
if (seconds <= 0) {
|
||||
dlg.querySelector('.continueTimeText').classList.add('hide');
|
||||
dlg.querySelector('.btnContinue').classList.remove('hide');
|
||||
} else {
|
||||
dlg.querySelector('.continueTimeText').innerHTML = globalize.translate('sharedcomponents#ContinueInSecondsValue', seconds);
|
||||
}
|
||||
|
||||
}, 1000);
|
||||
|
||||
var i, length;
|
||||
var btnPurchases = dlg.querySelectorAll('.buttonPremiereInfo');
|
||||
for (i = 0, length = btnPurchases.length; i < length; i++) {
|
||||
btnPurchases[i].addEventListener('click', showExternalPremiereInfo);
|
||||
}
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, true);
|
||||
}
|
||||
|
||||
// Has to be assigned a z-index after the call to .open()
|
||||
dlg.addEventListener('close', function (e) {
|
||||
|
||||
clearInterval(timeTextInterval);
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, false);
|
||||
}
|
||||
|
||||
if (isRejected) {
|
||||
reject();
|
||||
} else {
|
||||
appSettings.set(settingsKey, new Date().getTime());
|
||||
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnContinue').addEventListener('click', function () {
|
||||
isRejected = false;
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnGetPremiere').addEventListener('click', showPremiereInfo);
|
||||
|
||||
dialogHelper.open(dlg);
|
||||
|
||||
var onCancelClick = function () {
|
||||
dialogHelper.close(dlg);
|
||||
};
|
||||
var elems = dlg.querySelectorAll('.btnCancelSupporterInfo');
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].addEventListener('click', onCancelClick);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showPeriodicMessageIfNeeded(feature) {
|
||||
|
||||
if (feature !== 'playback') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
var intervalMs = iapManager.getPeriodicMessageIntervalMs(feature);
|
||||
if (intervalMs <= 0) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
var settingsKey = 'periodicmessage11-' + feature;
|
||||
|
||||
var lastMessage = parseInt(appSettings.get(settingsKey) || '0');
|
||||
|
||||
if (!lastMessage) {
|
||||
|
||||
// Don't show on the very first playback attempt
|
||||
appSettings.set(settingsKey, new Date().getTime());
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
if ((new Date().getTime() - lastMessage) > intervalMs) {
|
||||
|
||||
var apiClient = connectionManager.currentApiClient();
|
||||
if (apiClient.serverId() === '6da60dd6edfc4508bca2c434d4400816') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
var registrationOptions = {
|
||||
viewOnly: true
|
||||
};
|
||||
|
||||
// Get supporter status
|
||||
return connectionManager.getRegistrationInfo(iapManager.getAdminFeatureName(feature), apiClient, registrationOptions).catch(function (errorResult) {
|
||||
|
||||
if (errorResult === 'overlimit') {
|
||||
appSettings.set(settingsKey, new Date().getTime());
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return showPeriodicMessage(feature, settingsKey);
|
||||
});
|
||||
}
|
||||
|
||||
function validateFeature(feature, options) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function validateFeature(feature, options) {
|
||||
|
||||
options = options || {};
|
||||
|
||||
console.log('validateFeature: ' + feature);
|
||||
|
||||
return iapManager.isUnlockedByDefault(feature, options).then(function () {
|
||||
|
||||
return showPeriodicMessageIfNeeded(feature);
|
||||
|
||||
}, function () {
|
||||
|
||||
var unlockableFeatureCacheKey = 'featurepurchased-' + feature;
|
||||
if (appSettings.get(unlockableFeatureCacheKey) === '1') {
|
||||
return showPeriodicMessageIfNeeded(feature);
|
||||
}
|
||||
|
||||
var unlockableProduct = iapManager.getProductInfo(feature);
|
||||
if (unlockableProduct) {
|
||||
|
||||
var unlockableCacheKey = 'productpurchased-' + unlockableProduct.id;
|
||||
if (unlockableProduct.owned) {
|
||||
|
||||
// Cache this to eliminate the store as a possible point of failure in the future
|
||||
appSettings.set(unlockableFeatureCacheKey, '1');
|
||||
appSettings.set(unlockableCacheKey, '1');
|
||||
return showPeriodicMessageIfNeeded(feature);
|
||||
}
|
||||
|
||||
if (appSettings.get(unlockableCacheKey) === '1') {
|
||||
return showPeriodicMessageIfNeeded(feature);
|
||||
}
|
||||
}
|
||||
|
||||
var unlockableProductInfo = unlockableProduct ? {
|
||||
enableAppUnlock: true,
|
||||
id: unlockableProduct.id,
|
||||
price: unlockableProduct.price,
|
||||
feature: feature
|
||||
|
||||
} : null;
|
||||
|
||||
return iapManager.getSubscriptionOptions().then(function (subscriptionOptions) {
|
||||
|
||||
if (subscriptionOptions.filter(function (p) {
|
||||
return p.owned;
|
||||
}).length > 0) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
var registrationOptions = {
|
||||
viewOnly: options.viewOnly
|
||||
};
|
||||
|
||||
// Get supporter status
|
||||
return connectionManager.getRegistrationInfo(iapManager.getAdminFeatureName(feature), connectionManager.currentApiClient(), registrationOptions).catch(function (errorResult) {
|
||||
|
||||
if (options.showDialog === false) {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
var alertPromise;
|
||||
|
||||
if (errorResult === 'overlimit') {
|
||||
alertPromise = showOverLimitAlert();
|
||||
}
|
||||
|
||||
if (!alertPromise) {
|
||||
alertPromise = Promise.resolve();
|
||||
}
|
||||
|
||||
return alertPromise.then(function () {
|
||||
|
||||
var dialogOptions = {
|
||||
title: globalize.translate('sharedcomponents#HeaderUnlockFeature'),
|
||||
feature: feature
|
||||
};
|
||||
|
||||
currentValidatingFeature = feature;
|
||||
|
||||
return showInAppPurchaseInfo(subscriptionOptions, unlockableProductInfo, dialogOptions);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function showOverLimitAlert() {
|
||||
|
||||
return alertText('Your Jellyfin Premiere device limit has been exceeded. Please check with the owner of your Jellyfin Server and have them contact Emby support at apps@emby.media if necessary.').catch(function () {
|
||||
return Promise.resolve();
|
||||
});
|
||||
}
|
||||
|
||||
function cancelInAppPurchase() {
|
||||
|
||||
var elem = document.querySelector('.inAppPurchaseOverlay');
|
||||
if (elem) {
|
||||
dialogHelper.close(elem);
|
||||
}
|
||||
}
|
||||
|
||||
function clearCurrentDisplayingInfo() {
|
||||
currentDisplayingProductInfos = [];
|
||||
currentDisplayingResolve = null;
|
||||
currentValidatingFeature = null;
|
||||
isCurrentDialogRejected = null;
|
||||
}
|
||||
|
||||
function showExternalPremiereInfo() {
|
||||
shell.openUrl(iapManager.getPremiumInfoUrl());
|
||||
}
|
||||
|
||||
function centerFocus(elem, horiz, on) {
|
||||
require(['scrollHelper'], function (scrollHelper) {
|
||||
var fn = on ? 'on' : 'off';
|
||||
scrollHelper.centerFocus[fn](elem, horiz);
|
||||
});
|
||||
}
|
||||
|
||||
function getPurchaseTermHtml(term) {
|
||||
|
||||
return '<li>' + term + '</li>';
|
||||
}
|
||||
|
||||
function getTermsOfPurchaseHtml() {
|
||||
|
||||
var html = '';
|
||||
|
||||
var termsOfPurchase = iapManager.getTermsOfPurchase ? iapManager.getTermsOfPurchase() : [];
|
||||
|
||||
if (!termsOfPurchase.length) {
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
html += '<h1>' + globalize.translate('sharedcomponents#HeaderTermsOfPurchase') + '</h1>';
|
||||
|
||||
termsOfPurchase.push('<a is="emby-linkbutton" class="button-link" href="https://github.com/jellyfin/jellyfin" target="_blank">' + globalize.translate('sharedcomponents#PrivacyPolicy') + '</a>');
|
||||
termsOfPurchase.push('<a is="emby-linkbutton" class="button-link" href="https://github.com/jellyfin/jellyfin" target="_blank">' + globalize.translate('sharedcomponents#TermsOfUse') + '</a>');
|
||||
|
||||
html += '<ul>';
|
||||
html += termsOfPurchase.map(getPurchaseTermHtml).join('');
|
||||
html += '</ul>';
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function showInAppPurchaseElement(subscriptionOptions, unlockableProductInfo, dialogOptions, resolve, reject) {
|
||||
|
||||
cancelInAppPurchase();
|
||||
|
||||
// clone
|
||||
currentDisplayingProductInfos = subscriptionOptions.slice(0);
|
||||
|
||||
if (unlockableProductInfo) {
|
||||
currentDisplayingProductInfos.push(unlockableProductInfo);
|
||||
}
|
||||
|
||||
var dlg = dialogHelper.createDialog({
|
||||
size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border',
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
});
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
|
||||
var html = '';
|
||||
html += '<div class="formDialogHeader">';
|
||||
html += '<button is="paper-icon-button-light" class="btnCloseDialog autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||
html += '<h3 class="formDialogHeaderTitle">';
|
||||
html += dialogOptions.title || '';
|
||||
html += '</h3>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="formDialogContent smoothScrollY">';
|
||||
html += '<div class="dialogContentInner dialog-content-centered">';
|
||||
html += '<form style="margin:auto;">';
|
||||
|
||||
html += '<p style="margin-top:1.5em;">';
|
||||
|
||||
if (unlockableProductInfo) {
|
||||
html += globalize.translate('sharedcomponents#MessageUnlockAppWithPurchaseOrSupporter');
|
||||
}
|
||||
else {
|
||||
html += globalize.translate('sharedcomponents#MessageUnlockAppWithSupporter');
|
||||
}
|
||||
html += '</p>';
|
||||
|
||||
html += '<p style="margin:1.5em 0 2em;">';
|
||||
html += globalize.translate('sharedcomponents#MessageToValidateSupporter');
|
||||
html += '</p>';
|
||||
|
||||
var hasProduct = false;
|
||||
var i, length;
|
||||
|
||||
for (i = 0, length = subscriptionOptions.length; i < length; i++) {
|
||||
|
||||
hasProduct = true;
|
||||
html += '<p>';
|
||||
html += '<button is="emby-button" type="button" class="raised button-submit block btnPurchase" data-email="' + (subscriptionOptions[i].requiresEmail !== false) + '" data-featureid="' + subscriptionOptions[i].id + '"><span>';
|
||||
html += subscriptionOptions[i].title;
|
||||
html += '</span></button>';
|
||||
html += '</p>';
|
||||
}
|
||||
|
||||
if (unlockableProductInfo) {
|
||||
|
||||
hasProduct = true;
|
||||
var unlockText = globalize.translate('sharedcomponents#ButtonUnlockWithPurchase');
|
||||
if (unlockableProductInfo.price) {
|
||||
unlockText = globalize.translate('sharedcomponents#ButtonUnlockPrice', unlockableProductInfo.price);
|
||||
}
|
||||
html += '<p>';
|
||||
html += '<button is="emby-button" type="button" class="raised secondary block btnPurchase" data-featureid="' + unlockableProductInfo.id + '"><span>' + unlockText + '</span></button>';
|
||||
html += '</p>';
|
||||
}
|
||||
|
||||
html += '<p>';
|
||||
html += '<button is="emby-button" type="button" class="raised button-cancel block btnRestorePurchase"><span>' + iapManager.getRestoreButtonText() + '</span></button>';
|
||||
html += '</p>';
|
||||
|
||||
if (subscriptionOptions.length) {
|
||||
html += '<h1 style="margin-top:1.5em;">' + globalize.translate('sharedcomponents#HeaderBenefitsJellyfinPremiere') + '</h1>';
|
||||
|
||||
html += '<div class="paperList" style="margin-bottom:1em;">';
|
||||
html += getSubscriptionBenefits().map(getSubscriptionBenefitHtml).join('');
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
if (dialogOptions.feature === 'playback') {
|
||||
html += '<p>';
|
||||
html += '<button is="emby-button" type="button" class="raised button-cancel block btnPlayMinute"><span>' + globalize.translate('sharedcomponents#ButtonPlayOneMinute') + '</span></button>';
|
||||
html += '</p>';
|
||||
}
|
||||
|
||||
html += getTermsOfPurchaseHtml();
|
||||
|
||||
html += '</form>';
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
|
||||
dlg.innerHTML = html;
|
||||
document.body.appendChild(dlg);
|
||||
|
||||
var btnPurchases = dlg.querySelectorAll('.btnPurchase');
|
||||
for (i = 0, length = btnPurchases.length; i < length; i++) {
|
||||
btnPurchases[i].addEventListener('click', onPurchaseButtonClick);
|
||||
}
|
||||
|
||||
btnPurchases = dlg.querySelectorAll('.buttonPremiereInfo');
|
||||
for (i = 0, length = btnPurchases.length; i < length; i++) {
|
||||
btnPurchases[i].addEventListener('click', showExternalPremiereInfo);
|
||||
}
|
||||
|
||||
isCurrentDialogRejected = true;
|
||||
var resolveWithTimeLimit = false;
|
||||
|
||||
var btnPlayMinute = dlg.querySelector('.btnPlayMinute');
|
||||
if (btnPlayMinute) {
|
||||
btnPlayMinute.addEventListener('click', function () {
|
||||
|
||||
resolveWithTimeLimit = true;
|
||||
isCurrentDialogRejected = false;
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
}
|
||||
|
||||
dlg.querySelector('.btnRestorePurchase').addEventListener('click', function () {
|
||||
restorePurchase(unlockableProductInfo);
|
||||
});
|
||||
|
||||
loading.hide();
|
||||
|
||||
function onCloseButtonClick() {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
}
|
||||
|
||||
var btnCloseDialogs = dlg.querySelectorAll('.btnCloseDialog');
|
||||
for (i = 0, length = btnCloseDialogs.length; i < length; i++) {
|
||||
btnCloseDialogs[i].addEventListener('click', onCloseButtonClick);
|
||||
}
|
||||
|
||||
dlg.classList.add('inAppPurchaseOverlay');
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, true);
|
||||
}
|
||||
|
||||
dialogHelper.open(dlg).then(function () {
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, false);
|
||||
}
|
||||
|
||||
var rejected = isCurrentDialogRejected;
|
||||
clearCurrentDisplayingInfo();
|
||||
if (rejected) {
|
||||
reject();
|
||||
} else if (resolveWithTimeLimit) {
|
||||
resolve({
|
||||
enableTimeLimit: true
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getSubscriptionBenefits() {
|
||||
|
||||
var list = [];
|
||||
|
||||
list.push({
|
||||
name: globalize.translate('sharedcomponents#HeaderFreeApps'),
|
||||
icon: '',
|
||||
text: globalize.translate('sharedcomponents#FreeAppsFeatureDescription')
|
||||
});
|
||||
|
||||
if (appHost.supports('sync')) {
|
||||
list.push({
|
||||
name: globalize.translate('sharedcomponents#HeaderOfflineDownloads'),
|
||||
icon: '',
|
||||
text: globalize.translate('sharedcomponents#HeaderOfflineDownloadsDescription')
|
||||
});
|
||||
}
|
||||
|
||||
list.push({
|
||||
name: globalize.translate('sharedcomponents#LiveTV'),
|
||||
icon: '',
|
||||
text: globalize.translate('sharedcomponents#LiveTvFeatureDescription')
|
||||
});
|
||||
|
||||
list.push({
|
||||
name: 'Jellyfin DVR',
|
||||
icon: '',
|
||||
text: globalize.translate('sharedcomponents#DvrFeatureDescription')
|
||||
});
|
||||
|
||||
list.push({
|
||||
name: globalize.translate('sharedcomponents#HeaderCinemaMode'),
|
||||
icon: '',
|
||||
text: globalize.translate('sharedcomponents#CinemaModeFeatureDescription')
|
||||
});
|
||||
|
||||
list.push({
|
||||
name: globalize.translate('sharedcomponents#HeaderCloudSync'),
|
||||
icon: '',
|
||||
text: globalize.translate('sharedcomponents#CloudSyncFeatureDescription')
|
||||
});
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
function getSubscriptionBenefitHtml(item) {
|
||||
|
||||
var enableLink = appHost.supports('externalpremium');
|
||||
|
||||
var html = '';
|
||||
|
||||
var cssClass = "listItem";
|
||||
|
||||
if (layoutManager.tv) {
|
||||
cssClass += ' listItem-focusscale';
|
||||
}
|
||||
|
||||
if (enableLink) {
|
||||
cssClass += ' listItem-button';
|
||||
|
||||
html += '<button type="button" class="' + cssClass + ' buttonPremiereInfo">';
|
||||
} else {
|
||||
html += '<div class="' + cssClass + '">';
|
||||
}
|
||||
|
||||
html += '<i class="listItemIcon md-icon">' + item.icon + '</i>';
|
||||
|
||||
html += '<div class="listItemBody">';
|
||||
|
||||
html += '<h3 class="listItemBodyText">';
|
||||
html += item.name;
|
||||
html += '</h3>';
|
||||
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
html += item.text;
|
||||
html += '</div>';
|
||||
|
||||
html += '</div>';
|
||||
|
||||
if (enableLink) {
|
||||
html += '</button>';
|
||||
} else {
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function onPurchaseButtonClick() {
|
||||
|
||||
var featureId = this.getAttribute('data-featureid');
|
||||
|
||||
if (this.getAttribute('data-email') === 'true') {
|
||||
getUserEmail().then(function (email) {
|
||||
iapManager.beginPurchase(featureId, email);
|
||||
});
|
||||
} else {
|
||||
iapManager.beginPurchase(featureId);
|
||||
}
|
||||
}
|
||||
|
||||
function restorePurchase(unlockableProductInfo) {
|
||||
|
||||
var dlg = dialogHelper.createDialog({
|
||||
size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border',
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
});
|
||||
|
||||
dlg.classList.add('formDialog');
|
||||
|
||||
var html = '';
|
||||
html += '<div class="formDialogHeader">';
|
||||
html += '<button is="paper-icon-button-light" class="btnCloseDialog autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||
html += '<h3 class="formDialogHeaderTitle">';
|
||||
html += iapManager.getRestoreButtonText();
|
||||
html += '</h3>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="formDialogContent smoothScrollY">';
|
||||
html += '<div class="dialogContentInner dialog-content-centered">';
|
||||
|
||||
html += '<p style="margin:2em 0;">';
|
||||
html += globalize.translate('sharedcomponents#HowDidYouPay');
|
||||
html += '</p>';
|
||||
|
||||
html += '<p>';
|
||||
html += '<button is="emby-button" type="button" class="raised button-cancel block btnRestoreSub"><span>' + globalize.translate('sharedcomponents#IHaveJellyfinPremiere') + '</span></button>';
|
||||
html += '</p>';
|
||||
|
||||
if (unlockableProductInfo) {
|
||||
html += '<p>';
|
||||
html += '<button is="emby-button" type="button" class="raised button-cancel block btnRestoreUnlock"><span>' + globalize.translate('sharedcomponents#IPurchasedThisApp') + '</span></button>';
|
||||
html += '</p>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
|
||||
dlg.innerHTML = html;
|
||||
document.body.appendChild(dlg);
|
||||
|
||||
loading.hide();
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, true);
|
||||
}
|
||||
|
||||
dlg.querySelector('.btnCloseDialog').addEventListener('click', function () {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
});
|
||||
|
||||
dlg.querySelector('.btnRestoreSub').addEventListener('click', function () {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
alertText({
|
||||
text: globalize.translate('sharedcomponents#MessageToValidateSupporter'),
|
||||
title: 'Jellyfin Premiere'
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
var btnRestoreUnlock = dlg.querySelector('.btnRestoreUnlock');
|
||||
if (btnRestoreUnlock) {
|
||||
btnRestoreUnlock.addEventListener('click', function () {
|
||||
|
||||
dialogHelper.close(dlg);
|
||||
iapManager.restorePurchase();
|
||||
});
|
||||
}
|
||||
|
||||
dialogHelper.open(dlg).then(function () {
|
||||
|
||||
if (layoutManager.tv) {
|
||||
centerFocus(dlg.querySelector('.formDialogContent'), false, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function getUserEmail() {
|
||||
|
||||
if (connectionManager.isLoggedIntoConnect()) {
|
||||
|
||||
var connectUser = connectionManager.connectUser();
|
||||
|
||||
if (connectUser && connectUser.Email) {
|
||||
return Promise.resolve(connectUser.Email);
|
||||
}
|
||||
}
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
|
||||
require(['prompt'], function (prompt) {
|
||||
|
||||
prompt({
|
||||
|
||||
label: globalize.translate('sharedcomponents#LabelEmailAddress')
|
||||
|
||||
}).then(resolve, reject);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function onProductUpdated(e, product) {
|
||||
|
||||
if (product.owned) {
|
||||
|
||||
var resolve = currentDisplayingResolve;
|
||||
|
||||
if (resolve && currentDisplayingProductInfos.filter(function (p) {
|
||||
|
||||
return product.id === p.id;
|
||||
|
||||
}).length) {
|
||||
|
||||
isCurrentDialogRejected = false;
|
||||
cancelInAppPurchase();
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var feature = currentValidatingFeature;
|
||||
if (feature) {
|
||||
iapManager.isUnlockedByDefault(feature).then(function () {
|
||||
isCurrentDialogRejected = false;
|
||||
cancelInAppPurchase();
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function showPremiereInfo() {
|
||||
|
||||
if (appHost.supports('externalpremium')) {
|
||||
showExternalPremiereInfo();
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return iapManager.getSubscriptionOptions().then(function (subscriptionOptions) {
|
||||
|
||||
var dialogOptions = {
|
||||
title: 'Jellyfin Premiere',
|
||||
feature: 'sync'
|
||||
};
|
||||
|
||||
return showInAppPurchaseInfo(subscriptionOptions, null, dialogOptions);
|
||||
});
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
events.on(iapManager, 'productupdated', onProductUpdated);
|
||||
|
||||
return {
|
||||
|
||||
validateFeature: validateFeature,
|
||||
showPremiereInfo: showPremiereInfo
|
||||
};
|
||||
|
|
|
@ -3,9 +3,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
|
||||
var appRouter = {
|
||||
showLocalLogin: function (serverId, manualLogin) {
|
||||
|
||||
var pageName = manualLogin ? 'manuallogin' : 'login';
|
||||
|
||||
show('/startup/' + pageName + '.html?serverid=' + serverId);
|
||||
},
|
||||
showSelectServer: function () {
|
||||
|
@ -45,65 +43,45 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
};
|
||||
|
||||
function beginConnectionWizard() {
|
||||
|
||||
backdrop.clear();
|
||||
|
||||
loading.show();
|
||||
|
||||
connectionManager.connect({
|
||||
|
||||
enableAutoLogin: appSettings.enableAutoLogin()
|
||||
|
||||
}).then(function (result) {
|
||||
handleConnectionResult(result, loading);
|
||||
});
|
||||
}
|
||||
|
||||
function handleConnectionResult(result, loading) {
|
||||
|
||||
switch (result.State) {
|
||||
|
||||
case 'SignedIn':
|
||||
{
|
||||
loading.hide();
|
||||
skinManager.loadUserSkin();
|
||||
}
|
||||
loading.hide();
|
||||
skinManager.loadUserSkin();
|
||||
break;
|
||||
case 'ServerSignIn':
|
||||
{
|
||||
result.ApiClient.getPublicUsers().then(function (users) {
|
||||
|
||||
if (users.length) {
|
||||
appRouter.showLocalLogin(result.Servers[0].Id);
|
||||
} else {
|
||||
appRouter.showLocalLogin(result.Servers[0].Id, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
result.ApiClient.getPublicUsers().then(function (users) {
|
||||
if (users.length) {
|
||||
appRouter.showLocalLogin(result.Servers[0].Id);
|
||||
} else {
|
||||
appRouter.showLocalLogin(result.Servers[0].Id, true);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case 'ServerSelection':
|
||||
{
|
||||
appRouter.showSelectServer();
|
||||
}
|
||||
appRouter.showSelectServer();
|
||||
break;
|
||||
case 'ConnectSignIn':
|
||||
{
|
||||
appRouter.showWelcome();
|
||||
}
|
||||
appRouter.showWelcome();
|
||||
break;
|
||||
case 'ServerUpdateNeeded':
|
||||
{
|
||||
require(['alert'], function (alert) {
|
||||
alert({
|
||||
|
||||
text: globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'),
|
||||
html: globalize.translate('sharedcomponents#ServerUpdateNeeded', '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
|
||||
|
||||
}).then(function () {
|
||||
appRouter.showSelectServer();
|
||||
});
|
||||
require(['alert'], function (alert) {
|
||||
alert({
|
||||
text: globalize.translate('sharedcomponents#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'),
|
||||
html: globalize.translate('sharedcomponents#ServerUpdateNeeded', '<a href="https://github.com/jellyfin/jellyfin">https://github.com/jellyfin/jellyfin</a>')
|
||||
}).then(function () {
|
||||
appRouter.showSelectServer();
|
||||
});
|
||||
}
|
||||
});
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -111,9 +89,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
function loadContentUrl(ctx, next, route, request) {
|
||||
|
||||
var url;
|
||||
|
||||
if (route.contentPath && typeof (route.contentPath) === 'function') {
|
||||
url = route.contentPath(ctx.querystring);
|
||||
} else {
|
||||
|
@ -121,10 +97,8 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
if (url.indexOf('://') === -1) {
|
||||
|
||||
// Put a slash at the beginning but make sure to avoid a double slash
|
||||
if (url.indexOf('/') !== 0) {
|
||||
|
||||
url = '/' + url;
|
||||
}
|
||||
|
||||
|
@ -136,26 +110,22 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
require(['text!' + url], function (html) {
|
||||
|
||||
loadContent(ctx, route, html, request);
|
||||
});
|
||||
}
|
||||
|
||||
function handleRoute(ctx, next, route) {
|
||||
|
||||
authenticate(ctx, route, function () {
|
||||
initRoute(ctx, next, route);
|
||||
});
|
||||
}
|
||||
|
||||
function initRoute(ctx, next, route) {
|
||||
|
||||
var onInitComplete = function (controllerFactory) {
|
||||
sendRouteToViewManager(ctx, next, route, controllerFactory);
|
||||
};
|
||||
|
||||
require(route.dependencies || [], function () {
|
||||
|
||||
if (route.controller) {
|
||||
require([route.controller], onInitComplete);
|
||||
} else {
|
||||
|
@ -173,14 +143,12 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
|
||||
var currentViewLoadRequest;
|
||||
function sendRouteToViewManager(ctx, next, route, controllerFactory) {
|
||||
|
||||
if (isDummyBackToHome && route.type === 'home') {
|
||||
isDummyBackToHome = false;
|
||||
return;
|
||||
}
|
||||
|
||||
cancelCurrentLoadRequest();
|
||||
|
||||
var isBackNav = ctx.isBack;
|
||||
|
||||
var currentRequest = {
|
||||
|
@ -201,9 +169,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
|
||||
var onNewViewNeeded = function () {
|
||||
if (typeof route.path === 'string') {
|
||||
|
||||
loadContentUrl(ctx, next, route, currentRequest);
|
||||
|
||||
} else {
|
||||
// ? TODO
|
||||
next();
|
||||
|
@ -226,7 +192,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
};
|
||||
|
||||
}).catch(function (result) {
|
||||
|
||||
if (!result || !result.cancelled) {
|
||||
onNewViewNeeded();
|
||||
}
|
||||
|
@ -236,7 +201,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
var msgTimeout;
|
||||
var forcedLogoutMsg;
|
||||
function onForcedLogoutMessageTimeout() {
|
||||
|
||||
var msg = forcedLogoutMsg;
|
||||
forcedLogoutMsg = null;
|
||||
|
||||
|
@ -248,7 +212,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
function showForcedLogoutMessage(msg) {
|
||||
|
||||
forcedLogoutMsg = msg;
|
||||
if (msgTimeout) {
|
||||
clearTimeout(msgTimeout);
|
||||
|
@ -277,14 +240,12 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
function onBeforeExit(e) {
|
||||
|
||||
if (browser.web0s) {
|
||||
page.restorePreviousState();
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeImageOptions(options) {
|
||||
|
||||
var scaleFactor = browser.tv ? 0.8 : 1;
|
||||
|
||||
var setQuality;
|
||||
|
@ -331,9 +292,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
function getMaxBandwidth() {
|
||||
|
||||
if (navigator.connection) {
|
||||
|
||||
var max = navigator.connection.downlinkMax;
|
||||
if (max && max > 0 && max < Number.POSITIVE_INFINITY) {
|
||||
|
||||
|
@ -728,13 +687,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
|
|||
}
|
||||
|
||||
function getRouteUrl(item, options) {
|
||||
|
||||
if (item === 'downloads') {
|
||||
return 'offline/offline.html';
|
||||
}
|
||||
if (item === 'managedownloads') {
|
||||
return 'offline/managedownloads.html';
|
||||
}
|
||||
if (item === 'settings') {
|
||||
return 'settings/settings.html';
|
||||
}
|
||||
|
|
|
@ -10,6 +10,12 @@ define([], function () {
|
|||
// options.path
|
||||
// options.arguments
|
||||
return Promise.reject();
|
||||
},
|
||||
enableFullscreen: function () {
|
||||
// do nothing since this is for native apps
|
||||
},
|
||||
disableFullscreen: function () {
|
||||
// do nothing since this is for native apps
|
||||
}
|
||||
};
|
||||
});
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "الغاء",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "الاربعاء",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Адмяніць",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Нови",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Книги",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Разглеждане",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Отмяна",
|
||||
"ButtonGotIt": "Добре",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Настройки на метаданните",
|
||||
"HeaderMusicQuality": "Качество на музиката",
|
||||
"HeaderMyDevice": "Моето устройство",
|
||||
"HeaderMyDownloads": "Моите изтегляния",
|
||||
"HeaderMyMedia": "Моята медия",
|
||||
"HeaderMyMediaSmall": "Моята медия (малък)",
|
||||
"HeaderNewRecording": "Нов запис",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Качество на видеото",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Помощ",
|
||||
"Hide": "Скриване",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Преглед на албума",
|
||||
"ViewArtist": "Преглед на изпълнителя",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Събуждане",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Изгледано",
|
||||
"Wednesday": "Сряда",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Tants com sigui possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Relació d'aspecte",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Nou",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel·la",
|
||||
"ButtonGotIt": "Entesos",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Preferències de Metadades",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "El meu dispositiu",
|
||||
"HeaderMyDownloads": "Les meves descàrregues",
|
||||
"HeaderMyMedia": "Els meus mitjans",
|
||||
"HeaderMyMediaSmall": "Els meus mitjans (petit)",
|
||||
"HeaderNewRecording": "Nou Enregistrament",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Esperant Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "Has dit...",
|
||||
"Help": "Ajuda",
|
||||
"Hide": "Amaga",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Veure àlbum",
|
||||
"ViewArtist": "Veure artista",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Vists",
|
||||
"Wednesday": "Dimecres",
|
||||
"WifiRequiredToDownload": "Es requereix una connexió Wifi per continuar descarregant.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Tolikrát jak je možné",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Poměr stran",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Nové",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Datový tok audia není podporován",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Knihy",
|
||||
"Box": "Pouzdro",
|
||||
"BoxRear": "Zadní část pouzdra",
|
||||
"Browse": "Procházet",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Zrušit",
|
||||
"ButtonGotIt": "Mám to",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Nastavení metadat",
|
||||
"HeaderMusicQuality": "Kvalita hudby",
|
||||
"HeaderMyDevice": "Moje zařízení",
|
||||
"HeaderMyDownloads": "Moje stahování",
|
||||
"HeaderMyMedia": "Moje média",
|
||||
"HeaderMyMediaSmall": "Moje média (malé)",
|
||||
"HeaderNewRecording": "Nový záznam",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Kvalita videa",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Čekání na Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "Zmínil ses...",
|
||||
"Help": "Nápověda",
|
||||
"Hide": "Skrýt",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Zobrazit album",
|
||||
"ViewArtist": "Zobrazit úmělce",
|
||||
"VoiceInput": "Hlasový vstup",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Shlédnuto",
|
||||
"Wednesday": "Středa",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Så mange som muligt",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Billedformat",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Ny",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Annuller",
|
||||
"ButtonGotIt": "Forstået",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Indstillinger for metadata",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "Min Enhed",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "Ny optagelse",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "Du sagde...",
|
||||
"Help": "Hjælp",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Vis album",
|
||||
"ViewArtist": "Vis kunstner",
|
||||
"VoiceInput": "Taleinput",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Onsdag",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "So viele wie möglich",
|
||||
"Ascending": "Aufsteigend",
|
||||
"AspectRatio": "Seitenverhältnis",
|
||||
"AttemptingWakeServer": "Versuche Server aufwecken. Bitte warten...",
|
||||
"AttributeNew": "Neu",
|
||||
"AudioBitDepthNotSupported": "Audiobittiefe nicht unterstützt",
|
||||
"AudioBitrateNotSupported": "Audio Bitrate nicht unterstützt",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Bücher",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (Rückseite)",
|
||||
"Browse": "Blättern",
|
||||
"BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel basierend auf deren Format einbrennen soll während der Videokonvertierung. Die Vermeidung des Einbrennen von Untertiteln verbessert die Serverperformance. Wähle Auto, um Bildfomate (z.B. VOBSUB, PGS, SUB/IDX, etc.) sowie bestimmte ASS/SSA-Untertitel einbrennen zu lassen.",
|
||||
"ButtonCancel": "Abbrechen",
|
||||
"ButtonGotIt": "Verstanden",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadaten Einstellungen",
|
||||
"HeaderMusicQuality": "Musikqualität",
|
||||
"HeaderMyDevice": "Mein Gerät",
|
||||
"HeaderMyDownloads": "Meine Downloads",
|
||||
"HeaderMyMedia": "Meine Medien",
|
||||
"HeaderMyMediaSmall": "Meine Medien (Klein)",
|
||||
"HeaderNewRecording": "Neue Aufnahme",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Videoqualität",
|
||||
"HeaderVideoType": "Videotyp:",
|
||||
"HeaderWaitingForWifi": "Warte auf WLAN",
|
||||
"HeaderWakeServer": "Server aufwecken",
|
||||
"HeaderYouSaid": "Du sagtest...",
|
||||
"Help": "Hilfe",
|
||||
"Hide": "Verstecke",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Zeige Album",
|
||||
"ViewArtist": "Zeige Darsteller",
|
||||
"VoiceInput": "Spracheingabe",
|
||||
"WakeServer": "Server aufwecken",
|
||||
"WakeServerError": "Wake On LAN Pakete wurden an deinen Server geschickt, aber wir konnten deinen Jellyfin Server nicht erreichen. Deine Maschine braucht vielleicht etwas länger um aufzuwachen oder Jellyfin Server wird zur Zeit nicht ausgeführt.",
|
||||
"WakeServerSuccess": "Erfolgreich!",
|
||||
"Watched": "Gesehen",
|
||||
"Wednesday": "Mittwoch",
|
||||
"WifiRequiredToDownload": "Um den Download fortzusetzen wird eine WLAN-Verbindung benötigt.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Οσο το δυνατον περισσοτερα",
|
||||
"Ascending": "Αύξουσα",
|
||||
"AspectRatio": "Αρχικός λόγος διαστάσεων:",
|
||||
"AttemptingWakeServer": "Ενεργοποίηση server σε εξέλιξη. Παρακαλώ περιμένετε...",
|
||||
"AttributeNew": "Νέο",
|
||||
"AudioBitDepthNotSupported": "Το βάθος bitrate ήχου δεν υποστηρίζεται",
|
||||
"AudioBitrateNotSupported": "Το bitrate ήχου δεν υποστηρίζεται",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Βιβλία",
|
||||
"Box": "Κουτί",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Αναζητήστε",
|
||||
"BurnSubtitlesHelp": "Καθορίζει αν ο διακομιστής πρέπει να εγγράψει στους υπότιτλους κατά τη μετατροπή βίντεο ανάλογα με τη μορφή των υπότιτλων. Η αποφυγή της εγγραφής στους υπότιτλους θα βελτιώσει την απόδοση του διακομιστή. Επιλέξτε Αυτόματα για να εγγράψετε μορφές βασισμένες σε εικόνες (π.χ. VOBSUB, PGS, SUB / IDX κ.λπ.) καθώς και ορισμένους υπότιτλους ASS / SSA",
|
||||
"ButtonCancel": "Ακύρωση ",
|
||||
"ButtonGotIt": "Το κατάλαβα",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Ρυθμίσεις μεταδεδομένων",
|
||||
"HeaderMusicQuality": "Ποιότητα Μουσικής",
|
||||
"HeaderMyDevice": "Η Συσκευή μου",
|
||||
"HeaderMyDownloads": "Οι Λήψεις μου",
|
||||
"HeaderMyMedia": "Τα Πολυμέσα μου",
|
||||
"HeaderMyMediaSmall": "Τα Πολυμέσα μου (μικρά)",
|
||||
"HeaderNewRecording": "Νέα Εγγραφή",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Ποιότητα βίντεο",
|
||||
"HeaderVideoType": "Τύπος Βίντεο",
|
||||
"HeaderWaitingForWifi": "Αναμονή για Wifi",
|
||||
"HeaderWakeServer": "Ενεργοποίηση Server",
|
||||
"HeaderYouSaid": "Είπατε...",
|
||||
"Help": "Βοήθεια",
|
||||
"Hide": "Κρύψε",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Προβολή άλμπουμ",
|
||||
"ViewArtist": "Εμφάνιση Καλλιτέχνη",
|
||||
"VoiceInput": "Είσοδος Ήχου",
|
||||
"WakeServer": "Ενεργοποίηση server",
|
||||
"WakeServerError": "Τα πακέτα Wake On LAN στάλθηκαν στον server σας, αλλά δεν είναι δυνατή η σύνδεση με τον Jellyfin Server. Το μηχάνημά σας μπορεί να χρειαστεί λίγο περισσότερο χρόνο για να ενεργοποιηθεί, ή ο Jellyfin Server ενδέχεται να μην εκτελείται ενεργά στο μηχάνημα.",
|
||||
"WakeServerSuccess": "Επιτυχία!",
|
||||
"Watched": "Έχει γίνει παρακολούθηση",
|
||||
"Wednesday": "Τετάρτη",
|
||||
"WifiRequiredToDownload": "Απαιτείται σύνδεση Wi-Fi για να συνεχίσετε τη λήψη.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wi-Fi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wi-Fi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Tantos como sea posible",
|
||||
"Ascending": "Ascendente",
|
||||
"AspectRatio": "Relación de aspecto",
|
||||
"AttemptingWakeServer": "Intentando despertar el servidor. Por favor espere...",
|
||||
"AttributeNew": "Nuevo",
|
||||
"AudioBitDepthNotSupported": "Profundidad de bits de Audio no soportado",
|
||||
"AudioBitrateNotSupported": "Tasa de bits de audio no soportado",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Libros",
|
||||
"Box": "Caja",
|
||||
"BoxRear": "Reverso de caja",
|
||||
"Browse": "Navegar",
|
||||
"BurnSubtitlesHelp": "Determina si el servidor debería quemar los subtitulos al convertir el video dependiendo en el formato de los subtitulos. Evitar los subtitulos quemados mejorara el rendimiento del servidor. Elija \"Auto\" para quemar los formatos basados en imágenes (por ejemplo VOBSUB, PGS, SUB/IDX, etc.) así como ciertos subtitulos ASS/SSA",
|
||||
"ButtonCancel": "Cancelar",
|
||||
"ButtonGotIt": "Hecho",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Configuración de metadatos",
|
||||
"HeaderMusicQuality": "Calidad de Musica",
|
||||
"HeaderMyDevice": "Mi Dispositivo",
|
||||
"HeaderMyDownloads": "Mis Descargas",
|
||||
"HeaderMyMedia": "Mis Medios",
|
||||
"HeaderMyMediaSmall": "Mis medios (pequeño)",
|
||||
"HeaderNewRecording": "Nueva Grabación",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Calidad de Video",
|
||||
"HeaderVideoType": "Tipo de Video",
|
||||
"HeaderWaitingForWifi": "Esperando Wifi",
|
||||
"HeaderWakeServer": "Despertar Servidor",
|
||||
"HeaderYouSaid": "Ha Dicho...",
|
||||
"Help": "Ayuda",
|
||||
"Hide": "Ocultar",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Ver album",
|
||||
"ViewArtist": "Ver artista",
|
||||
"VoiceInput": "Entrada de Voz",
|
||||
"WakeServer": "Despertar servidor",
|
||||
"WakeServerError": "Se enviaron los paquetes Wake On LAN (Despertar por red) a su computadora servidor, pero no ha sido posible contactar a su Servidor Jellyfin. Su computadora quizás necesite un poco mas de tiempo para despertar, o tal vez la aplicación de Servidor Jellyfin no se esta ejecutando en la computadora.",
|
||||
"WakeServerSuccess": "¡Éxito!",
|
||||
"Watched": "Visto",
|
||||
"Wednesday": "Miércoles",
|
||||
"WifiRequiredToDownload": "Se necesita de una conexión Wifi para continuar descargando.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Tantos como sea posible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Relación de aspecto",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Nuevo",
|
||||
"AudioBitDepthNotSupported": "Profundidad de bits de audio no soportada",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Libros",
|
||||
"Box": "Caja",
|
||||
"BoxRear": "Caja (trasera)",
|
||||
"Browse": "Navegar",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancelar",
|
||||
"ButtonGotIt": "Lo tengo",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Ajustes de metadatos",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "Mi dispositivo",
|
||||
"HeaderMyDownloads": "Mis Descargas",
|
||||
"HeaderMyMedia": "Mis Contenidos",
|
||||
"HeaderMyMediaSmall": "Mis Contenidos (pequeño)",
|
||||
"HeaderNewRecording": "Nueva grabación",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Calidad de Video",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Esperando a la red Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "Dijiste...",
|
||||
"Help": "Ayuda",
|
||||
"Hide": "Esconder",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Ver album",
|
||||
"ViewArtist": "Ver artista",
|
||||
"VoiceInput": "Entrada de voz",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Visto",
|
||||
"Wednesday": "Miércoles",
|
||||
"WifiRequiredToDownload": "Una red Wifi es necesaria para continuar la descarga.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Lopeta",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Nouveau",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Annuler",
|
||||
"ButtonGotIt": "J'ai compris",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "Mes Médias",
|
||||
"HeaderMyMediaSmall": "Mes médias (petit)",
|
||||
"HeaderNewRecording": "Nouvel enregistrement",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Aide",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Mercredi",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Autant que possible",
|
||||
"Ascending": "Croissant",
|
||||
"AspectRatio": "Ratio d'aspect original",
|
||||
"AttemptingWakeServer": "Essai de réveil du serveur. Veuillez patienter...",
|
||||
"AttributeNew": "Nouveau",
|
||||
"AudioBitDepthNotSupported": "Profondeur des échantillons de l'audio non prise en charge",
|
||||
"AudioBitrateNotSupported": "Débit audio non pris en charge",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Livres",
|
||||
"Box": "Boîtier",
|
||||
"BoxRear": "Dos de boîtier",
|
||||
"Browse": "Parcourir",
|
||||
"BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors de la conversion vidéo en fonction du format des sous-titres. Éviter la gravure des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA",
|
||||
"ButtonCancel": "Annuler",
|
||||
"ButtonGotIt": "Compris",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Paramètres des métadonnées",
|
||||
"HeaderMusicQuality": "Qualité de la musique :",
|
||||
"HeaderMyDevice": "Cet appareil",
|
||||
"HeaderMyDownloads": "Mes téléchargements",
|
||||
"HeaderMyMedia": "Mes Médias",
|
||||
"HeaderMyMediaSmall": "Mes médias (Petit)",
|
||||
"HeaderNewRecording": "Nouvel enregistrement",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Qualité vidéo",
|
||||
"HeaderVideoType": "Type de vidéo",
|
||||
"HeaderWaitingForWifi": "En attente du Wi-Fi",
|
||||
"HeaderWakeServer": "Réveiller le serveur",
|
||||
"HeaderYouSaid": "Vous avez dit...",
|
||||
"Help": "Aide",
|
||||
"Hide": "Cacher",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Voir l'album",
|
||||
"ViewArtist": "Voir l'artiste",
|
||||
"VoiceInput": "Entrée vocale",
|
||||
"WakeServer": "Réveiller le serveur",
|
||||
"WakeServerError": "Des paquets Wake-On-LAN on été envoyé à votre serveur, mais nous ne pouvons pas nous connecter à votre serveur Jellyfin. Votre machine a peut-être besoin de plus de temps pour se réveiller, ou le serveur Jellyfin n'est peut-être pas lancé sur la machine.",
|
||||
"WakeServerSuccess": "Réussi !",
|
||||
"Watched": "Lu",
|
||||
"Wednesday": "Mercredi",
|
||||
"WifiRequiredToDownload": "Une connexion Wi-Fi est nécessaire pour continuer le téléchargement.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Abbreche",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Mittwoch",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "כמה שיותר",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "חדש",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "בטל",
|
||||
"ButtonGotIt": "הבנתי",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "הגדרות מטא נתונים",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "הקלטה חדשה",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "אתה אמרת...",
|
||||
"Help": "עזרה",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "צפה באלבום",
|
||||
"ViewArtist": "צפה באמן",
|
||||
"VoiceInput": "קלט קולי",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "רביעי",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Što više je moguće",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Novo",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Odustani",
|
||||
"ButtonGotIt": "Shvaćam",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Postavke meta-podataka",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "Nova snimka",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "Rekao si...",
|
||||
"Help": "Pomoć",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Pogledaj album",
|
||||
"ViewArtist": "Pogledaj umjetnika",
|
||||
"VoiceInput": "Ulazni glas",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Srijeda",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Növekvő",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "A kiszolgáló felébresztése folyamatban. Kérlek várj...",
|
||||
"AttributeNew": "Új",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Könyvek",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Mégsem",
|
||||
"ButtonGotIt": "Értettem",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metaadat Beállítások",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "Jelenlegi eszköz",
|
||||
"HeaderMyDownloads": "Letöltések",
|
||||
"HeaderMyMedia": "Médiatáram",
|
||||
"HeaderMyMediaSmall": "Médiatáram (kicsi)",
|
||||
"HeaderNewRecording": "Új Felvétel",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Videó típusa:",
|
||||
"HeaderWaitingForWifi": "Wifi-re vár",
|
||||
"HeaderWakeServer": "Kiszolgáló felébresztés",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Segítség",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Kiszolgáló felébresztés",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Megtekintett",
|
||||
"Wednesday": "Szerda",
|
||||
"WifiRequiredToDownload": "Wifi kapcsolat szükséges a letöltés folytatásához.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Tutto il possibile",
|
||||
"Ascending": "Crescente",
|
||||
"AspectRatio": "Rapporto d'aspetto",
|
||||
"AttemptingWakeServer": "Tentando di svegliare il server. Per piacere aspetta...",
|
||||
"AttributeNew": "Nuovo",
|
||||
"AudioBitDepthNotSupported": "La profondità bit audio non è supportata",
|
||||
"AudioBitrateNotSupported": "Bitrate audio non supportato",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Libri",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (retro)",
|
||||
"Browse": "Esplora",
|
||||
"BurnSubtitlesHelp": "Determina se il server deve applicare i sottotitoli quando si converte i video in base al formato dei sottotitoli. Evitando di applicare i sottotitoli migliorerà le prestazioni del server. Selezionare Auto per applicare formati basati sull'immagine (ad esempio VOBSUB, PGS, SUB / IDX, ecc.) così come alcuni sottotitoli ASS / SSA",
|
||||
"ButtonCancel": "Annulla",
|
||||
"ButtonGotIt": "Ho capito",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Impostazioni Metadati",
|
||||
"HeaderMusicQuality": "Qualità Musica",
|
||||
"HeaderMyDevice": "Il Mio Dispositivo",
|
||||
"HeaderMyDownloads": "I Miei Download",
|
||||
"HeaderMyMedia": "I miei media",
|
||||
"HeaderMyMediaSmall": "I miei media (piccolo)",
|
||||
"HeaderNewRecording": "Nuova Registrazione",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Qualità Video",
|
||||
"HeaderVideoType": "Tipo di Video",
|
||||
"HeaderWaitingForWifi": "In attesa di Wifi",
|
||||
"HeaderWakeServer": "Sveglia il server",
|
||||
"HeaderYouSaid": "Hai detto...",
|
||||
"Help": "Aiuto",
|
||||
"Hide": "Nascondi",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Visualizza album",
|
||||
"ViewArtist": "Visualizza artista",
|
||||
"VoiceInput": "Comandi Vocali",
|
||||
"WakeServer": "Sveglia il server",
|
||||
"WakeServerError": "I pacchetti Wake On LAN sono stati inviati al computer server, ma non siamo in grado di connettersi al server Jellyfin. Potrebbe essere necessario un po 'più di tempo per riattivare la macchina, oppure il server Jellyfin potrebbe non essere attivo sulla macchina.",
|
||||
"WakeServerSuccess": "Successo!",
|
||||
"Watched": "Visto",
|
||||
"Wednesday": "Mercoledì",
|
||||
"WifiRequiredToDownload": "Una connessione Wifi è richiesta per continuare il download",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Мүмкіндігінше көп",
|
||||
"Ascending": "Артуы бойынша",
|
||||
"AspectRatio": "Пішімдік арақатынасы",
|
||||
"AttemptingWakeServer": "Серверді ояту әрекеті жасалуда. Күте тұрыңыз...",
|
||||
"AttributeNew": "Жаңа",
|
||||
"AudioBitDepthNotSupported": "Дыбыстың биттік тереңдігі үшін қолдау көрсетілмейді",
|
||||
"AudioBitrateNotSupported": "Дыбыс қарқыны үшін қолдау көрсетілмейді",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Кітаптар",
|
||||
"Box": "Қорап",
|
||||
"BoxRear": "Қорап арты",
|
||||
"Browse": "Шарлау",
|
||||
"BurnSubtitlesHelp": "Субтитрлер пішіміне байланысты бейнені түрлендірген кезде сервер субтитрлерді жазыуын анықтайды. Субтитрлер жазуды қашқақтау сервердің өнімділігін жақсартады. Суретке негізделген пішімдерді (мысалы, VOBSUB, PGS, SUB/IDX ж.т.б.), сондай-ақ кейбір ASS/SSA субтитрлерін жазу үшін Автоматтыны таңдаңыз",
|
||||
"ButtonCancel": "Болдырмау",
|
||||
"ButtonGotIt": "Түсінікті",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Метадеректер параметрлері",
|
||||
"HeaderMusicQuality": "Музыка сапасы",
|
||||
"HeaderMyDevice": "Менің құрылғым",
|
||||
"HeaderMyDownloads": "Менің жүктеулерім",
|
||||
"HeaderMyMedia": "Менің тасығышдеректерім",
|
||||
"HeaderMyMediaSmall": "Менің тасығышдеректерім (ықшам)",
|
||||
"HeaderNewRecording": "Жаңа жазба",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Бейне сапасы",
|
||||
"HeaderVideoType": "Бейне түрі",
|
||||
"HeaderWaitingForWifi": "WiFi үшін күтуде",
|
||||
"HeaderWakeServer": "Серверді ояту",
|
||||
"HeaderYouSaid": "Сіз айтқаныңыз...",
|
||||
"Help": "Интернеттегі анықтамаға",
|
||||
"Hide": "Жасыру",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Альбомды қарау",
|
||||
"ViewArtist": "Орындаушыны қарау",
|
||||
"VoiceInput": "Дауыстық енгізу",
|
||||
"WakeServer": "Серверді ояту",
|
||||
"WakeServerError": "Wake On LAN пакеттері сіздің серверіңізге жіберілді, бірақ сіздің Jellyfin Server үшін қосыла алмаймыз. Құрылғыңызды ояту үшін біраз уақыт қажет болуы мүмкін немесе Jellyfin Server құрылғыда белсенді жұмыс істемеуі мүмкін.",
|
||||
"WakeServerSuccess": "Сәттілік!",
|
||||
"Watched": "Қаралған",
|
||||
"Wednesday": "сәрсенбі",
|
||||
"WifiRequiredToDownload": "Жүктеп алуды жалғастыру үшін WiFi қосылымы қажет.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "신규",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "취소",
|
||||
"ButtonGotIt": "그럴게요.",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "메타데이터 설정",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "내 미디어 (작음)",
|
||||
"HeaderNewRecording": "신규 녹화",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "도움말",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "앨범 보기",
|
||||
"ViewArtist": "아티스트 보기",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "시청함",
|
||||
"Wednesday": "수요일",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Kiek tik įmanoma",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Naujas",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Atšaukti",
|
||||
"ButtonGotIt": "Supratau",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metaduomenų nustatymai",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "Naujas įrašas",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "Jūs pasakėte:",
|
||||
"Help": "Padėti",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Žiūrėti albumą",
|
||||
"ViewArtist": "Žiūrėti atlikėją",
|
||||
"VoiceInput": "Balso komandos",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Trečiadienis",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Så mange som mulig",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Størrelsesforholdet",
|
||||
"AttemptingWakeServer": "Prøver å vekke opp server. Vennligst vent,..",
|
||||
"AttributeNew": "Ny",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Bøker",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Avbryt",
|
||||
"ButtonGotIt": "Skjønner",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata innstilinger",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "Min enhet",
|
||||
"HeaderMyDownloads": "Mine nedlastinger",
|
||||
"HeaderMyMedia": "Min Media",
|
||||
"HeaderMyMediaSmall": "Min Media (liten)",
|
||||
"HeaderNewRecording": "Nye opptak:",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Vekk opp server",
|
||||
"HeaderYouSaid": "Du sa...",
|
||||
"Help": "Hjelp",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Vis album",
|
||||
"ViewArtist": "Vis artist",
|
||||
"VoiceInput": "Stemme input",
|
||||
"WakeServer": "Vekk opp server",
|
||||
"WakeServerError": "Wake On LAN-pakker ble sendt til servermaskinen din, men tilkobling til din Jellyfin Server mislyktes. Serveren din kan trenge litt mer tid til å våkne, eller så kjører ikke Jellyfin Server på maskinen.",
|
||||
"WakeServerSuccess": "Suksess!",
|
||||
"Watched": "Sett",
|
||||
"Wednesday": "Onsdag",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Zo veel als mogelijk",
|
||||
"Ascending": "Oplopend",
|
||||
"AspectRatio": "Beeldverhouding",
|
||||
"AttemptingWakeServer": "Proberen de server te wekken. Een moment geduld...",
|
||||
"AttributeNew": "Nieuw",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth niet ondersteund",
|
||||
"AudioBitrateNotSupported": "Audio bitrate niet ondersteund",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Boeken",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (achterkant)",
|
||||
"Browse": "Bladeren",
|
||||
"BurnSubtitlesHelp": "Bepaalt of de server ondertitels moet inbranden wanneer video's op basis van het ondertitel formaat geconverteerd moeten worden. Inbranden van ondertitels hebben een negatief effect op de server performance. Selecteer Automatisch om op afbeelding gebaseerde formaten (bijv. VOBSUB, PGS, SUB/IDX etc.) en bepaalde ASS/SSA ondertitels in te branden.",
|
||||
"ButtonCancel": "Annuleren",
|
||||
"ButtonGotIt": "Begrepen",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metagegevens instellingen",
|
||||
"HeaderMusicQuality": "Muziek Kwaliteit",
|
||||
"HeaderMyDevice": "Mijn Apparaat",
|
||||
"HeaderMyDownloads": "Mijn Downloads",
|
||||
"HeaderMyMedia": "Mijn Media",
|
||||
"HeaderMyMediaSmall": "Mijn Media (klein)",
|
||||
"HeaderNewRecording": "Nieuwe opname",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Kwaliteit",
|
||||
"HeaderVideoType": "Videotype",
|
||||
"HeaderWaitingForWifi": "Wachten op Wifi",
|
||||
"HeaderWakeServer": "Server Wekken",
|
||||
"HeaderYouSaid": "U zei...",
|
||||
"Help": "Hulp",
|
||||
"Hide": "Verbergen",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Bekijk album",
|
||||
"ViewArtist": "Bekijk artiest",
|
||||
"VoiceInput": "Spraak invoer",
|
||||
"WakeServer": "Server wekken",
|
||||
"WakeServerError": "Er zijn \"Wake On Lan\" pakketten naar de server verzonden, maar verbinding maken is mislukt. Het kan voorkomen dat de server wat meer tijd nodig heeft om op te starten, of misschien is Jellyfin Server niet actief op de machine.",
|
||||
"WakeServerSuccess": "Succesvol!",
|
||||
"Watched": "Bekeken",
|
||||
"Wednesday": "Woensdag",
|
||||
"WifiRequiredToDownload": "Wifi verbinding is vereist om te downloaden.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Tak wiele jak to możliwe",
|
||||
"Ascending": "Rosnąco",
|
||||
"AspectRatio": "Proporcje obrazu",
|
||||
"AttemptingWakeServer": "Trwa próba wybudzenia serwera. Proszę czekać...",
|
||||
"AttributeNew": "Nowy",
|
||||
"AudioBitDepthNotSupported": "Nieobsługiwana głębia bitowa dźwięku",
|
||||
"AudioBitrateNotSupported": "Nieobsługiwana przepływność dźwięku",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Książki",
|
||||
"Box": "Pudełko",
|
||||
"BoxRear": "Pudełko (tył)",
|
||||
"Browse": "Przeglądaj",
|
||||
"BurnSubtitlesHelp": "Określa czy serwer powinien wypalać napisy podczas konwersji wideo, w zależności od formatu napisów. Unikanie wypalania napisów poprawia wydajność serwera. Wybierz Automatycznie, w celu wypalania zarówno napisów w formatach graficznych (np. VOBSUB, PGS, SUB/IDX, itp.), jak i pewnych napisów ASS/SSA.",
|
||||
"ButtonCancel": "Anuluj",
|
||||
"ButtonGotIt": "Rozumiem",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Ustawienia metadanych",
|
||||
"HeaderMusicQuality": "Jakość muzyki",
|
||||
"HeaderMyDevice": "Moje urządzenie",
|
||||
"HeaderMyDownloads": "Moje pobrania",
|
||||
"HeaderMyMedia": "Moje media",
|
||||
"HeaderMyMediaSmall": "Moje media (małe)",
|
||||
"HeaderNewRecording": "Nowe nagranie",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Jakość wideo",
|
||||
"HeaderVideoType": "Typ wideo",
|
||||
"HeaderWaitingForWifi": "Oczekiwanie na sieć WiFi",
|
||||
"HeaderWakeServer": "Wybudzaj serwer",
|
||||
"HeaderYouSaid": "Powiedziałeś...",
|
||||
"Help": "Pomoc",
|
||||
"Hide": "Ukryj",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Podgląd albumu",
|
||||
"ViewArtist": "Podgląd wykonawcy",
|
||||
"VoiceInput": "Wejście głosowe",
|
||||
"WakeServer": "Wybudzaj serwer",
|
||||
"WakeServerError": "Wysłano pakiery Wake On LAN do maszyny serwera, ale połączenie z serwer Jellyfin zakończyło się niepowodzeniem. Twoja maszyna potrzebuje więcej czasu do wybudzenia lub serwer Jellyfin może nie działać aktywnie na tej maszynie.",
|
||||
"WakeServerSuccess": "Powodzenie!",
|
||||
"Watched": "Obejrzany",
|
||||
"Wednesday": "Środa",
|
||||
"WifiRequiredToDownload": "Połączenie WiFi jest wymagane, aby kontynuować pobieranie.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Quantos forem possíveis",
|
||||
"Ascending": "Ascendente",
|
||||
"AspectRatio": "Proporção da imagem",
|
||||
"AttemptingWakeServer": "Tentando despertar o servidor. Por favor, aguarde...",
|
||||
"AttributeNew": "Novo",
|
||||
"AudioBitDepthNotSupported": "Profundidade de bit de áudio não suportada",
|
||||
"AudioBitrateNotSupported": "Taxa de áudio não suportada",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Livros",
|
||||
"Box": "Caixa",
|
||||
"BoxRear": "Caixa (traseira)",
|
||||
"Browse": "Navegar",
|
||||
"BurnSubtitlesHelp": "Determina se o servidor deveria gravar as legendas no vídeo ao convertê-lo, dependendo do formato da legenda. Evitar a gravação da legenda irá melhorar a performance do servidor. Selecione Auto para gravar a imagem baseado nos formatos (ex. VOBSUB, PGS, SUB/IDX, etc.) assim como algumas legendas ASS/SSA.",
|
||||
"ButtonCancel": "Cancelar",
|
||||
"ButtonGotIt": "Feito",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Ajustes dos Metadados",
|
||||
"HeaderMusicQuality": "Qualidade da Música:",
|
||||
"HeaderMyDevice": "Meu Dispositivo",
|
||||
"HeaderMyDownloads": "Meus Downloads",
|
||||
"HeaderMyMedia": "Minha Mídia",
|
||||
"HeaderMyMediaSmall": "Minha Mídia (pequeno)",
|
||||
"HeaderNewRecording": "Nova Gravação",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Qualidade do Vídeo",
|
||||
"HeaderVideoType": "Tipo de Vídeo",
|
||||
"HeaderWaitingForWifi": "Esperando por Wifi",
|
||||
"HeaderWakeServer": "Despertar Servidor",
|
||||
"HeaderYouSaid": "Você Disse...",
|
||||
"Help": "Ajuda",
|
||||
"Hide": "Ocultar",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Ver álbum",
|
||||
"ViewArtist": "Ver artista",
|
||||
"VoiceInput": "Entrada de voz",
|
||||
"WakeServer": "Acordar servidor",
|
||||
"WakeServerError": "Pacotes de rede para despertar foram enviados para seu servidor, mas não foi possível conectar ao seu Servidor Jellyfin. Sua máquina pode necessitar um pouco mais de tempo para despertar, ou o Servidor Jellyfin pode não estar rodando na máquina.",
|
||||
"WakeServerSuccess": "Deu certo!",
|
||||
"Watched": "Assistido(s)",
|
||||
"Wednesday": "Quarta-feira",
|
||||
"WifiRequiredToDownload": "É necessária uma conexão Wifi para continuar a transferir.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Novo",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancelar",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Ajustes dos Metadados",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "Nova Gravação",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Ajuda",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Quarta",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Anuleaza",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Ajutor",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Miercuri",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Как можно больше",
|
||||
"Ascending": "По возрастанию",
|
||||
"AspectRatio": "Соот-ие сторон",
|
||||
"AttemptingWakeServer": "Идёт попытка разбудить ваш сервер. Ждите...",
|
||||
"AttributeNew": "Новинка",
|
||||
"AudioBitDepthNotSupported": "Разрядность аудио не поддерживается",
|
||||
"AudioBitrateNotSupported": "Потоковая скорость аудио не поддерживается",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Книги",
|
||||
"Box": "Коробка",
|
||||
"BoxRear": "Спинка коробки",
|
||||
"Browse": "Навигация",
|
||||
"BurnSubtitlesHelp": "Определяется, должен ли сервер внедрять субтитры при преобразовании видео в зависимости от формата субтитров. Избегание внедрения субтитров улучшит производительность сервера. Выберите «Авто» для записи основанных на графике форматов (например, VOBSUB, PGS, SUB/IDX и т.п.), а также некоторых субтитров ASS/SSA.",
|
||||
"ButtonCancel": "Отменить",
|
||||
"ButtonGotIt": "Понятно",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Параметры метаданных",
|
||||
"HeaderMusicQuality": "Качество музыки",
|
||||
"HeaderMyDevice": "Моё устройство",
|
||||
"HeaderMyDownloads": "Мои загрузки",
|
||||
"HeaderMyMedia": "Мои медиаданные",
|
||||
"HeaderMyMediaSmall": "Мои медиаданные (компактно)",
|
||||
"HeaderNewRecording": "Новая запись",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Качество видео",
|
||||
"HeaderVideoType": "Тип видео",
|
||||
"HeaderWaitingForWifi": "В ожидании WiFi",
|
||||
"HeaderWakeServer": "Пробуждение сервера",
|
||||
"HeaderYouSaid": "Вы сказали...",
|
||||
"Help": "Справка...",
|
||||
"Hide": "Скрыть",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Посмотреть альбом",
|
||||
"ViewArtist": "Посмотреть исполнителя",
|
||||
"VoiceInput": "Голосовой ввод",
|
||||
"WakeServer": "Разбудить сервер",
|
||||
"WakeServerError": "Пакеты Wake On LAN были отправлены на вашу серверную машину, однако, мы не смогли соединиться с Jellyfin Server. Возможно, вашей машине потребуется немного больше времени для пробуждения, или Jellyfin Server не может активно работать на данной машине.",
|
||||
"WakeServerSuccess": "Успешно!",
|
||||
"Watched": "Просмотрено",
|
||||
"Wednesday": "среда",
|
||||
"WifiRequiredToDownload": "WiFi-соединение требуется для продолжения загрузки.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Najviac ako je možné",
|
||||
"Ascending": "Vzostupne",
|
||||
"AspectRatio": "Pomer strán",
|
||||
"AttemptingWakeServer": "Pokúšam sa zobudiť server. Prosím počkajte...",
|
||||
"AttributeNew": "Nové",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Knihy",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Zrušiť",
|
||||
"ButtonGotIt": "Rozumiem",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Nastavenia metadát",
|
||||
"HeaderMusicQuality": "Kvalita hudby",
|
||||
"HeaderMyDevice": "Moje zariadenie",
|
||||
"HeaderMyDownloads": "Moje sťahovania",
|
||||
"HeaderMyMedia": "Moje média",
|
||||
"HeaderMyMediaSmall": "Moje médiá (malé)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Kvalita videa",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Čakám na WiFi",
|
||||
"HeaderWakeServer": "Zobudiť server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Pomoc",
|
||||
"Hide": "Skryť",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Zobraziť album",
|
||||
"ViewArtist": "Zobraziť umelca",
|
||||
"VoiceInput": "Hlasový vstup",
|
||||
"WakeServer": "Zobudiť server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Vyšlo to!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Streda",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Cancel",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "Så många som möjligt",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Bildförhållande",
|
||||
"AttemptingWakeServer": "Försöker väcka servern. Vänligen vänta....",
|
||||
"AttributeNew": "Ny",
|
||||
"AudioBitDepthNotSupported": "Ljudets bitdjup stöds inte",
|
||||
"AudioBitrateNotSupported": "Ljudbithastigheten stöds inte",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Böcker",
|
||||
"Box": "Omslag",
|
||||
"BoxRear": "Omslag (baksida)",
|
||||
"Browse": "Bläddra",
|
||||
"BurnSubtitlesHelp": "Avgör ifall servern ska \"bränna in\" undertexterna under videokonverteringen, beroende på undertextsformatet. Att undvika inbränning av undertexter kommer att förbättra prestandan på servern. Välj Auto för att bränna image-baserade formats (ex. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA undertexter.",
|
||||
"ButtonCancel": "Avbryt",
|
||||
"ButtonGotIt": "Ok",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadatainställningar",
|
||||
"HeaderMusicQuality": "Musikkvalitet:",
|
||||
"HeaderMyDevice": "Min enhet",
|
||||
"HeaderMyDownloads": "Mina nedladdningar",
|
||||
"HeaderMyMedia": "Min Media",
|
||||
"HeaderMyMediaSmall": "Min Media (liten)",
|
||||
"HeaderNewRecording": "Ny inspelning",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Videokvalitet",
|
||||
"HeaderVideoType": "Videotyp",
|
||||
"HeaderWaitingForWifi": "Väntar på Wifi",
|
||||
"HeaderWakeServer": "Väck Server",
|
||||
"HeaderYouSaid": "Du sa...",
|
||||
"Help": "Hjälp",
|
||||
"Hide": "Dölj",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "Bläddra album",
|
||||
"ViewArtist": "Bläddra artist",
|
||||
"VoiceInput": "Röstinspelning",
|
||||
"WakeServer": "Väck server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Lyckades!",
|
||||
"Watched": "Sedd",
|
||||
"Wednesday": "Onsdag",
|
||||
"WifiRequiredToDownload": "En Wifi-anslutning krävs för att fortsätta nedladdningen.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "Yeni",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "İptal",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Çarşamba",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Скасувати",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "Thoát",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "Help",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "Wednesday",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "尽可能多",
|
||||
"Ascending": "升序",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "尝试唤醒服务器中,请耐心等待...",
|
||||
"AttributeNew": "新增",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "音频比特率不受支持",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "书籍",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "浏览",
|
||||
"BurnSubtitlesHelp": "根据字幕格式确定服务器在转换视频时是否应烧录字幕。避免烧录字幕会提高服务器性能。选择“自动”以烧录基于图像的字幕格式(如 VOBSUB, PGS, SUB/IDX 等)和一些复杂的 ASS/SSA 字幕。",
|
||||
"ButtonCancel": "取消",
|
||||
"ButtonGotIt": "知道了",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "元数据设置",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "我的设备",
|
||||
"HeaderMyDownloads": "我的下载",
|
||||
"HeaderMyMedia": "我的媒体",
|
||||
"HeaderMyMediaSmall": "我的媒体 (小)",
|
||||
"HeaderNewRecording": "新录制",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "视频质量",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "等待 Wifi 连接",
|
||||
"HeaderWakeServer": "唤醒服务器",
|
||||
"HeaderYouSaid": "您说了...",
|
||||
"Help": "帮助",
|
||||
"Hide": "隐藏",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "查看专辑",
|
||||
"ViewArtist": "查看艺术家",
|
||||
"VoiceInput": "语音输入",
|
||||
"WakeServer": "唤醒服务器",
|
||||
"WakeServerError": "Wake On LAN 数据包已经发送到你的服务器所在机器上,但我们不能连接到你的 Jellyfin 服务器。你的机器可能还需要一些时间才能被唤醒,或者\n Jellyfin 服务器没有正确的在机器上启动。",
|
||||
"WakeServerSuccess": "成功!",
|
||||
"Watched": "已观看",
|
||||
"Wednesday": "星期三",
|
||||
"WifiRequiredToDownload": "需要连接 Wifi 才能继续下载。",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "取消",
|
||||
"ButtonGotIt": "Got It",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "New Recording",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "You Said...",
|
||||
"Help": "幫助",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "星期三",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
"AsManyAsPossible": "As many as possible",
|
||||
"Ascending": "Ascending",
|
||||
"AspectRatio": "Aspect ratio",
|
||||
"AttemptingWakeServer": "Attempting to wake server. Please wait...",
|
||||
"AttributeNew": "New",
|
||||
"AudioBitDepthNotSupported": "Audio bit depth not supported",
|
||||
"AudioBitrateNotSupported": "Audio bitrate not supported",
|
||||
|
@ -53,7 +52,6 @@
|
|||
"Books": "Books",
|
||||
"Box": "Box",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitles format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (e.g. VOBSUB, PGS, SUB/IDX, etc.) as well as certain ASS/SSA subtitles",
|
||||
"ButtonCancel": "取消",
|
||||
"ButtonGotIt": "我知道了",
|
||||
|
@ -248,7 +246,6 @@
|
|||
"HeaderMetadataSettings": "Metadata Settings",
|
||||
"HeaderMusicQuality": "Music Quality",
|
||||
"HeaderMyDevice": "My Device",
|
||||
"HeaderMyDownloads": "My Downloads",
|
||||
"HeaderMyMedia": "My Media",
|
||||
"HeaderMyMediaSmall": "My Media (small)",
|
||||
"HeaderNewRecording": "新錄製",
|
||||
|
@ -283,7 +280,6 @@
|
|||
"HeaderVideoQuality": "Video Quality",
|
||||
"HeaderVideoType": "Video Type",
|
||||
"HeaderWaitingForWifi": "Waiting for Wifi",
|
||||
"HeaderWakeServer": "Wake Server",
|
||||
"HeaderYouSaid": "您是指...",
|
||||
"Help": "說明",
|
||||
"Hide": "Hide",
|
||||
|
@ -676,9 +672,6 @@
|
|||
"ViewAlbum": "View album",
|
||||
"ViewArtist": "View artist",
|
||||
"VoiceInput": "Voice Input",
|
||||
"WakeServer": "Wake server",
|
||||
"WakeServerError": "Wake On LAN packets were sent to your server machine, but we're unable to connect to your Jellyfin Server. Your machine may need a little more time to wake, or Jellyfin Server may not be actively running on the machine.",
|
||||
"WakeServerSuccess": "Success!",
|
||||
"Watched": "Watched",
|
||||
"Wednesday": "星期三",
|
||||
"WifiRequiredToDownload": "A Wifi connection is required to continue downloading.",
|
||||
|
|
|
@ -302,11 +302,15 @@ html {
|
|||
}
|
||||
|
||||
.mainDrawer {
|
||||
background-color: #1c1c1c
|
||||
background-color: rgba(0, 0, 0, .5)
|
||||
}
|
||||
|
||||
.drawer-open {
|
||||
background-color: #011432
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
background: #252528
|
||||
background: rgba(221, 221, 221, 0.068)
|
||||
}
|
||||
|
||||
.navMenuOption-selected {
|
||||
|
|
|
@ -287,7 +287,7 @@ html {
|
|||
}
|
||||
|
||||
.mainDrawer {
|
||||
background-color: #1c1c1c
|
||||
background-color: #101010
|
||||
}
|
||||
|
||||
.navMenuOption:hover {
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
<div id="syncPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${TabCameraUpload}" data-menubutton="false">
|
||||
|
||||
<div>
|
||||
<form class="userProfileSettingsForm" style="margin: 0 auto;">
|
||||
|
||||
<h1>
|
||||
${HeaderCameraUpload}
|
||||
</h1>
|
||||
|
||||
<br />
|
||||
<p>${SelectCameraUploadServers}</p>
|
||||
|
||||
<div class="checkboxList uploadServerList">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
|
@ -1,10 +1,13 @@
|
|||
define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-button", "paper-icon-button-light", "css!./directorybrowser", "formDialogStyle", "emby-linkbutton"], function(loading, dialogHelper, dom) {
|
||||
"use strict";
|
||||
define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle', 'emby-linkbutton'], function(loading, dialogHelper, dom) {
|
||||
'use strict';
|
||||
|
||||
function getSystemInfo() {
|
||||
return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then(function(info) {
|
||||
return systemInfo = info, info
|
||||
})
|
||||
return systemInfo ? Promise.resolve(systemInfo) : ApiClient.getPublicSystemInfo().then(
|
||||
function(info) {
|
||||
systemInfo = info;
|
||||
return info;
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
function onDialogClosed() {
|
||||
|
@ -12,40 +15,139 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b
|
|||
}
|
||||
|
||||
function refreshDirectoryBrowser(page, path, fileOptions, updatePathOnError) {
|
||||
if (path && "string" != typeof path) throw new Error("invalid path");
|
||||
if (path && typeof path !== 'string') {
|
||||
throw new Error("invalid path");
|
||||
}
|
||||
|
||||
loading.show();
|
||||
|
||||
var promises = [];
|
||||
"Network" === path ? promises.push(ApiClient.getNetworkDevices()) : path ? (promises.push(ApiClient.getDirectoryContents(path, fileOptions)), promises.push(ApiClient.getParentPath(path))) : promises.push(ApiClient.getDrives()), Promise.all(promises).then(function(responses) {
|
||||
var folders = responses[0],
|
||||
parentPath = responses[1] || "";
|
||||
page.querySelector("#txtDirectoryPickerPath").value = path || "";
|
||||
var html = "";
|
||||
path && (html += getItem("lnkPath lnkDirectory", "", parentPath, "..."));
|
||||
for (var i = 0, length = folders.length; i < length; i++) {
|
||||
var folder = folders[i];
|
||||
html += getItem("File" === folder.Type ? "lnkPath lnkFile" : "lnkPath lnkDirectory", folder.Type, folder.Path, folder.Name)
|
||||
|
||||
if ("Network" === path) {
|
||||
promises.push(ApiClient.getNetworkDevices())
|
||||
} else {
|
||||
if (path) {
|
||||
promises.push(ApiClient.getDirectoryContents(path, fileOptions));
|
||||
promises.push(ApiClient.getParentPath(path));
|
||||
} else {
|
||||
promises.push(ApiClient.getDrives());
|
||||
}
|
||||
path || (html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate("ButtonNetwork"))), page.querySelector(".results").innerHTML = html, loading.hide()
|
||||
}, function() {
|
||||
updatePathOnError && (page.querySelector("#txtDirectoryPickerPath").value = ""), page.querySelector(".results").innerHTML = "", loading.hide()
|
||||
})
|
||||
}
|
||||
|
||||
Promise.all(promises).then(
|
||||
function(responses) {
|
||||
var folders = responses[0];
|
||||
var parentPath = responses[1] || "";
|
||||
var html = "";
|
||||
|
||||
page.querySelector(".results").scrollTop = 0;
|
||||
page.querySelector("#txtDirectoryPickerPath").value = path || "";
|
||||
|
||||
if (path) {
|
||||
html += getItem("lnkPath lnkDirectory", "", parentPath, "...");
|
||||
}
|
||||
for (var i = 0, length = folders.length; i < length; i++) {
|
||||
var folder = folders[i];
|
||||
var cssClass = "File" === folder.Type ? "lnkPath lnkFile" : "lnkPath lnkDirectory";
|
||||
html += getItem(cssClass, folder.Type, folder.Path, folder.Name);
|
||||
}
|
||||
|
||||
if (!path) {
|
||||
html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate("ButtonNetwork"));
|
||||
}
|
||||
|
||||
page.querySelector(".results").innerHTML = html;
|
||||
loading.hide();
|
||||
}, function() {
|
||||
if (updatePathOnError) {
|
||||
page.querySelector("#txtDirectoryPickerPath").value = "";
|
||||
page.querySelector(".results").innerHTML = "";
|
||||
loading.hide();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function getItem(cssClass, type, path, name) {
|
||||
var html = "";
|
||||
return html += '<div class="listItem listItem-border ' + cssClass + '" data-type="' + type + '" data-path="' + path + '">', html += '<div class="listItemBody" style="padding-left:0;padding-top:.5em;padding-bottom:.5em;">', html += '<div class="listItemBodyText">', html += name, html += "</div>", html += "</div>", html += '<i class="md-icon" style="font-size:inherit;">arrow_forward</i>', html += "</div>"
|
||||
html += '<div class="listItem listItem-border ' + cssClass + '" data-type="' + type + '" data-path="' + path + '">';
|
||||
html += '<div class="listItemBody" style="padding-left:0;padding-top:.5em;padding-bottom:.5em;">';
|
||||
html += '<div class="listItemBodyText">';
|
||||
html += name;
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += '<i class="md-icon" style="font-size:inherit;">arrow_forward</i>';
|
||||
html += "</div>";
|
||||
return html;
|
||||
}
|
||||
|
||||
function getEditorHtml(options, systemInfo) {
|
||||
var html = "";
|
||||
if (html += '<div class="formDialogContent scrollY">', html += '<div class="dialogContentInner dialog-content-centered" style="padding-top:2em;">', !options.pathReadOnly) {
|
||||
html += '<div class="formDialogContent scrollY">';
|
||||
html += '<div class="dialogContentInner dialog-content-centered" style="padding-top:2em;">';
|
||||
if (!options.pathReadOnly) {
|
||||
var instruction = options.instruction ? options.instruction + "<br/><br/>" : "";
|
||||
html += '<div class="infoBanner" style="margin-bottom:1.5em;">', html += instruction, html += Globalize.translate("MessageDirectoryPickerInstruction").replace("{0}", "<b>\\\\server</b>").replace("{1}", "<b>\\\\192.168.1.101</b>"), "synology" === (systemInfo.PackageName || "").toLowerCase() ? (html += "<br/>", html += "<br/>", html += '<a is="emby-linkbutton" class="button-link" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Synology-:-Setting-Up-Your-Media-Library-Share" target="_blank">' + Globalize.translate("LearnHowToCreateSynologyShares") + "</a>") : "bsd" === systemInfo.OperatingSystem.toLowerCase() ? (html += "<br/>", html += "<br/>", html += Globalize.translate("MessageDirectoryPickerBSDInstruction"), html += "<br/>", html += '<a is="emby-linkbutton" class="button-link" href="http://doc.freenas.org/9.3/freenas_jails.html#add-storage" target="_blank">' + Globalize.translate("ButtonMoreInformation") + "</a>") : "linux" === systemInfo.OperatingSystem.toLowerCase() && (html += "<br/>", html += "<br/>", html += Globalize.translate("MessageDirectoryPickerLinuxInstruction"), html += "<br/>"), html += "</div>"
|
||||
html += '<div class="infoBanner" style="margin-bottom:1.5em;">';
|
||||
html += instruction;
|
||||
html += Globalize.translate("MessageDirectoryPickerInstruction").replace("{0}", "<b>\\\\server</b>").replace("{1}", "<b>\\\\192.168.1.101</b>");
|
||||
if ("synology" === (systemInfo.PackageName || "").toLowerCase()) {
|
||||
html += "<br/>";
|
||||
html += "<br/>";
|
||||
html += '<a is="emby-linkbutton" class="button-link" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Synology-:-Setting-Up-Your-Media-Library-Share" target="_blank">';
|
||||
html += Globalize.translate("LearnHowToCreateSynologyShares");
|
||||
html += "</a>";
|
||||
} else if ("bsd" === systemInfo.OperatingSystem.toLowerCase()) {
|
||||
html += "<br/>";
|
||||
html += "<br/>";
|
||||
html += Globalize.translate("MessageDirectoryPickerBSDInstruction");
|
||||
html += "<br/>";
|
||||
html += '<a is="emby-linkbutton" class="button-link" href="http://doc.freenas.org/9.3/freenas_jails.html#add-storage" target="_blank">';
|
||||
html += Globalize.translate("ButtonMoreInformation");
|
||||
html += "</a>";
|
||||
} else if ("linux" === systemInfo.OperatingSystem.toLowerCase()) {
|
||||
html += "<br/>";
|
||||
html += "<br/>";
|
||||
html += Globalize.translate("MessageDirectoryPickerLinuxInstruction");
|
||||
html += "<br/>";
|
||||
}
|
||||
html += "</div>"
|
||||
}
|
||||
html += '<form style="margin:auto;">', html += '<div class="inputContainer" style="display: flex; align-items: center;">', html += '<div style="flex-grow:1;">';
|
||||
var labelKey = !0 !== options.includeFiles ? "LabelFolder" : "LabelPath",
|
||||
readOnlyAttribute = options.pathReadOnly ? " readonly" : "";
|
||||
return html += '<input is="emby-input" id="txtDirectoryPickerPath" type="text" required="required" ' + readOnlyAttribute + ' label="' + Globalize.translate(labelKey) + '"/>', html += "</div>", readOnlyAttribute || (html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + Globalize.translate("ButtonRefresh") + '"><i class="md-icon">search</i></button>'), html += "</div>", readOnlyAttribute || (html += '<div class="results paperList" style="max-height: 200px; overflow-y: auto;"></div>'), options.enableNetworkSharePath && (html += '<div class="inputContainer" style="margin-top:2em;">', html += '<input is="emby-input" id="txtNetworkPath" type="text" label="' + Globalize.translate("LabelOptionalNetworkPath") + '"/>', html += '<div class="fieldDescription">', html += Globalize.translate("LabelOptionalNetworkPathHelp"), html += "</div>", html += "</div>"), html += '<div class="formDialogFooter">', html += '<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">' + Globalize.translate("ButtonOk") + "</button>", html += "</div>", html += "</form>", html += "</div>", html += "</div>", html += "</div>"
|
||||
html += '<form style="margin:auto;">';
|
||||
html += '<div class="inputContainer" style="display: flex; align-items: center;">';
|
||||
html += '<div style="flex-grow:1;">';
|
||||
var labelKey;
|
||||
if (options.includeFiles !== true) {
|
||||
labelKey = "LabelFolder";
|
||||
} else {
|
||||
labelKey = "LabelPath";
|
||||
}
|
||||
var readOnlyAttribute = options.pathReadOnly ? " readonly" : "";
|
||||
html += '<input is="emby-input" id="txtDirectoryPickerPath" type="text" required="required" ' + readOnlyAttribute + ' label="' + Globalize.translate(labelKey) + '"/>';
|
||||
html += "</div>";
|
||||
if (!readOnlyAttribute) {
|
||||
html += '<button type="button" is="paper-icon-button-light" class="btnRefreshDirectories emby-input-iconbutton" title="' + Globalize.translate("ButtonRefresh") + '"><i class="md-icon">search</i></button>';
|
||||
}
|
||||
html += "</div>";
|
||||
if (!readOnlyAttribute) {
|
||||
html += '<div class="results paperList" style="max-height: 200px; overflow-y: auto;"></div>';
|
||||
}
|
||||
if (options.enableNetworkSharePath) {
|
||||
html += '<div class="inputContainer" style="margin-top:2em;">';
|
||||
html += '<input is="emby-input" id="txtNetworkPath" type="text" label="' + Globalize.translate("LabelOptionalNetworkPath") + '"/>';
|
||||
html += '<div class="fieldDescription">';
|
||||
html += Globalize.translate("LabelOptionalNetworkPathHelp");
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
html += '<div class="formDialogFooter">';
|
||||
html += '<button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem">' + Globalize.translate("ButtonOk") + "</button>";
|
||||
html += "</div>";
|
||||
html += "</form>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function alertText(text) {
|
||||
|
@ -70,11 +172,22 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b
|
|||
}
|
||||
}).catch(function(response) {
|
||||
if (response) {
|
||||
if (404 === response.status) return alertText("The path could not be found. Please ensure the path is valid and try again."), Promise.reject();
|
||||
if (500 === response.status) return alertText(validateWriteable ? "Jellyfin Server requires write access to this folder. Please ensure write access and try again." : "The path could not be found. Please ensure the path is valid and try again."), Promise.reject()
|
||||
// TODO All alerts (across the project), should use Globalize.translate()
|
||||
if (response.status === 404) {
|
||||
alertText("The path could not be found. Please ensure the path is valid and try again.");
|
||||
return Promise.reject();
|
||||
}
|
||||
if (response.status === 500) {
|
||||
if (validateWriteable) {
|
||||
alertText("Jellyfin Server requires write access to this folder. Please ensure write access and try again.");
|
||||
} else {
|
||||
alertText("The path could not be found. Please ensure the path is valid and try again.")
|
||||
}
|
||||
return Promise.reject()
|
||||
}
|
||||
}
|
||||
return Promise.resolve()
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function initEditor(content, options, fileOptions) {
|
||||
|
@ -82,64 +195,121 @@ define(["loading", "dialogHelper", "dom", "listViewStyle", "emby-input", "emby-b
|
|||
var lnkPath = dom.parentWithClass(e.target, "lnkPath");
|
||||
if (lnkPath) {
|
||||
var path = lnkPath.getAttribute("data-path");
|
||||
lnkPath.classList.contains("lnkFile") ? content.querySelector("#txtDirectoryPickerPath").value = path : refreshDirectoryBrowser(content, path, fileOptions, !0)
|
||||
if (lnkPath.classList.contains("lnkFile")) {
|
||||
content.querySelector("#txtDirectoryPickerPath").value = path;
|
||||
} else {
|
||||
refreshDirectoryBrowser(content, path, fileOptions, true)
|
||||
};
|
||||
}
|
||||
}), content.addEventListener("click", function(e) {
|
||||
});
|
||||
|
||||
content.addEventListener("click", function(e) {
|
||||
if (dom.parentWithClass(e.target, "btnRefreshDirectories")) {
|
||||
var path = content.querySelector("#txtDirectoryPickerPath").value;
|
||||
refreshDirectoryBrowser(content, path, fileOptions)
|
||||
refreshDirectoryBrowser(content, path, fileOptions);
|
||||
}
|
||||
}), content.addEventListener("change", function(e) {
|
||||
});
|
||||
|
||||
content.addEventListener("change", function(e) {
|
||||
var txtDirectoryPickerPath = dom.parentWithTag(e.target, "INPUT");
|
||||
txtDirectoryPickerPath && "txtDirectoryPickerPath" === txtDirectoryPickerPath.id && refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions)
|
||||
}), content.querySelector("form").addEventListener("submit", function(e) {
|
||||
if (txtDirectoryPickerPath && "txtDirectoryPickerPath" === txtDirectoryPickerPath.id) {
|
||||
refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions);
|
||||
}
|
||||
});
|
||||
|
||||
content.querySelector("form").addEventListener("submit", function(e) {
|
||||
if (options.callback) {
|
||||
var networkSharePath = this.querySelector("#txtNetworkPath");
|
||||
networkSharePath = networkSharePath ? networkSharePath.value : null;
|
||||
var path = this.querySelector("#txtDirectoryPickerPath").value;
|
||||
validatePath(path, options.validateWriteable, ApiClient).then(function() {
|
||||
options.callback(path, networkSharePath)
|
||||
})
|
||||
validatePath(path, options.validateWriteable, ApiClient).then(
|
||||
function() {
|
||||
options.callback(path, networkSharePath);
|
||||
}
|
||||
);
|
||||
}
|
||||
return e.preventDefault(), e.stopPropagation(), !1
|
||||
})
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
function getDefaultPath(options) {
|
||||
return options.path ? Promise.resolve(options.path) : ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then(function(result) {
|
||||
return result.Path || ""
|
||||
}, function() {
|
||||
return ""
|
||||
})
|
||||
if (options.path) {
|
||||
Promise.resolve(options.path);
|
||||
} else {
|
||||
ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then(
|
||||
function(result) {
|
||||
return result.Path || "";
|
||||
}, function() {
|
||||
return "";
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function directoryBrowser() {
|
||||
var currentDialog, self = this;
|
||||
var currentDialog;
|
||||
var self = this;
|
||||
self.show = function(options) {
|
||||
options = options || {};
|
||||
var fileOptions = {
|
||||
includeDirectories: !0
|
||||
includeDirectories: true
|
||||
};
|
||||
null != options.includeDirectories && (fileOptions.includeDirectories = options.includeDirectories), null != options.includeFiles && (fileOptions.includeFiles = options.includeFiles), Promise.all([getSystemInfo(), getDefaultPath(options)]).then(function(responses) {
|
||||
var systemInfo = responses[0],
|
||||
initialPath = responses[1],
|
||||
dlg = dialogHelper.createDialog({
|
||||
size: "medium-tall",
|
||||
removeOnClose: !0,
|
||||
scrollY: !1
|
||||
if (options.includeDirectories != null) {
|
||||
fileOptions.includeDirectories = options.includeDirectories;
|
||||
}
|
||||
if (options.includeFiles != null) {
|
||||
fileOptions.includeFiles = options.includeFiles;
|
||||
}
|
||||
Promise.all([getSystemInfo(), getDefaultPath(options)]).then(
|
||||
function(responses) {
|
||||
var systemInfo = responses[0];
|
||||
var initialPath = responses[1];
|
||||
var dlg = dialogHelper.createDialog({
|
||||
size: "medium-tall",
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
});
|
||||
dlg.classList.add("ui-body-a");
|
||||
dlg.classList.add("background-theme-a");
|
||||
dlg.classList.add("directoryPicker");
|
||||
dlg.classList.add("formDialog");
|
||||
|
||||
var html = "";
|
||||
html += '<div class="formDialogHeader">';
|
||||
html += '<button is="paper-icon-button-light" class="btnCloseDialog autoSize" tabindex="-1"><i class="md-icon"></i></button>';
|
||||
html += '<h3 class="formDialogHeaderTitle">';
|
||||
html += options.header || Globalize.translate("HeaderSelectPath");
|
||||
html += "</h3>";
|
||||
html += "</div>";
|
||||
html += getEditorHtml(options, systemInfo);
|
||||
dlg.innerHTML = html;
|
||||
initEditor(dlg, options, fileOptions);
|
||||
dlg.addEventListener("close", onDialogClosed);
|
||||
dialogHelper.open(dlg);
|
||||
dlg.querySelector(".btnCloseDialog").addEventListener("click", function() {
|
||||
dialogHelper.close(dlg)
|
||||
});
|
||||
dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a"), dlg.classList.add("directoryPicker"), dlg.classList.add("formDialog");
|
||||
var html = "";
|
||||
html += '<div class="formDialogHeader">', html += '<button is="paper-icon-button-light" class="btnCloseDialog autoSize" tabindex="-1"><i class="md-icon"></i></button>', html += '<h3 class="formDialogHeaderTitle">', html += options.header || Globalize.translate("HeaderSelectPath"), html += "</h3>", html += "</div>", html += getEditorHtml(options, systemInfo), dlg.innerHTML = html, initEditor(dlg, options, fileOptions), dlg.addEventListener("close", onDialogClosed), dialogHelper.open(dlg), dlg.querySelector(".btnCloseDialog").addEventListener("click", function() {
|
||||
dialogHelper.close(dlg)
|
||||
}), currentDialog = dlg, dlg.querySelector("#txtDirectoryPickerPath").value = initialPath;
|
||||
var txtNetworkPath = dlg.querySelector("#txtNetworkPath");
|
||||
txtNetworkPath && (txtNetworkPath.value = options.networkSharePath || ""), options.pathReadOnly || refreshDirectoryBrowser(dlg, initialPath, fileOptions, !0)
|
||||
})
|
||||
}, self.close = function() {
|
||||
currentDialog && dialogHelper.close(currentDialog)
|
||||
currentDialog = dlg;
|
||||
dlg.querySelector("#txtDirectoryPickerPath").value = initialPath;
|
||||
var txtNetworkPath = dlg.querySelector("#txtNetworkPath");
|
||||
if (txtNetworkPath) {
|
||||
txtNetworkPath.value = options.networkSharePath || "";
|
||||
}
|
||||
if (!options.pathReadOnly) {
|
||||
refreshDirectoryBrowser(dlg, initialPath, fileOptions, true);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
self.close = function() {
|
||||
if (currentDialog) {
|
||||
dialogHelper.close(currentDialog);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var systemInfo;
|
||||
return directoryBrowser
|
||||
});
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
define(["globalize", "shell", "browser", "apphost"], function(globalize, shell, browser, appHost) {
|
||||
"use strict";
|
||||
|
||||
function getProductInfo(feature) {
|
||||
return null
|
||||
}
|
||||
|
||||
function getPremiumInfoUrl() {
|
||||
return "https://github.com/jellyfin/jellyfin"
|
||||
}
|
||||
|
||||
function beginPurchase(feature, email) {
|
||||
appHost.supports("externalpremium") ? shell.openUrl(getPremiumInfoUrl()) : require(["alert"], function(alert) {
|
||||
alert("Please visit " + getPremiumInfoUrl())
|
||||
})
|
||||
}
|
||||
|
||||
function restorePurchase(id) {
|
||||
return Promise.reject()
|
||||
}
|
||||
|
||||
function getSubscriptionOptions() {
|
||||
var options = [];
|
||||
return options.push({
|
||||
id: "embypremiere",
|
||||
title: globalize.translate("sharedcomponents#HeaderBecomeProjectSupporter"),
|
||||
requiresEmail: !1
|
||||
}), Promise.resolve(options)
|
||||
}
|
||||
|
||||
function isUnlockedByDefault(feature, options) {
|
||||
return "playback" === feature || "livetv" === feature ? Promise.resolve() : Promise.reject()
|
||||
}
|
||||
|
||||
function getAdminFeatureName(feature) {
|
||||
return feature
|
||||
}
|
||||
|
||||
function getRestoreButtonText() {
|
||||
return globalize.translate("sharedcomponents#HeaderAlreadyPaid")
|
||||
}
|
||||
|
||||
function getPeriodicMessageIntervalMs(feature) {
|
||||
return 0
|
||||
}
|
||||
return {
|
||||
getProductInfo: getProductInfo,
|
||||
beginPurchase: beginPurchase,
|
||||
restorePurchase: restorePurchase,
|
||||
getSubscriptionOptions: getSubscriptionOptions,
|
||||
isUnlockedByDefault: isUnlockedByDefault,
|
||||
getAdminFeatureName: getAdminFeatureName,
|
||||
getRestoreButtonText: getRestoreButtonText,
|
||||
getPeriodicMessageIntervalMs: getPeriodicMessageIntervalMs,
|
||||
getPremiumInfoUrl: getPremiumInfoUrl
|
||||
}
|
||||
});
|
|
@ -2,30 +2,48 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
|
|||
"use strict";
|
||||
|
||||
function onSubmit(e) {
|
||||
if (e.preventDefault(), e.stopPropagation(), 0 == pathInfos.length) return require(["alert"], function(alert) {
|
||||
alert({
|
||||
text: Globalize.translate("PleaseAddAtLeastOneFolder"),
|
||||
type: "error"
|
||||
})
|
||||
}), !1;
|
||||
var form = this,
|
||||
dlg = $(form).parents(".dialog")[0],
|
||||
name = $("#txtValue", form).val(),
|
||||
type = $("#selectCollectionType", form).val();
|
||||
"mixed" == type && (type = null);
|
||||
var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector(".libraryOptions"));
|
||||
return libraryOptions.PathInfos = pathInfos, ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function() {
|
||||
hasChanges = !0, dialogHelper.close(dlg)
|
||||
}, function() {
|
||||
require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder"))
|
||||
})
|
||||
}), !1
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
if (isCreating) return false;
|
||||
|
||||
if (pathInfos.length == 0) {
|
||||
require(["alert"], function(alert) {
|
||||
alert({
|
||||
text: Globalize.translate("PleaseAddAtLeastOneFolder"),
|
||||
type: "error"
|
||||
})
|
||||
});
|
||||
} else {
|
||||
isCreating = true;
|
||||
loading.show();
|
||||
|
||||
var form = this,
|
||||
dlg = $(form).parents(".dialog")[0],
|
||||
name = $("#txtValue", form).val(),
|
||||
type = $("#selectCollectionType", form).val();
|
||||
if (type == "mixed") type = null;
|
||||
var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector(".libraryOptions"));
|
||||
libraryOptions.PathInfos = pathInfos;
|
||||
ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function() {
|
||||
hasChanges = true;
|
||||
isCreating = false;
|
||||
loading.hide();
|
||||
dialogHelper.close(dlg);
|
||||
}, function() {
|
||||
require(["toast"], function(toast) {
|
||||
toast(Globalize.translate("ErrorAddingMediaPathToVirtualFolder"))
|
||||
})
|
||||
isCreating = false;
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function getCollectionTypeOptionsHtml(collectionTypeOptions) {
|
||||
return collectionTypeOptions.filter(function(i) {
|
||||
return !1 !== i.isSelectable
|
||||
return i.isSelectable
|
||||
}).map(function(i) {
|
||||
return '<option value="' + i.value + '">' + i.name + "</option>"
|
||||
}).join("")
|
||||
|
@ -35,9 +53,15 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
|
|||
$("#selectCollectionType", page).html(getCollectionTypeOptionsHtml(collectionTypeOptions)).val("").on("change", function() {
|
||||
var value = this.value,
|
||||
dlg = $(this).parents(".dialog")[0];
|
||||
if (libraryoptionseditor.setContentType(dlg.querySelector(".libraryOptions"), "mixed" == value ? "" : value), value ? dlg.querySelector(".libraryOptions").classList.remove("hide") : dlg.querySelector(".libraryOptions").classList.add("hide"), "mixed" != value) {
|
||||
libraryoptionseditor.setContentType(dlg.querySelector(".libraryOptions"), value == "mixed" ? "" : value);
|
||||
if (value)
|
||||
dlg.querySelector(".libraryOptions").classList.remove("hide");
|
||||
else
|
||||
dlg.querySelector(".libraryOptions").classList.add("hide");
|
||||
|
||||
if (value != "mixed") {
|
||||
var index = this.selectedIndex;
|
||||
if (-1 != index) {
|
||||
if (index != -1) {
|
||||
var name = this.options[index].innerHTML.replace("*", "").replace("&", "&");
|
||||
$("#txtValue", dlg).val(name);
|
||||
var folderOption = collectionTypeOptions.filter(function(i) {
|
||||
|
@ -59,7 +83,7 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
|
|||
require(["directorybrowser"], function(directoryBrowser) {
|
||||
var picker = new directoryBrowser;
|
||||
picker.show({
|
||||
enableNetworkSharePath: !0,
|
||||
enableNetworkSharePath: true,
|
||||
callback: function(path, networkSharePath) {
|
||||
path && addMediaLocation(page, path, networkSharePath), picker.close()
|
||||
}
|
||||
|
@ -101,7 +125,10 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
|
|||
}
|
||||
|
||||
function onDialogClosed() {
|
||||
loading.hide(), currentResolve(hasChanges)
|
||||
// I can't see any corresponding call to loading.show,
|
||||
// so I think this is not supposed to be here.
|
||||
loading.hide();
|
||||
currentResolve(hasChanges);
|
||||
}
|
||||
|
||||
function initLibraryOptions(dlg) {
|
||||
|
@ -113,23 +140,36 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed
|
|||
function editor() {
|
||||
this.show = function(options) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
currentOptions = options, currentResolve = resolve, hasChanges = !1;
|
||||
currentOptions = options, currentResolve = resolve, hasChanges = false;
|
||||
var xhr = new XMLHttpRequest;
|
||||
xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", !0), xhr.onload = function(e) {
|
||||
xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", true);
|
||||
xhr.onload = function(e) {
|
||||
var template = this.response,
|
||||
dlg = dialogHelper.createDialog({
|
||||
size: "medium-tall",
|
||||
modal: !1,
|
||||
removeOnClose: !0,
|
||||
scrollY: !1
|
||||
modal: false,
|
||||
removeOnClose: true,
|
||||
scrollY: false
|
||||
});
|
||||
dlg.classList.add("ui-body-a"), dlg.classList.add("background-theme-a"), dlg.classList.add("dlg-librarycreator"), dlg.classList.add("formDialog"), dlg.innerHTML = Globalize.translateDocument(template), initEditor(dlg, options.collectionTypeOptions), dlg.addEventListener("close", onDialogClosed), dialogHelper.open(dlg), dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
||||
dlg.classList.add("ui-body-a");
|
||||
dlg.classList.add("background-theme-a");
|
||||
dlg.classList.add("dlg-librarycreator");
|
||||
dlg.classList.add("formDialog");
|
||||
dlg.innerHTML = Globalize.translateDocument(template);
|
||||
initEditor(dlg, options.collectionTypeOptions);
|
||||
dlg.addEventListener("close", onDialogClosed);
|
||||
dialogHelper.open(dlg);
|
||||
dlg.querySelector(".btnCancel").addEventListener("click", function() {
|
||||
dialogHelper.close(dlg)
|
||||
}), pathInfos = [], renderPaths(dlg), initLibraryOptions(dlg)
|
||||
}, xhr.send()
|
||||
});
|
||||
pathInfos = [];
|
||||
renderPaths(dlg);
|
||||
initLibraryOptions(dlg);
|
||||
};
|
||||
xhr.send();
|
||||
})
|
||||
}
|
||||
}
|
||||
var currentResolve, hasChanges, currentOptions, pathInfos = [];
|
||||
var currentResolve, hasChanges, currentOptions, pathInfos = [], isCreating = false;
|
||||
return editor
|
||||
});
|
||||
});
|
||||
|
|
|
@ -2,19 +2,22 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||
"use strict";
|
||||
return function(options) {
|
||||
function getTouches(e) {
|
||||
return e.changedTouches || e.targetTouches || e.touches
|
||||
return e.changedTouches || e.targetTouches || e.touches;
|
||||
}
|
||||
|
||||
function onMenuTouchStart(e) {
|
||||
options.target.classList.remove("transition");
|
||||
var touches = getTouches(e),
|
||||
touch = touches[0] || {};
|
||||
menuTouchStartX = touch.clientX, menuTouchStartY = touch.clientY, menuTouchStartTime = (new Date).getTime()
|
||||
var touches = getTouches(e);
|
||||
var touch = touches[0] || {};
|
||||
|
||||
menuTouchStartX = touch.clientX;
|
||||
menuTouchStartY = touch.clientY;
|
||||
menuTouchStartTime = (new Date).getTime();
|
||||
}
|
||||
|
||||
function setVelocity(deltaX) {
|
||||
var time = (new Date).getTime() - (menuTouchStartTime || 0);
|
||||
velocity = Math.abs(deltaX) / time
|
||||
velocity = Math.abs(deltaX) / time;
|
||||
}
|
||||
|
||||
function onMenuTouchMove(e) {
|
||||
|
@ -29,25 +32,41 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function(browser,
|
|||
}
|
||||
|
||||
function onMenuTouchEnd(e) {
|
||||
options.target.classList.add("transition"), scrollContainer.removeEventListener("scroll", disableEvent), dragMode = 0;
|
||||
options.target.classList.add("transition");
|
||||
scrollContainer.removeEventListener("scroll", disableEvent);
|
||||
dragMode = 0;
|
||||
|
||||
var touches = getTouches(e),
|
||||
touch = touches[0] || {},
|
||||
endX = touch.clientX || 0,
|
||||
endY = touch.clientY || 0,
|
||||
deltaX = endX - (menuTouchStartX || 0),
|
||||
deltaY = endY - (menuTouchStartY || 0);
|
||||
currentPos = deltaX, self.checkMenuState(deltaX, deltaY)
|
||||
|
||||
currentPos = deltaX;
|
||||
self.checkMenuState(deltaX, deltaY);
|
||||
}
|
||||
|
||||
function onEdgeTouchStart(e) {
|
||||
if (isPeeking) onMenuTouchMove(e);
|
||||
else {
|
||||
((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize && (isPeeking = !0, "touchstart" === e.type && (dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}), dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {})), onMenuTouchStart(e))
|
||||
if (isPeeking) {
|
||||
onMenuTouchMove(e);
|
||||
} else {
|
||||
if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) {
|
||||
isPeeking = true;
|
||||
if (e.type === "touchstart") {
|
||||
dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {});
|
||||
dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {});
|
||||
}
|
||||
onMenuTouchStart(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onEdgeTouchMove(e) {
|
||||
onEdgeTouchStart(e), e.preventDefault(), e.stopPropagation()
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
onEdgeTouchStart(e);
|
||||
}
|
||||
|
||||
function onEdgeTouchEnd(e) {
|
||||
|
|
|
@ -1,197 +1,193 @@
|
|||
define(["jQuery", "registrationServices", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($__q, registrationServices, loading) {
|
||||
"use strict";
|
||||
define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($__q, loading) {
|
||||
"use strict";
|
||||
|
||||
return function (page, providerId, options) {
|
||||
function getListingProvider(config, id) {
|
||||
if (config && id) {
|
||||
var result = config.ListingProviders.filter(function (i__w) {
|
||||
return i__w.Id === id;
|
||||
})[0];
|
||||
return function (page, providerId, options) {
|
||||
function getListingProvider(config, id) {
|
||||
if (config && id) {
|
||||
var result = config.ListingProviders.filter(function (provider) {
|
||||
return provider.Id === id;
|
||||
})[0];
|
||||
|
||||
if (result) {
|
||||
return Promise.resolve(result);
|
||||
}
|
||||
if (result) {
|
||||
return Promise.resolve(result);
|
||||
}
|
||||
|
||||
return getListingProvider();
|
||||
}
|
||||
|
||||
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/Default"));
|
||||
}
|
||||
|
||||
function reload() {
|
||||
loading.show();
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
getListingProvider(config, providerId).then(function (info) {
|
||||
page.querySelector(".txtPath").value = info.Path || "";
|
||||
page.querySelector(".txtKids").value = (info.KidsCategories || []).join("|");
|
||||
page.querySelector(".txtNews").value = (info.NewsCategories || []).join("|");
|
||||
page.querySelector(".txtSports").value = (info.SportsCategories || []).join("|");
|
||||
page.querySelector(".txtMovies").value = (info.MovieCategories || []).join("|");
|
||||
page.querySelector(".txtMoviePrefix").value = info.MoviePrefix || "";
|
||||
page.querySelector(".txtUserAgent").value = info.UserAgent || "";
|
||||
page.querySelector(".chkAllTuners").checked = info.EnableAllTuners;
|
||||
|
||||
if (page.querySelector(".chkAllTuners").checked) {
|
||||
page.querySelector(".selectTunersSection").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".selectTunersSection").classList.remove("hide");
|
||||
}
|
||||
|
||||
refreshTunerDevices(page, info, config.TunerHosts);
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getCategories(txtInput) {
|
||||
var value = txtInput.value;
|
||||
|
||||
if (value) {
|
||||
return value.split("|");
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
function submitListingsForm() {
|
||||
loading.show();
|
||||
var id = providerId;
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
var info = config.ListingProviders.filter(function (i__e) {
|
||||
return i__e.Id === id;
|
||||
})[0] || {};
|
||||
info.Type = "xmltv";
|
||||
info.Path = page.querySelector(".txtPath").value;
|
||||
info.MoviePrefix = page.querySelector(".txtMoviePrefix").value || null;
|
||||
info.UserAgent = page.querySelector(".txtUserAgent").value || null;
|
||||
info.MovieCategories = getCategories(page.querySelector(".txtMovies"));
|
||||
info.KidsCategories = getCategories(page.querySelector(".txtKids"));
|
||||
info.NewsCategories = getCategories(page.querySelector(".txtNews"));
|
||||
info.SportsCategories = getCategories(page.querySelector(".txtSports"));
|
||||
info.EnableAllTuners = page.querySelector(".chkAllTuners").checked;
|
||||
info.EnabledTuners = info.EnableAllTuners ? [] : $__q(".chkTuner", page).get().filter(function (i__r) {
|
||||
return i__r.checked;
|
||||
}).map(function (i__t) {
|
||||
return i__t.getAttribute("data-id");
|
||||
});
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||
ValidateListings: true
|
||||
}),
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json"
|
||||
}).then(function (result) {
|
||||
loading.hide();
|
||||
|
||||
if (false !== options.showConfirmation) {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
}
|
||||
|
||||
Events.trigger(self, "submitted");
|
||||
}, function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("ErrorAddingXmlTvFile")
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTunerName(providerId) {
|
||||
switch (providerId = providerId.toLowerCase()) {
|
||||
case "m3u":
|
||||
return "M3U Playlist";
|
||||
|
||||
case "hdhomerun":
|
||||
return "HDHomerun";
|
||||
|
||||
case "satip":
|
||||
return "DVB";
|
||||
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
function refreshTunerDevices(page, providerInfo, devices) {
|
||||
var html = "";
|
||||
|
||||
for (var i__y = 0, length = devices.length; i__y < length; i__y++) {
|
||||
var device = devices[i__y];
|
||||
html += '<div class="listItem">';
|
||||
var enabledTuners = providerInfo.EnabledTuners || [];
|
||||
var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id);
|
||||
var checkedAttribute = isChecked ? " checked" : "";
|
||||
html += '<label class="listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" class="chkTuner" data-id="' + device.Id + '" ' + checkedAttribute + "><span></span></label>";
|
||||
html += '<div class="listItemBody two-line">';
|
||||
html += '<div class="listItemBodyText">';
|
||||
html += device.FriendlyName || getTunerName(device.Type);
|
||||
html += "</div>";
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
html += device.Url;
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
page.querySelector(".tunerList").innerHTML = html;
|
||||
}
|
||||
|
||||
function onSelectPathClick(e__u) {
|
||||
var page = $__q(e__u.target).parents(".xmltvForm")[0];
|
||||
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
var txtPath = page.querySelector(".txtPath");
|
||||
txtPath.value = path;
|
||||
txtPath.focus();
|
||||
return getListingProvider();
|
||||
}
|
||||
|
||||
picker.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var self = this;
|
||||
|
||||
self.submit = function () {
|
||||
page.querySelector(".btnSubmitListings").click();
|
||||
};
|
||||
|
||||
self.init = function () {
|
||||
options = options || {};
|
||||
|
||||
if (false !== options.showCancelButton) {
|
||||
page.querySelector(".btnCancel").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".btnCancel").classList.add("hide");
|
||||
}
|
||||
|
||||
if (false !== options.showSubmitButton) {
|
||||
page.querySelector(".btnSubmitListings").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".btnSubmitListings").classList.add("hide");
|
||||
}
|
||||
|
||||
$__q("form", page).on("submit", function () {
|
||||
submitListingsForm();
|
||||
return false;
|
||||
});
|
||||
page.querySelector("#btnSelectPath").addEventListener("click", onSelectPathClick);
|
||||
page.querySelector(".chkAllTuners").addEventListener("change", function (e__i) {
|
||||
if (e__i.target.checked) {
|
||||
page.querySelector(".selectTunersSection").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".selectTunersSection").classList.remove("hide");
|
||||
return ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/Default"));
|
||||
}
|
||||
});
|
||||
reload();
|
||||
|
||||
function reload() {
|
||||
loading.show();
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
getListingProvider(config, providerId).then(function (info) {
|
||||
page.querySelector(".txtPath").value = info.Path || "";
|
||||
page.querySelector(".txtKids").value = (info.KidsCategories || []).join("|");
|
||||
page.querySelector(".txtNews").value = (info.NewsCategories || []).join("|");
|
||||
page.querySelector(".txtSports").value = (info.SportsCategories || []).join("|");
|
||||
page.querySelector(".txtMovies").value = (info.MovieCategories || []).join("|");
|
||||
page.querySelector(".txtMoviePrefix").value = info.MoviePrefix || "";
|
||||
page.querySelector(".txtUserAgent").value = info.UserAgent || "";
|
||||
page.querySelector(".chkAllTuners").checked = info.EnableAllTuners;
|
||||
|
||||
if (page.querySelector(".chkAllTuners").checked) {
|
||||
page.querySelector(".selectTunersSection").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".selectTunersSection").classList.remove("hide");
|
||||
}
|
||||
|
||||
refreshTunerDevices(page, info, config.TunerHosts);
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getCategories(txtInput) {
|
||||
var value = txtInput.value;
|
||||
|
||||
if (value) {
|
||||
return value.split("|");
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
function submitListingsForm() {
|
||||
loading.show();
|
||||
var id = providerId;
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
var info = config.ListingProviders.filter(function (provider) {
|
||||
return provider.Id === id;
|
||||
})[0] || {};
|
||||
info.Type = "xmltv";
|
||||
info.Path = page.querySelector(".txtPath").value;
|
||||
info.MoviePrefix = page.querySelector(".txtMoviePrefix").value || null;
|
||||
info.UserAgent = page.querySelector(".txtUserAgent").value || null;
|
||||
info.MovieCategories = getCategories(page.querySelector(".txtMovies"));
|
||||
info.KidsCategories = getCategories(page.querySelector(".txtKids"));
|
||||
info.NewsCategories = getCategories(page.querySelector(".txtNews"));
|
||||
info.SportsCategories = getCategories(page.querySelector(".txtSports"));
|
||||
info.EnableAllTuners = page.querySelector(".chkAllTuners").checked;
|
||||
info.EnabledTuners = info.EnableAllTuners ? [] : $__q(".chkTuner", page).get().filter(function (tuner) {
|
||||
return tuner.checked;
|
||||
}).map(function (tuner) {
|
||||
return tuner.getAttribute("data-id");
|
||||
});
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl("LiveTv/ListingProviders", {
|
||||
ValidateListings: true
|
||||
}),
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json"
|
||||
}).then(function (result) {
|
||||
loading.hide();
|
||||
|
||||
if (false !== options.showConfirmation) {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
}
|
||||
|
||||
Events.trigger(self, "submitted");
|
||||
}, function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate("ErrorAddingXmlTvFile")
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getTunerName(providerId) {
|
||||
switch (providerId = providerId.toLowerCase()) {
|
||||
case "m3u":
|
||||
return "M3U Playlist";
|
||||
case "hdhomerun":
|
||||
return "HDHomerun";
|
||||
case "satip":
|
||||
return "DVB";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
function refreshTunerDevices(page, providerInfo, devices) {
|
||||
var html = "";
|
||||
|
||||
for (var i = 0, length = devices.length; i < length; i++) {
|
||||
var device = devices[i];
|
||||
html += '<div class="listItem">';
|
||||
var enabledTuners = providerInfo.EnabledTuners || [];
|
||||
var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id);
|
||||
var checkedAttribute = isChecked ? " checked" : "";
|
||||
html += '<label class="listItemCheckboxContainer"><input type="checkbox" is="emby-checkbox" class="chkTuner" data-id="' + device.Id + '" ' + checkedAttribute + "><span></span></label>";
|
||||
html += '<div class="listItemBody two-line">';
|
||||
html += '<div class="listItemBodyText">';
|
||||
html += device.FriendlyName || getTunerName(device.Type);
|
||||
html += "</div>";
|
||||
html += '<div class="listItemBodyText secondary">';
|
||||
html += device.Url;
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
page.querySelector(".tunerList").innerHTML = html;
|
||||
}
|
||||
|
||||
function onSelectPathClick(e__u) {
|
||||
var page = $__q(e__u.target).parents(".xmltvForm")[0];
|
||||
|
||||
require(["directorybrowser"], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser();
|
||||
picker.show({
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
var txtPath = page.querySelector(".txtPath");
|
||||
txtPath.value = path;
|
||||
txtPath.focus();
|
||||
}
|
||||
picker.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var self = this;
|
||||
|
||||
self.submit = function () {
|
||||
page.querySelector(".btnSubmitListings").click();
|
||||
};
|
||||
|
||||
self.init = function () {
|
||||
options = options || {};
|
||||
|
||||
if (false !== options.showCancelButton) {
|
||||
page.querySelector(".btnCancel").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".btnCancel").classList.add("hide");
|
||||
}
|
||||
|
||||
if (false !== options.showSubmitButton) {
|
||||
page.querySelector(".btnSubmitListings").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".btnSubmitListings").classList.add("hide");
|
||||
}
|
||||
|
||||
$__q("form", page).on("submit", function () {
|
||||
submitListingsForm();
|
||||
return false;
|
||||
});
|
||||
page.querySelector("#btnSelectPath").addEventListener("click", onSelectPathClick);
|
||||
page.querySelector(".chkAllTuners").addEventListener("change", function (evt) {
|
||||
if (evt.target.checked) {
|
||||
page.querySelector(".selectTunersSection").classList.add("hide");
|
||||
} else {
|
||||
page.querySelector(".selectTunersSection").classList.remove("hide");
|
||||
}
|
||||
});
|
||||
reload();
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
|
|
|
@ -176,8 +176,7 @@ div[data-role=controlgroup] a.ui-btn-active {
|
|||
flex-grow: 1
|
||||
}
|
||||
|
||||
.activeSession:not(.playingSession) .sessionNowPlayingContent,
|
||||
.supporterMembershipDisabled .tabSupporterMembership {
|
||||
.activeSession:not(.playingSession) .sessionNowPlayingContent {
|
||||
display: none
|
||||
}
|
||||
|
||||
|
|
|
@ -77,42 +77,12 @@ div[data-role=page] {
|
|||
padding-bottom: 2em !important
|
||||
}
|
||||
|
||||
.supporterPromotionContainer {
|
||||
margin: 0 0 2em
|
||||
}
|
||||
|
||||
@media all and (min-width:80em) {
|
||||
.supporterPromotionContainer {
|
||||
margin: 0
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (min-width:50em) {
|
||||
|
||||
.readOnlyContent,
|
||||
form {
|
||||
max-width: 54em
|
||||
}
|
||||
|
||||
.supporterPromotionContainer {
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-box-orient: horizontal;
|
||||
-webkit-box-direction: reverse;
|
||||
-webkit-flex-direction: row-reverse;
|
||||
flex-direction: row-reverse
|
||||
}
|
||||
|
||||
.supporterPromotion {
|
||||
text-align: center;
|
||||
padding: 0 2em
|
||||
}
|
||||
|
||||
.supporterPromotion button {
|
||||
padding-left: 2em;
|
||||
padding-right: 2em
|
||||
}
|
||||
}
|
||||
|
||||
.imageDropZone {
|
||||
|
|
|
@ -84,7 +84,36 @@
|
|||
<div class="paperList serverActivityItems" data-activitylimit="4" data-useractivity="false">
|
||||
</div>
|
||||
</div>
|
||||
<div class="dashboardSection">
|
||||
<h3>${HeaderPaths}</h3>
|
||||
<div class="paperList">
|
||||
<div class="listItem listItem-border">
|
||||
<div class="listItemBody two-line">
|
||||
<div class="listItemBodyText secondary" style="margin:0;">${LabelCache}</div>
|
||||
<div class="listItemBodyText" id="cachePath"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="listItem listItem-border">
|
||||
<div class="listItemBody two-line">
|
||||
<div class="listItemBodyText secondary" style="margin:0;">${LabelLogs}</div>
|
||||
<div class="listItemBodyText" id="logPath"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="listItem listItem-border">
|
||||
<div class="listItemBody two-line">
|
||||
<div class="listItemBodyText secondary" style="margin:0;">${LabelMetadata}</div>
|
||||
<div class="listItemBodyText" id="metadataPath"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="listItem listItem-border">
|
||||
<div class="listItemBody two-line">
|
||||
<div class="listItemBodyText secondary" style="margin:0;">${LabelTranscodingTemporaryFiles}</div>
|
||||
<div class="listItemBodyText" id="transcodingTemporaryPath"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -1,13 +1,6 @@
|
|||
<div id="liveTvSuggestedPage" data-dom-cache="true" data-role="page" class="page libraryPage liveTvPage pageWithAbsoluteTabs withTabs" data-title="${HeaderLiveTv}" data-backdroptype="series,movie">
|
||||
|
||||
<div class="unlockContainer hide padded-left padded-right">
|
||||
<p class="unlockText" style="text-align:center;"></p>
|
||||
<button is="emby-button" type="button" class="raised button-submit block btnUnlock">
|
||||
<span>${HeaderBecomeProjectSupporter}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="hide liveTvContainer">
|
||||
<div class="liveTvContainer">
|
||||
|
||||
<div class="pageTabContent" id="suggestionsTab" data-index="0">
|
||||
<div id="activePrograms" class="verticalSection">
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
<div id="manageDownloadsPage" data-role="page" class="page libraryPage noSecondaryNavPage" data-backbutton="true">
|
||||
|
||||
<div class="syncActivity padded-top padded-left padded-right padded-bottom-page">
|
||||
|
||||
</div>
|
||||
</div>
|
|
@ -47,24 +47,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a is="emby-linkbutton" style="display:block; padding: 0; margin:0;" data-ripple="false" href="#" class="lnkCameraUpload hide listItem-border">
|
||||
<div class="listItem">
|
||||
<i class="md-icon listItemIcon listItemIcon-transparent">photo</i>
|
||||
<div class="listItemBody">
|
||||
<div class="listItemBodyText">${TabCameraUpload}</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a is="emby-linkbutton" style="display:block; padding: 0; margin:0;" data-ripple="false" href="#" class="lnkSync hide listItem-border">
|
||||
<div class="listItem">
|
||||
<i class="md-icon listItemIcon listItemIcon-transparent">file_download</i>
|
||||
<div class="listItemBody">
|
||||
<div class="listItemBodyText">${HeaderOfflineSync}</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="verticalSection verticalSection-extrabottompadding">
|
||||
<h2 class="sectionTitle headerUser" style="padding-left:.25em;"></h2>
|
||||
|
@ -77,12 +59,14 @@
|
|||
</div>
|
||||
</div>
|
||||
</a>
|
||||
<div class="listItem btnLogout listItem-border">
|
||||
<i class="md-icon listItemIcon listItemIcon-transparent">lock</i>
|
||||
<div class="listItemBody">
|
||||
<div class="listItemBodyText">${ButtonSignOut}</div>
|
||||
<a is="emby-linkbutton" style="display:block; padding: 0; margin:0;" data-ripple="false" href="#" class="btnLogout hide listItem-border">
|
||||
<div class="listItem">
|
||||
<i class="md-icon listItemIcon listItemIcon-transparent">lock</i>
|
||||
<div class="listItemBody">
|
||||
<div class="listItemBodyText">${ButtonSignOut}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
<div id="mySyncActivityPage" data-role="page" class="page libraryPage syncActivityPage mySyncPage noSecondaryNavPage" data-title="${TitleSync}">
|
||||
|
||||
<div class="padded-left padded-right padded-top padded-bottom-page" style="clear:both;">
|
||||
<div class="syncActivity">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,40 +0,0 @@
|
|||
<div id="syncPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderOfflineSync}" data-menubutton="false">
|
||||
|
||||
<div class="padded-left padded-right padded-bottom-page">
|
||||
<form class="userProfileSettingsForm" style="margin: 0 auto;">
|
||||
|
||||
<h1>
|
||||
${HeaderOfflineSync}
|
||||
</h1>
|
||||
|
||||
<br />
|
||||
<div class="inputContainer fldSyncPath hide">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<div style="flex-grow: 1;">
|
||||
<input is="emby-input" id="txtSyncPath" class="txtSyncPath" label="${LabelSyncPath}" autocomplete="off" readonly />
|
||||
</div>
|
||||
<button type="button" is="paper-icon-button-light" id="btnSelectSyncPath" class="autoSize">
|
||||
<i class="md-icon">search</i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="selectContainer">
|
||||
<select is="emby-select" class="selectAudioBitrate" label="${LabelMaxAudioFileBitrate}">
|
||||
<option value="2000000">${OptionNone}</option>
|
||||
<option value="320000">320K</option>
|
||||
<option value="256000">256K</option>
|
||||
<option value="192000">192K</option>
|
||||
<option value="128000">128K</option>
|
||||
<option value="64000">64K</option>
|
||||
</select>
|
||||
<div class="fieldDescription">${LabelMaxAudioFileBitrateHelp}</div>
|
||||
</div>
|
||||
|
||||
<label class="checkboxContainer">
|
||||
<input type="checkbox" is="emby-checkbox" id="chkWifi" />
|
||||
<span>${OptionSyncOnlyOnWifi}</span>
|
||||
</label>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
|
@ -1,29 +0,0 @@
|
|||
define(["appSettings", "loading", "emby-checkbox"], function(appSettings, loading) {
|
||||
"use strict";
|
||||
|
||||
function loadForm(page, user) {
|
||||
var uploadServers = appSettings.cameraUploadServers();
|
||||
page.querySelector(".uploadServerList").innerHTML = ConnectionManager.getSavedServers().map(function(s) {
|
||||
return '<label><input type="checkbox" is="emby-checkbox"' + (-1 == uploadServers.indexOf(s.Id) ? "" : " checked") + ' class="chkUploadServer" data-id="' + s.Id + '"/><span>' + s.Name + "</span></label>"
|
||||
}).join(""), loading.hide()
|
||||
}
|
||||
|
||||
function saveUser(page) {
|
||||
for (var chkUploadServer = page.querySelectorAll(".chkUploadServer"), cameraUploadServers = [], i = 0, length = chkUploadServer.length; i < length; i++) chkUploadServer[i].checked && cameraUploadServers.push(chkUploadServer[i].getAttribute("data-id"));
|
||||
appSettings.cameraUploadServers(cameraUploadServers), window.MainActivity && MainActivity.authorizeStorage(), loading.hide()
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector("form").addEventListener("submit", function(e) {
|
||||
return loading.show(), saveUser(view), e.preventDefault(), !1
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
var page = this;
|
||||
loading.show();
|
||||
var userId = params.userId || Dashboard.getCurrentUserId();
|
||||
ApiClient.getUser(userId).then(function(user) {
|
||||
loadForm(page, user)
|
||||
})
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
saveUser(this)
|
||||
})
|
||||
}
|
||||
});
|
File diff suppressed because it is too large
Load diff
|
@ -37,15 +37,21 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent)
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent)
|
||||
}
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
|
@ -80,16 +86,24 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
scalable: !0,
|
||||
overlayPlayButton: !0
|
||||
});
|
||||
var i, length, elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide()
|
||||
var i, length, elems;
|
||||
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].addEventListener("click", onPreviousPageClick);
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {};
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
|
@ -152,4 +166,4 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
reloadItems(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -88,9 +88,44 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
|
|||
|
||||
function refreshLibraryInfoInDrawer(user, drawer) {
|
||||
var html = "";
|
||||
html += '<div style="height:.5em;"></div>', html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" href="home.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonHome") + "</span></a>", html += '<div class="libraryMenuDownloads">', html += '<h3 class="sidebarHeader">', html += globalize.translate("sharedcomponents#HeaderMyDownloads"), html += "</h3>", html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="manageoffline" href="offline/offline.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("sharedcomponents#Browse") + "</span></a>", html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="manageoffline" href="managedownloads.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("sharedcomponents#Manage") + "</span></a>", html += "</div>", html += '<div class="libraryMenuOptions">', html += "</div>";
|
||||
html += '<div style="height:.5em;"></div>';
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" href="home.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonHome") + "</span></a>";
|
||||
|
||||
// libraries are added here
|
||||
html += '<div class="libraryMenuOptions">';
|
||||
html += "</div>";
|
||||
|
||||
var localUser = user.localUser;
|
||||
localUser && localUser.Policy.IsAdministrator && (html += '<div class="adminMenuOptions">', html += '<h3 class="sidebarHeader">', html += globalize.translate("HeaderAdmin"), html += "</h3>", html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder lnkManageServer" data-itemid="dashboard" href="dashboard.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonManageServer") + "</span></a>", html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder editorViewMenu" data-itemid="editor" href="edititemmetadata.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("MetadataManager") + "</span></a>", html += "</div>"), html += '<div class="userMenuOptions">', user.localUser && (html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder lnkMySettings" href="mypreferencesmenu.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSettings") + "</span></a>"), html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder lnkSyncToOtherDevices" data-itemid="syncotherdevices" href="mysync.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("sharedcomponents#Sync") + "</span></a>", AppInfo.isNativeApp && (html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="selectserver" href="selectserver.html?showuser=1"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSelectServer") + "</span></a>"), /* TODO cvium user is always localUser I think */!user.localUser || user.localUser.EnableAutoLogin || (html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnLogout" data-itemid="logout" href="#"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSignOut") + "</span></a>"), html += "</div>", navDrawerScrollContainer.innerHTML = html;
|
||||
if (localUser && localUser.Policy.IsAdministrator) {
|
||||
html += '<div class="adminMenuOptions">';
|
||||
html += '<h3 class="sidebarHeader">';
|
||||
html += globalize.translate("HeaderAdmin");
|
||||
html += "</h3>";
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder lnkManageServer" data-itemid="dashboard" href="dashboard.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonManageServer") + "</span></a>";
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder editorViewMenu" data-itemid="editor" href="edititemmetadata.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("MetadataManager") + "</span></a>";
|
||||
html += "</div>"
|
||||
}
|
||||
|
||||
html += '<div class="userMenuOptions">';
|
||||
html += '<h3 class="sidebarHeader">';
|
||||
html += globalize.translate("HeaderUser");
|
||||
html += "</h3>";
|
||||
if (user.localUser) {
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder lnkMySettings" href="mypreferencesmenu.html"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSettings") + "</span></a>";
|
||||
}
|
||||
if (AppInfo.isNativeApp) {
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="selectserver" href="selectserver.html?showuser=1"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSelectServer") + "</span></a>";
|
||||
}
|
||||
// null check for local user might not be required
|
||||
if (user.localUser && !user.localUser.EnableAutoLogin) {
|
||||
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnLogout" data-itemid="logout" href="#"><i class="md-icon navMenuOptionIcon"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSignOut") + "</span></a>";
|
||||
}
|
||||
html += "</div>";
|
||||
|
||||
// add buttons to navigation drawer
|
||||
navDrawerScrollContainer.innerHTML = html;
|
||||
|
||||
// bind logout button click to method
|
||||
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
|
||||
btnLogout && btnLogout.addEventListener("click", onLogoutClick)
|
||||
}
|
||||
|
|
|
@ -30,10 +30,12 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em
|
|||
|
||||
function renderChannels(context, result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(context)
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(context)
|
||||
}
|
||||
var query = getQuery();
|
||||
|
@ -68,17 +70,20 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em
|
|||
|
||||
function reloadItems(context, save) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(),
|
||||
apiClient = ApiClient;
|
||||
query.UserId = apiClient.getCurrentUserId(), apiClient.getLiveTvChannels(query).then(function(result) {
|
||||
renderChannels(context, result), loading.hide()
|
||||
renderChannels(context, result);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
var pageData, self = this;
|
||||
var pageData, self = this, isLoading = false;
|
||||
tabContent.querySelector(".btnFilter").addEventListener("click", function() {
|
||||
showFilterMenu(tabContent)
|
||||
}), self.renderTab = function() {
|
||||
reloadItems(tabContent)
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,197 +1,222 @@
|
|||
define(["layoutManager", "userSettings", "inputManager", "loading", "registrationServices", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function(layoutManager, userSettings, inputManager, loading, registrationServices, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
|
||||
define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
|
||||
"use strict";
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
||||
function getBackdropShape() {
|
||||
return enableScrollX() ? "overflowBackdrop" : "backdrop"
|
||||
if (enableScrollX()) {
|
||||
return "overflowBackdrop";
|
||||
}
|
||||
return "backdrop";
|
||||
}
|
||||
|
||||
function getPortraitShape() {
|
||||
return enableScrollX() ? "overflowPortrait" : "portrait"
|
||||
if (enableScrollX()) {
|
||||
return "overflowPortrait";
|
||||
}
|
||||
return "portrait";
|
||||
}
|
||||
|
||||
function getLimit() {
|
||||
return enableScrollX() ? 12 : 9
|
||||
if (enableScrollX()) {
|
||||
return 12;
|
||||
}
|
||||
return 9;
|
||||
}
|
||||
|
||||
function loadRecommendedPrograms(page) {
|
||||
loading.show();
|
||||
var limit = getLimit();
|
||||
enableScrollX() && (limit *= 2), ApiClient.getLiveTvRecommendedPrograms({
|
||||
|
||||
if (enableScrollX()) {
|
||||
limit *= 2;
|
||||
}
|
||||
|
||||
ApiClient.getLiveTvRecommendedPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
IsAiring: !0,
|
||||
IsAiring: true,
|
||||
limit: limit,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop",
|
||||
EnableTotalRecordCount: !1,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio"
|
||||
}).then(function(result) {
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "activeProgramItems", "play", {
|
||||
showAirDateTime: !1,
|
||||
showAirEndTime: !0
|
||||
}), loading.hide()
|
||||
})
|
||||
showAirDateTime: false,
|
||||
showAirEndTime: true
|
||||
});
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
function reload(page, enableFullRender) {
|
||||
enableFullRender && (loadRecommendedPrograms(page), ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: !1,
|
||||
limit: getLimit(),
|
||||
IsMovie: !1,
|
||||
IsSports: !1,
|
||||
IsKids: !1,
|
||||
IsNews: !1,
|
||||
IsSeries: !0,
|
||||
EnableTotalRecordCount: !1,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function(result) {
|
||||
renderItems(page, result.Items, "upcomingEpisodeItems")
|
||||
}), ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: !1,
|
||||
limit: getLimit(),
|
||||
IsMovie: !0,
|
||||
EnableTotalRecordCount: !1,
|
||||
Fields: "ChannelInfo",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function(result) {
|
||||
renderItems(page, result.Items, "upcomingTvMovieItems", null, {
|
||||
shape: getPortraitShape(),
|
||||
preferThumb: null,
|
||||
showParentTitle: !1
|
||||
})
|
||||
}), ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: !1,
|
||||
limit: getLimit(),
|
||||
IsSports: !0,
|
||||
EnableTotalRecordCount: !1,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function(result) {
|
||||
renderItems(page, result.Items, "upcomingSportsItems")
|
||||
}), ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: !1,
|
||||
limit: getLimit(),
|
||||
IsKids: !0,
|
||||
EnableTotalRecordCount: !1,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function(result) {
|
||||
renderItems(page, result.Items, "upcomingKidsItems")
|
||||
}), ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: !1,
|
||||
limit: getLimit(),
|
||||
IsNews: !0,
|
||||
EnableTotalRecordCount: !1,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function(result) {
|
||||
renderItems(page, result.Items, "upcomingNewsItems", null, {
|
||||
showParentTitleOrTitle: !0,
|
||||
showTitle: !1,
|
||||
showParentTitle: !1
|
||||
})
|
||||
}))
|
||||
if (enableFullRender) {
|
||||
loadRecommendedPrograms(page);
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsMovie: false,
|
||||
IsSports: false,
|
||||
IsKids: false,
|
||||
IsNews: false,
|
||||
IsSeries: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingEpisodeItems");
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsMovie: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingTvMovieItems", null, {
|
||||
shape: getPortraitShape(),
|
||||
preferThumb: null,
|
||||
showParentTitle: false
|
||||
});
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsSports: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingSportsItems");
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsKids: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingKidsItems");
|
||||
});
|
||||
ApiClient.getLiveTvPrograms({
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
HasAired: false,
|
||||
limit: getLimit(),
|
||||
IsNews: true,
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo,PrimaryImageAspectRatio",
|
||||
EnableImageTypes: "Primary,Thumb"
|
||||
}).then(function (result) {
|
||||
renderItems(page, result.Items, "upcomingNewsItems", null, {
|
||||
showParentTitleOrTitle: true,
|
||||
showTitle: false,
|
||||
showParentTitle: false
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function renderItems(page, items, sectionClass, overlayButton, cardOptions) {
|
||||
var html = cardBuilder.getCardsHtml(Object.assign({
|
||||
items: items,
|
||||
preferThumb: "auto",
|
||||
inheritThumb: !1,
|
||||
shape: enableScrollX() ? "autooverflow" : "auto",
|
||||
defaultShape: getBackdropShape(),
|
||||
showParentTitle: !0,
|
||||
showTitle: !0,
|
||||
centerText: !0,
|
||||
coverImage: !0,
|
||||
overlayText: !1,
|
||||
lazy: !0,
|
||||
overlayPlayButton: "play" === overlayButton,
|
||||
overlayMoreButton: "more" === overlayButton,
|
||||
overlayInfoButton: "info" === overlayButton,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
showAirTime: !0,
|
||||
showAirDateTime: !0
|
||||
}, cardOptions || {})),
|
||||
elem = page.querySelector("." + sectionClass);
|
||||
elem.innerHTML = html, imageLoader.lazyChildren(elem)
|
||||
items: items,
|
||||
preferThumb: "auto",
|
||||
inheritThumb: false,
|
||||
shape: enableScrollX() ? "autooverflow" : "auto",
|
||||
defaultShape: getBackdropShape(),
|
||||
showParentTitle: true,
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
coverImage: true,
|
||||
overlayText: false,
|
||||
lazy: true,
|
||||
overlayPlayButton: "play" === overlayButton,
|
||||
overlayMoreButton: "more" === overlayButton,
|
||||
overlayInfoButton: "info" === overlayButton,
|
||||
allowBottomPadding: !enableScrollX(),
|
||||
showAirTime: true,
|
||||
showAirDateTime: true
|
||||
}, cardOptions || {}));
|
||||
var elem = page.querySelector("." + sectionClass);
|
||||
elem.innerHTML = html;
|
||||
imageLoader.lazyChildren(elem);
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [{
|
||||
name: globalize.translate("Programs")
|
||||
}, {
|
||||
name: globalize.translate("TabGuide")
|
||||
}, {
|
||||
name: globalize.translate("TabChannels")
|
||||
}, {
|
||||
name: globalize.translate("TabRecordings")
|
||||
}, {
|
||||
name: globalize.translate("HeaderSchedule")
|
||||
}, {
|
||||
name: globalize.translate("TabSeries")
|
||||
}, {
|
||||
name: globalize.translate("ButtonSearch"),
|
||||
cssClass: "searchTabButton"
|
||||
}]
|
||||
}
|
||||
|
||||
function validateUnlock(view, showDialog) {
|
||||
registrationServices.validateFeature("livetv", {
|
||||
showDialog: showDialog,
|
||||
viewOnly: !0
|
||||
}).then(function() {
|
||||
view.querySelector(".liveTvContainer").classList.remove("hide"), view.querySelector(".unlockContainer").classList.add("hide")
|
||||
}, function() {
|
||||
view.querySelector(".liveTvContainer").classList.add("hide"), view.querySelector(".unlockContainer").classList.remove("hide")
|
||||
})
|
||||
return [
|
||||
{ name: globalize.translate("Programs") },
|
||||
{ name: globalize.translate("TabGuide") },
|
||||
{ name: globalize.translate("TabChannels") },
|
||||
{ name: globalize.translate("TabRecordings") },
|
||||
{ name: globalize.translate("HeaderSchedule") },
|
||||
{ name: globalize.translate("TabSeries") },
|
||||
{ name: globalize.translate("ButtonSearch"), cssClass: "searchTabButton" }
|
||||
];
|
||||
}
|
||||
|
||||
function setScrollClasses(elem, scrollX) {
|
||||
scrollX ? (elem.classList.add("hiddenScrollX"), layoutManager.tv && elem.classList.add("smoothScrollX"), elem.classList.add("scrollX"), elem.classList.remove("vertical-wrap")) : (elem.classList.remove("hiddenScrollX"), elem.classList.remove("smoothScrollX"), elem.classList.remove("scrollX"), elem.classList.add("vertical-wrap"))
|
||||
if (scrollX) {
|
||||
elem.classList.add("hiddenScrollX");
|
||||
|
||||
if (layoutManager.tv) {
|
||||
elem.classList.add("smoothScrollX");
|
||||
}
|
||||
|
||||
elem.classList.add("scrollX");
|
||||
elem.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
elem.classList.remove("hiddenScrollX");
|
||||
elem.classList.remove("smoothScrollX");
|
||||
elem.classList.remove("scrollX");
|
||||
elem.classList.add("vertical-wrap");
|
||||
}
|
||||
}
|
||||
|
||||
function getDefaultTabIndex(folderId) {
|
||||
switch (userSettings.get("landing-" + folderId)) {
|
||||
case "guide":
|
||||
return 1;
|
||||
default:
|
||||
return 0
|
||||
if (userSettings.get("landing-" + folderId) === "guide") {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return function(view, params) {
|
||||
|
||||
return function (view, params) {
|
||||
function enableFullRender() {
|
||||
return (new Date).getTime() - lastFullRender > 3e5
|
||||
return new Date().getTime() - lastFullRender > 3e5;
|
||||
}
|
||||
|
||||
function onBeforeTabChange(e) {
|
||||
preLoadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
function onBeforeTabChange(evt) {
|
||||
preLoadTab(view, parseInt(evt.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function onTabChange(e) {
|
||||
var previousTabController = tabControllers[parseInt(e.detail.previousIndex)];
|
||||
previousTabController && previousTabController.onHide && previousTabController.onHide(), loadTab(view, parseInt(e.detail.selectedTabIndex))
|
||||
function onTabChange(evt) {
|
||||
var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
|
||||
|
||||
if (previousTabController && previousTabController.onHide) {
|
||||
previousTabController.onHide();
|
||||
}
|
||||
|
||||
loadTab(view, parseInt(evt.detail.selectedTabIndex));
|
||||
}
|
||||
|
||||
function getTabContainers() {
|
||||
return view.querySelectorAll(".pageTabContent")
|
||||
return view.querySelectorAll(".pageTabContent");
|
||||
}
|
||||
|
||||
function initTabs() {
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange)
|
||||
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
|
||||
}
|
||||
|
||||
function getTabController(page, index, callback) {
|
||||
var depends = [];
|
||||
|
||||
// TODO int is a little hard to read
|
||||
switch (index) {
|
||||
case 0:
|
||||
break;
|
||||
|
@ -211,63 +236,141 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "registratio
|
|||
depends.push("scripts/livetvseriestimers");
|
||||
break;
|
||||
case 6:
|
||||
depends.push("scripts/searchtab")
|
||||
depends.push("scripts/searchtab");
|
||||
}
|
||||
require(depends, function(controllerFactory) {
|
||||
|
||||
require(depends, function (controllerFactory) {
|
||||
var tabContent;
|
||||
0 == index && (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), self.tabContent = tabContent);
|
||||
|
||||
if (0 == index) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
self.tabContent = tabContent;
|
||||
}
|
||||
|
||||
var controller = tabControllers[index];
|
||||
controller || (tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"), controller = 0 === index ? self : 6 === index ? new controllerFactory(view, tabContent, {
|
||||
collectionType: "livetv"
|
||||
}) : new controllerFactory(view, params, tabContent), tabControllers[index] = controller, controller.initTab && controller.initTab()), callback(controller)
|
||||
})
|
||||
|
||||
if (!controller) {
|
||||
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
|
||||
if (0 === index) {
|
||||
controller = self;
|
||||
} else if (6 === index) {
|
||||
controller = new controllerFactory(view, tabContent, {
|
||||
collectionType: "livetv"
|
||||
});
|
||||
} else {
|
||||
controller = new controllerFactory(view, params, tabContent);
|
||||
}
|
||||
tabControllers[index] = controller;
|
||||
|
||||
if (controller.initTab) {
|
||||
controller.initTab();
|
||||
}
|
||||
}
|
||||
|
||||
callback(controller);
|
||||
});
|
||||
}
|
||||
|
||||
function preLoadTab(page, index) {
|
||||
getTabController(page, index, function(controller) {
|
||||
-1 == renderedTabs.indexOf(index) && controller.preRender && controller.preRender()
|
||||
})
|
||||
getTabController(page, index, function (controller) {
|
||||
if (renderedTabs.indexOf(index) === -1 && controller.preRender) {
|
||||
controller.preRender();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadTab(page, index) {
|
||||
currentTabIndex = index, getTabController(page, index, function(controller) {
|
||||
initialTabIndex = null, 1 === index ? document.body.classList.add("autoScrollY") : document.body.classList.remove("autoScrollY"), -1 == renderedTabs.indexOf(index) ? (1 === index && renderedTabs.push(index), controller.renderTab()) : controller.onShow && controller.onShow(), currentTabController = controller
|
||||
})
|
||||
currentTabIndex = index;
|
||||
getTabController(page, index, function (controller) {
|
||||
initialTabIndex = null;
|
||||
|
||||
if (1 === index) {
|
||||
document.body.classList.add("autoScrollY");
|
||||
} else {
|
||||
document.body.classList.remove("autoScrollY");
|
||||
}
|
||||
|
||||
if (-1 == renderedTabs.indexOf(index)) {
|
||||
if (1 === index) {
|
||||
renderedTabs.push(index);
|
||||
}
|
||||
|
||||
controller.renderTab();
|
||||
} else if (controller.onShow) {
|
||||
controller.onShow();
|
||||
}
|
||||
|
||||
currentTabController = controller;
|
||||
});
|
||||
}
|
||||
|
||||
function onInputCommand(e) {
|
||||
switch (e.detail.command) {
|
||||
case "search":
|
||||
e.preventDefault(), Dashboard.navigate("search.html?collectionType=livetv")
|
||||
function onInputCommand(evt) {
|
||||
if (evt.detail.command === "search") {
|
||||
evt.preventDefault();
|
||||
Dashboard.navigate("search.html?collectionType=livetv");
|
||||
}
|
||||
}
|
||||
var isViewRestored, self = this,
|
||||
currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv")),
|
||||
initialTabIndex = currentTabIndex,
|
||||
lastFullRender = 0;
|
||||
[].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function(link) {
|
||||
|
||||
var isViewRestored;
|
||||
var self = this;
|
||||
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv"));
|
||||
var initialTabIndex = currentTabIndex;
|
||||
var lastFullRender = 0;
|
||||
[].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function (link) {
|
||||
var href = link.href;
|
||||
href && (link.href = href + "&serverId=" + ApiClient.serverId())
|
||||
}), view.querySelector(".unlockText").innerHTML = globalize.translate("sharedcomponents#LiveTvRequiresUnlock"), validateUnlock(view, !1), self.initTab = function() {
|
||||
for (var tabContent = view.querySelector(".pageTabContent[data-index='0']"), containers = tabContent.querySelectorAll(".itemsContainer"), i = 0, length = containers.length; i < length; i++) setScrollClasses(containers[i], enableScrollX())
|
||||
}, self.renderTab = function() {
|
||||
|
||||
if (href) {
|
||||
link.href = href + "&serverId=" + ApiClient.serverId();
|
||||
}
|
||||
});
|
||||
|
||||
self.initTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
enableFullRender() ? (reload(tabContent, !0), lastFullRender = (new Date).getTime()) : reload(tabContent)
|
||||
var containers = tabContent.querySelectorAll(".itemsContainer");
|
||||
|
||||
for (var i = 0, length = containers.length; i < length; i++) {
|
||||
setScrollClasses(containers[i], enableScrollX());
|
||||
}
|
||||
};
|
||||
var currentTabController, tabControllers = [],
|
||||
renderedTabs = [];
|
||||
view.querySelector(".btnUnlock").addEventListener("click", function() {
|
||||
validateUnlock(view, !0)
|
||||
}), view.addEventListener("viewbeforeshow", function(e) {
|
||||
isViewRestored = e.detail.isRestored, initTabs()
|
||||
}), view.addEventListener("viewshow", function(e) {
|
||||
isViewRestored = e.detail.isRestored, isViewRestored || mainTabsManager.selectedTabIndex(initialTabIndex), inputManager.on(window, onInputCommand)
|
||||
}), view.addEventListener("viewbeforehide", function(e) {
|
||||
currentTabController && currentTabController.onHide && currentTabController.onHide(), document.body.classList.remove("autoScrollY"), inputManager.off(window, onInputCommand)
|
||||
}), view.addEventListener("viewdestroy", function(e) {
|
||||
tabControllers.forEach(function(t) {
|
||||
t.destroy && t.destroy()
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
self.renderTab = function () {
|
||||
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
|
||||
|
||||
if (enableFullRender()) {
|
||||
reload(tabContent, true);
|
||||
lastFullRender = new Date().getTime();
|
||||
} else {
|
||||
reload(tabContent);
|
||||
}
|
||||
};
|
||||
|
||||
var currentTabController;
|
||||
var tabControllers = [];
|
||||
var renderedTabs = [];
|
||||
view.addEventListener("viewbeforeshow", function (evt) {
|
||||
isViewRestored = evt.detail.isRestored;
|
||||
initTabs();
|
||||
});
|
||||
view.addEventListener("viewshow", function (evt) {
|
||||
isViewRestored = evt.detail.isRestored;
|
||||
if (!isViewRestored) {
|
||||
mainTabsManager.selectedTabIndex(initialTabIndex);
|
||||
}
|
||||
inputManager.on(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function (e__u) {
|
||||
if (currentTabController && currentTabController.onHide) {
|
||||
currentTabController.onHide();
|
||||
}
|
||||
document.body.classList.remove("autoScrollY");
|
||||
inputManager.off(window, onInputCommand);
|
||||
});
|
||||
view.addEventListener("viewdestroy", function (evt) {
|
||||
tabControllers.forEach(function (tabController) {
|
||||
if (tabController.destroy) {
|
||||
tabController.destroy();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
define(["syncJobList"], function(syncJobList) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
var apiClient = ApiClient,
|
||||
mySyncJobList = new syncJobList({
|
||||
serverId: apiClient.serverId(),
|
||||
userId: null,
|
||||
element: view.querySelector(".syncActivity"),
|
||||
mode: "download"
|
||||
});
|
||||
view.addEventListener("viewdestroy", function() {
|
||||
mySyncJobList && (mySyncJobList.destroy(), mySyncJobList = null)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -4,20 +4,25 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
function getPageData(context) {
|
||||
var key = getSavedQueryKey(context),
|
||||
pageData = data[key];
|
||||
return pageData || (pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "BoxSet",
|
||||
Recursive: !0,
|
||||
Fields: "PrimaryImageAspectRatio,SortName",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
}, pageData.query.ParentId = params.topParentId, libraryBrowser.loadSavedQueryValues(key, pageData.query)), pageData
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: "SortName",
|
||||
SortOrder: "Ascending",
|
||||
IncludeItemTypes: "BoxSet",
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,SortName",
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || "Poster"
|
||||
};
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
}
|
||||
return pageData;
|
||||
}
|
||||
|
||||
function getQuery(context) {
|
||||
|
@ -36,13 +41,16 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
window.scrollTo(0, 0);
|
||||
|
@ -106,12 +114,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoCollectionsAvailable") + "</p>");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide()
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {};
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.getCurrentViewStyle = function() {
|
||||
return getPageData(tabContent).view
|
||||
},
|
||||
|
@ -160,4 +173,4 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
|
|||
reloadItems(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,8 +1,16 @@
|
|||
define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"], function(layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
|
||||
define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "emby-itemscontainer"],
|
||||
function(loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder) {
|
||||
"use strict";
|
||||
return function(view, params, tabContent, options) {
|
||||
function onViewStyleChange() {
|
||||
"List" == self.getCurrentViewStyle() ? (itemsContainer.classList.add("vertical-list"), itemsContainer.classList.remove("vertical-wrap")) : (itemsContainer.classList.remove("vertical-list"), itemsContainer.classList.add("vertical-wrap")), itemsContainer.innerHTML = ""
|
||||
if (self.getCurrentViewStyle() == "List") {
|
||||
itemsContainer.classList.add("vertical-list");
|
||||
itemsContainer.classList.remove("vertical-wrap");
|
||||
} else {
|
||||
itemsContainer.classList.remove("vertical-list");
|
||||
itemsContainer.classList.add("vertical-wrap");
|
||||
}
|
||||
itemsContainer.innerHTML = "";
|
||||
}
|
||||
|
||||
function updateFilterControls() {
|
||||
|
@ -10,19 +18,26 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke
|
|||
}
|
||||
|
||||
function fetchData() {
|
||||
isLoading = true;
|
||||
loading.show();
|
||||
return ApiClient.getItems(ApiClient.getCurrentUserId(), query)
|
||||
}
|
||||
|
||||
function afterRefresh(result) {
|
||||
function onNextPageClick() {
|
||||
query.StartIndex += query.Limit, itemsContainer.refreshItems()
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit;
|
||||
itemsContainer.refreshItems();
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
query.StartIndex -= query.Limit, itemsContainer.refreshItems()
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit;
|
||||
itemsContainer.refreshItems();
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls();
|
||||
var i, length, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
window.scrollTo(0, 0);
|
||||
updateFilterControls();
|
||||
var i, length, elems, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
|
@ -31,11 +46,15 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke
|
|||
addLayoutButton: !1,
|
||||
sortButton: !1,
|
||||
filterButton: !1
|
||||
}),
|
||||
elems = tabContent.querySelectorAll(".paging");
|
||||
for (i = 0, length = elems.length; i < length; i++) elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick)
|
||||
});
|
||||
for (elems = tabContent.querySelectorAll(".paging"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].innerHTML = pagingHtml;
|
||||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++)
|
||||
elems[i].addEventListener("click", onPreviousPageClick)
|
||||
isLoading = false;
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function getItemsHtml(items) {
|
||||
|
@ -89,15 +108,27 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke
|
|||
}
|
||||
|
||||
function initPage(tabContent) {
|
||||
itemsContainer.fetchData = fetchData, itemsContainer.getItemsHtml = getItemsHtml, itemsContainer.afterRefresh = afterRefresh;
|
||||
itemsContainer.fetchData = fetchData;
|
||||
itemsContainer.getItemsHtml = getItemsHtml;
|
||||
itemsContainer.afterRefresh = afterRefresh;
|
||||
var alphaPickerElement = tabContent.querySelector(".alphaPicker");
|
||||
alphaPickerElement && (alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
var newValue = e.detail.value;
|
||||
query.NameStartsWithOrGreater = newValue, query.StartIndex = 0, itemsContainer.refreshItems()
|
||||
}), self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
}), (layoutManager.desktop || layoutManager.mobile) && (alphaPickerElement.classList.add("alphabetPicker-right"), itemsContainer.classList.remove("padded-left-withalphapicker"), itemsContainer.classList.add("padded-right-withalphapicker")));
|
||||
if (alphaPickerElement) {
|
||||
alphaPickerElement.addEventListener("alphavaluechanged", function(e) {
|
||||
var newValue = e.detail.value;
|
||||
query.NameStartsWithOrGreater = newValue;
|
||||
query.StartIndex = 0;
|
||||
itemsContainer.refreshItems();
|
||||
});
|
||||
self.alphaPicker = new alphaPicker({
|
||||
element: alphaPickerElement,
|
||||
valueChangeEvent: "click"
|
||||
});
|
||||
if (layoutManager.desktop || layoutManager.mobile) {
|
||||
alphaPickerElement.classList.add("alphabetPicker-right");
|
||||
itemsContainer.classList.remove("padded-left-withalphapicker");
|
||||
itemsContainer.classList.add("padded-right-withalphapicker");
|
||||
}
|
||||
}
|
||||
var btnFilter = tabContent.querySelector(".btnFilter");
|
||||
btnFilter && btnFilter.addEventListener("click", function() {
|
||||
self.showFilterMenu()
|
||||
|
@ -145,7 +176,10 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke
|
|||
libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(","))
|
||||
}), btnSelectView.addEventListener("layoutchange", function(e) {
|
||||
var viewStyle = e.detail.viewStyle;
|
||||
userSettings.set(savedViewKey, viewStyle), query.StartIndex = 0, onViewStyleChange(), itemsContainer.refreshItems()
|
||||
userSettings.set(savedViewKey, viewStyle);
|
||||
query.StartIndex = 0;
|
||||
onViewStyleChange();
|
||||
itemsContainer.refreshItems();
|
||||
})
|
||||
}
|
||||
var self = this,
|
||||
|
@ -163,8 +197,11 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke
|
|||
StartIndex: 0,
|
||||
Limit: 100,
|
||||
ParentId: params.topParentId
|
||||
};
|
||||
"favorites" === options.mode && (query.IsFavorite = !0), query = userSettings.loadQuerySettings(savedQueryKey, query), self.showFilterMenu = function() {
|
||||
},
|
||||
isLoading = false;
|
||||
if (options.mode === "favorites") query.IsFavorite = true;
|
||||
query = userSettings.loadQuerySettings(savedQueryKey, query);
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
query: query,
|
||||
|
@ -175,14 +212,20 @@ define(["layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicke
|
|||
query.StartIndex = 0, itemsContainer.refreshItems()
|
||||
}), filterDialog.show()
|
||||
})
|
||||
}, self.getCurrentViewStyle = function() {
|
||||
};
|
||||
self.getCurrentViewStyle = function() {
|
||||
return userSettings.get(savedViewKey) || "Poster"
|
||||
}, self.initTab = function() {
|
||||
initPage(tabContent), onViewStyleChange()
|
||||
}, self.renderTab = function() {
|
||||
itemsContainer.refreshItems(), updateFilterControls()
|
||||
}, self.destroy = function() {
|
||||
};
|
||||
self.initTab = function() {
|
||||
initPage(tabContent);
|
||||
onViewStyleChange();
|
||||
};
|
||||
self.renderTab = function() {
|
||||
itemsContainer.refreshItems();
|
||||
updateFilterControls();
|
||||
};
|
||||
self.destroy = function() {
|
||||
itemsContainer = null
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -30,13 +30,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
|
||||
function reloadItems() {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(tabContent);
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems()
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems()
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(tabContent);
|
||||
|
@ -98,7 +101,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
result.Items.length || (html = '<p style="text-align:center;">' + Globalize.translate("MessageNoTrailersFound") + "</p>");
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query), loading.hide()
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -108,7 +115,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {};
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
|
@ -174,4 +182,4 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
reloadItems(), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -50,13 +50,16 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
|
|||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery();
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(page);
|
||||
|
@ -100,7 +103,11 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
|
|||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(), query), loading.hide()
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -109,7 +116,8 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
|
|||
self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
}
|
||||
var savedQueryKey, pageData, self = this,
|
||||
pageSize = 100;
|
||||
pageSize = 100,
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
|
@ -179,4 +187,4 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
|
|||
reloadItems(tabContent), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -35,13 +35,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
("albumartists" == self.mode ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query)).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(page);
|
||||
|
@ -81,7 +84,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide()
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -90,7 +97,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
self.alphaPicker.value(query.NameStartsWithOrGreater)
|
||||
}
|
||||
var self = this,
|
||||
data = {};
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
|
@ -133,4 +141,4 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
reloadItems(tabContent), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,16 +1,42 @@
|
|||
define(["apphost", "connectionManager", "listViewStyle", "emby-linkbutton"], function(appHost, connectionManager) {
|
||||
"use strict";
|
||||
|
||||
return function(view, params) {
|
||||
view.querySelector(".btnLogout").addEventListener("click", function() {
|
||||
Dashboard.logout()
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
var page = this,
|
||||
userId = params.userId || Dashboard.getCurrentUserId();
|
||||
page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId), page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId), page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId), page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId), page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId), page.querySelector(".lnkSync").setAttribute("href", "mysyncsettings.html?userId=" + userId), page.querySelector(".lnkCameraUpload").setAttribute("href", "camerauploadsettings.html?userId=" + userId), appHost.supports("cameraupload") ? page.querySelector(".lnkCameraUpload").classList.remove("hide") : page.querySelector(".lnkCameraUpload").classList.add("hide"), appHost.supports("sync") ? page.querySelector(".lnkSync").classList.remove("hide") : page.querySelector(".lnkSync").classList.add("hide"), connectionManager.user(ApiClient).then(function(user) {
|
||||
!user.localUser || user.localUser.EnableAutoLogin && !user.connectUser ? view.querySelector(".btnLogout").classList.add("hide") : view.querySelector(".btnLogout").classList.remove("hide")
|
||||
}), Dashboard.getCurrentUser().then(function(user) {
|
||||
page.querySelector(".headerUser").innerHTML = user.Name, user.Policy.IsAdministrator ? page.querySelector(".adminSection").classList.remove("hide") : page.querySelector(".adminSection").classList.add("hide")
|
||||
}), appHost.supports("multiserver") ? page.querySelector(".selectServer").classList.remove("hide") : page.querySelector(".selectServer").classList.add("hide")
|
||||
Dashboard.logout();
|
||||
});
|
||||
|
||||
view.addEventListener("viewshow", function() {
|
||||
var page = this;
|
||||
var userId = params.userId || Dashboard.getCurrentUserId();
|
||||
|
||||
page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId);
|
||||
page.querySelector(".lnkLanguagePreferences").setAttribute("href", "mypreferenceslanguages.html?userId=" + userId);
|
||||
page.querySelector(".lnkSubtitleSettings").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
|
||||
page.querySelector(".lnkHomeScreenPreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId);
|
||||
page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId);
|
||||
|
||||
if (appHost.supports("multiserver")) {
|
||||
page.querySelector(".selectServer").classList.remove("hide")
|
||||
} else {
|
||||
page.querySelector(".selectServer").classList.add("hide");
|
||||
}
|
||||
connectionManager.user(ApiClient).then(function(user) {
|
||||
if (user.localUser && !user.localUser.EnableAutoLogin) {
|
||||
view.querySelector(".btnLogout").classList.remove("hide");
|
||||
} else {
|
||||
view.querySelector(".btnLogout").classList.add("hide");
|
||||
}
|
||||
});
|
||||
|
||||
Dashboard.getCurrentUser().then(function(user) {
|
||||
page.querySelector(".headerUser").innerHTML = user.Name;
|
||||
if (user.Policy.IsAdministrator) {
|
||||
page.querySelector(".adminSection").classList.remove("hide");
|
||||
} else {
|
||||
page.querySelector(".adminSection").classList.add("hide");
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
define(["apphost", "globalize", "syncJobList", "events", "localsync", "emby-button", "paper-icon-button-light"], function(appHost, globalize, syncJobList, events, localSync) {
|
||||
"use strict";
|
||||
return function(view, params) {
|
||||
var interval, mySyncJobList = new syncJobList({
|
||||
mode: params.mode,
|
||||
enableRemoteSyncManagement: !1,
|
||||
serverId: ApiClient.serverId(),
|
||||
userId: "offline" === params.mode ? null : ApiClient.getCurrentUserId(),
|
||||
element: view.querySelector(".syncActivity"),
|
||||
mode: params.mode
|
||||
});
|
||||
view.addEventListener("viewbeforehide", function() {
|
||||
interval && (clearInterval(interval), interval = null)
|
||||
}), view.addEventListener("viewdestroy", function() {
|
||||
mySyncJobList.destroy()
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,33 +0,0 @@
|
|||
define(["appSettings", "apphost", "emby-checkbox", "emby-select", "emby-input"], function(appSettings, appHost) {
|
||||
"use strict";
|
||||
|
||||
function loadForm(page, user) {
|
||||
page.querySelector("#txtSyncPath").value = appSettings.syncPath() || "", page.querySelector("#chkWifi").checked = appSettings.syncOnlyOnWifi(), page.querySelector(".selectAudioBitrate").value = appSettings.maxStaticMusicBitrate() || ""
|
||||
}
|
||||
|
||||
function saveUser(page) {
|
||||
var syncPath = page.querySelector("#txtSyncPath").value;
|
||||
appSettings.syncPath(syncPath), appSettings.syncOnlyOnWifi(page.querySelector("#chkWifi").checked), appSettings.maxStaticMusicBitrate(page.querySelector(".selectAudioBitrate").value || null), require(["localsync"], function(localSync) {
|
||||
localSync.sync()
|
||||
})
|
||||
}
|
||||
return function(view, params) {
|
||||
view.querySelector("form").addEventListener("submit", function(e) {
|
||||
return saveUser(view), e.preventDefault(), !1
|
||||
}), view.querySelector("#btnSelectSyncPath").addEventListener("click", function() {
|
||||
require(["nativedirectorychooser"], function() {
|
||||
NativeDirectoryChooser.chooseDirectory().then(function(path) {
|
||||
path && (view.querySelector("#txtSyncPath").value = path)
|
||||
})
|
||||
})
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
var page = this,
|
||||
userId = getParameterByName("userId") || Dashboard.getCurrentUserId();
|
||||
ApiClient.getUser(userId).then(function(user) {
|
||||
loadForm(page, user)
|
||||
}), appHost.supports("customsyncpath") ? page.querySelector(".fldSyncPath").classList.remove("hide") : page.querySelector(".fldSyncPath").classList.add("hide")
|
||||
}), view.addEventListener("viewbeforehide", function() {
|
||||
saveUser(this)
|
||||
})
|
||||
}
|
||||
});
|
|
@ -1,78 +1,206 @@
|
|||
define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "emby-checkbox", "emby-select"], function(loading, libraryMenu, globalize) {
|
||||
define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "emby-checkbox", "emby-select"], function (loading, libraryMenu, globalize) {
|
||||
"use strict";
|
||||
|
||||
function reloadList(page) {
|
||||
loading.show(), query.IsAppStoreSafe = !0;
|
||||
var promise1 = ApiClient.getAvailablePlugins(query),
|
||||
promise2 = ApiClient.getInstalledPlugins();
|
||||
Promise.all([promise1, promise2]).then(function(responses) {
|
||||
loading.show();
|
||||
query.IsAppStoreSafe = true;
|
||||
var promise1 = ApiClient.getAvailablePlugins(query);
|
||||
var promise2 = ApiClient.getInstalledPlugins();
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
populateList({
|
||||
catalogElement: page.querySelector("#pluginTiles"),
|
||||
noItemsElement: page.querySelector("#noPlugins"),
|
||||
availablePlugins: responses[0],
|
||||
installedPlugins: responses[1]
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function populateList(options) {
|
||||
populateListInternal(options)
|
||||
populateListInternal(options);
|
||||
}
|
||||
|
||||
function getHeaderText(category) {
|
||||
category.replace(" ", "").replace(" ", "");
|
||||
return "Channel" === category ? category = "Channels" : "Theme" === category ? category = "Themes" : "LiveTV" === category ? category = "HeaderLiveTV" : "ScreenSaver" === category && (category = "HeaderScreenSavers"), globalize.translate(category)
|
||||
category = category.replace(" ", "");
|
||||
|
||||
if ("Channel" === category) {
|
||||
category = "Channels";
|
||||
} else if ("Theme" === category) {
|
||||
category = "Themes";
|
||||
} else if ("LiveTV" === category) {
|
||||
category = "HeaderLiveTV";
|
||||
} else if ("ScreenSaver" === category) {
|
||||
category = "HeaderScreenSavers";
|
||||
}
|
||||
|
||||
return globalize.translate(category);
|
||||
}
|
||||
|
||||
function isUserInstalledPlugin(plugin) {
|
||||
return -1 === ["02528C96-F727-44D7-BE87-9EEF040758C3", "0277E613-3EC0-4360-A3DE-F8AF0AABB5E9", "4DCB591C-0FA2-4C5D-A7E5-DABE37164C8B"].indexOf(plugin.guid)
|
||||
return -1 === ["02528C96-F727-44D7-BE87-9EEF040758C3", "0277E613-3EC0-4360-A3DE-F8AF0AABB5E9", "4DCB591C-0FA2-4C5D-A7E5-DABE37164C8B"].indexOf(plugin.guid);
|
||||
}
|
||||
|
||||
function populateListInternal(options) {
|
||||
var availablePlugins = options.availablePlugins,
|
||||
installedPlugins = options.installedPlugins,
|
||||
allPlugins = availablePlugins.filter(function(p) {
|
||||
return p.category = p.category || "General", p.categoryDisplayName = getHeaderText(p.category), (!options.categories || -1 != options.categories.indexOf(p.category)) && ((!options.targetSystem || p.targetSystem == options.targetSystem) && "UserInstalled" == p.type)
|
||||
});
|
||||
availablePlugins = allPlugins.sort(function(a, b) {
|
||||
var aName = a.category,
|
||||
bName = b.category;
|
||||
return aName > bName ? 1 : bName > aName ? -1 : (aName = a.name, bName = b.name, aName > bName ? 1 : bName > aName ? -1 : 0)
|
||||
var availablePlugins = options.availablePlugins;
|
||||
var installedPlugins = options.installedPlugins;
|
||||
var allPlugins = availablePlugins.filter(function (plugin) {
|
||||
plugin.category = plugin.category || "General";
|
||||
plugin.categoryDisplayName = getHeaderText(plugin.category);
|
||||
|
||||
if (!options.categories || -1 != options.categories.indexOf(plugin.category)) {
|
||||
if (!options.targetSystem || plugin.targetSystem == options.targetSystem) {
|
||||
return "UserInstalled" == plugin.type;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
var i, length, plugin, currentCategory, html = "";
|
||||
availablePlugins = allPlugins.sort(function (a__e, b__r) {
|
||||
var aName = a__e.category;
|
||||
var bName = b__r.category;
|
||||
|
||||
if (aName > bName) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (bName > aName) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
aName = a__e.name;
|
||||
bName = b__r.name;
|
||||
|
||||
if (aName > bName) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (bName > aName) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
var i__q;
|
||||
var length;
|
||||
var plugin;
|
||||
var currentCategory;
|
||||
var html = "";
|
||||
|
||||
if (!options.categories) {
|
||||
currentCategory = globalize.translate("HeaderTopPlugins"), html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards">' + currentCategory + "</h2>";
|
||||
var topPlugins = allPlugins.slice(0).sort(function(a, b) {
|
||||
if (a.installs > b.installs) return -1;
|
||||
if (b.installs > a.installs) return 1;
|
||||
var aName = a.name,
|
||||
bName = b.name;
|
||||
return aName > bName ? 1 : bName > aName ? -1 : 0
|
||||
currentCategory = globalize.translate("HeaderTopPlugins");
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">' + currentCategory + "</h2>";
|
||||
var topPlugins = allPlugins.slice(0).sort(function (a__t, b__y) {
|
||||
if (a__t.installs > b__y.installs) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (b__y.installs > a__t.installs) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
var aName = a__t.name;
|
||||
var bName = b__y.name;
|
||||
|
||||
if (aName > bName) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (bName > aName) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}).filter(isUserInstalledPlugin);
|
||||
html += '<div class="itemsContainer vertical-wrap">';
|
||||
var limit = screen.availWidth >= 1920 ? 15 : 12;
|
||||
for (i = 0, length = Math.min(topPlugins.length, limit); i < length; i++) html += getPluginHtml(topPlugins[i], options, installedPlugins);
|
||||
html += "</div>", html += "</div>"
|
||||
|
||||
for (i__q = 0, length = Math.min(topPlugins.length, limit); i__q < length; i__q++) {
|
||||
html += getPluginHtml(topPlugins[i__q], options, installedPlugins);
|
||||
}
|
||||
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
var hasOpenTag = !1;
|
||||
for (currentCategory = null, !1 === options.showCategory && (html += '<div class="itemsContainer vertical-wrap">', hasOpenTag = !0), i = 0, length = availablePlugins.length; i < length; i++) {
|
||||
plugin = availablePlugins[i];
|
||||
|
||||
var hasOpenTag = false;
|
||||
|
||||
for (currentCategory = null, false === options.showCategory && (html += '<div class="itemsContainer vertical-wrap">', hasOpenTag = true), i__q = 0, length = availablePlugins.length; i__q < length; i__q++) {
|
||||
plugin = availablePlugins[i__q];
|
||||
var category = plugin.categoryDisplayName;
|
||||
category != currentCategory && (!1 !== options.showCategory && (currentCategory && (hasOpenTag = !1, html += "</div>", html += "</div>"), html += '<div class="verticalSection">', html += '<h2 class="sectionTitle sectionTitle-cards">' + category + "</h2>", html += '<div class="itemsContainer vertical-wrap">', hasOpenTag = !0), currentCategory = category), html += getPluginHtml(plugin, options, installedPlugins)
|
||||
|
||||
if (category != currentCategory) {
|
||||
if (false !== options.showCategory) {
|
||||
if (currentCategory) {
|
||||
hasOpenTag = false;
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
html += '<div class="verticalSection">';
|
||||
html += '<h2 class="sectionTitle sectionTitle-cards">' + category + "</h2>";
|
||||
html += '<div class="itemsContainer vertical-wrap">';
|
||||
hasOpenTag = true;
|
||||
}
|
||||
|
||||
currentCategory = category;
|
||||
}
|
||||
|
||||
html += getPluginHtml(plugin, options, installedPlugins);
|
||||
}
|
||||
hasOpenTag && (html += "</div>", html += "</div>"), !availablePlugins.length && options.noItemsElement && options.noItemsElement.classList.add("hide"), options.catalogElement.innerHTML = html, loading.hide()
|
||||
|
||||
if (hasOpenTag) {
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
if (!availablePlugins.length && options.noItemsElement) {
|
||||
options.noItemsElement.classList.add("hide");
|
||||
}
|
||||
|
||||
options.catalogElement.innerHTML = html;
|
||||
loading.hide();
|
||||
}
|
||||
|
||||
function getPluginHtml(plugin, options, installedPlugins) {
|
||||
var html = "",
|
||||
href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid;
|
||||
options.context && (href += "&context=" + options.context);
|
||||
var html = "";
|
||||
var href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid;
|
||||
|
||||
if (options.context) {
|
||||
href += "&context=" + options.context;
|
||||
}
|
||||
|
||||
var target = plugin.externalUrl ? ' target="_blank"' : "";
|
||||
html += "<div class='card backdropCard'>", html += '<div class="cardBox visualCardBox">', html += '<div class="cardScalable visualCardBox-cardScalable">', html += '<div class="cardPadder cardPadder-backdrop"></div>', html += '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + href + '"' + target + ">", plugin.thumbImage ? (html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.thumbImage + "');\">", html += "</div>") : html += '<i class="cardImageIcon md-icon"></i>', plugin.isPremium && (plugin.price > 0 ? html += "<div class='premiumBanner'><img src='css/images/supporter/premiumflag.png' /></div>" : html += "<div class='premiumBanner'><img src='css/images/supporter/supporterflag.png' /></div>"), html += "</a>", html += "</div>", html += '<div class="cardFooter">', html += "<div class='cardText'>", html += plugin.name, html += "</div>";
|
||||
var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function(ip) {
|
||||
return ip.Id == plugin.guid
|
||||
html += "<div class='card backdropCard'>";
|
||||
html += '<div class="cardBox visualCardBox">';
|
||||
html += '<div class="cardScalable visualCardBox-cardScalable">';
|
||||
html += '<div class="cardPadder cardPadder-backdrop"></div>';
|
||||
html += '<a class="cardContent cardImageContainer" is="emby-linkbutton" href="' + href + '"' + target + ">";
|
||||
|
||||
if (plugin.thumbImage) {
|
||||
html += '<div class="cardImage coveredImage" style="background-image:url(\'' + plugin.thumbImage + "');\">";
|
||||
html += "</div>";
|
||||
} else {
|
||||
html += '<i class="cardImageIcon md-icon"></i>';
|
||||
}
|
||||
|
||||
html += "</a>";
|
||||
html += "</div>";
|
||||
html += '<div class="cardFooter">';
|
||||
html += "<div class='cardText'>";
|
||||
html += plugin.name;
|
||||
html += "</div>";
|
||||
var installedPlugin = plugin.isApp ? null : installedPlugins.filter(function (ip) {
|
||||
return ip.Id == plugin.guid;
|
||||
})[0];
|
||||
return html += "<div class='cardText cardText-secondary'>", html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : " ", html += "</div>", html += "</div>", html += "</div>", html += "</div>"
|
||||
html += "<div class='cardText cardText-secondary'>";
|
||||
html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : " ";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
return html += "</div>";
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
|
@ -82,20 +210,24 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-linkbutton", "
|
|||
}, {
|
||||
href: "plugincatalog.html",
|
||||
name: globalize.translate("TabCatalog")
|
||||
}]
|
||||
}];
|
||||
}
|
||||
|
||||
var query = {
|
||||
TargetSystems: "Server",
|
||||
IsAdult: !1
|
||||
IsAdult: false
|
||||
};
|
||||
return window.PluginCatalog = {
|
||||
renderCatalog: populateList
|
||||
},
|
||||
function(view, params) {
|
||||
view.querySelector("#selectSystem").addEventListener("change", function() {
|
||||
query.TargetSystems = this.value, reloadList(view)
|
||||
}), view.addEventListener("viewshow", function() {
|
||||
libraryMenu.setTabs("plugins", 1, getTabs), reloadList(this)
|
||||
})
|
||||
}
|
||||
});
|
||||
window.PluginCatalog = {
|
||||
renderCatalog: populateList
|
||||
};
|
||||
return function (view, params) {
|
||||
view.querySelector("#selectSystem").addEventListener("change", function () {
|
||||
query.TargetSystems = this.value;
|
||||
reloadList(view);
|
||||
});
|
||||
view.addEventListener("viewshow", function () {
|
||||
libraryMenu.setTabs("plugins", 1, getTabs);
|
||||
reloadList(this);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
|
|
@ -47,6 +47,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
|||
function showServerConnectionFailure() {
|
||||
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"))
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
function connectToServer(server) {
|
||||
loading.show(), connectionManager.connectToServer(server, {
|
||||
|
@ -81,62 +82,6 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
|||
})
|
||||
}
|
||||
|
||||
function acceptInvitation(id) {
|
||||
loading.show(), connectionManager.acceptServer(id).then(function() {
|
||||
loading.hide(), loadServers(), loadInvitations()
|
||||
}, showGeneralError)
|
||||
}
|
||||
|
||||
function rejectInvitation(id) {
|
||||
loading.show(), connectionManager.rejectServer(id).then(function() {
|
||||
loading.hide(), loadServers(), loadInvitations()
|
||||
}, showGeneralError)
|
||||
}
|
||||
|
||||
function showPendingInviteMenu(elem) {
|
||||
var card = dom.parentWithClass(elem, "inviteItem"),
|
||||
invitationId = card.getAttribute("data-id"),
|
||||
menuItems = [];
|
||||
menuItems.push({
|
||||
name: globalize.translate("sharedcomponents#Accept"),
|
||||
id: "accept"
|
||||
}), menuItems.push({
|
||||
name: globalize.translate("sharedcomponents#Reject"),
|
||||
id: "reject"
|
||||
}), require(["actionsheet"], function(actionsheet) {
|
||||
actionsheet.show({
|
||||
items: menuItems,
|
||||
positionTo: elem,
|
||||
callback: function(id) {
|
||||
switch (id) {
|
||||
case "accept":
|
||||
acceptInvitation(invitationId);
|
||||
break;
|
||||
case "reject":
|
||||
rejectInvitation(invitationId)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function getPendingInviteHtml(item) {
|
||||
var cardBoxCssClass = "cardBox";
|
||||
layoutManager.tv && (cardBoxCssClass += " cardBox-focustransform");
|
||||
var innerOpening = '<div class="' + cardBoxCssClass + '">';
|
||||
return '<button raised class="card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable btnInviteMenu inviteItem" style="display:inline-block;" data-id="' + item.Id + '">' + innerOpening + '<div class="cardScalable card-focuscontent"><div class="cardPadder cardPadder-square"></div><div class="cardContent"><div class="cardImageContainer coveredImage" style="background:#0288D1;border-radius:.15em;"><i class="cardImageIcon md-icon"></i></div></div></div><div class="cardFooter"><div class="cardText cardTextCentered">' + item.Name + "</div></div></div></button>"
|
||||
}
|
||||
|
||||
function renderInvitations(list) {
|
||||
list.length ? view.querySelector(".invitationSection").classList.remove("hide") : view.querySelector(".invitationSection").classList.add("hide");
|
||||
var html = list.map(getPendingInviteHtml).join("");
|
||||
view.querySelector(".invitations").innerHTML = html
|
||||
}
|
||||
|
||||
function loadInvitations() {
|
||||
connectionManager.isLoggedIntoConnect() ? connectionManager.getUserInvitations().then(renderInvitations) : renderInvitations([])
|
||||
}
|
||||
|
||||
function onServerClick(server) {
|
||||
var menuItems = [];
|
||||
menuItems.push({
|
||||
|
@ -146,11 +91,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
|||
name: globalize.translate("sharedcomponents#Delete"),
|
||||
id: "delete"
|
||||
});
|
||||
var apiClient = connectionManager.getApiClient(server.Id);
|
||||
apiClient && apiClient.supportsWakeOnLan() && menuItems.push({
|
||||
name: globalize.translate("sharedcomponents#WakeServer"),
|
||||
id: "wol"
|
||||
}), actionSheet.show({
|
||||
actionSheet.show({
|
||||
items: menuItems,
|
||||
title: server.Name
|
||||
}).then(function(id) {
|
||||
|
@ -160,50 +101,10 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
|||
break;
|
||||
case "delete":
|
||||
deleteServer(server);
|
||||
break;
|
||||
case "wol":
|
||||
sendWolPacket(server)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function sendWolPacket(server) {
|
||||
var apiClient = connectionManager.getApiClient(server.Id);
|
||||
require(["loadingDialog"], function(LoadingDialog) {
|
||||
var dlg = new LoadingDialog({
|
||||
title: globalize.translate("sharedcomponents#HeaderWakeServer"),
|
||||
text: globalize.translate("sharedcomponents#AttemptingWakeServer")
|
||||
});
|
||||
dlg.show();
|
||||
var afterWol = function() {
|
||||
setTimeout(function() {
|
||||
apiClient.getPublicSystemInfo().then(onWolSuccess.bind(dlg), onWolFail.bind(dlg))
|
||||
}, 12e3)
|
||||
};
|
||||
apiClient.wakeOnLan().then(afterWol, afterWol)
|
||||
})
|
||||
}
|
||||
|
||||
function onWolSuccess() {
|
||||
var dlg = this;
|
||||
dlg.hide(), dlg.destroy(), require(["alert"], function(alert) {
|
||||
alert({
|
||||
text: globalize.translate("sharedcomponents#WakeServerSuccess"),
|
||||
title: globalize.translate("sharedcomponents#HeaderWakeServer")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onWolFail() {
|
||||
var dlg = this;
|
||||
dlg.hide(), dlg.destroy(), require(["alert"], function(alert) {
|
||||
alert({
|
||||
text: globalize.translate("sharedcomponents#WakeServerError"),
|
||||
title: globalize.translate("sharedcomponents#HeaderWakeServer")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onServersRetrieved(result) {
|
||||
servers = result, renderSelectServerItems(view, result), layoutManager.tv && focusManager.autoFocus(view)
|
||||
}
|
||||
|
@ -215,15 +116,13 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
|||
}
|
||||
var servers;
|
||||
layoutManager.desktop;
|
||||
(function() {
|
||||
updatePageStyle(view, params), view.querySelector(".btnOfflineText").innerHTML = globalize.translate("sharedcomponents#HeaderMyDownloads"), appHost.supports("sync") && view.querySelector(".btnOffline").classList.remove("hide")
|
||||
})();
|
||||
updatePageStyle(view, params);
|
||||
var backdropUrl = staticBackdrops.getRandomImageUrl();
|
||||
view.addEventListener("viewshow", function(e) {
|
||||
var isRestored = e.detail.isRestored;
|
||||
appRouter.setTitle(null), backdrop.setBackdrop(backdropUrl), isRestored || (loadServers(), loadInvitations())
|
||||
}), view.querySelector(".btnOffline").addEventListener("click", function(e) {
|
||||
appRouter.show("/offline/offline.html")
|
||||
appRouter.setTitle(null);
|
||||
backdrop.setBackdrop(backdropUrl);
|
||||
if (!isRestored) loadServers();
|
||||
}), view.querySelector(".servers").addEventListener("click", function(e) {
|
||||
var card = dom.parentWithClass(e.target, "card");
|
||||
if (card) {
|
||||
|
@ -236,9 +135,6 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
|
|||
})[0])
|
||||
}
|
||||
}
|
||||
}), view.querySelector(".invitations").addEventListener("click", function(e) {
|
||||
var btnInviteMenu = dom.parentWithClass(e.target, "btnInviteMenu");
|
||||
btnInviteMenu && showPendingInviteMenu(btnInviteMenu)
|
||||
})
|
||||
}
|
||||
});
|
||||
|
|
|
@ -285,12 +285,68 @@ var Dashboard = {
|
|||
}
|
||||
|
||||
function initRequireWithBrowser(browser) {
|
||||
var bowerPath = getBowerPath(),
|
||||
apiClientBowerPath = bowerPath + "/emby-apiclient",
|
||||
embyWebComponentsBowerPath = bowerPath + "/emby-webcomponents";
|
||||
"android" === self.appMode ? define("iapManager", ["cordova/iap"], returnFirstDependency) : "cordova" === self.appMode ? define("iapManager", ["cordova/iap"], returnFirstDependency) : define("iapManager", ["components/iap"], returnFirstDependency), "android" === self.appMode ? (define("filesystem", ["cordova/filesystem"], returnFirstDependency), define("cameraRoll", ["cordova/cameraroll"], returnFirstDependency)) : (define("filesystem", [embyWebComponentsBowerPath + "/filesystem"], returnFirstDependency), define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency)), window.IntersectionObserver && !browser.edge ? define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency) : define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency), "android" === self.appMode ? define("shell", ["cordova/shell"], returnFirstDependency) : define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency)) : define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("wakeOnLan", ["cordova/wakeonlan"], returnFirstDependency) : define("wakeOnLan", ["bower_components/emby-apiclient/wakeonlan"], returnFirstDependency), define("actionsheet", ["webActionSheet"], returnFirstDependency), "registerElement" in document ? define("registerElement", []) : browser.msie ? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency) : define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency), "android" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : "cordova" === self.appMode ? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency) : define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency), "cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11 ? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency) : define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency);
|
||||
var bowerPath = getBowerPath();
|
||||
var apiClientBowerPath = bowerPath + "/emby-apiclient";
|
||||
var embyWebComponentsBowerPath = bowerPath + "/emby-webcomponents";
|
||||
|
||||
"android" === self.appMode
|
||||
? (define("filesystem", ["cordova/filesystem"], returnFirstDependency), define("cameraRoll", ["cordova/cameraroll"], returnFirstDependency))
|
||||
: (define("filesystem", [embyWebComponentsBowerPath + "/filesystem"], returnFirstDependency), define("cameraRoll", [apiClientBowerPath + "/cameraroll"], returnFirstDependency));
|
||||
window.IntersectionObserver && !browser.edge
|
||||
? define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency)
|
||||
: define("lazyLoader", [embyWebComponentsBowerPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency);
|
||||
"android" === self.appMode
|
||||
? define("shell", ["cordova/shell"], returnFirstDependency)
|
||||
: define("shell", [embyWebComponentsBowerPath + "/shell"], returnFirstDependency);
|
||||
"cordova" === self.appMode || "android" === self.appMode
|
||||
? (define("apiclientcore", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency), define("apiclient", ["bower_components/emby-apiclient/apiclientex"], returnFirstDependency))
|
||||
: define("apiclient", ["bower_components/emby-apiclient/apiclient"], returnFirstDependency)
|
||||
define("actionsheet", ["webActionSheet"], returnFirstDependency);
|
||||
"registerElement" in document
|
||||
? define("registerElement", [])
|
||||
: browser.msie
|
||||
? define("registerElement", [bowerPath + "/webcomponentsjs/webcomponents-lite.min.js"], returnFirstDependency)
|
||||
: define("registerElement", [bowerPath + "/document-register-element/build/document-register-element"], returnFirstDependency);
|
||||
"cordova" === self.appMode || "android" === self.appMode
|
||||
? define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency)
|
||||
: define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency);
|
||||
"cordova" === self.appMode && browser.iOSVersion && browser.iOSVersion < 11
|
||||
? define("imageFetcher", ["cordova/imagestore"], returnFirstDependency)
|
||||
: define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency);
|
||||
|
||||
var preferNativeAlerts = browser.tv;
|
||||
preferNativeAlerts && window.alert ? define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency) : define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency), defineResizeObserver(), define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency), preferNativeAlerts && window.confirm ? define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency) : define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency), (preferNativeAlerts || browser.xboxOne) && window.confirm ? define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency) : define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency), browser.tizen || browser.operaTv || browser.chromecast || browser.orsay || browser.web0s || browser.ps4 ? define("loading", [embyWebComponentsBowerPath + "/loading/loading-legacy"], returnFirstDependency) : define("loading", [embyWebComponentsBowerPath + "/loading/loading-lite"], returnFirstDependency), define("multi-download", [embyWebComponentsBowerPath + "/multidownload"], returnFirstDependency), "android" === self.appMode ? define("fileDownloader", ["cordova/filedownloader"], returnFirstDependency) : define("fileDownloader", [embyWebComponentsBowerPath + "/filedownloader"], returnFirstDependency), define("localassetmanager", [apiClientBowerPath + "/localassetmanager"], returnFirstDependency), "cordova" === self.appMode || "android" === self.appMode ? define("castSenderApiLoader", [], getDummyCastSenderApiLoader) : define("castSenderApiLoader", [], getCastSenderApiLoader), self.Windows ? (define("bgtaskregister", ["environments/windows-uwp/bgtaskregister"], returnFirstDependency), define("transfermanager", ["environments/windows-uwp/transfermanager"], returnFirstDependency), define("filerepository", ["environments/windows-uwp/filerepository"], returnFirstDependency)) : "cordova" === self.appMode ? (define("filerepository", ["cordova/filerepository"], returnFirstDependency), define("transfermanager", ["filerepository"], returnFirstDependency)) : "android" === self.appMode ? (define("transfermanager", ["cordova/transfermanager"], returnFirstDependency), define("filerepository", ["cordova/filerepository"], returnFirstDependency)) : (define("transfermanager", [apiClientBowerPath + "/sync/transfermanager"], returnFirstDependency), define("filerepository", [apiClientBowerPath + "/sync/filerepository"], returnFirstDependency)), "android" === self.appMode ? define("localsync", ["cordova/localsync"], returnFirstDependency) : define("localsync", [apiClientBowerPath + "/sync/localsync"], returnFirstDependency)
|
||||
preferNativeAlerts && window.alert
|
||||
? define("alert", [embyWebComponentsBowerPath + "/alert/nativealert"], returnFirstDependency)
|
||||
: define("alert", [embyWebComponentsBowerPath + "/alert/alert"], returnFirstDependency);
|
||||
defineResizeObserver();
|
||||
define("dialog", [embyWebComponentsBowerPath + "/dialog/dialog"], returnFirstDependency);
|
||||
preferNativeAlerts && window.confirm
|
||||
? define("confirm", [embyWebComponentsBowerPath + "/confirm/nativeconfirm"], returnFirstDependency)
|
||||
: define("confirm", [embyWebComponentsBowerPath + "/confirm/confirm"], returnFirstDependency);
|
||||
(preferNativeAlerts || browser.xboxOne) && window.confirm
|
||||
? define("prompt", [embyWebComponentsBowerPath + "/prompt/nativeprompt"], returnFirstDependency)
|
||||
: define("prompt", [embyWebComponentsBowerPath + "/prompt/prompt"], returnFirstDependency);
|
||||
browser.tizen || browser.operaTv || browser.chromecast || browser.orsay || browser.web0s || browser.ps4
|
||||
? define("loading", [embyWebComponentsBowerPath + "/loading/loading-legacy"], returnFirstDependency)
|
||||
: define("loading", [embyWebComponentsBowerPath + "/loading/loading-lite"], returnFirstDependency);
|
||||
define("multi-download", [embyWebComponentsBowerPath + "/multidownload"], returnFirstDependency);
|
||||
"android" === self.appMode
|
||||
? define("fileDownloader", ["cordova/filedownloader"], returnFirstDependency)
|
||||
: define("fileDownloader", [embyWebComponentsBowerPath + "/filedownloader"], returnFirstDependency);
|
||||
define("localassetmanager", [apiClientBowerPath + "/localassetmanager"], returnFirstDependency);
|
||||
"cordova" === self.appMode || "android" === self.appMode
|
||||
? define("castSenderApiLoader", [], getDummyCastSenderApiLoader)
|
||||
: define("castSenderApiLoader", [], getCastSenderApiLoader);
|
||||
self.Windows
|
||||
? (define("bgtaskregister", ["environments/windows-uwp/bgtaskregister"], returnFirstDependency), define("transfermanager", ["environments/windows-uwp/transfermanager"], returnFirstDependency), define("filerepository", ["environments/windows-uwp/filerepository"], returnFirstDependency))
|
||||
: "cordova" === self.appMode
|
||||
? (define("filerepository", ["cordova/filerepository"], returnFirstDependency), define("transfermanager", ["filerepository"], returnFirstDependency))
|
||||
: "android" === self.appMode
|
||||
? (define("transfermanager", ["cordova/transfermanager"], returnFirstDependency), define("filerepository", ["cordova/filerepository"], returnFirstDependency))
|
||||
: (define("transfermanager", [apiClientBowerPath + "/sync/transfermanager"], returnFirstDependency), define("filerepository", [apiClientBowerPath + "/sync/filerepository"], returnFirstDependency));
|
||||
"android" === self.appMode
|
||||
? define("localsync", ["cordova/localsync"], returnFirstDependency)
|
||||
: define("localsync", [apiClientBowerPath + "/sync/localsync"], returnFirstDependency);
|
||||
}
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
|
@ -612,42 +668,12 @@ var Dashboard = {
|
|||
autoFocus: !1,
|
||||
transition: "fade",
|
||||
controller: "scripts/myprofile"
|
||||
}), defineRoute({
|
||||
path: "/offline/offline.html",
|
||||
transition: "fade",
|
||||
controller: "offline/offline",
|
||||
dependencies: [],
|
||||
anonymous: !0,
|
||||
startup: !1
|
||||
}), defineRoute({
|
||||
path: "/managedownloads.html",
|
||||
transition: "fade",
|
||||
controller: "scripts/managedownloads",
|
||||
dependencies: []
|
||||
}), defineRoute({
|
||||
path: "/mysync.html",
|
||||
dependencies: [],
|
||||
autoFocus: !1,
|
||||
transition: "fade",
|
||||
controller: "scripts/mysync"
|
||||
}), defineRoute({
|
||||
path: "/camerauploadsettings.html",
|
||||
dependencies: [],
|
||||
autoFocus: !1,
|
||||
transition: "fade",
|
||||
controller: "scripts/camerauploadsettings"
|
||||
}), defineRoute({
|
||||
path: "/mysyncjob.html",
|
||||
dependencies: [],
|
||||
autoFocus: !1,
|
||||
transition: "fade",
|
||||
controller: "scripts/syncjob"
|
||||
}), defineRoute({
|
||||
path: "/mysyncsettings.html",
|
||||
dependencies: ["emby-checkbox", "emby-input", "emby-button", "paper-icon-button-light"],
|
||||
autoFocus: !1,
|
||||
transition: "fade",
|
||||
controller: "scripts/mysyncsettings"
|
||||
}), defineRoute({
|
||||
path: "/notificationsetting.html",
|
||||
dependencies: [],
|
||||
|
@ -872,7 +898,7 @@ var Dashboard = {
|
|||
var deps = [],
|
||||
isBackgroundSync = -1 !== self.location.href.toString().toLowerCase().indexOf("start=backgroundsync"),
|
||||
isInBackground = isBackgroundSync;
|
||||
deps.push("apphost"), isInBackground || (deps.push("appRouter"), deps.push("scripts/themeloader"), browser.iOS && deps.push("css!devices/ios/ios.css"), "cordova" !== self.appMode && "android" !== self.appMode || deps.push("registrationServices"), deps.push("libraryMenu")), console.log("onAppReady - loading dependencies"), require(deps, function(appHost, pageObjects) {
|
||||
deps.push("apphost"), isInBackground || (deps.push("appRouter"), deps.push("scripts/themeloader"), browser.iOS && deps.push("css!devices/ios/ios.css"), deps.push("libraryMenu")), console.log("onAppReady - loading dependencies"), require(deps, function(appHost, pageObjects) {
|
||||
if (console.log("Loaded dependencies in onAppReady"), window.Emby = {}, isBackgroundSync) return void syncNow();
|
||||
window.Emby.Page = pageObjects, defineCoreRoutes(appHost), Emby.Page.start({
|
||||
click: !1,
|
||||
|
@ -1078,9 +1104,6 @@ var Dashboard = {
|
|||
serverId = item.ServerId || options.serverId;
|
||||
if ("settings" === item) return "mypreferencesmenu.html";
|
||||
if ("wizard" === item) return "wizardstart.html";
|
||||
if ("downloads" === item) return "offline/offline.html";
|
||||
if ("downloadsettings" === item) return "mysyncsettings.html";
|
||||
if ("managedownloads" === item) return "managedownloads.html";
|
||||
if ("manageserver" === item) return "dashboard.html";
|
||||
if ("recordedtv" === item) return "livetv.html?tab=3&serverId=" + options.serverId;
|
||||
if ("nextup" === item) return "list/list.html?type=nextup&serverId=" + options.serverId;
|
||||
|
|
|
@ -29,13 +29,16 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
|
|||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
}
|
||||
window.scrollTo(0, 0);
|
||||
|
@ -61,11 +64,16 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
|
|||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide()
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
var self = this,
|
||||
data = {};
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
|
@ -124,4 +132,4 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
|
|||
reloadItems(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -36,14 +36,19 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
|
||||
function reloadItems(page) {
|
||||
loading.show();
|
||||
isLoading = true;
|
||||
var query = getQuery(page);
|
||||
ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function(result) {
|
||||
function onNextPageClick() {
|
||||
query.StartIndex += query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) return;
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
|
||||
function onPreviousPageClick() {
|
||||
query.StartIndex -= query.Limit, reloadItems(tabContent)
|
||||
if (isLoading) return;
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(tabContent);
|
||||
}
|
||||
window.scrollTo(0, 0), updateFilterControls(page);
|
||||
var html, pagingHtml = libraryBrowser.getQueryPagingHtml({
|
||||
|
@ -103,7 +108,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
for (elems = tabContent.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onNextPageClick);
|
||||
for (elems = tabContent.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) elems[i].addEventListener("click", onPreviousPageClick);
|
||||
var itemsContainer = tabContent.querySelector(".itemsContainer");
|
||||
itemsContainer.innerHTML = html, imageLoader.lazyChildren(itemsContainer), libraryBrowser.saveQueryValues(getSavedQueryKey(page), query), loading.hide()
|
||||
itemsContainer.innerHTML = html;
|
||||
imageLoader.lazyChildren(itemsContainer);
|
||||
libraryBrowser.saveQueryValues(getSavedQueryKey(page), query);
|
||||
loading.hide();
|
||||
isLoading = false;
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -113,7 +122,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
}
|
||||
var self = this,
|
||||
pageSize = 100,
|
||||
data = {};
|
||||
data = {},
|
||||
isLoading = false;
|
||||
self.showFilterMenu = function() {
|
||||
require(["components/filterdialog/filterdialog"], function(filterDialogFactory) {
|
||||
var filterDialog = new filterDialogFactory({
|
||||
|
@ -183,4 +193,4 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
|
|||
reloadItems(tabContent), updateFilterControls(tabContent)
|
||||
}, self.destroy = function() {}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -37,7 +37,7 @@ define(["loading", "libraryMenu", "emby-linkbutton"], function(loading, libraryM
|
|||
var userId = params.userId,
|
||||
currentPassword = view.querySelector("#txtCurrentPassword").value,
|
||||
newPassword = view.querySelector("#txtNewPassword").value;
|
||||
if(view.querySelector("#fldCurrentPassword").classList.contains("hide")) {
|
||||
if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) {
|
||||
// Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank)
|
||||
// This should only happen when user.HasConfiguredPassword is false, but this information is not passed on
|
||||
currentPassword = "";
|
||||
|
|
|
@ -18,6 +18,7 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med
|
|||
function logoImageUrl(item, apiClient, options) {
|
||||
return options = options || {}, options.type = "Logo", item.ImageTags && item.ImageTags.Logo ? (options.tag = item.ImageTags.Logo, apiClient.getScaledImageUrl(item.Id, options)) : item.ParentLogoImageTag ? (options.tag = item.ParentLogoImageTag, apiClient.getScaledImageUrl(item.ParentLogoItemId, options)) : null
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
function onVerticalSwipe(e, elem, data) {
|
||||
var player = currentPlayer;
|
||||
|
@ -601,6 +602,9 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med
|
|||
|
||||
function onViewHideStopPlayback() {
|
||||
if (playbackManager.isPlayingVideo()) {
|
||||
require(['shell'], function (shell) {
|
||||
shell.disableFullscreen();
|
||||
});
|
||||
var player = currentPlayer;
|
||||
view.removeEventListener("viewbeforehide", onViewHideStopPlayback), releaseCurrentPlayer(), playbackManager.stop(player)
|
||||
}
|
||||
|
@ -609,6 +613,10 @@ define(["playbackManager", "dom", "inputmanager", "datetime", "itemHelper", "med
|
|||
function enableStopOnBack(enabled) {
|
||||
view.removeEventListener("viewbeforehide", onViewHideStopPlayback), enabled && playbackManager.isPlayingVideo(currentPlayer) && view.addEventListener("viewbeforehide", onViewHideStopPlayback)
|
||||
}
|
||||
|
||||
require(['shell'], function (shell) {
|
||||
shell.enableFullscreen();
|
||||
});
|
||||
var currentPlayer, comingUpNextDisplayed, currentUpNextDialog, isEnabled, currentItem, recordingButtonManager, enableProgressByTimeOfDay, supportsBrightnessChange, currentVisibleMenu, statsOverlay, osdHideTimeout, lastPointerMoveData, self = this,
|
||||
currentPlayerSupportedCommands = [],
|
||||
currentRuntimeTicks = 0,
|
||||
|
|
|
@ -1,32 +1,15 @@
|
|||
<div id="selectServerPage" data-role="page" class="page noSecondaryNavPage standalonePage pageContainer fullWidth vertical flex flex-direction-column">
|
||||
|
||||
<div class="verticalSection flex-shrink-zero flex flex-direction-column" style="margin: 2em 0 1em;">
|
||||
<div class="padded-left padded-right flex align-items-center justify-content-center" style="margin-bottom:2em;">
|
||||
<h1 class="sectionTitle sectionTitle-cards" style="margin:0;">${HeaderSelectServer}</h1>
|
||||
<button is="emby-button" type="button" class="raised raised-mini button-raised-accent hide noautofocus" style="margin-left:2em;" data-target="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Emby-Connect" data-autohide="true">
|
||||
<span>${Help}</span>
|
||||
</button>
|
||||
</div>
|
||||
<div is="emby-scroller" class="padded-top padded-bottom-focusscale flex-grow flex" data-mousewheel="false" data-horizontal="true" data-centerfocus="card">
|
||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x padded-left padded-right servers flex-grow" style="display: block; text-align: center;" data-hovermenu="false" data-multiselect="false"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="padded-top padded-left padded-right flex flex-shrink-zero justify-content-center verticalSection flex-wrap-wrap" style="margin-left:auto;margin-right:auto;">
|
||||
<a is="emby-linkbutton" href="addserver.html" class="raised block cancel btnAddServer flex-shrink-zero" style="margin: .25em;">
|
||||
<span>${ButtonAddServer}</span>
|
||||
</a>
|
||||
<button is="emby-button" type="button" class="raised block cancel btnOffline hide flex-shrink-zero" style="margin: .25em;">
|
||||
<span class="btnOfflineText"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="verticalSection invitationSection hide flex-shrink-zero flex flex-direction-column" style="margin-bottom:200px;">
|
||||
<div>
|
||||
<h1 class="sectionTitle sectionTitle-cards padded-left padded-right" style="text-align: center;">${Invitations}</h1>
|
||||
</div>
|
||||
<div is="emby-scroller" class="padded-bottom-focusscale flex-grow flex" data-mousewheel="false" data-horizontal="true" data-centerfocus="card">
|
||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x padded-left padded-right invitations flex-grow" style="display:block;text-align:center;" data-hovermenu="false" data-multiselect="false"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
Loading…
Add table
Add a link
Reference in a new issue