mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
stub out web client media controller
This commit is contained in:
parent
8842110e54
commit
355c3dcb42
21 changed files with 399 additions and 1061 deletions
|
@ -13,15 +13,18 @@
|
|||
var canClientSeek;
|
||||
var currentPlaylistIndex = 0;
|
||||
|
||||
self.currentTimeElement;
|
||||
self.unmuteButton;
|
||||
self.muteButton;
|
||||
self.positionSlider;
|
||||
self.isPositionSliderActive;
|
||||
self.volumeSlider;
|
||||
self.startTimeTicksOffset;
|
||||
self.currentTimeElement = null;
|
||||
self.unmuteButton = null;
|
||||
self.muteButton = null;
|
||||
self.positionSlider = null;
|
||||
self.isPositionSliderActive = null;
|
||||
self.volumeSlider = null;
|
||||
self.startTimeTicksOffset = null;
|
||||
|
||||
self.playlist = [];
|
||||
|
||||
self.isLocalPlayer = true;
|
||||
|
||||
self.updateCanClientSeek = function (elem) {
|
||||
var duration = elem.duration;
|
||||
canClientSeek = duration && !isNaN(duration) && duration != Number.POSITIVE_INFINITY && duration != Number.NEGATIVE_INFINITY;
|
||||
|
@ -275,7 +278,7 @@
|
|||
audioBitrate: audioBitrate,
|
||||
videoBitrate: videoBitrate
|
||||
};
|
||||
|
||||
|
||||
if (params.videoCodec == 'h264') {
|
||||
params.profile = 'baseline';
|
||||
params.level = '3';
|
||||
|
@ -284,46 +287,6 @@
|
|||
return params;
|
||||
};
|
||||
|
||||
self.canPlay = function (item, user) {
|
||||
|
||||
if (item.PlayAccess != 'Full') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (item.LocationType == "Virtual" || item.IsPlaceHolder) {
|
||||
return false;
|
||||
}
|
||||
if (item.Type == "MusicAlbum" || item.Type == "MusicArtist" || item.Type == "MusicGenre") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (item.GameSystem == "Nintendo" && item.MediaType == "Game" && item.ProviderIds.NesBox && item.ProviderIds.NesBoxRom) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (item.GameSystem == "Super Nintendo" && item.MediaType == "Game" && item.ProviderIds.NesBox && item.ProviderIds.NesBoxRom) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return self.canPlayMediaType(item.MediaType);
|
||||
};
|
||||
|
||||
self.getPlayUrl = function (item) {
|
||||
|
||||
|
||||
if (item.GameSystem == "Nintendo" && item.MediaType == "Game" && item.ProviderIds.NesBox && item.ProviderIds.NesBoxRom) {
|
||||
|
||||
return "http://nesbox.com/game/" + item.ProviderIds.NesBox + '/rom/' + item.ProviderIds.NesBoxRom;
|
||||
}
|
||||
|
||||
if (item.GameSystem == "Super Nintendo" && item.MediaType == "Game" && item.ProviderIds.NesBox && item.ProviderIds.NesBoxRom) {
|
||||
|
||||
return "http://snesbox.com/game/" + item.ProviderIds.NesBox + '/rom/' + item.ProviderIds.NesBoxRom;
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
self.canPlayMediaType = function (mediaType) {
|
||||
|
||||
if (mediaType === "Video") {
|
||||
|
@ -337,84 +300,45 @@
|
|||
return false;
|
||||
};
|
||||
|
||||
self.play = function (items, startPosition) {
|
||||
self.canQueueMediaType = function (mediaType) {
|
||||
|
||||
return currentItem && currentItem.MediaType == mediaType;
|
||||
};
|
||||
|
||||
self.play = function (options) {
|
||||
|
||||
Dashboard.getCurrentUser().done(function (user) {
|
||||
|
||||
var item = items[0];
|
||||
if (options.items) {
|
||||
|
||||
var videoType = (item.VideoType || "").toLowerCase();
|
||||
self.playInternal(options.items[0], options.startPositionTicks, user);
|
||||
|
||||
var expirementalText = "This feature is experimental. It may not work at all with some titles. Do you wish to continue?";
|
||||
self.playlist = options.items;
|
||||
currentPlaylistIndex = 0;
|
||||
|
||||
if (videoType == "dvd") {
|
||||
} else {
|
||||
|
||||
self.playWithWarning(items, startPosition, user, "dvdstreamconfirmed", "Dvd Folder Streaming", expirementalText);
|
||||
return;
|
||||
}
|
||||
else if (videoType == "bluray") {
|
||||
self.getItemsForPlayback({
|
||||
|
||||
self.playWithWarning(items, startPosition, user, "bluraystreamconfirmed", "Blu-ray Folder Streaming", expirementalText);
|
||||
return;
|
||||
}
|
||||
else if (videoType == "iso") {
|
||||
Ids: options.ids.join(',')
|
||||
|
||||
var isoType = (item.IsoType || "").toLowerCase();
|
||||
}).done(function (result) {
|
||||
|
||||
if (isoType == "dvd") {
|
||||
options.items = result.Items;
|
||||
|
||||
self.playWithWarning(items, startPosition, user, "dvdisostreamconfirmed", "Dvd Iso Streaming", expirementalText);
|
||||
return;
|
||||
}
|
||||
else if (isoType == "bluray") {
|
||||
self.playInternal(options.items[0], options.startPositionTicks, user);
|
||||
|
||||
self.playWithWarning(items, startPosition, user, "blurayisostreamconfirmed", "Blu-ray Iso Streaming", expirementalText);
|
||||
return;
|
||||
}
|
||||
}
|
||||
self.playlist = options.items;
|
||||
currentPlaylistIndex = 0;
|
||||
|
||||
self.playInternal(items[0], startPosition, user);
|
||||
self.onPlaybackStarted(items);
|
||||
});
|
||||
};
|
||||
|
||||
self.playWithWarning = function (items, startPosition, user, localStorageKeyName, header, text) {
|
||||
|
||||
// Increment this version when changes are made and we want users to see the prompts again
|
||||
var warningVersion = "2";
|
||||
localStorageKeyName += new Date().getMonth() + warningVersion;
|
||||
|
||||
if (localStorage.getItem(localStorageKeyName) == "1") {
|
||||
|
||||
self.playInternal(items[0], startPosition, user);
|
||||
|
||||
self.onPlaybackStarted(items);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Dashboard.confirm(text, header, function (result) {
|
||||
|
||||
if (result) {
|
||||
|
||||
localStorage.setItem(localStorageKeyName, "1");
|
||||
|
||||
self.playInternal(items[0], startPosition, user);
|
||||
|
||||
self.onPlaybackStarted(items);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.onPlaybackStarted = function (items) {
|
||||
|
||||
self.playlist = items;
|
||||
currentPlaylistIndex = 0;
|
||||
};
|
||||
|
||||
self.getBitrateSetting = function() {
|
||||
self.getBitrateSetting = function () {
|
||||
return parseInt(localStorage.getItem('preferredVideoBitrate') || '') || 1500000;
|
||||
};
|
||||
|
||||
|
@ -569,163 +493,11 @@
|
|||
|
||||
query.Limit = query.Limit || 100;
|
||||
query.Fields = getItemFields;
|
||||
query.ExcludeLocationTypes = "Virtual";
|
||||
|
||||
return ApiClient.getItems(userId, query);
|
||||
};
|
||||
|
||||
self.playById = function (id, startPositionTicks) {
|
||||
|
||||
ApiClient.getItem(Dashboard.getCurrentUserId(), id).done(function (item) {
|
||||
|
||||
if (item.IsFolder) {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
ParentId: id,
|
||||
Recursive: true,
|
||||
SortBy: "SortName"
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items, startPositionTicks);
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
self.play([item], startPositionTicks);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.playInstantMixFromSong = function (id) {
|
||||
|
||||
ApiClient.getInstantMixFromSong(id, {
|
||||
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.playInstantMixFromAlbum = function (id) {
|
||||
|
||||
ApiClient.getInstantMixFromAlbum(id, {
|
||||
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.playInstantMixFromArtist = function (name) {
|
||||
|
||||
ApiClient.getInstantMixFromArtist(name, {
|
||||
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.playInstantMixFromMusicGenre = function (name) {
|
||||
|
||||
ApiClient.getInstantMixFromMusicGenre(name, {
|
||||
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.playArtist = function (artist) {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
Artists: artist,
|
||||
Recursive: true,
|
||||
SortBy: "Album,SortName",
|
||||
IncludeItemTypes: "Audio"
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.shuffleArtist = function (artist) {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
Artists: artist,
|
||||
Recursive: true,
|
||||
SortBy: "Random",
|
||||
IncludeItemTypes: "Audio"
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.shuffleMusicGenre = function (genre) {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
Genres: genre,
|
||||
Recursive: true,
|
||||
SortBy: "Random",
|
||||
IncludeItemTypes: "Audio"
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.shuffleFolder = function (id) {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
ParentId: id,
|
||||
Recursive: true,
|
||||
SortBy: "Random"
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.play(result.Items);
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.removeFromPlaylist = function (index) {
|
||||
|
||||
self.playlist.remove(index);
|
||||
|
@ -797,51 +569,66 @@
|
|||
}
|
||||
};
|
||||
|
||||
self.queue = function (id) {
|
||||
self.queue = function (options) {
|
||||
|
||||
if (!currentMediaElement) {
|
||||
self.playById(id);
|
||||
self.play(options);
|
||||
return;
|
||||
}
|
||||
|
||||
ApiClient.getItem(Dashboard.getCurrentUserId(), id).done(function (item) {
|
||||
Dashboard.getCurrentUser().done(function (user) {
|
||||
|
||||
if (item.IsFolder) {
|
||||
if (options.items) {
|
||||
|
||||
self.queueItems(options.items);
|
||||
|
||||
} else {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
ParentId: id,
|
||||
Recursive: true,
|
||||
SortBy: "SortName"
|
||||
Ids: options.ids.join(',')
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
self.queueItems(result.Items);
|
||||
options.items = result.Items;
|
||||
|
||||
self.queueItems(options.items);
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
self.queueItems([item]);
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
self.queueArtist = function (artist) {
|
||||
self.queueNext = function (options) {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
if (!currentMediaElement) {
|
||||
self.play(options);
|
||||
return;
|
||||
}
|
||||
|
||||
Artists: artist,
|
||||
Recursive: true,
|
||||
SortBy: "Album,SortName",
|
||||
IncludeItemTypes: "Audio"
|
||||
Dashboard.getCurrentUser().done(function (user) {
|
||||
|
||||
}).done(function (result) {
|
||||
if (options.items) {
|
||||
|
||||
self.queueItems(result.Items);
|
||||
self.queueItemsNext(options.items);
|
||||
|
||||
} else {
|
||||
|
||||
self.getItemsForPlayback({
|
||||
|
||||
Ids: options.ids.join(',')
|
||||
|
||||
}).done(function (result) {
|
||||
|
||||
options.items = result.Items;
|
||||
|
||||
self.queueItemsNext(options.items);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.pause = function () {
|
||||
|
@ -905,6 +692,108 @@
|
|||
}
|
||||
};
|
||||
|
||||
self.shuffle = function (id) {
|
||||
|
||||
var userId = Dashboard.getCurrentUserId();
|
||||
|
||||
ApiClient.getItem(userId, id).done(function (item) {
|
||||
|
||||
var query = {
|
||||
UserId: userId,
|
||||
Fields: getItemFields,
|
||||
Limit: 50,
|
||||
Filters: "IsNotFolder",
|
||||
Recursive: true,
|
||||
SortBy: "Random"
|
||||
};
|
||||
|
||||
if (item.IsFolder) {
|
||||
query.ParentId = id;
|
||||
|
||||
}
|
||||
else if (item.Type == "MusicArtist") {
|
||||
|
||||
query.MediaTypes = "Audio";
|
||||
query.Artists = item.Name;
|
||||
|
||||
}
|
||||
else if (item.Type == "MusicGenre") {
|
||||
|
||||
query.MediaTypes = "Audio";
|
||||
query.Genres = item.Name;
|
||||
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
self.getItemsForPlayback(query).done(function (result) {
|
||||
|
||||
self.play({ items: result.Items });
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.instantMix = function (id) {
|
||||
|
||||
var userId = Dashboard.getCurrentUserId();
|
||||
|
||||
ApiClient.getItem(userId, id).done(function (item) {
|
||||
|
||||
var promise;
|
||||
|
||||
if (item.Type == "MusicArtist") {
|
||||
|
||||
promise = ApiClient.getInstantMixFromArtist(name, {
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
});
|
||||
|
||||
}
|
||||
else if (item.Type == "MusicGenre") {
|
||||
|
||||
promise = ApiClient.getInstantMixFromMusicGenre(name, {
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
});
|
||||
|
||||
}
|
||||
else if (item.Type == "MusicAlbum") {
|
||||
|
||||
promise = ApiClient.getInstantMixFromAlbum(id, {
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
});
|
||||
|
||||
}
|
||||
else if (item.Type == "Audio") {
|
||||
|
||||
promise = ApiClient.getInstantMixFromSong(id, {
|
||||
UserId: Dashboard.getCurrentUserId(),
|
||||
Fields: getItemFields,
|
||||
Limit: 50
|
||||
});
|
||||
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
|
||||
promise.done(function (result) {
|
||||
|
||||
self.play({ items: result.Items });
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.stop = function () {
|
||||
|
||||
var elem = currentMediaElement;
|
||||
|
@ -933,14 +822,6 @@
|
|||
return currentMediaElement;
|
||||
};
|
||||
|
||||
self.showSendMediaMenu = function () {
|
||||
|
||||
RemoteControl.showMenuForItem({
|
||||
item: currentItem
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
self.bindPositionSlider = function () {
|
||||
self.positionSlider.on('slidestart', function (e) {
|
||||
|
||||
|
@ -1220,4 +1101,7 @@
|
|||
|
||||
window.MediaPlayer = new mediaPlayer();
|
||||
|
||||
window.MediaController.registerPlayer(window.MediaPlayer);
|
||||
|
||||
|
||||
})(document, setTimeout, clearTimeout, screen, localStorage, $, setInterval, window);
|
Loading…
Add table
Add a link
Reference in a new issue