mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-03-15 01:00:56 +03:00
Compare commits
17 Commits
db-bug-fix
...
docker-ubu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab5cd409bb | ||
|
|
e0509e8091 | ||
|
|
83a9d93ce5 | ||
|
|
2707b09627 | ||
|
|
8118906b0a | ||
|
|
2ad42ebf27 | ||
|
|
2b3490e52c | ||
|
|
55fd60acd3 | ||
|
|
0c1568b38d | ||
|
|
f8a0d14968 | ||
|
|
f5894e6bc0 | ||
|
|
f205f8e58e | ||
|
|
02e683add9 | ||
|
|
d90b2d3687 | ||
|
|
32b68033e8 | ||
|
|
08027a5c0b | ||
|
|
25aac19cfb |
13
Dockerfile
13
Dockerfile
@@ -2,8 +2,9 @@ FROM ubuntu:22.04 AS ffmpeg
|
|||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
COPY docker-build.sh .
|
RUN apt-get update && apt-get install -y software-properties-common
|
||||||
RUN sh ./docker-build.sh
|
RUN add-apt-repository ppa:savoury1/ffmpeg4
|
||||||
|
RUN add-apt-repository ppa:savoury1/ffmpeg5 && apt-get update && apt-get install -y ffmpeg
|
||||||
|
|
||||||
#--------------# Stage 2
|
#--------------# Stage 2
|
||||||
|
|
||||||
@@ -48,7 +49,8 @@ RUN apt-get update && apt-get -y install \
|
|||||||
python2 \
|
python2 \
|
||||||
python3 \
|
python3 \
|
||||||
gosu \
|
gosu \
|
||||||
atomicparsley && \
|
atomicparsley \
|
||||||
|
--no-install-recommends && \
|
||||||
apt-get install -f && \
|
apt-get install -f && \
|
||||||
apt-get autoremove --purge && \
|
apt-get autoremove --purge && \
|
||||||
apt-get autoremove && \
|
apt-get autoremove && \
|
||||||
@@ -64,9 +66,12 @@ RUN npm config set strict-ssl false && \
|
|||||||
npm install pm2 -g && \
|
npm install pm2 -g && \
|
||||||
npm install && chown -R $UID:$GID ./
|
npm install && chown -R $UID:$GID ./
|
||||||
|
|
||||||
|
# needed for ubuntu, see #596
|
||||||
|
RUN ln -s /usr/bin/python3 /usr/bin/python
|
||||||
|
|
||||||
COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ]
|
COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ]
|
||||||
COPY --chown=$UID:$GID [ "/backend/", "/app/" ]
|
COPY --chown=$UID:$GID [ "/backend/", "/app/" ]
|
||||||
|
|
||||||
EXPOSE 17442
|
EXPOSE 17442
|
||||||
ENTRYPOINT [ "/app/entrypoint.sh" ]
|
# ENTRYPOINT [ "/app/entrypoint.sh" ]
|
||||||
CMD [ "pm2-runtime", "pm2.config.js" ]
|
CMD [ "pm2-runtime", "pm2.config.js" ]
|
||||||
|
|||||||
2
Dockerfile.heroku
Normal file
2
Dockerfile.heroku
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
FROM tzahi12345/youtubedl-material:nightly
|
||||||
|
CMD [ "pm2-runtime", "pm2.config.js" ]
|
||||||
1
app.json
1
app.json
@@ -2,6 +2,7 @@
|
|||||||
"name": "YoutubeDL-Material",
|
"name": "YoutubeDL-Material",
|
||||||
"description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.",
|
"description": "An open-source and self-hosted YouTube downloader based on Google's Material Design specifications.",
|
||||||
"repository": "https://github.com/Tzahi12345/YoutubeDL-Material",
|
"repository": "https://github.com/Tzahi12345/YoutubeDL-Material",
|
||||||
|
"stack": "container",
|
||||||
"logo": "https://i.imgur.com/GPzvPiU.png",
|
"logo": "https://i.imgur.com/GPzvPiU.png",
|
||||||
"keywords": ["youtube-dl", "youtubedl-material", "nodejs"]
|
"keywords": ["youtube-dl", "youtubedl-material", "nodejs"]
|
||||||
}
|
}
|
||||||
@@ -249,14 +249,6 @@ async function startServer() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function restartServer(is_update = false) {
|
|
||||||
logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`);
|
|
||||||
|
|
||||||
// the following line restarts the server through nodemon
|
|
||||||
fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function updateServer(tag) {
|
async function updateServer(tag) {
|
||||||
// no tag provided means update to the latest version
|
// no tag provided means update to the latest version
|
||||||
if (!tag) {
|
if (!tag) {
|
||||||
@@ -297,7 +289,7 @@ async function updateServer(tag) {
|
|||||||
updating: true,
|
updating: true,
|
||||||
'details': 'Update complete! Restarting server...'
|
'details': 'Update complete! Restarting server...'
|
||||||
}
|
}
|
||||||
restartServer(true);
|
utils.restartServer(true);
|
||||||
}, err => {
|
}, err => {
|
||||||
logger.error(err);
|
logger.error(err);
|
||||||
updaterStatus = {
|
updaterStatus = {
|
||||||
@@ -676,6 +668,7 @@ async function getUrlInfos(url) {
|
|||||||
|
|
||||||
async function startYoutubeDL() {
|
async function startYoutubeDL() {
|
||||||
// auto update youtube-dl
|
// auto update youtube-dl
|
||||||
|
youtubedl_api.verifyBinaryExistsLinux();
|
||||||
const update_available = await youtubedl_api.checkForYoutubeDLUpdate();
|
const update_available = await youtubedl_api.checkForYoutubeDLUpdate();
|
||||||
if (update_available) await youtubedl_api.updateYoutubeDL(update_available);
|
if (update_available) await youtubedl_api.updateYoutubeDL(update_available);
|
||||||
}
|
}
|
||||||
@@ -764,7 +757,7 @@ app.get('/api/versionInfo', (req, res) => {
|
|||||||
|
|
||||||
app.post('/api/restartServer', optionalJwt, (req, res) => {
|
app.post('/api/restartServer', optionalJwt, (req, res) => {
|
||||||
// delayed by a little bit so that the client gets a response
|
// delayed by a little bit so that the client gets a response
|
||||||
setTimeout(() => {restartServer()}, 100);
|
setTimeout(() => {utils.restartServer()}, 100);
|
||||||
res.send({success: true});
|
res.send({success: true});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1802,6 +1795,7 @@ app.post('/api/updateTaskData', optionalJwt, async (req, res) => {
|
|||||||
|
|
||||||
app.post('/api/getDBBackups', optionalJwt, async (req, res) => {
|
app.post('/api/getDBBackups', optionalJwt, async (req, res) => {
|
||||||
const backup_dir = path.join('appdata', 'db_backup');
|
const backup_dir = path.join('appdata', 'db_backup');
|
||||||
|
fs.ensureDirSync(backup_dir);
|
||||||
const db_backups = [];
|
const db_backups = [];
|
||||||
|
|
||||||
const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false);
|
const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false);
|
||||||
|
|||||||
@@ -415,6 +415,14 @@ async function fetchFile(url, path, file_label) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function restartServer(is_update = false) {
|
||||||
|
logger.info(`${is_update ? 'Update complete! ' : ''}Restarting server...`);
|
||||||
|
|
||||||
|
// the following line restarts the server through nodemon
|
||||||
|
fs.writeFileSync(`restart${is_update ? '_update' : '_general'}.json`, 'internal use only');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
// adds or replaces args according to the following rules:
|
// adds or replaces args according to the following rules:
|
||||||
// - if it already exists and has value, then replace both arg and value
|
// - if it already exists and has value, then replace both arg and value
|
||||||
// - if already exists and doesn't have value, ignore
|
// - if already exists and doesn't have value, ignore
|
||||||
@@ -491,6 +499,7 @@ module.exports = {
|
|||||||
wait: wait,
|
wait: wait,
|
||||||
checkExistsWithTimeout: checkExistsWithTimeout,
|
checkExistsWithTimeout: checkExistsWithTimeout,
|
||||||
fetchFile: fetchFile,
|
fetchFile: fetchFile,
|
||||||
|
restartServer: restartServer,
|
||||||
injectArgs: injectArgs,
|
injectArgs: injectArgs,
|
||||||
File: File
|
File: File
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ const utils = require('./utils');
|
|||||||
const CONSTS = require('./consts');
|
const CONSTS = require('./consts');
|
||||||
const config_api = require('./config.js');
|
const config_api = require('./config.js');
|
||||||
|
|
||||||
|
const OUTDATED_VERSION = "2020.00.00";
|
||||||
|
|
||||||
const is_windows = process.platform === 'win32';
|
const is_windows = process.platform === 'win32';
|
||||||
|
|
||||||
const download_sources = {
|
const download_sources = {
|
||||||
@@ -31,7 +33,7 @@ exports.checkForYoutubeDLUpdate = async () => {
|
|||||||
let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH);
|
let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH);
|
||||||
if (!current_app_details_exists) {
|
if (!current_app_details_exists) {
|
||||||
logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`);
|
logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`);
|
||||||
fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader});
|
fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version": OUTDATED_VERSION, "downloader": default_downloader});
|
||||||
}
|
}
|
||||||
let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH));
|
let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH));
|
||||||
let current_version = current_app_details['version'];
|
let current_version = current_app_details['version'];
|
||||||
@@ -86,6 +88,18 @@ exports.updateYoutubeDL = async (latest_update_version) => {
|
|||||||
await download_sources[default_downloader]['func'](latest_update_version);
|
await download_sources[default_downloader]['func'](latest_update_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exports.verifyBinaryExistsLinux = () => {
|
||||||
|
const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH);
|
||||||
|
if (!is_windows && details_json && details_json['path'].includes('.exe')) {
|
||||||
|
details_json['path'] = 'node_modules/youtube-dl/bin/youtube-dl';
|
||||||
|
details_json['exec'] = 'youtube-dl';
|
||||||
|
details_json['version'] = OUTDATED_VERSION;
|
||||||
|
fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json);
|
||||||
|
|
||||||
|
utils.restartServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function downloadLatestYoutubeDLBinary(new_version) {
|
async function downloadLatestYoutubeDLBinary(new_version) {
|
||||||
const file_ext = is_windows ? '.exe' : '';
|
const file_ext = is_windows ? '.exe' : '';
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMX9Wk5SM5cIfY
|
|
||||||
6ReKX3ybY1rsbNbOzG8ceN7yyeXB0mor8pVsX1MOna2HewOyBuaaYNJRO4tJBxic
|
|
||||||
7a8zQErfgHL/i/QrVvVCpfJ7xKvq6zij5NYoqd/FBUwawqjeH5/voIcAp9z5Vmsr
|
|
||||||
kL0sxJUKy6b4IWNp3noU7Nvq2RwxnXQbKDhz8FrX6oQAnDC6gsG5a2OSPsaE4oqw
|
|
||||||
6nmonORJypmpP5hqyHY8ffXBT2lAxjHT7OnYbaCBe2TQP8+rH6rDBOhjVNtUJ089
|
|
||||||
ocTQL6LtQEPkcF4yKJmtcOwHl8OPGZs5l9i8xb4j9RuSPkm2lbzZX8sOsdGGoqJZ
|
|
||||||
q68nYhsHAgMBAAECggEAXmtKEzfPObq88B/kAcgSk+FngMHZzcmR7bgD3GwdSxnQ
|
|
||||||
dkRI9zvk7eQ35tcUwntAr4Lat6/ILjFqlBmVLxrdXHuF5Xz9jcZLYgKzz61xdYM9
|
|
||||||
dC6FKF0u5eGIIvbauGAo7jaeGFX1F3Zu5b4lP9kEOGwU1B7sxF0FzsQM5+dtCJgv
|
|
||||||
We/hWQeF+9gtoVnkCSS/Mq2p0UomXXHW0Bz4+HuHlTR9aiYbviYnotABiLUhZyzt
|
|
||||||
v5yUaktb9qniBfdLpRlq8cp06xYlTEA9gJpa4Pnok8OWUsbAiW6EiXUSaZ/cchVa
|
|
||||||
AnO8WWYvVOnnt6WHI3+QdFTnqVjE5TBX4N/7bVhHGQKBgQD0dtbFqp7vZK/jVYvE
|
|
||||||
z0WPdySOg2ZDmoSfk5ZlR1+Y9zWToHv0qu8zqoOjL8Ubxrh9fGlOow+cCVdkEuaa
|
|
||||||
jWC2AWetuRvW0Z5A3XMXr0/N/1fgOkTqtp3WNrUPjVJahEg3lN+90opgFoT8swSi
|
|
||||||
s1oxW0oLcVIlrjhGBXAPCfsAuQKBgQDWBLRhHsRAvGcK5wGuVnxVApTIyBOermsW
|
|
||||||
3bJt+7+UI+4sYrBAwkWdQG93IG0cQtn48TEPBgmR2fjRF5IFT9M4/u+QOeeByT7I
|
|
||||||
we7nVtHgSY5ByC9N0mjWbcmSg8fktz/LonjldNC4kWdOFb75fxGf8kOGS5rUaMA4
|
|
||||||
zHucfB6ZvwKBgQCPHJrysMXGY21MaqIeHzEboaX3ABl37hdBzAa5V6UxSVdGCydF
|
|
||||||
vmO2HVZey/JaJmWOoKyNaowSzq0oWqBBTg6VvhDR9JHFmoVId9uOvAS+FYN+Mt5x
|
|
||||||
gWK5KuGoLxVNBC+6yh6JY526TrSfsrU+Aj0Es+qO9FIg2PL8muZVB4S3kQKBgH/5
|
|
||||||
CDMaxpc/EQ5/2413wZjDllwI51J3USm3Hz6Mzp2ybnSz/lh60k2Zfg1polTH1Lb6
|
|
||||||
4i7tmUNRZ2sAARyUAuWN64n+VeRRhe1dqZFDZPQMh7fmEAMk0fOGaoXlrt2ghdEq
|
|
||||||
Mchi9Xun1nHmpu9hgBR4NNBU3RwuFuLfwvprbZDZAoGAWa62QJChE86xQGP1MrL2
|
|
||||||
SbIzw3cfeP5xdQ3MKldJiy5IkbMR7Z13WZ7FwvPTy0g/onLHD1rqlm1kUMsGRHpD
|
|
||||||
5vH06PNpKXQ6x8BYaRGtE6P39jLycO/X+WK/lYTrWo1bR+mGCebDh4B5XrwT3gI6
|
|
||||||
x4Gvz134pZCTyQCf5JCwbQs=
|
|
||||||
-----END PRIVATE KEY-----
|
|
||||||
3
heroku.yml
Normal file
3
heroku.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
build:
|
||||||
|
docker:
|
||||||
|
web: Dockerfile.heroku
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
"build": "ng build --configuration production",
|
"build": "ng build --configuration production",
|
||||||
"prebuild": "node src/postbuild.mjs",
|
"prebuild": "node src/postbuild.js",
|
||||||
"heroku-postbuild": "npm install --prefix backend",
|
"heroku-postbuild": "npm install --prefix backend",
|
||||||
"test": "ng test",
|
"test": "ng test",
|
||||||
"lint": "ng lint",
|
"lint": "ng lint",
|
||||||
|
|||||||
43
src/postbuild.js
Normal file
43
src/postbuild.js
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
const fs = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
const xliffToJSON = require('xliff-to-json');
|
||||||
|
|
||||||
|
async function recFindByExt(base,ext,files,result)
|
||||||
|
{
|
||||||
|
files = files || (await fs.readdir(base))
|
||||||
|
result = result || []
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
var newbase = path.join(base,file)
|
||||||
|
if ( (await fs.stat(newbase)).isDirectory() )
|
||||||
|
{
|
||||||
|
result = await recFindByExt(newbase,ext,await fs.readdir(newbase),result)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( file.substr(-1*(ext.length+1)) == '.' + ext )
|
||||||
|
{
|
||||||
|
result.push(newbase)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// outputs array of supported locales
|
||||||
|
async function createLocalizationJSON() {
|
||||||
|
xliffToJSON.convert('src/assets/i18n');
|
||||||
|
const files = await recFindByExt(path.join('src', 'assets', 'i18n'), 'json');
|
||||||
|
const locales = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < files.length; i++) {
|
||||||
|
const file = path.basename(files[i]);
|
||||||
|
const file_parts = file.split('.');
|
||||||
|
locales.push(file_parts[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.unlinkSync('src/assets/i18n/messages.en.json');
|
||||||
|
fs.writeJSONSync('src/assets/i18n/supported_locales.json', {supported_locales: locales});
|
||||||
|
}
|
||||||
|
|
||||||
|
createLocalizationJSON();
|
||||||
Binary file not shown.
Reference in New Issue
Block a user