]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/video.js
Server: host -> hostname (host = hostname + port)
[github/Chocobozzz/PeerTube.git] / server / models / video.js
index b9999c8f66f0c4fd000e96455692a3cba6975095..be3e80598e84f96eb5290e0a44bdeca3501aa2cf 100644 (file)
@@ -1,10 +1,12 @@
 'use strict'
 
-const eachLimit = require('async/eachLimit')
+const createTorrent = require('create-torrent')
 const ffmpeg = require('fluent-ffmpeg')
 const fs = require('fs')
 const parallel = require('async/parallel')
+const parseTorrent = require('parse-torrent')
 const pathUtils = require('path')
+const magnet = require('magnet-uri')
 const mongoose = require('mongoose')
 
 const constants = require('../initializers/constants')
@@ -12,7 +14,6 @@ const customVideosValidators = require('../helpers/custom-validators').videos
 const logger = require('../helpers/logger')
 const modelUtils = require('./utils')
 const utils = require('../helpers/utils')
-const webtorrent = require('../lib/webtorrent')
 
 // ---------------------------------------------------------------------------
 
@@ -56,13 +57,12 @@ VideoSchema.statics = {
   getDurationFromFile,
   listForApi,
   listByUrlAndMagnet,
-  listByUrls,
+  listByUrl,
   listOwned,
   listOwnedByAuthor,
   listRemotes,
   load,
-  search,
-  seedAllExisting
+  search
 }
 
 VideoSchema.pre('remove', function (next) {
@@ -94,12 +94,34 @@ VideoSchema.pre('save', function (next) {
   const tasks = []
 
   if (video.isOwned()) {
-    const videoPath = pathUtils.join(constants.CONFIG.STORAGE.UPLOAD_DIR, video.filename)
+    const videoPath = pathUtils.join(constants.CONFIG.STORAGE.VIDEOS_DIR, video.filename)
     this.podUrl = constants.CONFIG.WEBSERVER.URL
 
     tasks.push(
+      // TODO: refractoring
       function (callback) {
-        seed(videoPath, callback)
+        const options = {
+          announceList: [
+            [ constants.CONFIG.WEBSERVER.WS + '://' + constants.CONFIG.WEBSERVER.HOSTNAME + ':' + constants.CONFIG.WEBSERVER.PORT + '/tracker/socket' ]
+          ],
+          urlList: [
+            constants.CONFIG.WEBSERVER.URL + constants.STATIC_PATHS.WEBSEED + video.filename
+          ]
+        }
+
+        createTorrent(videoPath, options, function (err, torrent) {
+          if (err) return callback(err)
+
+          fs.writeFile(constants.CONFIG.STORAGE.TORRENTS_DIR + video.filename + '.torrent', torrent, function (err) {
+            if (err) return callback(err)
+
+            const parsedTorrent = parseTorrent(torrent)
+            parsedTorrent.xs = video.podUrl + constants.STATIC_PATHS.TORRENTS + video.filename + '.torrent'
+            video.magnetUri = magnet.encode(parsedTorrent)
+
+            callback(null)
+          })
+        })
       },
       function (callback) {
         createThumbnail(videoPath, callback)
@@ -109,7 +131,6 @@ VideoSchema.pre('save', function (next) {
     parallel(tasks, function (err, results) {
       if (err) return next(err)
 
-      video.magnetUri = results[0].magnetURI
       video.thumbnail = results[1]
 
       return next()
@@ -144,7 +165,7 @@ function toFormatedJSON () {
     author: this.author,
     duration: this.duration,
     tags: this.tags,
-    thumbnailPath: constants.THUMBNAILS_STATIC_PATH + '/' + this.thumbnail,
+    thumbnailPath: constants.STATIC_PATHS.THUMBNAILS + '/' + this.thumbnail,
     createdDate: this.createdDate
   }
 
@@ -197,8 +218,8 @@ function listByUrlAndMagnet (fromUrl, magnetUri, callback) {
   this.find({ podUrl: fromUrl, magnetUri: magnetUri }, callback)
 }
 
-function listByUrls (fromUrls, callback) {
-  this.find({ podUrl: { $in: fromUrls } }, callback)
+function listByUrl (fromUrl, callback) {
+  this.find({ podUrl: fromUrl }, callback)
 }
 
 function listOwned (callback) {
@@ -230,17 +251,6 @@ function search (value, field, start, count, sort, callback) {
   modelUtils.listForApiWithCount.call(this, query, start, count, sort, callback)
 }
 
-function seedAllExisting (callback) {
-  listOwned.call(this, function (err, videos) {
-    if (err) return callback(err)
-
-    eachLimit(videos, constants.SEEDS_IN_PARALLEL, function (video, callbackEach) {
-      const videoPath = pathUtils.join(constants.CONFIG.STORAGE.UPLOAD_DIR, video.filename)
-      seed(videoPath, callbackEach)
-    }, callback)
-  })
-}
-
 // ---------------------------------------------------------------------------
 
 function removeThumbnail (video, callback) {
@@ -248,17 +258,12 @@ function removeThumbnail (video, callback) {
 }
 
 function removeFile (video, callback) {
-  fs.unlink(constants.CONFIG.STORAGE.UPLOAD_DIR + video.filename, callback)
+  fs.unlink(constants.CONFIG.STORAGE.VIDEOS_DIR + video.filename, callback)
 }
 
 // Maybe the torrent is not seeded, but we catch the error to don't stop the removing process
 function removeTorrent (video, callback) {
-  try {
-    webtorrent.remove(video.magnetUri, callback)
-  } catch (err) {
-    logger.warn('Cannot remove the torrent from WebTorrent', { err: err })
-    return callback(null)
-  }
+  fs.unlink(constants.CONFIG.STORAGE.TORRENTS_DIR + video.filename + '.torrent', callback)
 }
 
 function createThumbnail (videoPath, callback) {
@@ -276,16 +281,6 @@ function createThumbnail (videoPath, callback) {
     })
 }
 
-function seed (path, callback) {
-  logger.info('Seeding %s...', path)
-
-  webtorrent.seed(path, function (torrent) {
-    logger.info('%s seeded (%s).', path, torrent.magnetURI)
-
-    return callback(null, torrent)
-  })
-}
-
 function generateThumbnailFromBase64 (data, callback) {
   // Creating the thumbnail for this remote video
   utils.generateRandomString(16, function (err, randomString) {