UNPKG

ng-plyr

Version:

An HTML5 media player for developers, built using Angular, having interface similar to Youtube player.

170 lines 18.5 kB
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