ng-plyr
Version:
An HTML5 media player for developers, built using Angular, having interface similar to Youtube player.
170 lines • 18.5 kB
JavaScript
export class PlaylistItem {
constructor(media) {
this.media = media;
}
static hasSameMediaSrc(p1, p2) {
return p1.media.src === p2.media.src;
}
// Inquiry functions
hasNext() { return this.next ? true : false; }
hasPrev() { return this.prev ? true : false; }
}
export class Playlist {
constructor(item) {
this.itemCount = 0;
if (item) {
this.head = item;
this.updateTail(item);
}
}
static getLastItemFrom(item) {
while (item.hasNext()) {
item = item.next;
}
return item;
}
static getItemsCount(item) {
let count = 1;
while (item.hasNext()) {
item = item.next;
count++;
}
return count;
}
static mediaArrToPaylistItems(playlist) {
let pl = new PlaylistItem(playlist[playlist.length - 1]);
for (let i = playlist.length - 2; i >= 0; i--) {
let tempPl = new PlaylistItem(playlist[i]);
tempPl.next = pl;
pl.prev = tempPl;
pl = tempPl;
}
return pl;
}
// Reset this playlist
resetPlaylist() {
this.head = undefined;
this.tail = undefined;
this.current = undefined;
this.itemCount = 0;
}
// Initialize playlist with mediaItems
initializePlaylist(mediaItems) {
// Reseting
this.resetPlaylist();
// Adding new items to playlist
let playlistItems = Playlist.mediaArrToPaylistItems(mediaItems);
this.appendPlaylist(playlistItems);
this.current = this.head;
}
// Update head to add items at beginning
updateHead(item) {
let oldHead = this.head;
this.head = item;
this.itemCount++;
while (item.hasNext()) {
item = item.next;
this.itemCount++;
}
if (oldHead) {
oldHead.prev = item;
item.next = oldHead;
}
else {
this.tail = item;
}
}
// Update tail after item is added at end
updateTail(item) {
while (item.hasNext()) {
item = item.next;
this.itemCount++;
}
this.tail = item;
this.itemCount++;
}
// Add items at end
appendPlaylist(item, atHead) {
if (atHead)
return this.updateHead(item);
if (this.isEmpty()) {
this.head = item;
}
else if (this.tail) {
item.prev = this.tail;
this.tail.next = item;
}
this.updateTail(item);
}
// Append item after current, update tail if req, update itemCount
addNext(item) {
if (this.current) {
this.itemCount += Playlist.getItemsCount(item);
let tempNext = this.current.next;
item.prev = this.current;
this.current.next = item;
// Update links at end of item
let lastItem = Playlist.getLastItemFrom(item);
if (tempNext) {
tempNext.prev = lastItem;
lastItem.next = tempNext;
}
else {
this.tail = lastItem;
}
}
else {
this.appendPlaylist(item, true);
this.current = item;
}
}
// Remove an existing PlaylistItem from Playlist
remove(item) {
if (!this.contains(item))
return;
let prev = item.prev;
let next = item.next;
if (next) {
next.prev = prev;
}
if (prev) {
prev.next = next;
}
this.itemCount--;
return item.media;
}
// Inquiry functions
// Check if Playlist is empty
isEmpty() { return this.head ? false : true; }
// Check whether this playlist contains the item
contains(item) {
let start = this.head;
while (start) {
if (item === start)
return true;
start = start.next;
}
return false;
}
// Get PlaylistItem at index
getPlaylistItemAt(index) {
let item = this.head;
while (index > 0 && item?.hasNext()) {
item = item.next;
index--;
}
return item;
}
// Count number of items in this playlist
countPlaylistItems() {
let item = this.head;
let count = 0;
while (item) {
count++;
item = item.next;
}
this.itemCount = count;
return count;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWxpc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wbHlyL3NyYy9saWIvbW9kZWxzL3BsYXlsaXN0Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxZQUFZO0lBS3JCLFlBQVksS0FBVztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFlLEVBQUUsRUFBZTtRQUNuRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTlDLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUNqRDtBQUVELE1BQU0sT0FBTyxRQUFRO0lBUWpCLFlBQVksSUFBa0I7UUFGOUIsY0FBUyxHQUFVLENBQUMsQ0FBQztRQUdqQixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFpQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUssQ0FBQztTQUNyQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxD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QUFDO1FBQ2QsT0FBTSxJQUFJLEVBQUU7WUFDUixLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVkaWEgfSBmcm9tIFwiLi9tZWRpYS5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0SXRlbSB7XHJcbiAgICBtZWRpYTpNZWRpYTtcclxuICAgIG5leHQ/OlBsYXlsaXN0SXRlbTtcclxuICAgIHByZXY/OlBsYXlsaXN0SXRlbTtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IobWVkaWE6TWVkaWEpIHtcclxuICAgICAgICB0aGlzLm1lZGlhID0gbWVkaWE7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGhhc1NhbWVNZWRpYVNyYyhwMTpQbGF5bGlzdEl0ZW0sIHAyOlBsYXlsaXN0SXRlbSkge1xyXG4gICAgICAgIHJldHVybiBwMS5tZWRpYS5zcmMgPT09IHAyLm1lZGlhLnNyYztcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gSW5xdWlyeSBmdW5jdGlvbnNcclxuICAgIGhhc05leHQoKSB7IHJldHVybiB0aGlzLm5leHQgPyB0cnVlIDogZmFsc2U7IH1cclxuXHJcbiAgICBoYXNQcmV2KCkgeyByZXR1cm4gdGhpcy5wcmV2ID8gdHJ1ZSA6IGZhbHNlOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XHJcbiAgICBpZD86c3RyaW5nO1xyXG4gICAgLy8gQ3VycmVudCB3aWxsIHN0b3JlIGN1cnJlbnRseSBwbGF5aW5nIGl0ZW0sIG9uIHN0b3BwaW5nIGl0IHdpbGwgYmUgbnVsbFxyXG4gICAgY3VycmVudD86UGxheWxpc3RJdGVtO1xyXG4gICAgaGVhZD86UGxheWxpc3RJdGVtO1xyXG4gICAgdGFpbD86UGxheWxpc3RJdGVtO1xyXG4gICAgaXRlbUNvdW50Om51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaXRlbT86UGxheWxpc3RJdGVtKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gaXRlbTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWlsKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TGFzdEl0ZW1Gcm9tKGl0ZW06UGxheWxpc3RJdGVtKTpQbGF5bGlzdEl0ZW0ge1xyXG4gICAgICAgIHdoaWxlIChpdGVtLmhhc05leHQoKSkge1xyXG4gICAgICAgICAgICBpdGVtID0gaXRlbS5uZXh0ITtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEl0ZW1zQ291bnQoaXRlbTpQbGF5bGlzdEl0ZW0pOm51bWJlciB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMTtcclxuICAgICAgICB3aGlsZSAoaXRlbS5oYXNOZXh0KCkpIHtcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW0ubmV4dCE7XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbWVkaWFBcnJUb1BheWxpc3RJdGVtcyhwbGF5bGlzdDpNZWRpYVtdKTpQbGF5bGlzdEl0ZW0ge1xyXG4gICAgICAgIGxldCBwbCA9IG5ldyBQbGF5bGlzdEl0ZW0ocGxheWxpc3RbcGxheWxpc3QubGVuZ3RoLTFdKTtcclxuXHRcdGZvciAobGV0IGkgPSBwbGF5bGlzdC5sZW5ndGgtMjsgaT49MDsgIGktLSkge1xyXG5cdFx0XHRsZXQgdGVtcFBsID0gbmV3IFBsYXlsaXN0SXRlbShwbGF5bGlzdFtpXSk7XHJcblx0XHRcdHRlbXBQbC5uZXh0ID0gcGw7XHJcblx0XHRcdHBsLnByZXYgPSB0ZW1wUGw7XHJcblx0XHRcdHBsID0gdGVtcFBsO1xyXG5cdFx0fVxyXG4gICAgICAgIHJldHVybiBwbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gUmVzZXQgdGhpcyBwbGF5bGlzdFxyXG4gICAgcmVzZXRQbGF5bGlzdCgpIHtcclxuICAgICAgICB0aGlzLmhlYWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy50YWlsID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuY3VycmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLml0ZW1Db3VudCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBwbGF5bGlzdCB3aXRoIG1lZGlhSXRlbXNcclxuICAgIGluaXRpYWxpemVQbGF5bGlzdChtZWRpYUl0ZW1zOk1lZGlhW10pIHtcclxuICAgICAgICAvLyBSZXNldGluZ1xyXG4gICAgICAgIHRoaXMucmVzZXRQbGF5bGlzdCgpO1xyXG4gICAgICAgIC8vIEFkZGluZyBuZXcgaXRlbXMgdG8gcGxheWxpc3RcclxuICAgICAgICBsZXQgcGxheWxpc3RJdGVtcyA9IFBsYXlsaXN0Lm1lZGlhQXJyVG9QYXlsaXN0SXRlbXMobWVkaWFJdGVtcyk7XHJcblx0XHR0aGlzLmFwcGVuZFBsYXlsaXN0KHBsYXlsaXN0SXRlbXMpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgaGVhZCB0byBhZGQgaXRlbXMgYXQgYmVnaW5uaW5nXHJcbiAgICB1cGRhdGVIZWFkKGl0ZW06UGxheWxpc3RJdGVtKSB7XHJcbiAgICAgICAgbGV0IG9sZEhlYWQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgdGhpcy5oZWFkID0gaXRlbTtcclxuICAgICAgICB0aGlzLml0ZW1Db3VudCsrO1xyXG4gICAgICAgIHdoaWxlIChpdGVtLmhhc05leHQoKSkge1xyXG4gICAgICAgICAgICBpdGVtID0gaXRlbS5uZXh0ITtcclxuICAgICAgICAgICAgdGhpcy5pdGVtQ291bnQrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9sZEhlYWQpIHtcclxuICAgICAgICAgICAgb2xkSGVhZC5wcmV2ID0gaXRlbTtcclxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gb2xkSGVhZDtcclxuICAgICAgICB9IGVsc2UgeyB0aGlzLnRhaWwgPSBpdGVtOyB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIHRhaWwgYWZ0ZXIgaXRlbSBpcyBhZGRlZCBhdCBlbmRcclxuICAgIHVwZGF0ZVRhaWwoaXRlbTpQbGF5bGlzdEl0ZW0pIHtcclxuICAgICAgICB3aGlsZSAoaXRlbS5oYXNOZXh0KCkpIHtcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW0ubmV4dCE7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbUNvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFpbCA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5pdGVtQ291bnQrKztcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgaXRlbXMgYXQgZW5kXHJcbiAgICBhcHBlbmRQbGF5bGlzdChpdGVtOlBsYXlsaXN0SXRlbSwgYXRIZWFkPzpib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKGF0SGVhZCkgcmV0dXJuIHRoaXMudXBkYXRlSGVhZChpdGVtKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gaXRlbTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICBpdGVtLnByZXYgPSB0aGlzLnRhaWw7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5uZXh0ID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWlsKGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFwcGVuZCBpdGVtIGFmdGVyIGN1cnJlbnQsIHVwZGF0ZSB0YWlsIGlmIHJlcSwgdXBkYXRlIGl0ZW1Db3VudFxyXG4gICAgYWRkTmV4dChpdGVtOlBsYXlsaXN0SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtQ291bnQgKz0gUGxheWxpc3QuZ2V0SXRlbXNDb3VudChpdGVtKTtcclxuICAgICAgICAgICAgbGV0IHRlbXBOZXh0ID0gdGhpcy5jdXJyZW50Lm5leHQ7XHJcbiAgICAgICAgICAgIGl0ZW0ucHJldiA9IHRoaXMuY3VycmVudDtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Lm5leHQgPSBpdGVtO1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgbGlua3MgYXQgZW5kIG9mIGl0ZW1cclxuICAgICAgICAgICAgbGV0IGxhc3RJdGVtID0gUGxheWxpc3QuZ2V0TGFzdEl0ZW1Gcm9tKGl0ZW0pO1xyXG4gICAgICAgICAgICBpZiAodGVtcE5leHQpIHtcclxuICAgICAgICAgICAgICAgIHRlbXBOZXh0LnByZXYgPSBsYXN0SXRlbTtcclxuICAgICAgICAgICAgICAgIGxhc3RJdGVtLm5leHQgPSB0ZW1wTmV4dDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGFpbCA9IGxhc3RJdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRQbGF5bGlzdChpdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIGFuIGV4aXN0aW5nIFBsYXlsaXN0SXRlbSBmcm9tIFBsYXlsaXN0XHJcbiAgICByZW1vdmUoaXRlbTpQbGF5bGlzdEl0ZW0pIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnMoaXRlbSkpIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcHJldiA9IGl0ZW0ucHJldjtcclxuICAgICAgICBsZXQgbmV4dCA9IGl0ZW0ubmV4dDtcclxuICAgICAgICBpZiAobmV4dCkgeyBuZXh0LnByZXYgPSBwcmV2OyB9XHJcbiAgICAgICAgaWYgKHByZXYpIHsgcHJldi5uZXh0ID0gbmV4dDsgfVxyXG4gICAgICAgIHRoaXMuaXRlbUNvdW50LS07XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0ubWVkaWE7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIElucXVpcnkgZnVuY3Rpb25zXHJcbiAgICAvLyBDaGVjayBpZiBQbGF5bGlzdCBpcyBlbXB0eVxyXG4gICAgaXNFbXB0eSgpOmJvb2xlYW4geyByZXR1cm4gdGhpcy5oZWFkID8gZmFsc2UgOiB0cnVlOyB9XHJcblxyXG4gICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIHBsYXlsaXN0IGNvbnRhaW5zIHRoZSBpdGVtXHJcbiAgICBjb250YWlucyhpdGVtOlBsYXlsaXN0SXRlbSk6Ym9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlKHN0YXJ0KSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBzdGFydCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQubmV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCBQbGF5bGlzdEl0ZW0gYXQgaW5kZXhcclxuICAgIGdldFBsYXlsaXN0SXRlbUF0KGluZGV4Om51bWJlcik6UGxheWxpc3RJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuaGVhZDtcclxuICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIGl0ZW0/Lmhhc05leHQoKSkge1xyXG4gICAgICAgICAgICBpdGVtID0gaXRlbS5uZXh0O1xyXG4gICAgICAgICAgICBpbmRleC0tO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb3VudCBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcyBwbGF5bGlzdFxyXG4gICAgY291bnRQbGF5bGlzdEl0ZW1zKCk6bnVtYmVyIHtcclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuaGVhZDtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIHdoaWxlKGl0ZW0pIHtcclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW0ubmV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtQ291bnQgPSBjb3VudDtcclxuICAgICAgICByZXR1cm4gY291bnQ7XHJcbiAgICB9XHJcbn1cclxuIl19