mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
more client sync stubs
This commit is contained in:
parent
fcc1746fde
commit
4ed9e6d637
12 changed files with 297 additions and 25 deletions
|
@ -46,7 +46,7 @@
|
|||
return deferred.promise();
|
||||
}
|
||||
|
||||
function createLocalItem(libraryItem, serverId, originalFileName) {
|
||||
function createLocalItem(libraryItem, serverInfo, originalFileName) {
|
||||
|
||||
var item = {};
|
||||
|
||||
|
|
|
@ -198,7 +198,7 @@
|
|||
require(['localassetmanager'], function () {
|
||||
|
||||
var libraryItem = jobItem.Item;
|
||||
LocalAssetManager.createLocalItem(libraryItem, serverInfo.Id, jobItem.OriginalFileName).done(function (localItem) {
|
||||
LocalAssetManager.createLocalItem(libraryItem, serverInfo, jobItem.OriginalFileName).done(function (localItem) {
|
||||
|
||||
downloadMedia(apiClient, jobItem, localItem).done(function () {
|
||||
|
||||
|
|
264
dashboard-ui/cordova/localassetmanager.js
vendored
264
dashboard-ui/cordova/localassetmanager.js
vendored
|
@ -11,12 +11,29 @@
|
|||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
getLocalItem(itemId, serverId).done(function (localItem) {
|
||||
|
||||
if (localItem && localItem.MediaSources.length) {
|
||||
|
||||
var mediaSource = localItem.MediaSources[0];
|
||||
|
||||
fileExists(mediaSource.Path).done(function (exists) {
|
||||
|
||||
if (exists) {
|
||||
deferred.resolveWith(null, [mediaSource]);
|
||||
}
|
||||
else {
|
||||
deferred.resolveWith(null, [null]);
|
||||
}
|
||||
|
||||
function saveOfflineUser(user) {
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolve();
|
||||
}).fail(getOnFail(deferred));
|
||||
return;
|
||||
}
|
||||
|
||||
deferred.resolveWith(null, [null]);
|
||||
|
||||
}).fail(getOnFail(deferred));
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
|
@ -46,71 +63,292 @@
|
|||
return deferred.promise();
|
||||
}
|
||||
|
||||
function saveOfflineUser(user) {
|
||||
|
||||
// TODO
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolve();
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function getOfflineActions(serverId) {
|
||||
// TODO
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, [[]]);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function getServerItemIds(serverId) {
|
||||
// TODO
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, [[]]);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function removeLocalItem(itemId, serverId) {
|
||||
// TODO
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, []);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function getLocalItem(itemId, serverId) {
|
||||
// TODO
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, []);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function addOrUpdateLocalItem(localItem) {
|
||||
// TODO
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, []);
|
||||
deferred.resolveWith(null, [null]);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function createLocalItem(libraryItem, serverId, originalFileName) {
|
||||
function createLocalItem(libraryItem, serverInfo, originalFileName) {
|
||||
|
||||
var path = getDirectoryPath(libraryItem, serverInfo);
|
||||
path.push(getLocalFileName(libraryItem, originalFileName));
|
||||
|
||||
var item = {};
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
getFileSystem().done(function (fileSystem) {
|
||||
|
||||
var localPath = fileSystem.root.toURL() + "/" + path.join('/');
|
||||
|
||||
item.LocalPath = localPath;
|
||||
|
||||
for (var i = 0, length = libraryItem.MediaSources.length; i < length; i++) {
|
||||
|
||||
var mediaSource = libraryItem.MediaSources[i];
|
||||
mediaSource.setPath(localPath);
|
||||
mediaSource.setProtocol(MediaProtocol.File);
|
||||
}
|
||||
|
||||
item.ServerId = serverInfo.Id;
|
||||
item.Item = libraryItem;
|
||||
item.ItemId = libraryItem.Id;
|
||||
item.Id = getLocalId(item.ServerId, item.ItemId);
|
||||
deferred.resolveWith(null, [item]);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function getDirectoryPath(item, serverInfo) {
|
||||
|
||||
var parts = [];
|
||||
parts.push(server.Name);
|
||||
|
||||
if (item.Type == "Episode") {
|
||||
parts.push("TV");
|
||||
parts.push(item.SeriesName);
|
||||
|
||||
if (item.SeasonName) {
|
||||
parts.push(item.SeasonName);
|
||||
}
|
||||
}
|
||||
else if (item.MediaType == 'Video') {
|
||||
parts.push("Videos");
|
||||
parts.push(item.Name);
|
||||
}
|
||||
else if (item.MediaType == 'Audio') {
|
||||
parts.push("Music");
|
||||
|
||||
if (item.AlbumArtist) {
|
||||
parts.push(item.AlbumArtist);
|
||||
}
|
||||
|
||||
if (item.Album) {
|
||||
parts.push(item.Album);
|
||||
}
|
||||
}
|
||||
else if (item.MediaType == 'Photo') {
|
||||
parts.push("Photos");
|
||||
|
||||
if (item.Album) {
|
||||
parts.push(item.Album);
|
||||
}
|
||||
}
|
||||
|
||||
return parts.map(getValidFileName);
|
||||
}
|
||||
|
||||
function getLocalFileName(libraryItem, originalFileName) {
|
||||
|
||||
var filename = originalFileName || libraryItem.Name;
|
||||
|
||||
return fileRepository.getValidFileName(filename);
|
||||
}
|
||||
|
||||
function getValidFileName(filename) {
|
||||
// TODO
|
||||
return filename;
|
||||
}
|
||||
|
||||
function downloadFile(url, localPath) {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, []);
|
||||
|
||||
Logger.log('downloading: ' + url + ' to ' + localPath);
|
||||
var ft = new FileTransfer();
|
||||
ft.download(url, localPath, function (entry) {
|
||||
|
||||
var localUrl = normalizeReturnUrl(entry.toURL());
|
||||
|
||||
Logger.log('Downloaded local url: ' + localUrl);
|
||||
deferred.resolveWith(null, [localUrl]);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function downloadSubtitles(url, localItem, subtitleStreamh) {
|
||||
function downloadSubtitles(url, localItem, subtitleStream) {
|
||||
|
||||
var path = item.LocalPath;
|
||||
|
||||
var filename = getSubtitleSaveFileName(item, subtitleStream.Language, subtitleStream.IsForced) + "." + subtitleStream.Codec.toLowerCase();
|
||||
|
||||
var parentPath = getParentDirectoryPath(path);
|
||||
|
||||
path = combinePaths(parentPath, filename);
|
||||
|
||||
return downloadFile(url, path);
|
||||
}
|
||||
|
||||
function getSubtitleSaveFileName(item, language, isForced) {
|
||||
|
||||
var path = item.LocalPath;
|
||||
|
||||
var name = getNameWithoutExtension(path);
|
||||
|
||||
if (language) {
|
||||
name += "." + language.toLowerCase();
|
||||
}
|
||||
|
||||
if (isForced) {
|
||||
name += ".foreign";
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
function getNameWithoutExtension(path) {
|
||||
|
||||
var parts = path.split('/');
|
||||
var name = parts[parts.length - 1];
|
||||
|
||||
var index = name.lastIndexOf('.');
|
||||
|
||||
if (index != -1) {
|
||||
name = name.substring(0, index);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
function getParentDirectoryPath(path) {
|
||||
|
||||
var parts = path.split('/');
|
||||
parts.length--;
|
||||
|
||||
return parts.join('/');
|
||||
}
|
||||
|
||||
function combinePaths(path1, path2) {
|
||||
|
||||
return path1 + path2;
|
||||
}
|
||||
|
||||
function getLocalId(serverId, itemId) {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, [""]);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function hasImage(serverId, itemId, imageTag) {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, [false]);
|
||||
getImageLocalPath(serverId, itemId, imageTag).done(function (localPath) {
|
||||
|
||||
fileExists(localPath).done(function (exists) {
|
||||
|
||||
deferred.resolveWith(null, [exists]);
|
||||
|
||||
}).fail(getOnFail(deferred));
|
||||
|
||||
}).fail(getOnFail(deferred));
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function downloadImage(url, serverId, itemId, imageTag) {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
deferred.resolveWith(null, [false]);
|
||||
getImageLocalPath(serverId, itemId, imageTag).done(function (localPath) {
|
||||
|
||||
downloadFile(url, localPath).done(function () {
|
||||
|
||||
deferred.resolve();
|
||||
|
||||
}).fail(getOnFail(deferred));
|
||||
|
||||
}).fail(getOnFail(deferred));
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function getImageLocalPath(serverId, itemId, imageTag) {
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
getFileSystem().done(function (fileSystem) {
|
||||
var path = fileSystem.root.toURL() + "/emby/images/" + serverId + "/" + itemId + "/" + imageTag;
|
||||
|
||||
deferred.resolveWith(null, [path]);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function fileExists(path) {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
resolveLocalFileSystemURL(path, function (fileEntry) {
|
||||
|
||||
deferred.resolveWith(null, [true]);
|
||||
|
||||
}, function () {
|
||||
|
||||
deferred.resolveWith(null, [false]);
|
||||
});
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
var fileSystem;
|
||||
function getFileSystem() {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
if (fileSystem) {
|
||||
deferred.resolveWith(null, [fileSystem]);
|
||||
} else {
|
||||
requestFileSystem(PERSISTENT, 0, function (fs) {
|
||||
fileSystem = fs;
|
||||
deferred.resolveWith(null, [fileSystem]);
|
||||
});
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function getOnFail(deferred) {
|
||||
return function () {
|
||||
|
||||
deferred.reject();
|
||||
};
|
||||
}
|
||||
|
||||
window.LocalAssetManager = {
|
||||
getLocalMediaSource: getLocalMediaSource,
|
||||
saveOfflineUser: saveOfflineUser,
|
||||
|
|
BIN
dashboard-ui/css/images/ani_equalizer_black.gif
Normal file
BIN
dashboard-ui/css/images/ani_equalizer_black.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
dashboard-ui/css/images/ani_equalizer_white.gif
Normal file
BIN
dashboard-ui/css/images/ani_equalizer_white.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
|
@ -73,6 +73,11 @@
|
|||
box-shadow: 0 0 12px 7px #cc3333;
|
||||
}
|
||||
|
||||
.playlistIndexIndicatorImage {
|
||||
background-size: initial !important;
|
||||
background-image: url(images/ani_equalizer_white.gif) !important;
|
||||
}
|
||||
|
||||
@media all and (max-width: 700px) {
|
||||
|
||||
.nowPlayingPageImage img {
|
||||
|
@ -81,6 +86,14 @@
|
|||
}
|
||||
}
|
||||
|
||||
@media all and (max-width: 600px) and (orientation: portrait) {
|
||||
|
||||
.btnSlideshow {
|
||||
display: block;
|
||||
margin-top: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-height: 600px) {
|
||||
|
||||
.nowPlayingPage .btnCommand, .nowPlayingPage .btnPlayStateCommand {
|
||||
|
|
|
@ -105,6 +105,9 @@
|
|||
vertical-align: middle;
|
||||
text-align: center;
|
||||
margin-top: 12px;
|
||||
position: relative;
|
||||
/* Need this to make sure it's on top of nowPlayingBarPositionContainer so that buttons are fully clickable */
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.nowPlayingBarPositionContainer {
|
||||
|
@ -150,6 +153,8 @@
|
|||
bottom: 12px;
|
||||
right: 10px;
|
||||
vertical-align: middle;
|
||||
/* Need this to make sure it's on top of nowPlayingBarPositionContainer so that buttons are fully clickable */
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.mediaButton img {
|
||||
|
@ -159,8 +164,6 @@
|
|||
.nowPlayingBarCurrentTime {
|
||||
vertical-align: middle;
|
||||
font-weight: normal;
|
||||
position: absolute;
|
||||
bottom: 31px;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
|
@ -204,8 +207,9 @@
|
|||
|
||||
.nowPlayingBarCurrentTime {
|
||||
padding-left: 0;
|
||||
bottom: 30px;
|
||||
top: 12px;
|
||||
right: 130px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.nowPlayingBarCenter > *:not(.nowPlayingBarCurrentTime) {
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
<div style="float:right;position:relative;top:5px;right:5px;text-align:right;">
|
||||
<div>
|
||||
<span class="nowPlayingSelectedPlayer"></span>
|
||||
<paper-fab mini icon="slideshow" class="btnSlideshow" style="vertical-align:middle;background:#888;z-index:1;margin-right:.5em;"></paper-fab>
|
||||
<paper-fab mini icon="cast" class="blue nowPlayingCastIcon" onclick="MediaController.showPlayerSelection();" style="vertical-align:middle;"></paper-fab>
|
||||
<paper-fab mini icon="slideshow" class="btnSlideshow" style="vertical-align:middle;background:#888;z-index:1;margin-left:.5em;"></paper-fab>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -144,7 +144,7 @@
|
|||
</div>
|
||||
</neon-animatable>
|
||||
<neon-animatable>
|
||||
<div class="playlist itemsContainer" style="max-width:800px;margin: 1.5em auto 0;">
|
||||
<div class="playlist itemsContainer" style="max-width:800px;margin: 2em auto 0;padding-bottom:200px;">
|
||||
</div>
|
||||
</neon-animatable>
|
||||
</neon-animated-pages>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
style += 'position:fixed;top:' + pos.top + 'px;left:' + pos.left + 'px';
|
||||
}
|
||||
|
||||
html += '<paper-dialog id="' + id + '" entry-animation="fade-in-animation" exit-animation="fade-out-animation" with-backdrop style="' + style + '">';
|
||||
html += '<paper-dialog id="' + id + '" with-backdrop style="' + style + '">';
|
||||
|
||||
if (options.title) {
|
||||
html += '<h2>';
|
||||
|
|
|
@ -1561,8 +1561,8 @@
|
|||
posterWidth = 200;
|
||||
}
|
||||
else if (options.shape == 'detailPageSquare') {
|
||||
posterWidth = 200;
|
||||
squareSize = 200;
|
||||
posterWidth = 240;
|
||||
squareSize = 240;
|
||||
}
|
||||
else if (options.shape == 'detailPage169') {
|
||||
posterWidth = 320;
|
||||
|
|
|
@ -587,6 +587,11 @@
|
|||
};
|
||||
|
||||
self.currentPlaylistIndex = function (i) {
|
||||
|
||||
if (i == null) {
|
||||
return currentPlayer.currentPlaylistIndex();
|
||||
}
|
||||
|
||||
currentPlayer.currentPlaylistIndex(i);
|
||||
};
|
||||
|
||||
|
|
|
@ -700,6 +700,18 @@
|
|||
|
||||
var itemsContainer = page.querySelector('.playlist');
|
||||
itemsContainer.innerHTML = html;
|
||||
|
||||
var index = MediaController.currentPlaylistIndex();
|
||||
|
||||
if (index != -1) {
|
||||
|
||||
var item = itemsContainer.querySelectorAll('.listItem')[index];
|
||||
var img = item.querySelector('.listviewImage');
|
||||
|
||||
img.classList.remove('lazy');
|
||||
img.classList.add('playlistIndexIndicatorImage');
|
||||
}
|
||||
|
||||
ImageLoader.lazyChildren(itemsContainer);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue