mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update components
This commit is contained in:
parent
b72503e2d2
commit
1730740055
76 changed files with 16132 additions and 55 deletions
|
@ -66,6 +66,26 @@
|
|||
});
|
||||
}
|
||||
|
||||
function getItemsFromIds(serverId, ids) {
|
||||
|
||||
var actions = ids.map(function (id) {
|
||||
var strippedId = stripStart(id, 'local:');
|
||||
|
||||
return getLocalItem(serverId, strippedId);
|
||||
});
|
||||
|
||||
return Promise.all(actions).then(function (items) {
|
||||
|
||||
var libItems = items.map(function (locItem) {
|
||||
|
||||
return locItem.Item;
|
||||
});
|
||||
|
||||
|
||||
return Promise.resolve(libItems);
|
||||
});
|
||||
}
|
||||
|
||||
function getViews(serverId, userId) {
|
||||
|
||||
return itemrepository.getServerItemTypes(serverId, userId).then(function (types) {
|
||||
|
@ -80,7 +100,7 @@
|
|||
ServerId: serverId,
|
||||
Id: 'localview:MusicView',
|
||||
Type: 'MusicView',
|
||||
CollectionType: 'Music',
|
||||
CollectionType: 'music',
|
||||
IsFolder: true
|
||||
};
|
||||
|
||||
|
@ -94,7 +114,7 @@
|
|||
ServerId: serverId,
|
||||
Id: 'localview:PhotosView',
|
||||
Type: 'PhotosView',
|
||||
CollectionType: 'Photos',
|
||||
CollectionType: 'photos',
|
||||
IsFolder: true
|
||||
};
|
||||
|
||||
|
@ -108,23 +128,49 @@
|
|||
ServerId: serverId,
|
||||
Id: 'localview:TVView',
|
||||
Type: 'TVView',
|
||||
CollectionType: 'TvShows',
|
||||
CollectionType: 'tvshows',
|
||||
IsFolder: true
|
||||
};
|
||||
|
||||
list.push(item);
|
||||
}
|
||||
|
||||
if (types.indexOf('video') > -1 ||
|
||||
types.indexOf('movie') > -1 ||
|
||||
types.indexOf('musicvideo') > -1) {
|
||||
if (types.indexOf('movie') > -1) {
|
||||
|
||||
item = {
|
||||
Name: 'Movies',
|
||||
ServerId: serverId,
|
||||
Id: 'localview:MoviesView',
|
||||
Type: 'MoviesView',
|
||||
CollectionType: 'movies',
|
||||
IsFolder: true
|
||||
};
|
||||
|
||||
list.push(item);
|
||||
}
|
||||
|
||||
if (types.indexOf('video') > -1) {
|
||||
|
||||
item = {
|
||||
Name: 'Videos',
|
||||
ServerId: serverId,
|
||||
Id: 'localview:VideosView',
|
||||
Type: 'VideosView',
|
||||
CollectionType: 'HomeVideos',
|
||||
CollectionType: 'videos',
|
||||
IsFolder: true
|
||||
};
|
||||
|
||||
list.push(item);
|
||||
}
|
||||
|
||||
if (types.indexOf('musicvideo') > -1) {
|
||||
|
||||
item = {
|
||||
Name: 'Music Videos',
|
||||
ServerId: serverId,
|
||||
Id: 'localview:MusicVideosView',
|
||||
Type: 'MusicVideosView',
|
||||
CollectionType: 'videos',
|
||||
IsFolder: true
|
||||
};
|
||||
|
||||
|
@ -135,28 +181,80 @@
|
|||
});
|
||||
}
|
||||
|
||||
function getTypeFilterForTopLevelView(parentId) {
|
||||
|
||||
var typeFilter = null;
|
||||
|
||||
switch (parentId) {
|
||||
case 'localview:MusicView':
|
||||
typeFilter = 'audio';
|
||||
break;
|
||||
case 'localview:PhotosView':
|
||||
typeFilter = 'photo';
|
||||
break;
|
||||
case 'localview:TVView':
|
||||
typeFilter = 'episode';
|
||||
break;
|
||||
case 'localview:VideosView':
|
||||
typeFilter = 'video';
|
||||
break;
|
||||
case 'localview:MoviesView':
|
||||
typeFilter = 'movie';
|
||||
break;
|
||||
case 'localview:MusicVideosView':
|
||||
typeFilter = 'musicvideo';
|
||||
break;
|
||||
}
|
||||
|
||||
return typeFilter;
|
||||
}
|
||||
|
||||
function getViewItems(serverId, userId, parentId) {
|
||||
|
||||
var typeFilter = getTypeFilterForTopLevelView(parentId);
|
||||
|
||||
parentId = stripStart(parentId, 'localview:');
|
||||
parentId = stripStart(parentId, 'local:');
|
||||
|
||||
return getServerItems(serverId).then(function (items) {
|
||||
|
||||
var resultItems = items.filter(function (item) {
|
||||
var resultItemIds = 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;
|
||||
if (item.SyncStatus && item.SyncStatus !== 'synced') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (typeFilter) {
|
||||
var type = (item.Item.Type || '').toLowerCase();
|
||||
return typeFilter === type;
|
||||
}
|
||||
|
||||
return item.Item.ParentId === parentId;
|
||||
|
||||
}).map(function (item2) {
|
||||
return item2.Item;
|
||||
|
||||
switch (typeFilter) {
|
||||
case 'audio':
|
||||
case 'photo':
|
||||
return item2.Item.AlbumId;
|
||||
case 'episode':
|
||||
return item2.Item.SeriesId;
|
||||
}
|
||||
|
||||
return item2.Item.Id;
|
||||
|
||||
}).filter(filterDistinct);
|
||||
|
||||
var resultItems = [];
|
||||
|
||||
items.forEach(function (item) {
|
||||
var found = false;
|
||||
|
||||
resultItemIds.forEach(function (id) {
|
||||
if (item.Item.Id === id) {
|
||||
resultItems.push(item.Item);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return Promise.resolve(resultItems);
|
||||
|
@ -218,14 +316,19 @@
|
|||
var path = getDirectoryPath(libraryItem, serverInfo);
|
||||
var localFolder = filerepository.getFullLocalPath(path);
|
||||
|
||||
path.push(getLocalFileName(libraryItem, jobItem.OriginalFileName));
|
||||
var localPath;
|
||||
|
||||
var localPath = filerepository.getFullLocalPath(path);
|
||||
if (jobItem) {
|
||||
path.push(getLocalFileName(libraryItem, jobItem.OriginalFileName));
|
||||
localPath = filerepository.getFullLocalPath(path);
|
||||
}
|
||||
|
||||
for (var i = 0; i < libraryItem.MediaSources.length; i++) {
|
||||
var mediaSource = libraryItem.MediaSources[i];
|
||||
mediaSource.Path = localPath;
|
||||
mediaSource.Protocol = 'File';
|
||||
if (libraryItem.MediaSources) {
|
||||
for (var i = 0; i < libraryItem.MediaSources.length; i++) {
|
||||
var mediaSource = libraryItem.MediaSources[i];
|
||||
mediaSource.Path = localPath;
|
||||
mediaSource.Protocol = 'File';
|
||||
}
|
||||
}
|
||||
|
||||
var item = {
|
||||
|
@ -235,11 +338,14 @@
|
|||
ServerId: serverInfo.Id,
|
||||
LocalPath: localPath,
|
||||
LocalFolder: localFolder,
|
||||
AdditionalFiles: jobItem.AdditionalFiles.slice(0),
|
||||
Id: getLocalId(serverInfo.Id, libraryItem.Id),
|
||||
SyncJobItemId: jobItem.SyncJobItemId
|
||||
Id: getLocalId(serverInfo.Id, libraryItem.Id)
|
||||
};
|
||||
|
||||
if (jobItem) {
|
||||
item.AdditionalFiles = jobItem.AdditionalFiles.slice(0);
|
||||
item.SyncJobItemId = jobItem.SyncJobItemId;
|
||||
}
|
||||
|
||||
return Promise.resolve(item);
|
||||
}
|
||||
|
||||
|
@ -424,7 +530,9 @@
|
|||
parts.push('Metadata');
|
||||
parts.push(serverId);
|
||||
parts.push('images');
|
||||
parts.push(itemId + '_' + imageType + '_' + index.toString() + '.png');
|
||||
// Store without extension. This allows mixed image types since the browser will
|
||||
// detect the type from the content
|
||||
parts.push(itemId + '_' + imageType + '_' + index.toString()); // + '.jpg');
|
||||
|
||||
var finalParts = [];
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
|
@ -459,6 +567,29 @@
|
|||
return uuid;
|
||||
}
|
||||
|
||||
function startsWith(str, find) {
|
||||
|
||||
if (str && find && str.length > find.length) {
|
||||
if (str.indexOf(find) === 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function stripStart(str, find) {
|
||||
if (startsWith(str, find)) {
|
||||
return str.substr(find.length);
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
function filterDistinct(value, index, self) {
|
||||
return self.indexOf(value) === index;
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
getLocalItem: getLocalItem,
|
||||
|
@ -486,6 +617,7 @@
|
|||
getDownloadItemCount: getDownloadItemCount,
|
||||
getViews: getViews,
|
||||
getViewItems: getViewItems,
|
||||
resyncTransfers: resyncTransfers
|
||||
resyncTransfers: resyncTransfers,
|
||||
getItemsFromIds: getItemsFromIds
|
||||
};
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue