1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

update sync objects

This commit is contained in:
Luke Pulverenti 2016-12-26 15:48:13 -05:00
parent 7fda6e4d03
commit 4a34334cf4
3 changed files with 458 additions and 67 deletions

View file

@ -1,94 +1,481 @@
define([], function () { define(['filerepository', 'itemrepository', 'userrepository', 'useractionrepository', 'transfermanager', 'cryptojs-md5'], function (filerepository, itemrepository, userrepository, useractionrepository, transfermanager) {
'use strict'; 'use strict';
function getLocalMediaSource(serverId, itemId) { function getLocalItem(serverId, itemId) {
return Promise.resolve(null); var id = getLocalId(serverId, itemId);
return itemrepository.get(id);
}
function getLocalItemById(id) {
return itemrepository.get(id);
}
function getLocalId(serverId, itemId) {
return CryptoJS.MD5(serverId + itemId).toString();
} }
function saveOfflineUser(user) { function saveOfflineUser(user) {
return Promise.resolve(); return userrepository.set(user.Id, user);
} }
function deleteOfflineUser(id) { function deleteOfflineUser(id) {
return Promise.resolve(); return userrepository.remove(id);
} }
//TODO:
function getCameraPhotos() { function getCameraPhotos() {
return Promise.resolve([]); return Promise.resolve([]);
} }
function getOfflineActions(serverId) { function recordUserAction(action) {
return Promise.resolve([]);
action.Id = createGuid();
return useractionrepository.set(action.Id, action);
} }
function deleteOfflineActions(actions) { function getUserActions(serverId) {
return Promise.resolve([]); return useractionrepository.getByServerId(serverId);
}
function deleteUserAction(action) {
return useractionrepository.remove(action.Id);
}
function deleteUserActions(actions) {
var results = [];
actions.forEach(function (action) {
results.push(deleteUserAction(action));
});
return Promise.all(results);
} }
function getServerItemIds(serverId) { function getServerItemIds(serverId) {
return Promise.resolve([]); return itemrepository.getServerItemIds(serverId);
} }
function removeLocalItem(itemId, serverId) { function getServerItems(serverId) {
return Promise.resolve();
return itemrepository.getServerIds(serverId).then(function (localIds) {
var actions = localIds.map(function (id) {
return getLocalItemById(id);
});
return Promise.all(actions).then(function (items) {
return Promise.resolve(items);
});
});
} }
function getLocalItem(itemId, serverId) { function getViews(serverId, userId) {
return Promise.resolve();
return itemrepository.getServerItemTypes(serverId, userId).then(function (types) {
var list = [];
var item;
if (types.indexOf('audio') > -1) {
item = {
Name: 'Music',
ServerId: serverId,
Id: 'localview:MusicView',
Type: 'MusicView',
CollectionType: 'Music',
IsFolder: true
};
list.push(item);
}
if (types.indexOf('photo') > -1) {
item = {
Name: 'Photos',
ServerId: serverId,
Id: 'localview:PhotosView',
Type: 'PhotosView',
CollectionType: 'Photos',
IsFolder: true
};
list.push(item);
}
if (types.indexOf('episode') > -1) {
item = {
Name: 'TV',
ServerId: serverId,
Id: 'localview:TVView',
Type: 'TVView',
CollectionType: 'TvShows',
IsFolder: true
};
list.push(item);
}
if (types.indexOf('video') > -1 ||
types.indexOf('movie') > -1 ||
types.indexOf('musicvideo') > -1) {
item = {
Name: 'Videos',
ServerId: serverId,
Id: 'localview:VideosView',
Type: 'VideosView',
CollectionType: 'HomeVideos',
IsFolder: true
};
list.push(item);
}
return Promise.resolve(list);
});
}
function getViewItems(serverId, userId, parentId) {
return getServerItems(serverId).then(function (items) {
var resultItems = items.filter(function (item) {
var type = (item.Item.Type || '').toLowerCase();
switch (parentId) {
case 'localview:MusicView':
return type === 'audio';
case 'localview:PhotosView':
return type === 'photo';
case 'localview:TVView':
return type === 'episode';
case 'localview:VideosView':
return type === 'movie' || type === 'video' || type === 'musicvideo';
default:
return false;
}
}).map(function (item2) {
return item2.Item;
});
return Promise.resolve(resultItems);
});
}
function removeLocalItem(localItem) {
return itemrepository.get(localItem.Id).then(function (item) {
return filerepository.deleteFile(item.LocalPath).then(function () {
var p = Promise.resolve(true);
if (item.AdditionalFiles) {
item.AdditionalFiles.forEach(function (file) {
p = p.then(function () {
return filerepository.deleteFile(file.Path);
});
});
}
return p.then(function (file) {
return itemrepository.remove(localItem.Id);
});
}, function (error) {
var p = Promise.resolve(true);
if (item.AdditionalFiles) {
item.AdditionalFiles.forEach(function (file) {
p = p.then(function (item) {
return filerepository.deleteFile(file.Path);
});
});
}
return p.then(function (file) {
return itemrepository.remove(localItem.Id);
});
});
});
} }
function addOrUpdateLocalItem(localItem) { function addOrUpdateLocalItem(localItem) {
return Promise.resolve(); return itemrepository.set(localItem.Id, localItem);
} }
function createLocalItem(libraryItem, serverInfo, originalFileName) { function createLocalItem(libraryItem, serverInfo, jobItem) {
return Promise.resolve({}); var path = getDirectoryPath(libraryItem, serverInfo);
var localFolder = filerepository.getFullLocalPath(path);
path.push(getLocalFileName(libraryItem, jobItem.OriginalFileName));
var localPath = filerepository.getFullLocalPath(path);
for (var i = 0; i < libraryItem.MediaSources.length; i++) {
var mediaSource = libraryItem.MediaSources[i];
mediaSource.Path = localPath;
mediaSource.Protocol = 'File';
}
var item = {
Item: libraryItem,
ItemId: libraryItem.Id,
ServerId: serverInfo.Id,
LocalPath: localPath,
LocalFolder: localFolder,
AdditionalFiles: jobItem.AdditionalFiles.slice(0),
Id: getLocalId(serverInfo.Id, libraryItem.Id),
SyncJobItemId: jobItem.SyncJobItemId
};
return Promise.resolve(item);
} }
function downloadFile(url, localPath) { function getSubtitleSaveFileName(localItem, mediaPath, language, isForced, format) {
var name = getNameWithoutExtension(mediaPath);
if (language) {
name += "." + language.toLowerCase();
}
if (isForced) {
name += ".foreign";
}
name = name + "." + format.toLowerCase();
var localPathArray = [localItem.LocalFolder, name];
var localFilePath = filerepository.getPathFromArray(localPathArray);
return localFilePath;
return Promise.resolve();
} }
function downloadSubtitles(url, localItem, subtitleStreamh) { function getItemFileSize(path) {
return filerepository.getItemFileSize(path);
return Promise.resolve('');
} }
function hasImage(serverId, itemId, imageTag) { function getNameWithoutExtension(path) {
return Promise.resolve(false);
var fileName = path;
var pos = fileName.lastIndexOf(".");
if (pos > 0) {
fileName = fileName.substring(0, pos);
}
return fileName;
} }
function downloadImage(url, serverId, itemId, imageTag) { function downloadFile(url, localItem) {
return Promise.resolve(false);
return transfermanager.downloadFile(url, localItem);
} }
function fileExists(path) { function downloadSubtitles(url, fileName) {
return Promise.resolve(false);
return transfermanager.downloadSubtitles(url, fileName);
}
function getImageUrl(serverId, itemId, imageType, index) {
var pathArray = getImagePath(serverId, itemId, imageType, index);
var relPath = pathArray.join('/');
var prefix = 'ms-appdata:///local';
return prefix + '/' + relPath;
}
function hasImage(serverId, itemId, imageType, index) {
var pathArray = getImagePath(serverId, itemId, imageType, index);
var localFilePath = filerepository.getFullLocalPath(pathArray);
return filerepository.fileExists(localFilePath).then(function (exists) {
// TODO: Maybe check for broken download when file size is 0 and item is not queued
////if (exists) {
//// if (!transfermanager.isDownloadFileInQueue(localFilePath)) {
//// // If file exists but
//// exists = false;
//// }
////}
return Promise.resolve(exists);
}, function (err) {
return Promise.resolve(false);
});
}
function downloadImage(localItem, url, serverId, itemId, imageType, index) {
var pathArray = getImagePath(serverId, itemId, imageType, index);
var localFilePath = filerepository.getFullLocalPath(pathArray);
if (!localItem.AdditionalFiles) {
localItem.AdditionalFiles = [];
}
var fileInfo = {
Path: localFilePath,
Type: 'Image',
Name: imageType + index.toString(),
ImageType: imageType
};
localItem.AdditionalFiles.push(fileInfo);
return transfermanager.downloadImage(url, localFilePath);
}
function isDownloadFileInQueue(path) {
return transfermanager.isDownloadFileInQueue(path);
} }
function translateFilePath(path) { function translateFilePath(path) {
return Promise.resolve(path); return Promise.resolve(path);
} }
// Helpers ***********************************************************
function getDirectoryPath(item, server) {
var parts = [];
parts.push(server.Name);
var itemtype = item.Type.toLowerCase();
if (itemtype === 'episode') {
parts.push("TV");
var seriesName = item.SeriesName;
if (seriesName) {
parts.push(seriesName);
}
var seasonName = item.SeasonName;
if (seasonName) {
parts.push(seasonName);
}
} else if (itemtype === 'video') {
parts.push("Videos");
parts.push(item.Name);
} else if (itemtype === 'audio') {
parts.push("Music");
var albumArtist = item.AlbumArtist;
if (albumArtist) {
parts.push(albumArtist);
}
if ((item.AlbumId) && (item.Album)) {
parts.push(item.Album);
}
} else if (itemtype === 'photo') {
parts.push("Photos");
if ((item.AlbumId) && (item.Album)) {
parts.push(item.Album);
}
}
var finalParts = [];
for (var i = 0; i < parts.length; i++) {
finalParts.push(filerepository.getValidFileName(parts[i]));
}
return finalParts;
}
function getImagePath(serverId, itemId, imageType, index) {
var parts = [];
parts.push('Metadata');
parts.push(serverId);
parts.push('images');
parts.push(itemId + '_' + imageType + '_' + index.toString() + '.png');
var finalParts = [];
for (var i = 0; i < parts.length; i++) {
finalParts.push(filerepository.getValidFileName(parts[i]));
}
return finalParts;
}
function getLocalFileName(item, originalFileName) {
var filename = originalFileName || item.Name;
return filerepository.getValidFileName(filename);
}
function resyncTransfers() {
return transfermanager.resyncTransfers();
}
function createGuid() {
var d = new Date().getTime();
if (window.performance && typeof window.performance.now === "function") {
d += performance.now(); //use high-precision timer if available
}
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid;
}
return { return {
getLocalMediaSource: getLocalMediaSource,
getLocalItem: getLocalItem,
saveOfflineUser: saveOfflineUser, saveOfflineUser: saveOfflineUser,
deleteOfflineUser: deleteOfflineUser, deleteOfflineUser: deleteOfflineUser,
getCameraPhotos: getCameraPhotos, getCameraPhotos: getCameraPhotos,
getOfflineActions: getOfflineActions, recordUserAction: recordUserAction,
deleteOfflineActions: deleteOfflineActions, getUserActions: getUserActions,
deleteUserAction: deleteUserAction,
deleteUserActions: deleteUserActions,
getServerItemIds: getServerItemIds, getServerItemIds: getServerItemIds,
removeLocalItem: removeLocalItem, removeLocalItem: removeLocalItem,
getLocalItem: getLocalItem,
addOrUpdateLocalItem: addOrUpdateLocalItem, addOrUpdateLocalItem: addOrUpdateLocalItem,
createLocalItem: createLocalItem, createLocalItem: createLocalItem,
downloadFile: downloadFile, downloadFile: downloadFile,
downloadSubtitles: downloadSubtitles, downloadSubtitles: downloadSubtitles,
hasImage: hasImage, hasImage: hasImage,
downloadImage: downloadImage, downloadImage: downloadImage,
fileExists: fileExists, getImageUrl: getImageUrl,
translateFilePath: translateFilePath translateFilePath: translateFilePath,
getSubtitleSaveFileName: getSubtitleSaveFileName,
getLocalItemById: getLocalItemById,
getServerItems: getServerItems,
getItemFileSize: getItemFileSize,
isDownloadFileInQueue: isDownloadFileInQueue,
getViews: getViews,
getViewItems: getViewItems,
resyncTransfers: resyncTransfers
}; };
}); });

View file

@ -267,7 +267,7 @@
var serverId = libraryItem.ServerId; var serverId = libraryItem.ServerId;
// case 0 // case 0
var mainImageTag = (libraryItem.ImageTags || {})['Primary']; var mainImageTag = (libraryItem.ImageTags || {}).Primary;
if (libraryItem.Id && mainImageTag) { if (libraryItem.Id && mainImageTag) {
p = p.then(function () { p = p.then(function () {
@ -276,7 +276,7 @@
} }
// case 0a // case 0a
var logoImageTag = (libraryItem.ImageTags || {})['Logo']; var logoImageTag = (libraryItem.ImageTags || {}).Logo;
if (libraryItem.Id && logoImageTag) { if (libraryItem.Id && logoImageTag) {
p = p.then(function () { p = p.then(function () {
return downloadImage(localItem, apiClient, serverId, libraryItem.Id, logoImageTag, 'Logo'); return downloadImage(localItem, apiClient, serverId, libraryItem.Id, logoImageTag, 'Logo');
@ -284,7 +284,7 @@
} }
// case 0b // case 0b
var artImageTag = (libraryItem.ImageTags || {})['Art']; var artImageTag = (libraryItem.ImageTags || {}).Art;
if (libraryItem.Id && artImageTag) { if (libraryItem.Id && artImageTag) {
p = p.then(function () { p = p.then(function () {
return downloadImage(localItem, apiClient, serverId, libraryItem.Id, artImageTag, 'Art'); return downloadImage(localItem, apiClient, serverId, libraryItem.Id, artImageTag, 'Art');
@ -292,7 +292,7 @@
} }
// case 0c // case 0c
var bannerImageTag = (libraryItem.ImageTags || {})['Banner']; var bannerImageTag = (libraryItem.ImageTags || {}).Banner;
if (libraryItem.Id && bannerImageTag) { if (libraryItem.Id && bannerImageTag) {
p = p.then(function () { p = p.then(function () {
return downloadImage(localItem, apiClient, serverId, libraryItem.Id, bannerImageTag, 'Banner'); return downloadImage(localItem, apiClient, serverId, libraryItem.Id, bannerImageTag, 'Banner');
@ -300,7 +300,7 @@
} }
// case 0d // case 0d
var thumbImageTag = (libraryItem.ImageTags || {})['Thumb']; var thumbImageTag = (libraryItem.ImageTags || {}).Thumb;
if (libraryItem.Id && thumbImageTag) { if (libraryItem.Id && thumbImageTag) {
p = p.then(function () { p = p.then(function () {
return downloadImage(localItem, apiClient, serverId, libraryItem.Id, thumbImageTag, 'Thumb'); return downloadImage(localItem, apiClient, serverId, libraryItem.Id, thumbImageTag, 'Thumb');
@ -308,19 +308,19 @@
} }
// Backdrops // Backdrops
if (libraryItem.Id && libraryItem.BackdropImageTags) { //if (libraryItem.Id && libraryItem.BackdropImageTags) {
for (var i = 0; i < libraryItem.BackdropImageTags.length; i++) { // for (var i = 0; i < libraryItem.BackdropImageTags.length; i++) {
var backdropImageTag = libraryItem.BackdropImageTags[i]; // var backdropImageTag = libraryItem.BackdropImageTags[i];
// use self-invoking function to simulate block-level variable scope // // use self-invoking function to simulate block-level variable scope
(function (index, tag) { // (function (index, tag) {
p = p.then(function () { // p = p.then(function () {
return downloadImage(localItem, apiClient, serverId, libraryItem.Id, tag, 'backdrop', index); // return downloadImage(localItem, apiClient, serverId, libraryItem.Id, tag, 'backdrop', index);
}); // });
})(i, backdropImageTag); // })(i, backdropImageTag);
} // }
} //}
// case 1/2: // case 1/2:
if (libraryItem.SeriesId && libraryItem.SeriesPrimaryImageTag) { if (libraryItem.SeriesId && libraryItem.SeriesPrimaryImageTag) {

View file

@ -889,25 +889,26 @@
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['localassetmanager'], function (LocalAssetManager) { require([], function () {
//require(['localassetmanager'], function (LocalAssetManager) {
var serverInfo = ApiClient.serverInfo(); var serverInfo = ApiClient.serverInfo();
if (serverInfo.Id) { //if (serverInfo.Id) {
LocalAssetManager.getLocalMediaSource(serverInfo.Id, itemId).then(function (localMediaSource) { // LocalAssetManager.getLocalMediaSource(serverInfo.Id, itemId).then(function (localMediaSource) {
// Use the local media source if a specific one wasn't requested, or the smae one was requested // // Use the local media source if a specific one wasn't requested, or the smae one was requested
if (localMediaSource && (!mediaSource || mediaSource.Id == localMediaSource.Id)) { // if (localMediaSource && (!mediaSource || mediaSource.Id == localMediaSource.Id)) {
var playbackInfo = getPlaybackInfoFromLocalMediaSource(itemId, deviceProfile, startPosition, localMediaSource); // var playbackInfo = getPlaybackInfoFromLocalMediaSource(itemId, deviceProfile, startPosition, localMediaSource);
resolve(playbackInfo); // resolve(playbackInfo);
return; // return;
} // }
getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, resolve, reject); // getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, resolve, reject);
}); // });
return; // return;
} //}
getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, resolve, reject); getPlaybackInfoWithoutLocalMediaSource(itemId, deviceProfile, startPosition, mediaSource, audioStreamIndex, subtitleStreamIndex, liveStreamId, resolve, reject);
}); });
@ -1003,11 +1004,14 @@
if (mediaSource.Protocol == 'File') { if (mediaSource.Protocol == 'File') {
require(['localassetmanager'], function (LocalAssetManager) { require(['filesystem'], function (fileSystem) {
LocalAssetManager.fileExists(mediaSource.Path).then(function (exists) { fileSystem.fileExists(mediaSource.Path).then(function () {
console.log('LocalAssetManager.fileExists: path: ' + mediaSource.Path + ' result: ' + exists); console.log('fileSystem.fileExists: path: ' + mediaSource.Path + ' result: ' + true);
resolve(exists); resolve(true);
}, function () {
console.log('fileSystem.fileExists: path: ' + mediaSource.Path + ' result: ' + false);
resolve(false);
}); });
}); });
} }