1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/bower_components/emby-webcomponents/shortcuts.js

248 lines
11 KiB
JavaScript
Raw Normal View History

2018-10-23 01:05:09 +03:00
define(["playbackManager", "inputManager", "connectionManager", "appRouter", "globalize", "loading", "dom", "recordingHelper"], function(playbackManager, inputManager, connectionManager, appRouter, globalize, loading, dom, recordingHelper) {
"use strict";
function playAllFromHere(card, serverId, queue) {
for (var startIndex, parent = card.parentNode, className = card.classList.length ? "." + card.classList[0] : "", cards = parent.querySelectorAll(className + "[data-id]"), ids = [], foundCard = !1, i = 0, length = cards.length; i < length; i++) cards[i] === card && (foundCard = !0, startIndex = i), !foundCard && queue || ids.push(cards[i].getAttribute("data-id"));
var itemsContainer = dom.parentWithClass(card, "itemsContainer");
if (itemsContainer && itemsContainer.fetchData) {
var queryOptions = queue ? {
StartIndex: startIndex
} : {};
return itemsContainer.fetchData(queryOptions).then(function(result) {
return queue ? playbackManager.queue({
items: result.Items
}) : playbackManager.play({
items: result.Items,
startIndex: startIndex
})
})
}
if (ids.length) return queue ? playbackManager.queue({
ids: ids,
serverId: serverId
}) : playbackManager.play({
ids: ids,
serverId: serverId,
startIndex: startIndex
})
}
function showProgramDialog(item) {
require(["recordingCreator"], function(recordingCreator) {
recordingCreator.show(item.Id, item.ServerId)
})
}
function getItem(button) {
button = dom.parentWithAttribute(button, "data-id");
var serverId = button.getAttribute("data-serverid"),
id = button.getAttribute("data-id"),
type = button.getAttribute("data-type"),
apiClient = connectionManager.getApiClient(serverId);
return "Timer" === type ? apiClient.getLiveTvTimer(id) : "SeriesTimer" === type ? apiClient.getLiveTvSeriesTimer(id) : apiClient.getItem(apiClient.getCurrentUserId(), id)
}
function notifyRefreshNeeded(childElement, itemsContainer) {
(itemsContainer = itemsContainer || dom.parentWithAttribute(childElement, "is", "emby-itemscontainer")) && itemsContainer.notifyRefreshNeeded(!0)
}
function showContextMenu(card, options) {
getItem(card).then(function(item) {
var playlistId = card.getAttribute("data-playlistid"),
collectionId = card.getAttribute("data-collectionid");
if (playlistId) {
var elem = dom.parentWithAttribute(card, "data-playlistitemid");
item.PlaylistItemId = elem ? elem.getAttribute("data-playlistitemid") : null
}
require(["itemContextMenu"], function(itemContextMenu) {
connectionManager.getApiClient(item.ServerId).getCurrentUser().then(function(user) {
itemContextMenu.show(Object.assign({
item: item,
play: !0,
queue: !0,
playAllFromHere: !item.IsFolder,
queueAllFromHere: !item.IsFolder,
playlistId: playlistId,
collectionId: collectionId,
user: user
}, options || {})).then(function(result) {
"playallfromhere" === result.command || "queueallfromhere" === result.command ? executeAction(card, options.positionTo, result.command) : (result.updated || result.deleted) && notifyRefreshNeeded(card, options.itemsContainer)
})
})
})
})
}
function getItemInfoFromCard(card) {
return {
Type: card.getAttribute("data-type"),
Id: card.getAttribute("data-id"),
TimerId: card.getAttribute("data-timerid"),
CollectionType: card.getAttribute("data-collectiontype"),
ChannelId: card.getAttribute("data-channelid"),
SeriesId: card.getAttribute("data-seriesid"),
ServerId: card.getAttribute("data-serverid"),
MediaType: card.getAttribute("data-mediatype"),
IsFolder: "true" === card.getAttribute("data-isfolder"),
UserData: {
PlaybackPositionTicks: parseInt(card.getAttribute("data-positionticks") || "0")
}
}
}
function showPlayMenu(card, target) {
var item = getItemInfoFromCard(card);
require(["playMenu"], function(playMenu) {
playMenu.show({
item: item,
positionTo: target
})
})
}
function sendToast(text) {
require(["toast"], function(toast) {
toast(text)
})
}
function executeAction(card, target, action) {
target = target || card;
var id = card.getAttribute("data-id");
id || (card = dom.parentWithAttribute(card, "data-id"), id = card.getAttribute("data-id"));
var item = getItemInfoFromCard(card),
serverId = item.ServerId,
type = item.Type,
playableItemId = "Program" === type ? item.ChannelId : item.Id;
if ("Photo" === item.MediaType && "link" === action && (action = "play"), "link" === action) appRouter.showItem(item, {
context: card.getAttribute("data-context"),
parentId: card.getAttribute("data-parentid")
});
else if ("programdialog" === action) showProgramDialog(item);
else if ("instantmix" === action) playbackManager.instantMix({
Id: playableItemId,
ServerId: serverId
});
else if ("play" === action || "resume" === action) {
var startPositionTicks = parseInt(card.getAttribute("data-positionticks") || "0");
playbackManager.play({
ids: [playableItemId],
startPositionTicks: startPositionTicks,
serverId: serverId
})
} else if ("queue" === action) playbackManager.isPlaying() ? (playbackManager.queue({
ids: [playableItemId],
serverId: serverId
}), sendToast(globalize.translate("sharedcomponents#MediaQueued"))) : playbackManager.queue({
ids: [playableItemId],
serverId: serverId
});
else if ("playallfromhere" === action) playAllFromHere(card, serverId);
else if ("queueallfromhere" === action) playAllFromHere(card, serverId, !0);
else if ("setplaylistindex" === action) playbackManager.setCurrentPlaylistItem(card.getAttribute("data-playlistitemid"));
else if ("record" === action) onRecordCommand(serverId, id, type, card.getAttribute("data-timerid"), card.getAttribute("data-seriestimerid"));
else if ("menu" === action) {
var options = "false" === target.getAttribute("data-playoptions") ? {
shuffle: !1,
instantMix: !1,
play: !1,
playAllFromHere: !1,
queue: !1,
queueAllFromHere: !1
} : {};
options.positionTo = target, showContextMenu(card, options)
} else if ("playmenu" === action) showPlayMenu(card, target);
else if ("edit" === action) getItem(target).then(function(item) {
editItem(item, serverId)
});
else if ("playtrailer" === action) getItem(target).then(playTrailer);
else if ("addtoplaylist" === action) getItem(target).then(addToPlaylist);
else if ("custom" === action) {
var customAction = target.getAttribute("data-customaction");
card.dispatchEvent(new CustomEvent("action-" + customAction, {
detail: {
playlistItemId: card.getAttribute("data-playlistitemid")
},
cancelable: !1,
bubbles: !0
}))
}
}
function addToPlaylist(item) {
require(["playlistEditor"], function(playlistEditor) {
(new playlistEditor).show({
items: [item.Id],
serverId: item.ServerId
})
})
}
function playTrailer(item) {
var apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getLocalTrailers(apiClient.getCurrentUserId(), item.Id).then(function(trailers) {
playbackManager.play({
items: trailers
})
})
}
function editItem(item, serverId) {
var apiClient = connectionManager.getApiClient(serverId);
return new Promise(function(resolve, reject) {
var serverId = apiClient.serverInfo().Id;
"Timer" === item.Type ? item.ProgramId ? require(["recordingCreator"], function(recordingCreator) {
recordingCreator.show(item.ProgramId, serverId).then(resolve, reject)
}) : require(["recordingEditor"], function(recordingEditor) {
recordingEditor.show(item.Id, serverId).then(resolve, reject)
}) : require(["metadataEditor"], function(metadataEditor) {
metadataEditor.show(item.Id, serverId).then(resolve, reject)
})
})
}
function onRecordCommand(serverId, id, type, timerId, seriesTimerId) {
if ("Program" === type || timerId || seriesTimerId) {
var programId = "Program" === type ? id : null;
recordingHelper.toggleRecording(serverId, programId, timerId, seriesTimerId)
}
}
function onClick(e) {
var card = dom.parentWithClass(e.target, "itemAction");
if (card) {
var actionElement = card,
action = actionElement.getAttribute("data-action");
if (action || (actionElement = dom.parentWithAttribute(actionElement, "data-action")) && (action = actionElement.getAttribute("data-action")), action) return executeAction(card, actionElement, action), e.preventDefault(), e.stopPropagation(), !1
}
}
function onCommand(e) {
var cmd = e.detail.command;
if ("play" === cmd || "resume" === cmd || "record" === cmd || "menu" === cmd || "info" === cmd) {
var target = e.target,
card = dom.parentWithClass(target, "itemAction") || dom.parentWithAttribute(target, "data-id");
card && (e.preventDefault(), e.stopPropagation(), executeAction(card, card, cmd))
}
}
function on(context, options) {
options = options || {}, !1 !== options.click && context.addEventListener("click", onClick), !1 !== options.command && inputManager.on(context, onCommand)
}
function off(context, options) {
options = options || {}, context.removeEventListener("click", onClick), !1 !== options.command && inputManager.off(context, onCommand)
}
function getShortcutAttributesHtml(item, serverId) {
var html = 'data-id="' + item.Id + '" data-serverid="' + (serverId || item.ServerId) + '" data-type="' + item.Type + '" data-mediatype="' + item.MediaType + '" data-channelid="' + item.ChannelId + '" data-isfolder="' + item.IsFolder + '"',
collectionType = item.CollectionType;
return collectionType && (html += ' data-collectiontype="' + collectionType + '"'), html
}
return {
on: on,
off: off,
onClick: onClick,
getShortcutAttributesHtml: getShortcutAttributesHtml
}
});