diff options
author | Chocobozzz <me@florianbigard.com> | 2018-09-28 09:08:12 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-09-28 09:08:12 +0200 |
commit | d0b52b5285d0797b30bca6510b7a8f840fab4697 (patch) | |
tree | 465973b0942bb78d1ee1e1783651056f9b9760cc /server/helpers | |
parent | 8578e3b5e630f0cfe1dfbf13a7be1e6b89554077 (diff) | |
download | PeerTube-d0b52b5285d0797b30bca6510b7a8f840fab4697.tar.gz PeerTube-d0b52b5285d0797b30bca6510b7a8f840fab4697.tar.zst PeerTube-d0b52b5285d0797b30bca6510b7a8f840fab4697.zip |
Correctly delete directories on import
Diffstat (limited to 'server/helpers')
-rw-r--r-- | server/helpers/webtorrent.ts | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/server/helpers/webtorrent.ts b/server/helpers/webtorrent.ts index f6469ef32..b4629a094 100644 --- a/server/helpers/webtorrent.ts +++ b/server/helpers/webtorrent.ts | |||
@@ -3,7 +3,7 @@ import { generateVideoTmpPath } from './utils' | |||
3 | import * as WebTorrent from 'webtorrent' | 3 | import * as WebTorrent from 'webtorrent' |
4 | import { createWriteStream, ensureDir, remove } from 'fs-extra' | 4 | import { createWriteStream, ensureDir, remove } from 'fs-extra' |
5 | import { CONFIG } from '../initializers' | 5 | import { CONFIG } from '../initializers' |
6 | import { join } from 'path' | 6 | import { dirname, join } from 'path' |
7 | 7 | ||
8 | async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName?: string }, timeout?: number) { | 8 | async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName?: string }, timeout?: number) { |
9 | const id = target.magnetUri || target.torrentName | 9 | const id = target.magnetUri || target.torrentName |
@@ -26,7 +26,7 @@ async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName | |||
26 | if (torrent.files.length !== 1) { | 26 | if (torrent.files.length !== 1) { |
27 | if (timer) clearTimeout(timer) | 27 | if (timer) clearTimeout(timer) |
28 | 28 | ||
29 | return safeWebtorrentDestroy(webtorrent, torrentId, join(directoryPath, file.name), target.torrentName) | 29 | return safeWebtorrentDestroy(webtorrent, torrentId, { directoryPath, filepath: file.path }, target.torrentName) |
30 | .then(() => rej(new Error('Cannot import torrent ' + torrentId + ': there are multiple files in it'))) | 30 | .then(() => rej(new Error('Cannot import torrent ' + torrentId + ': there are multiple files in it'))) |
31 | } | 31 | } |
32 | 32 | ||
@@ -37,7 +37,7 @@ async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName | |||
37 | writeStream.on('finish', () => { | 37 | writeStream.on('finish', () => { |
38 | if (timer) clearTimeout(timer) | 38 | if (timer) clearTimeout(timer) |
39 | 39 | ||
40 | return safeWebtorrentDestroy(webtorrent, torrentId, join(directoryPath, file.name), target.torrentName) | 40 | return safeWebtorrentDestroy(webtorrent, torrentId, { directoryPath, filepath: file.path }, target.torrentName) |
41 | .then(() => res(path)) | 41 | .then(() => res(path)) |
42 | }) | 42 | }) |
43 | 43 | ||
@@ -48,7 +48,7 @@ async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName | |||
48 | 48 | ||
49 | if (timeout) { | 49 | if (timeout) { |
50 | timer = setTimeout(async () => { | 50 | timer = setTimeout(async () => { |
51 | return safeWebtorrentDestroy(webtorrent, torrentId, file ? join(directoryPath, file.name) : undefined, target.torrentName) | 51 | return safeWebtorrentDestroy(webtorrent, torrentId, file ? { directoryPath, filepath: file.path } : undefined, target.torrentName) |
52 | .then(() => rej(new Error('Webtorrent download timeout.'))) | 52 | .then(() => rej(new Error('Webtorrent download timeout.'))) |
53 | }, timeout) | 53 | }, timeout) |
54 | } | 54 | } |
@@ -63,19 +63,32 @@ export { | |||
63 | 63 | ||
64 | // --------------------------------------------------------------------------- | 64 | // --------------------------------------------------------------------------- |
65 | 65 | ||
66 | function safeWebtorrentDestroy (webtorrent: WebTorrent.Instance, torrentId: string, filepath?: string, torrentName?: string) { | 66 | function safeWebtorrentDestroy ( |
67 | webtorrent: WebTorrent.Instance, | ||
68 | torrentId: string, | ||
69 | downloadedFile?: { directoryPath: string, filepath: string }, | ||
70 | torrentName?: string | ||
71 | ) { | ||
67 | return new Promise(res => { | 72 | return new Promise(res => { |
68 | webtorrent.destroy(err => { | 73 | webtorrent.destroy(err => { |
69 | // Delete torrent file | 74 | // Delete torrent file |
70 | if (torrentName) { | 75 | if (torrentName) { |
76 | logger.debug('Removing %s torrent after webtorrent download.', torrentId) | ||
71 | remove(torrentId) | 77 | remove(torrentId) |
72 | .catch(err => logger.error('Cannot remove torrent %s in webtorrent download.', torrentId, { err })) | 78 | .catch(err => logger.error('Cannot remove torrent %s in webtorrent download.', torrentId, { err })) |
73 | } | 79 | } |
74 | 80 | ||
75 | // Delete downloaded file | 81 | // Delete downloaded file |
76 | if (filepath) { | 82 | if (downloadedFile) { |
77 | remove(filepath) | 83 | // We want to delete the base directory |
78 | .catch(err => logger.error('Cannot remove torrent file %s in webtorrent download.', filepath, { err })) | 84 | let pathToDelete = dirname(downloadedFile.filepath) |
85 | if (pathToDelete === '.') pathToDelete = downloadedFile.filepath | ||
86 | |||
87 | const toRemovePath = join(downloadedFile.directoryPath, pathToDelete) | ||
88 | |||
89 | logger.debug('Removing %s after webtorrent download.', toRemovePath) | ||
90 | remove(toRemovePath) | ||
91 | .catch(err => logger.error('Cannot remove torrent file %s in webtorrent download.', toRemovePath, { err })) | ||
79 | } | 92 | } |
80 | 93 | ||
81 | if (err) { | 94 | if (err) { |