88 lines
2.1 KiB
JavaScript
88 lines
2.1 KiB
JavaScript
module.exports = {
|
|
hasNext,
|
|
getNextIndex,
|
|
hasPrevious,
|
|
getPreviousIndex,
|
|
getCurrentLocalURL
|
|
}
|
|
|
|
const TorrentSummary = require('./torrent-summary')
|
|
const TorrentPlayer = require('./torrent-player')
|
|
|
|
const cache = {
|
|
infoHash: null,
|
|
previousIndex: null,
|
|
currentIndex: null,
|
|
nextIndex: null
|
|
}
|
|
|
|
function hasNext (state) {
|
|
updateCache(state)
|
|
return cache.nextIndex !== null
|
|
}
|
|
|
|
function getNextIndex (state) {
|
|
updateCache(state)
|
|
return cache.nextIndex
|
|
}
|
|
|
|
function hasPrevious (state) {
|
|
updateCache(state)
|
|
return cache.previousIndex !== null
|
|
}
|
|
|
|
function getPreviousIndex (state) {
|
|
updateCache(state)
|
|
return cache.previousIndex
|
|
}
|
|
|
|
function getCurrentLocalURL (state) {
|
|
return state.server
|
|
? state.server.localURL + '/' + state.playing.fileIndex + '/' + encodeURIComponent(state.playing.fileName)
|
|
: ''
|
|
}
|
|
|
|
function updateCache (state) {
|
|
const infoHash = state.playing.infoHash
|
|
const fileIndex = state.playing.fileIndex
|
|
|
|
if (infoHash === cache.infoHash) {
|
|
switch (fileIndex) {
|
|
case cache.currentIndex:
|
|
return
|
|
case cache.nextIndex:
|
|
cache.previousIndex = cache.currentIndex
|
|
cache.currentIndex = fileIndex
|
|
cache.nextIndex = findNextIndex(state)
|
|
return
|
|
case cache.previousIndex:
|
|
cache.previousIndex = findPreviousIndex(state)
|
|
cache.nextIndex = cache.currentIndex
|
|
cache.currentIndex = fileIndex
|
|
return
|
|
}
|
|
} else {
|
|
cache.infoHash = infoHash
|
|
}
|
|
|
|
cache.previousIndex = findPreviousIndex(state)
|
|
cache.currentIndex = fileIndex
|
|
cache.nextIndex = findNextIndex(state)
|
|
}
|
|
|
|
function findPreviousIndex (state) {
|
|
const files = TorrentSummary.getByKey(state, state.playing.infoHash).files
|
|
for (let i = state.playing.fileIndex - 1; i >= 0; i--) {
|
|
if (TorrentPlayer.isPlayable(files[i])) return i
|
|
}
|
|
return null
|
|
}
|
|
|
|
function findNextIndex (state) {
|
|
const files = TorrentSummary.getByKey(state, state.playing.infoHash).files
|
|
for (let i = state.playing.fileIndex + 1; i < files.length; i++) {
|
|
if (TorrentPlayer.isPlayable(files[i])) return i
|
|
}
|
|
return null
|
|
}
|