import { AccountModel } from '../server/models/account/account'
import { VideoChannelModel } from '../server/models/video/video-channel'
import { initDatabaseModels } from '../server/initializers/database'
-import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent'
+import { updateTorrentUrls } from '@server/helpers/webtorrent'
import { getServerActor } from '@server/models/application/application'
run()
for (const file of video.VideoFiles) {
console.log('Updating torrent file %s of video %s.', file.resolution, video.uuid)
- await createTorrentAndSetInfoHash(video, file)
+ await updateTorrentUrls(video, file)
await file.save()
}
for (const file of (playlist?.VideoFiles || [])) {
console.log('Updating fragmented torrent file %s of video %s.', file.resolution, video.uuid)
- await createTorrentAndSetInfoHash(video, file)
+ await updateTorrentUrls(video, file)
await file.save()
}
+import * as bencode from 'bencode'
import * as createTorrent from 'create-torrent'
-import { createWriteStream, ensureDir, remove, writeFile } from 'fs-extra'
+import { createWriteStream, ensureDir, readFile, remove, writeFile } from 'fs-extra'
import * as magnetUtil from 'magnet-uri'
import * as parseTorrent from 'parse-torrent'
import { dirname, join } from 'path'
})
}
-function createTorrentAndSetInfoHash (
- videoOrPlaylist: MVideo | MStreamingPlaylistVideo,
- videoFile: MVideoFile
-) {
+function createTorrentAndSetInfoHash (videoOrPlaylist: MVideo | MStreamingPlaylistVideo, videoFile: MVideoFile) {
const video = extractVideo(videoOrPlaylist)
const options = {
// Keep the extname, it's used by the client to stream the file inside a web browser
name: `${video.name} ${videoFile.resolution}p${videoFile.extname}`,
createdBy: 'PeerTube',
- announceList: [
- [ WEBSERVER.WS + '://' + WEBSERVER.HOSTNAME + ':' + WEBSERVER.PORT + '/tracker/socket' ],
- [ WEBSERVER.URL + '/tracker/announce' ]
- ],
- urlList: [ videoFile.getFileUrl(video) ]
+ announceList: buildAnnounceList(),
+ urlList: buildUrlList(video, videoFile)
}
return VideoPathManager.Instance.makeAvailableVideoFile(videoOrPlaylist, videoFile, async videoPath => {
- const torrent = await createTorrentPromise(videoPath, options)
+ const torrentContent = await createTorrentPromise(videoPath, options)
const torrentFilename = generateTorrentFileName(videoOrPlaylist, videoFile.resolution)
const torrentPath = join(CONFIG.STORAGE.TORRENTS_DIR, torrentFilename)
logger.info('Creating torrent %s.', torrentPath)
- await writeFile(torrentPath, torrent)
+ await writeFile(torrentPath, torrentContent)
// Remove old torrent file if it existed
if (videoFile.hasTorrent()) {
await remove(join(CONFIG.STORAGE.TORRENTS_DIR, videoFile.torrentFilename))
}
- const parsedTorrent = parseTorrent(torrent)
+ const parsedTorrent = parseTorrent(torrentContent)
videoFile.infoHash = parsedTorrent.infoHash
videoFile.torrentFilename = torrentFilename
})
}
+async function updateTorrentUrls (videoOrPlaylist: MVideo | MStreamingPlaylistVideo, videoFile: MVideoFile) {
+ const video = extractVideo(videoOrPlaylist)
+
+ const oldTorrentPath = join(CONFIG.STORAGE.TORRENTS_DIR, videoFile.torrentFilename)
+
+ const torrentContent = await readFile(oldTorrentPath)
+ const decoded = bencode.decode(torrentContent)
+
+ decoded['announce-list'] = buildAnnounceList()
+ decoded.announce = decoded['announce-list'][0][0]
+
+ decoded['url-list'] = buildUrlList(video, videoFile)
+
+ const newTorrentFilename = generateTorrentFileName(videoOrPlaylist, videoFile.resolution)
+ const newTorrentPath = join(CONFIG.STORAGE.TORRENTS_DIR, newTorrentFilename)
+
+ logger.info('Updating torrent URLs %s.', newTorrentPath)
+
+ await writeFile(newTorrentPath, bencode.encode(decoded))
+
+ // Remove old torrent file if it existed
+ if (videoFile.hasTorrent()) {
+ await remove(join(CONFIG.STORAGE.TORRENTS_DIR, videoFile.torrentFilename))
+ }
+
+ videoFile.torrentFilename = newTorrentFilename
+}
+
function generateMagnetUri (
video: MVideo,
videoFile: MVideoFileRedundanciesOpt,
export {
createTorrentPromise,
+ updateTorrentUrls,
createTorrentAndSetInfoHash,
generateMagnetUri,
downloadWebTorrentVideo
remove(toRemovePath)
.catch(err => logger.error('Cannot remove torrent file %s in webtorrent download.', toRemovePath, { err }))
}
+
+function buildAnnounceList () {
+ return [
+ [ WEBSERVER.WS + '://' + WEBSERVER.HOSTNAME + ':' + WEBSERVER.PORT + '/tracker/socket' ],
+ [ WEBSERVER.URL + '/tracker/announce' ]
+ ]
+}
+
+function buildUrlList (video: MVideo, videoFile: MVideoFile) {
+ return [ videoFile.getFileUrl(video) ]
+}