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

get api libs from bower

This commit is contained in:
Luke Pulverenti 2015-12-16 00:30:14 -05:00
parent def418714f
commit f36e664503
97 changed files with 16860 additions and 197 deletions

View file

@ -0,0 +1,118 @@
(function (globalScope) {
function contentUploader(connectionManager) {
var self = this;
self.uploadImages = function (server) {
var deferred = DeferredBuilder.Deferred();
LocalAssetManager.getCameraPhotos().then(function (photos) {
if (!photos.length) {
deferred.resolve();
return;
}
var apiClient = connectionManager.getApiClient(server.Id);
apiClient.getContentUploadHistory().then(function (uploadHistory) {
photos = getFilesToUpload(photos, uploadHistory);
Logger.log('Found ' + photos.length + ' files to upload');
uploadNext(photos, 0, server, apiClient, deferred);
}, function () {
deferred.reject();
});
}, function () {
deferred.reject();
});
return deferred.promise();
};
function getFilesToUpload(files, uploadHistory) {
return files.filter(function (file) {
// Seeing some null entries for some reason
if (!file) {
return false;
}
return uploadHistory.FilesUploaded.filter(function (u) {
return getUploadId(file) == u.Id;
}).length == 0;
});
}
function getUploadId(file) {
return CryptoJS.SHA1(file + "1").toString();
}
function uploadNext(files, index, server, apiClient, deferred) {
var length = files.length;
if (index >= length) {
deferred.resolve();
return;
}
uploadFile(files[index], apiClient).then(function () {
uploadNext(files, index + 1, server, apiClient, deferred);
}, function () {
uploadNext(files, index + 1, server, apiClient, deferred);
});
}
function uploadFile(file, apiClient) {
var deferred = DeferredBuilder.Deferred();
require(['fileupload', "cryptojs-sha1"], function () {
var name = 'camera image ' + new Date().getTime();
var url = apiClient.getUrl('Devices/CameraUploads', {
DeviceId: apiClient.deviceId(),
Name: name,
Album: 'Camera Roll',
Id: getUploadId(file),
api_key: apiClient.accessToken()
});
Logger.log('Uploading file to ' + url);
new MediaBrowser.FileUpload().upload(file, name, url).then(function () {
Logger.log('File upload succeeded');
deferred.resolve();
}, function () {
Logger.log('File upload failed');
deferred.reject();
});
});
return deferred.promise();
}
}
if (!globalScope.MediaBrowser) {
globalScope.MediaBrowser = {};
}
globalScope.MediaBrowser.ContentUploader = contentUploader;
})(this);

View file

@ -0,0 +1,536 @@
(function (globalScope) {
function mediaSync() {
var self = this;
self.sync = function (apiClient, serverInfo, options) {
var deferred = DeferredBuilder.Deferred();
reportOfflineActions(apiClient, serverInfo).then(function () {
// Do the first data sync
syncData(apiClient, serverInfo, false).then(function () {
// Download new content
getNewMedia(apiClient, serverInfo, options).then(function () {
// Do the second data sync
syncData(apiClient, serverInfo, false).then(function () {
deferred.resolve();
}, getOnFail(deferred));
}, getOnFail(deferred));
}, getOnFail(deferred));
}, getOnFail(deferred));
return deferred.promise();
};
function reportOfflineActions(apiClient, serverInfo) {
Logger.log('Begin reportOfflineActions');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
LocalAssetManager.getOfflineActions(serverInfo.Id).then(function (actions) {
if (!actions.length) {
deferred.resolve();
return;
}
apiClient.reportOfflineActions(actions).then(function () {
LocalAssetManager.deleteOfflineActions(actions).then(function () {
deferred.resolve();
}, getOnFail(deferred));
}, getOnFail(deferred));
}, getOnFail(deferred));
});
return deferred.promise();
}
function syncData(apiClient, serverInfo, syncUserItemAccess) {
Logger.log('Begin syncData');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
LocalAssetManager.getServerItemIds(serverInfo.Id).then(function (localIds) {
var request = {
TargetId: apiClient.deviceId(),
LocalItemIds: localIds,
OfflineUserIds: (serverInfo.Users || []).map(function (u) { return u.Id; })
};
apiClient.syncData(request).then(function (result) {
afterSyncData(apiClient, serverInfo, syncUserItemAccess, result, deferred);
}, getOnFail(deferred));
}, getOnFail(deferred));
});
return deferred.promise();
}
function afterSyncData(apiClient, serverInfo, enableSyncUserItemAccess, syncDataResult, deferred) {
Logger.log('Begin afterSyncData');
removeLocalItems(syncDataResult, serverInfo.Id).then(function (result) {
if (enableSyncUserItemAccess) {
syncUserItemAccess(syncDataResult, serverInfo.Id).then(function () {
deferred.resolve();
}, getOnFail(deferred));
}
else {
deferred.resolve();
}
}, getOnFail(deferred));
deferred.resolve();
}
function removeLocalItems(syncDataResult, serverId) {
Logger.log('Begin removeLocalItems');
var deferred = DeferredBuilder.Deferred();
removeNextLocalItem(syncDataResult.ItemIdsToRemove, 0, serverId, deferred);
return deferred.promise();
}
function removeNextLocalItem(itemIdsToRemove, index, serverId, deferred) {
var length = itemIdsToRemove.length;
if (index >= length) {
deferred.resolve();
return;
}
removeLocalItem(itemIdsToRemove[index], serverId).then(function () {
removeNextLocalItem(itemIdsToRemove, index + 1, serverId, deferred);
}, function () {
removeNextLocalItem(itemIdsToRemove, index + 1, serverId, deferred);
});
}
function removeLocalItem(itemId, serverId) {
Logger.log('Begin removeLocalItem');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
LocalAssetManager.removeLocalItem(itemId, serverId).then(function (localIds) {
deferred.resolve();
}, getOnFail(deferred));
});
return deferred.promise();
}
function getNewMedia(apiClient, serverInfo, options) {
Logger.log('Begin getNewMedia');
var deferred = DeferredBuilder.Deferred();
apiClient.getReadySyncItems(apiClient.deviceId()).then(function (jobItems) {
getNextNewItem(jobItems, 0, apiClient, serverInfo, options, deferred);
}, getOnFail(deferred));
return deferred.promise();
}
function getNextNewItem(jobItems, index, apiClient, serverInfo, options, deferred) {
var length = jobItems.length;
if (index >= length) {
deferred.resolve();
return;
}
var hasGoneNext = false;
var goNext = function () {
if (!hasGoneNext) {
hasGoneNext = true;
getNextNewItem(jobItems, index + 1, apiClient, serverInfo, options, deferred);
}
};
getNewItem(jobItems[index], apiClient, serverInfo, options).then(goNext, goNext);
}
function getNewItem(jobItem, apiClient, serverInfo, options) {
Logger.log('Begin getNewItem');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
var libraryItem = jobItem.Item;
LocalAssetManager.createLocalItem(libraryItem, serverInfo, jobItem.OriginalFileName).then(function (localItem) {
downloadMedia(apiClient, jobItem, localItem, options).then(function (isQueued) {
if (isQueued) {
deferred.resolve();
return;
}
getImages(apiClient, jobItem, localItem).then(function () {
getSubtitles(apiClient, jobItem, localItem).then(function () {
apiClient.reportSyncJobItemTransferred(jobItem.SyncJobItemId).then(function () {
deferred.resolve();
}, getOnFail(deferred));
}, getOnFail(deferred));
}, getOnFail(deferred));
}, getOnFail(deferred));
}, getOnFail(deferred));
});
return deferred.promise();
}
function downloadMedia(apiClient, jobItem, localItem, options) {
Logger.log('Begin downloadMedia');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/File", {
api_key: apiClient.accessToken()
});
var localPath = localItem.LocalPath;
Logger.log('Downloading media. Url: ' + url + '. Local path: ' + localPath);
options = options || {};
LocalAssetManager.downloadFile(url, localPath, options.enableBackgroundTransfer, options.enableNewDownloads).then(function (path, isQueued) {
if (isQueued) {
deferred.resolveWith(null, [true]);
return;
}
LocalAssetManager.addOrUpdateLocalItem(localItem).then(function () {
deferred.resolveWith(null, [false]);
}, getOnFail(deferred));
}, getOnFail(deferred));
});
return deferred.promise();
}
function getImages(apiClient, jobItem, localItem) {
Logger.log('Begin getImages');
var deferred = DeferredBuilder.Deferred();
getNextImage(0, apiClient, localItem, deferred);
return deferred.promise();
}
function getNextImage(index, apiClient, localItem, deferred) {
Logger.log('Begin getNextImage');
if (index >= 4) {
deferred.resolve();
return;
}
// Just for now while media syncing gets worked out
deferred.resolve();
return;
var libraryItem = localItem.Item;
var serverId = libraryItem.ServerId;
var itemId = null;
var imageTag = null;
var imageType = "Primary";
switch (index) {
case 0:
itemId = libraryItem.Id;
imageType = "Primary";
imageTag = (libraryItem.ImageTags || {})["Primary"];
break;
case 1:
itemId = libraryItem.SeriesId;
imageType = "Primary";
imageTag = libraryItem.SeriesPrimaryImageTag;
break;
case 2:
itemId = libraryItem.SeriesId;
imageType = "Thumb";
imageTag = libraryItem.SeriesPrimaryImageTag;
break;
case 3:
itemId = libraryItem.AlbumId;
imageType = "Primary";
imageTag = libraryItem.AlbumPrimaryImageTag;
break;
default:
break;
}
if (!itemId || !imageTag) {
getNextImage(index + 1, apiClient, localItem, deferred);
return;
}
downloadImage(apiClient, serverId, itemId, imageTag, imageType).then(function () {
// For the sake of simplicity, limit to one image
deferred.resolve();
return;
getNextImage(index + 1, apiClient, localItem, deferred);
}, getOnFail(deferred));
}
function downloadImage(apiClient, serverId, itemId, imageTag, imageType) {
Logger.log('Begin downloadImage');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
LocalAssetManager.hasImage(serverId, itemId, imageTag).then(function (hasImage) {
if (hasImage) {
deferred.resolve();
return;
}
var imageUrl = apiClient.getImageUrl(itemId, {
tag: imageTag,
type: imageType,
api_key: apiClient.accessToken()
});
LocalAssetManager.downloadImage(imageUrl, serverId, itemId, imageTag).then(function () {
deferred.resolve();
}, getOnFail(deferred));
});
});
return deferred.promise();
}
function getSubtitles(apiClient, jobItem, localItem) {
Logger.log('Begin getSubtitles');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
if (!jobItem.Item.MediaSources.length) {
logger.Error("Cannot download subtitles because video has no media source info.");
deferred.resolve();
return;
}
var files = jobItem.AdditionalFiles.filter(function (f) {
return f.Type == 'Subtitles';
});
var mediaSource = jobItem.Item.MediaSources[0];
getNextSubtitle(files, 0, apiClient, jobItem, localItem, mediaSource, deferred);
});
return deferred.promise();
}
function getNextSubtitle(files, index, apiClient, jobItem, localItem, mediaSource, deferred) {
var length = files.length;
if (index >= length) {
deferred.resolve();
return;
}
getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource).then(function () {
getNextSubtitle(files, index + 1, apiClient, jobItem, localItem, mediaSource, deferred);
}, function () {
getNextSubtitle(files, index + 1, apiClient, jobItem, localItem, mediaSource, deferred);
});
}
function getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) {
Logger.log('Begin getItemSubtitle');
var deferred = DeferredBuilder.Deferred();
var subtitleStream = mediaSource.MediaStreams.filter(function (m) {
return m.Type == 'Subtitle' && m.Index == file.Index;
})[0];
if (!subtitleStream) {
// We shouldn't get in here, but let's just be safe anyway
Logger.log("Cannot download subtitles because matching stream info wasn't found.");
deferred.reject();
return;
}
var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/AdditionalFiles", {
Name: file.Name,
api_key: apiClient.accessToken()
});
require(['localassetmanager'], function () {
LocalAssetManager.downloadSubtitles(url, localItem, subtitleStream).then(function (subtitlePath) {
subtitleStream.Path = subtitlePath;
LocalAssetManager.addOrUpdateLocalItem(localItem).then(function () {
deferred.resolve();
}, getOnFail(deferred));
}, getOnFail(deferred));
});
return deferred.promise();
}
function syncUserItemAccess(syncDataResult, serverId) {
Logger.log('Begin syncUserItemAccess');
var deferred = DeferredBuilder.Deferred();
var itemIds = [];
for (var id in syncDataResult.ItemUserAccess) {
itemIds.push(id);
}
syncNextUserAccessForItem(itemIds, 0, syncDataResult, serverId, deferred);
return deferred.promise();
}
function syncNextUserAccessForItem(itemIds, index, syncDataResult, serverId, deferred) {
var length = itemIds.length;
if (index >= length) {
deferred.resolve();
return;
}
syncUserAccessForItem(itemIds[index], syncDataResult).then(function () {
syncNextUserAccessForItem(itemIds, index + 1, syncDataResult, serverId, deferred);
}, function () {
syncNextUserAccessForItem(itemIds, index + 1, syncDataResult, serverId, deferred);
});
}
function syncUserAccessForItem(itemId, syncDataResult) {
Logger.log('Begin syncUserAccessForItem');
var deferred = DeferredBuilder.Deferred();
require(['localassetmanager'], function () {
LocalAssetManager.getUserIdsWithAccess(itemId, serverId).then(function (savedUserIdsWithAccess) {
var userIdsWithAccess = syncDataResult.ItemUserAccess[itemId];
if (userIdsWithAccess.join(',') == savedUserIdsWithAccess.join(',')) {
// Hasn't changed, nothing to do
deferred.resolve();
}
else {
LocalAssetManager.saveUserIdsWithAccess(itemId, serverId, userIdsWithAccess).then(function () {
deferred.resolve();
}, getOnFail(deferred));
}
}, getOnFail(deferred));
});
return deferred.promise();
}
function getOnFail(deferred) {
return function () {
deferred.reject();
};
}
}
if (!globalScope.MediaBrowser) {
globalScope.MediaBrowser = {};
}
globalScope.MediaBrowser.MediaSync = mediaSync;
})(this);

View file

@ -0,0 +1,52 @@
(function (globalScope) {
function multiServerSync(connectionManager) {
var self = this;
self.sync = function (options) {
var deferred = DeferredBuilder.Deferred();
var servers = connectionManager.getSavedServers();
syncNext(servers, 0, options, deferred);
return deferred.promise();
};
function syncNext(servers, index, options, deferred) {
var length = servers.length;
if (index >= length) {
deferred.resolve();
return;
}
var server = servers[index];
Logger.log("Creating ServerSync to server: " + server.Id);
require(['serversync'], function () {
new MediaBrowser.ServerSync(connectionManager).sync(server, options).then(function () {
syncNext(servers, index + 1, options, deferred);
}, function () {
syncNext(servers, index + 1, options, deferred);
});
});
}
}
if (!globalScope.MediaBrowser) {
globalScope.MediaBrowser = {};
}
globalScope.MediaBrowser.MultiServerSync = multiServerSync;
})(this);

View file

@ -0,0 +1,75 @@
(function (globalScope) {
function offlineUserSync() {
var self = this;
self.sync = function (apiClient, server) {
var deferred = DeferredBuilder.Deferred();
var users = server.Users || [];
syncNext(users, 0, deferred, apiClient, server);
return deferred.promise();
};
function syncNext(users, index, deferred, apiClient, server) {
var length = users.length;
if (index >= length) {
deferred.resolve();
return;
}
syncUser(users[index], apiClient).then(function () {
syncNext(users, index + 1, deferred, apiClient, server);
}, function () {
syncNext(users, index + 1, deferred, apiClient, server);
});
}
function syncUser(user, apiClient) {
var deferred = DeferredBuilder.Deferred();
apiClient.getOfflineUser(user.Id).then(function (result) {
require(['localassetmanager'], function () {
LocalAssetManager.saveOfflineUser(result).then(function () {
deferred.resolve();
}, function () {
deferred.resolve();
});
});
}, function () {
// TODO: We should only delete if there's a 401 response
require(['localassetmanager'], function () {
LocalAssetManager.deleteOfflineUser(user.Id).then(function () {
deferred.resolve();
}, function () {
deferred.resolve();
});
});
});
return deferred.promise();
}
}
if (!globalScope.MediaBrowser) {
globalScope.MediaBrowser = {};
}
globalScope.MediaBrowser.OfflineUserSync = offlineUserSync;
})(this);

View file

@ -0,0 +1,134 @@
(function (globalScope) {
function serverSync(connectionManager) {
var self = this;
self.sync = function (server, options) {
var deferred = DeferredBuilder.Deferred();
if (!server.AccessToken && !server.ExchangeToken) {
Logger.log('Skipping sync to server ' + server.Id + ' because there is no saved authentication information.');
deferred.resolve();
return deferred.promise();
}
var connectionOptions = {
updateDateLastAccessed: false,
enableWebSocket: false,
reportCapabilities: false
};
connectionManager.connectToServer(server, connectionOptions).then(function (result) {
if (result.State == MediaBrowser.ConnectionState.SignedIn) {
performSync(server, options, deferred);
} else {
Logger.log('Unable to connect to server id: ' + server.Id);
deferred.reject();
}
}, function () {
Logger.log('Unable to connect to server id: ' + server.Id);
deferred.reject();
});
return deferred.promise();
};
function performSync(server, options, deferred) {
Logger.log("Creating ContentUploader to server: " + server.Id);
var nextAction = function () {
syncOfflineUsers(server, options, deferred);
};
options = options || {};
var uploadPhotos = options.uploadPhotos !== false;
if (options.cameraUploadServers && options.cameraUploadServers.indexOf(server.Id) == -1) {
uploadPhotos = false;
}
if (!uploadPhotos) {
nextAction();
return;
}
require(['contentuploader'], function () {
new MediaBrowser.ContentUploader(connectionManager).uploadImages(server).then(function () {
Logger.log("ContentUploaded succeeded to server: " + server.Id);
nextAction();
}, function () {
Logger.log("ContentUploaded failed to server: " + server.Id);
nextAction();
});
});
}
function syncOfflineUsers(server, options, deferred) {
if (options.syncOfflineUsers === false) {
syncMedia(server, options, deferred);
return;
}
require(['offlineusersync'], function () {
var apiClient = connectionManager.getApiClient(server.Id);
new MediaBrowser.OfflineUserSync().sync(apiClient, server).then(function () {
Logger.log("OfflineUserSync succeeded to server: " + server.Id);
syncMedia(server, options, deferred);
}, function () {
Logger.log("OfflineUserSync failed to server: " + server.Id);
deferred.reject();
});
});
}
function syncMedia(server, options, deferred) {
require(['mediasync'], function () {
var apiClient = connectionManager.getApiClient(server.Id);
new MediaBrowser.MediaSync().sync(apiClient, server, options).then(function () {
Logger.log("MediaSync succeeded to server: " + server.Id);
deferred.resolve();
}, function () {
Logger.log("MediaSync failed to server: " + server.Id);
deferred.reject();
});
});
}
}
if (!globalScope.MediaBrowser) {
globalScope.MediaBrowser = {};
}
globalScope.MediaBrowser.ServerSync = serverSync;
})(this);