2024-05-06 01:50:56 -04:00
|
|
|
import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api';
|
2018-10-23 01:05:09 +03:00
|
|
|
|
2024-05-06 01:50:56 -04:00
|
|
|
import ServerConnections from 'components/ServerConnections';
|
|
|
|
import listView from 'components/listview/listview';
|
|
|
|
import { toApi } from 'utils/jellyfin-apiclient/compat';
|
|
|
|
|
|
|
|
function getFetchPlaylistItemsFn(apiClient, itemId) {
|
2020-08-14 08:46:34 +02:00
|
|
|
return function () {
|
|
|
|
const query = {
|
2020-12-05 15:36:44 +01:00
|
|
|
Fields: 'PrimaryImageAspectRatio',
|
2020-08-14 08:46:34 +02:00
|
|
|
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',
|
2024-05-06 01:50:56 -04:00
|
|
|
UserId: apiClient.getCurrentUserId()
|
2019-10-08 01:02:37 +03:00
|
|
|
};
|
2024-05-06 01:50:56 -04:00
|
|
|
return apiClient.getJSON(apiClient.getUrl(`Playlists/${itemId}/Items`, query));
|
2020-08-14 08:46:34 +02:00
|
|
|
};
|
|
|
|
}
|
2018-10-23 01:05:09 +03:00
|
|
|
|
2024-05-06 01:50:56 -04:00
|
|
|
function getItemsHtmlFn(playlistId, isEditable = false) {
|
2020-08-14 08:46:34 +02:00
|
|
|
return function (items) {
|
|
|
|
return listView.getListViewHtml({
|
2024-05-06 01:50:56 -04:00
|
|
|
items,
|
2020-08-14 08:46:34 +02:00
|
|
|
showIndex: false,
|
|
|
|
playFromHere: true,
|
|
|
|
action: 'playallfromhere',
|
|
|
|
smallIcon: true,
|
2024-05-06 01:50:56 -04:00
|
|
|
dragHandle: isEditable,
|
|
|
|
playlistId
|
2020-08-14 08:46:34 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
2019-10-08 01:02:37 +03:00
|
|
|
|
2024-05-06 01:50:56 -04:00
|
|
|
async function init(page, item) {
|
|
|
|
const apiClient = ServerConnections.getApiClient(item.ServerId);
|
|
|
|
const api = toApi(apiClient);
|
|
|
|
|
|
|
|
let isEditable = false;
|
|
|
|
const { data } = await getPlaylistsApi(api)
|
|
|
|
.getPlaylistUser({
|
|
|
|
playlistId: item.Id,
|
|
|
|
userId: apiClient.getCurrentUserId()
|
|
|
|
})
|
2024-05-06 03:10:52 -04:00
|
|
|
.catch(err => {
|
2024-05-06 01:50:56 -04:00
|
|
|
// If a user doesn't have access, then the request will 404 and throw
|
2024-05-06 03:10:52 -04:00
|
|
|
console.info('[PlaylistViewer] Failed to fetch playlist permissions', err);
|
2024-05-06 01:50:56 -04:00
|
|
|
return { data: {} };
|
|
|
|
});
|
|
|
|
isEditable = !!data.CanEdit;
|
|
|
|
|
2020-08-14 08:46:34 +02:00
|
|
|
const elem = page.querySelector('#childrenContent .itemsContainer');
|
|
|
|
elem.classList.add('vertical-list');
|
|
|
|
elem.classList.remove('vertical-wrap');
|
2024-05-06 01:50:56 -04:00
|
|
|
elem.enableDragReordering(isEditable);
|
|
|
|
elem.fetchData = getFetchPlaylistItemsFn(apiClient, item.Id);
|
|
|
|
elem.getItemsHtml = getItemsHtmlFn(item.Id, isEditable);
|
|
|
|
}
|
|
|
|
|
|
|
|
function refresh(page) {
|
|
|
|
page.querySelector('#childrenContent').classList.add('verticalSection-extrabottompadding');
|
|
|
|
page.querySelector('#childrenContent .itemsContainer').refreshItems();
|
2020-08-14 08:46:34 +02:00
|
|
|
}
|
2019-10-08 01:02:37 +03:00
|
|
|
|
2022-05-04 03:36:40 +03:00
|
|
|
function render(page, item) {
|
|
|
|
if (!page.playlistInit) {
|
|
|
|
page.playlistInit = true;
|
2024-05-06 01:50:56 -04:00
|
|
|
init(page, item)
|
|
|
|
.finally(() => {
|
|
|
|
refresh(page);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
refresh(page);
|
2020-08-14 08:46:34 +02:00
|
|
|
}
|
2022-05-04 03:36:40 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
const PlaylistViewer = {
|
2022-05-09 19:03:55 +03:00
|
|
|
render
|
2020-08-14 08:46:34 +02:00
|
|
|
};
|
2022-05-04 03:36:40 +03:00
|
|
|
|
|
|
|
export default PlaylistViewer;
|