]>
Commit | Line | Data |
---|---|---|
805b8619 C |
1 | import { remove } from 'fs-extra' |
2 | import { Instance as ParseTorrent } from 'parse-torrent' | |
3 | import { join } from 'path' | |
f304a158 | 4 | import { sha256 } from '@shared/extra-utils' |
d17c7b4e | 5 | import { ResultList } from '@shared/models' |
805b8619 | 6 | import { CONFIG } from '../initializers/config' |
06aad801 | 7 | import { execPromise, execPromise2, randomBytesPromise } from './core-utils' |
efc32059 | 8 | import { logger } from './logger' |
cbe2f7c3 | 9 | |
f6d6e7f8 | 10 | function deleteFileAndCatch (path: string) { |
62689b94 | 11 | remove(path) |
cf7a61b5 C |
12 | .catch(err => logger.error('Cannot delete the file %s asynchronously.', path, { err })) |
13 | } | |
14 | ||
f5028693 | 15 | async function generateRandomString (size: number) { |
a1587156 | 16 | const raw = await randomBytesPromise(size) |
f5028693 C |
17 | |
18 | return raw.toString('hex') | |
e4c87ec2 C |
19 | } |
20 | ||
b5fecbf4 C |
21 | interface FormattableToJSON<U, V> { |
22 | toFormattedJSON (args?: U): V | |
23 | } | |
24 | ||
a8b666e9 C |
25 | function getFormattedObjects<U, V, T extends FormattableToJSON<U, V>> (objects: T[], objectsTotal: number, formattedArg?: U) { |
26 | const formattedObjects = objects.map(o => o.toFormattedJSON(formattedArg)) | |
55fa55a9 | 27 | |
2186386c | 28 | return { |
55fa55a9 | 29 | total: objectsTotal, |
0aef76c4 | 30 | data: formattedObjects |
a8b666e9 | 31 | } as ResultList<V> |
55fa55a9 C |
32 | } |
33 | ||
805b8619 | 34 | function generateVideoImportTmpPath (target: string | ParseTorrent, extension = '.mp4') { |
d57d1d83 C |
35 | const id = typeof target === 'string' |
36 | ? target | |
37 | : target.infoHash | |
38 | ||
990b6a0b | 39 | const hash = sha256(id) |
d57d1d83 | 40 | return join(CONFIG.STORAGE.TMP_DIR, `${hash}-import${extension}`) |
ce33919c C |
41 | } |
42 | ||
990b6a0b C |
43 | function getSecureTorrentName (originalName: string) { |
44 | return sha256(originalName) + '.torrent' | |
45 | } | |
792dbaf0 | 46 | |
1b5e2d72 | 47 | async function getServerCommit () { |
499d9015 C |
48 | try { |
49 | const tag = await execPromise2( | |
50 | '[ ! -d .git ] || git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || true', | |
51 | { stdio: [ 0, 1, 2 ] } | |
52 | ) | |
53 | ||
54 | if (tag) return tag.replace(/^v/, '') | |
55 | } catch (err) { | |
56 | logger.debug('Cannot get version from git tags.', { err }) | |
57 | } | |
58 | ||
59 | try { | |
60 | const version = await execPromise('[ ! -d .git ] || git rev-parse --short HEAD') | |
61 | ||
62 | if (version) return version.toString().trim() | |
63 | } catch (err) { | |
64 | logger.debug('Cannot get version from git HEAD.', { err }) | |
65 | } | |
abb2c792 | 66 | |
1b5e2d72 | 67 | return '' |
abb2c792 RK |
68 | } |
69 | ||
edb4ffc7 FA |
70 | /** |
71 | * From a filename like "ede4cba5-742b-46fa-a388-9a6eb3a3aeb3.mp4", returns | |
72 | * only the "ede4cba5-742b-46fa-a388-9a6eb3a3aeb3" part. If the filename does | |
73 | * not contain a UUID, returns null. | |
74 | */ | |
75 | function getUUIDFromFilename (filename: string) { | |
76 | const regex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ | |
77 | const result = filename.match(regex) | |
78 | ||
79 | if (!result || Array.isArray(result) === false) return null | |
80 | ||
81 | return result[0] | |
82 | } | |
83 | ||
9f10b292 | 84 | // --------------------------------------------------------------------------- |
c45f7f84 | 85 | |
65fcc311 | 86 | export { |
f6d6e7f8 | 87 | deleteFileAndCatch, |
65fcc311 | 88 | generateRandomString, |
0aef76c4 | 89 | getFormattedObjects, |
990b6a0b | 90 | getSecureTorrentName, |
1b5e2d72 | 91 | getServerCommit, |
6040f87d | 92 | generateVideoImportTmpPath, |
edb4ffc7 | 93 | getUUIDFromFilename |
65fcc311 | 94 | } |