Open multi-file torrents as playlists
This commit is contained in:
78
src/renderer/lib/playlist.js
Normal file
78
src/renderer/lib/playlist.js
Normal file
@@ -0,0 +1,78 @@
|
||||
var TorrentPlayer = require('./torrent-player')
|
||||
|
||||
module.exports = Playlist
|
||||
|
||||
function Playlist (torrentSummary) {
|
||||
this._infoHash = torrentSummary.infoHash
|
||||
this._position = 0
|
||||
this._tracks = extractTracks(torrentSummary)
|
||||
}
|
||||
|
||||
Playlist.prototype.getInfoHash = function () {
|
||||
return this._infoHash
|
||||
}
|
||||
|
||||
Playlist.prototype.getTracks = function () {
|
||||
return this._tracks
|
||||
}
|
||||
|
||||
Playlist.prototype.hasNext = function () {
|
||||
return this._position + 1 < this._tracks.length
|
||||
}
|
||||
|
||||
Playlist.prototype.hasPrevious = function () {
|
||||
return this._position > 0
|
||||
}
|
||||
|
||||
Playlist.prototype.next = function () {
|
||||
if (this.hasNext()) {
|
||||
this._position++
|
||||
return this.getCurrent()
|
||||
}
|
||||
}
|
||||
|
||||
Playlist.prototype.previous = function () {
|
||||
if (this.hasPrevious()) {
|
||||
this._position--
|
||||
return this.getCurrent()
|
||||
}
|
||||
}
|
||||
|
||||
Playlist.prototype.jumpToFile = function (infoHash, fileIndex) {
|
||||
this.setPosition(this._tracks.findIndex(
|
||||
(track) => track.infoHash === infoHash && track.fileIndex === fileIndex
|
||||
))
|
||||
return this.getCurrent()
|
||||
}
|
||||
|
||||
Playlist.prototype.getCurrent = function () {
|
||||
var position = this.getPosition()
|
||||
return position === undefined ? undefined : this._tracks[position]
|
||||
}
|
||||
|
||||
Playlist.prototype.getPosition = function () {
|
||||
if (this._position >= 0 && this._position < this._tracks.length) {
|
||||
return this._position
|
||||
} else return undefined
|
||||
}
|
||||
|
||||
Playlist.prototype.setPosition = function (position) {
|
||||
this._position = position
|
||||
}
|
||||
|
||||
function extractTracks (torrentSummary) {
|
||||
return torrentSummary.files.map((file, index) => ({ file, index }))
|
||||
.filter((object) => TorrentPlayer.isPlayable(object.file))
|
||||
.sort(function (a, b) {
|
||||
if (a.file.name < b.file.name) return -1
|
||||
if (b.file.name < a.file.name) return 1
|
||||
return 0
|
||||
})
|
||||
.map((object) => ({
|
||||
infoHash: torrentSummary.infoHash,
|
||||
fileIndex: object.index,
|
||||
type: TorrentPlayer.isVideo(object.file) ? 'video'
|
||||
: TorrentPlayer.isAudio(object.file) ? 'audio'
|
||||
: 'other'
|
||||
}))
|
||||
}
|
||||
Reference in New Issue
Block a user