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 }