diff --git a/package-lock.json b/package-lock.json index 77793863..75d9530f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,7 @@ "@typescript-eslint/eslint-plugin": "5.48.2", "@typescript-eslint/parser": "5.48.2", "core-js": "2.6.1", - "electron": "^38.0.0", + "electron": "^37.0.0", "electron-builder": "26.3.6", "electron-reload": "1.5.0", "eslint": "^8.33.0", @@ -558,6 +558,7 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -603,6 +604,7 @@ "integrity": "sha512-zDqlD+rXFuYZP169c2v35HkMbkchVCft5sS+VpoCCgYTk2rwxpeYkjJ8DQZztZJZRXQ+EMpkv/TubswmDro2zA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@angular-devkit/architect": "0.1602.10", "@angular-devkit/core": "16.2.10", @@ -698,6 +700,7 @@ "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -742,6 +745,7 @@ "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -877,6 +881,7 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -899,6 +904,7 @@ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1004,6 +1010,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1117,6 +1124,7 @@ "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -3147,6 +3155,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3854,7 +3863,6 @@ "dev": true, "license": "BSD-2-Clause", "optional": true, - "peer": true, "dependencies": { "cross-dirname": "^0.1.0", "debug": "^4.3.4", @@ -5067,6 +5075,7 @@ "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.7.2", "@jimp/core": "^0.16.13" @@ -6764,6 +6773,7 @@ "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==", "dev": true, "license": "SEE LICENSE IN LICENSE", + "peer": true, "engines": { "node": "^16.13.0 || >=18.10.0" }, @@ -8481,6 +8491,7 @@ "integrity": "sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.48.2", "@typescript-eslint/types": "5.48.2", @@ -9384,6 +9395,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -9517,6 +9529,7 @@ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -10528,6 +10541,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -11015,6 +11029,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -11639,8 +11654,7 @@ "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -12144,6 +12158,7 @@ "integrity": "sha512-DFUJbtO6AQWZRZgMZnYd+/G1ehD1wncIKbu0fX5P0PJOnJ6K22GeYBESTjviFROsgTQCUtW1J5Lubx63ePt4Jw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "app-builder-lib": "26.3.6", "builder-util": "26.3.4", @@ -12434,11 +12449,12 @@ } }, "node_modules/electron": { - "version": "38.7.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-38.7.2.tgz", - "integrity": "sha512-BcjR0IHqp3uv4ytVQwW2/9zAWo17Rjwrydn6RS+g+vqhpcPTzmBHDCHKaEcqheSl/7zzKPgFZdvT21BoSfrxRQ==", + "version": "37.10.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.10.3.tgz", + "integrity": "sha512-3IjCGSjQmH50IbW2PFveaTzK+KwcFX9PEhE7KXb9v5IT8cLAiryAN7qezm/XzODhDRlLu0xKG1j8xWBtZ/bx/g==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^22.7.7", @@ -12583,7 +12599,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", @@ -12604,7 +12619,6 @@ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -12620,7 +12634,6 @@ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", - "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -12631,7 +12644,6 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -12685,16 +12697,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -13051,6 +13053,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -16013,6 +16016,7 @@ "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.6.1", "@jest/types": "^29.6.1", @@ -16213,6 +16217,7 @@ "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -17312,6 +17317,7 @@ "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -19250,6 +19256,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@nrwl/tao": "16.5.1", "@parcel/watcher": "2.0.4", @@ -20537,6 +20544,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -20671,7 +20679,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "commander": "^9.4.0" }, @@ -20689,7 +20696,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -21809,6 +21815,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^1.9.0" }, @@ -21924,6 +21931,7 @@ "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -23646,7 +23654,6 @@ "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" @@ -23687,7 +23694,6 @@ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -23702,7 +23708,6 @@ "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -23950,6 +23955,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -25207,6 +25213,7 @@ "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -25378,6 +25385,7 @@ "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -25454,6 +25462,7 @@ "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -25607,6 +25616,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -26139,6 +26149,7 @@ "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" } diff --git a/src/app/services/playback/queue.ts b/src/app/services/playback/queue.ts index 94ceea00..5e3b1d77 100644 --- a/src/app/services/playback/queue.ts +++ b/src/app/services/playback/queue.ts @@ -8,31 +8,41 @@ export class Queue { private _tracks: TrackModel[] = []; private playbackOrder: number[] = []; + private _priorityTracks: TrackModel[] = []; + + private _lastSystemTrack: TrackModel | undefined; + public constructor( private shuffler: Shuffler, private logger: Logger, ) {} public get tracks(): TrackModel[] { - return this._tracks; + return [...this._priorityTracks, ...this._tracks]; } public get tracksInPlaybackOrder(): TrackModel[] { const tracksInPlaybackOrder: TrackModel[] = []; + tracksInPlaybackOrder.push(...this._priorityTracks); + for (const trackIndex of this.playbackOrder) { - tracksInPlaybackOrder.push(this._tracks[trackIndex]); + if (this._tracks[trackIndex]) { + tracksInPlaybackOrder.push(this._tracks[trackIndex]); + } } return tracksInPlaybackOrder; } public get numberOfTracks(): number { - return this._tracks.length; + return this._tracks.length + this._priorityTracks.length; } public setTracks(tracksToSet: TrackModel[], shuffle: boolean): TrackModel[] { this._tracks = tracksToSet.map((x) => x.clone()); + this._priorityTracks = []; + this._lastSystemTrack = undefined; if (shuffle) { this.shuffle(); @@ -46,33 +56,35 @@ export class Queue { } public addTracks(tracksToAdd: TrackModel[]): void { + // Dodajemy do priorytetów (Spotify style) for (const trackToAdd of tracksToAdd) { - this._tracks.push(trackToAdd.clone()); - this.playbackOrder.push(this._tracks.length - 1); + this._priorityTracks.push(trackToAdd.clone()); } - - this.logger.info(`Added '${tracksToAdd?.length}' tracks`, 'Queue', 'addTracks'); + this.logger.info(`Added '${tracksToAdd?.length}' tracks to priority queue`, 'Queue', 'addTracks'); } public restoreTracks(tracks: TrackModel[], playbackOrder: number[]): void { this._tracks = tracks; this.playbackOrder = playbackOrder; - + this._priorityTracks = []; this.logger.info(`Restored '${tracks?.length}' tracks`, 'Queue', 'restoreTracks'); } public removeTracks(tracksToRemove: TrackModel[] | undefined): void { - if (tracksToRemove == undefined) { - return; - } - - if (tracksToRemove.length === 0) { + if (!tracksToRemove || tracksToRemove.length === 0) { return; } for (const trackToRemove of tracksToRemove) { - const trackIndex: number = this._tracks.indexOf(trackToRemove); + // Usuń z priorytetów + const priorityIndex = this._priorityTracks.indexOf(trackToRemove); + if (priorityIndex !== -1) { + this._priorityTracks.splice(priorityIndex, 1); + continue; + } + // Usuń z systemu + const trackIndex: number = this._tracks.indexOf(trackToRemove); if (trackIndex !== -1) { this.removeFromTracks(trackIndex); this.removeFromPlaybackOrder(trackIndex); @@ -90,11 +102,11 @@ export class Queue { } public getFirstTrack(): TrackModel | undefined { - if (this.playbackOrder == undefined) { - return undefined; + if (this._priorityTracks.length > 0) { + return this._priorityTracks[0]; } - if (this.playbackOrder.length === 0) { + if (!this.playbackOrder || this.playbackOrder.length === 0) { return undefined; } @@ -102,18 +114,71 @@ export class Queue { } public getPreviousTrack(currentTrack: TrackModel | undefined, allowWrapAround: boolean): TrackModel | undefined { - if (this._tracks.length === 0) { - return undefined; + if (this._tracks.length === 0 && this._priorityTracks.length === 0) return undefined; + + if (currentTrack && this._priorityTracks.includes(currentTrack)) { + const index = this._priorityTracks.indexOf(currentTrack); + if (index > 0) { + return this._priorityTracks[index - 1]; + } + return this._lastSystemTrack || this.getLastSystemTrack(); } - const minimumIndex: number = 0; - const maximumIndex: number = this.playbackOrder.length - 1; + return this.getSystemPreviousTrack(currentTrack, allowWrapAround); + } - if (currentTrack == undefined) { - return this._tracks[this.playbackOrder[minimumIndex]]; + public getNextTrack(currentTrack: TrackModel | undefined, allowWrapAround: boolean): TrackModel | undefined { + let nextTrack: TrackModel | undefined; + + if (currentTrack && this._priorityTracks.includes(currentTrack)) { + const index = this._priorityTracks.indexOf(currentTrack); + + if (index < this._priorityTracks.length - 1) { + nextTrack = this._priorityTracks[index + 1]; + } else { + nextTrack = this.getSystemNextTrack(this._lastSystemTrack, allowWrapAround); + } + } + else { + if (currentTrack && this._tracks.includes(currentTrack)) { + this._lastSystemTrack = currentTrack; + } + + // Czy wpadło coś do priorytetów? + if (this._priorityTracks.length > 0) { + nextTrack = this._priorityTracks[0]; + } else { + nextTrack = this.getSystemNextTrack(currentTrack, allowWrapAround); + } } - if (!this._tracks.includes(currentTrack)) { + if (currentTrack) { + // Próba usunięcia z priorytetów + const priorityIndex = this._priorityTracks.indexOf(currentTrack); + if (priorityIndex !== -1) { + this._priorityTracks.splice(priorityIndex, 1); + } + // Próba usunięcia z systemu + else { + const trackIndex = this._tracks.indexOf(currentTrack); + if (trackIndex !== -1) { + this.removeFromTracks(trackIndex); + this.removeFromPlaybackOrder(trackIndex); + } + } + } + + return nextTrack; + } + + + private getSystemPreviousTrack(currentTrack: TrackModel | undefined, allowWrapAround: boolean): TrackModel | undefined { + if (this._tracks.length === 0) return undefined; + + const minimumIndex: number = 0; + const maximumIndex: number = this.playbackOrder.length - 1; + + if (currentTrack == undefined || !this._tracks.includes(currentTrack)) { return this._tracks[this.playbackOrder[minimumIndex]]; } @@ -126,23 +191,16 @@ export class Queue { if (allowWrapAround) { return this._tracks[this.playbackOrder[maximumIndex]]; } - return undefined; } - public getNextTrack(currentTrack: TrackModel | undefined, allowWrapAround: boolean): TrackModel | undefined { - if (this._tracks.length === 0) { - return undefined; - } + private getSystemNextTrack(currentTrack: TrackModel | undefined, allowWrapAround: boolean): TrackModel | undefined { + if (this._tracks.length === 0) return undefined; const minimumIndex: number = 0; const maximumIndex: number = this.playbackOrder.length - 1; - - if (currentTrack == undefined) { - return this._tracks[this.playbackOrder[minimumIndex]]; - } - - if (!this._tracks.includes(currentTrack)) { + + if (currentTrack == undefined || !this._tracks.includes(currentTrack)) { return this._tracks[this.playbackOrder[minimumIndex]]; } @@ -155,13 +213,16 @@ export class Queue { if (allowWrapAround) { return this._tracks[this.playbackOrder[minimumIndex]]; } - return undefined; } + private getLastSystemTrack(): TrackModel | undefined { + if (this.playbackOrder.length === 0) return undefined; + return this._tracks[this.playbackOrder[this.playbackOrder.length - 1]]; + } + private populatePlayBackOrder(): void { this.playbackOrder = []; - for (let i: number = 0; i < this._tracks.length; i++) { this.playbackOrder.push(i); } @@ -173,7 +234,6 @@ export class Queue { public getPlaybackOrderIndex(track: TrackModel): number { const queuedTracksIndex: number = this._tracks.indexOf(track); - return this.playbackOrder.indexOf(queuedTracksIndex); } @@ -194,4 +254,4 @@ export class Queue { } } } -} +} \ No newline at end of file