diff --git a/Public API v1.yaml b/Public API v1.yaml index e82328a..b57c386 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -261,12 +261,12 @@ paths: $ref: '#/components/schemas/inline_response_200_10' security: - Auth query parameter: [] - /api/getAllSubscriptions: + /api/getSubscriptions: post: tags: - subscriptions summary: Get all subscriptions - operationId: post-api-getAllSubscriptions + operationId: post-api-getSubscriptions requestBody: content: application/json: diff --git a/backend/app.js b/backend/app.js index 0f6db8c..e1790fd 100644 --- a/backend/app.js +++ b/backend/app.js @@ -628,6 +628,9 @@ async function loadConfig() { // get subscriptions if (allowSubscriptions) { + // set downloading to false + let subscriptions = subscriptions_api.getAllSubscriptions(); + subscriptions_api.updateSubscriptionPropertyMultiple(subscriptions, {downloading: false}); // runs initially, then runs every ${subscriptionCheckInterval} seconds watchSubscriptions(); setInterval(() => { @@ -686,18 +689,7 @@ function calculateSubcriptionRetrievalDelay(subscriptions_amount) { } async function watchSubscriptions() { - let subscriptions = null; - - const multiUserMode = config_api.getConfigItem('ytdl_multi_user_mode'); - if (multiUserMode) { - subscriptions = []; - let users = users_db.get('users').value(); - for (let i = 0; i < users.length; i++) { - if (users[i]['subscriptions']) subscriptions = subscriptions.concat(users[i]['subscriptions']); - } - } else { - subscriptions = subscriptions_api.getAllSubscriptions(); - } + let subscriptions = subscriptions_api.getAllSubscriptions(); if (!subscriptions) return; @@ -707,6 +699,8 @@ async function watchSubscriptions() { let delay_interval = calculateSubcriptionRetrievalDelay(subscriptions_amount); let current_delay = 0; + + const multiUserMode = config_api.getConfigItem('ytdl_multi_user_mode'); for (let i = 0; i < valid_subscriptions.length; i++) { let sub = valid_subscriptions[i]; @@ -2026,7 +2020,7 @@ app.post('/api/getAllFiles', optionalJwt, async function (req, res) { let files = null; let playlists = null; - let subscriptions = config_api.getConfigItem('ytdl_allow_subscriptions') ? (subscriptions_api.getAllSubscriptions(req.isAuthenticated() ? req.user.uid : null)) : []; + let subscriptions = config_api.getConfigItem('ytdl_allow_subscriptions') ? (subscriptions_api.getSubscriptions(req.isAuthenticated() ? req.user.uid : null)) : []; // get basic info depending on multi-user mode being enabled if (req.isAuthenticated()) { @@ -2456,11 +2450,11 @@ app.post('/api/updateSubscription', optionalJwt, async (req, res) => { }); }); -app.post('/api/getAllSubscriptions', optionalJwt, async (req, res) => { +app.post('/api/getSubscriptions', optionalJwt, async (req, res) => { let user_uid = req.isAuthenticated() ? req.user.uid : null; // get subs from api - let subscriptions = subscriptions_api.getAllSubscriptions(user_uid); + let subscriptions = subscriptions_api.getSubscriptions(user_uid); res.send({ subscriptions: subscriptions diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 396516d..dfcff58 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -255,10 +255,6 @@ async function deleteSubscriptionFile(sub, file, deleteForever, file_uid = null, } async function getVideosForSub(sub, user_uid = null) { - if (!subExists(sub.id, user_uid)) { - return false; - } - // get sub_db let sub_db = null; if (user_uid) @@ -266,6 +262,13 @@ async function getVideosForSub(sub, user_uid = null) { else sub_db = db.get('subscriptions').find({id: sub.id}); + const latest_sub_obj = sub_db.value(); + if (!latest_sub_obj || latest_sub_obj['downloading']) { + return false; + } + + updateSubscriptionProperty(sub, {downloading: true}, user_uid); + // get basePath let basePath = null; if (user_uid) @@ -290,6 +293,7 @@ async function getVideosForSub(sub, user_uid = null) { return new Promise(resolve => { youtubedl.exec(sub.url, downloadConfig, {}, async function(err, output) { + updateSubscriptionProperty(sub, {downloading: false}, user_uid); logger.verbose('Subscription: finished check for ' + sub.name); if (err && !output) { logger.error(err.stderr ? err.stderr : err.message); @@ -319,6 +323,7 @@ async function getVideosForSub(sub, user_uid = null) { if (output.length === 0 || (output.length === 1 && output[0] === '')) { logger.verbose('No additional videos to download for ' + sub.name); resolve(true); + return; } for (let i = 0; i < output.length; i++) { let output_json = null; @@ -345,6 +350,7 @@ async function getVideosForSub(sub, user_uid = null) { }); }, err => { logger.error(err); + updateSubscriptionProperty(sub, {downloading: false}, user_uid); }); } @@ -460,13 +466,28 @@ function handleOutputJSON(sub, sub_db, output_json, multiUserMode = null, reset_ } } -function getAllSubscriptions(user_uid = null) { +function getSubscriptions(user_uid = null) { if (user_uid) return users_db.get('users').find({uid: user_uid}).get('subscriptions').value(); else return db.get('subscriptions').value(); } +function getAllSubscriptions() { + let subscriptions = null; + const multiUserMode = config_api.getConfigItem('ytdl_multi_user_mode'); + if (multiUserMode) { + subscriptions = []; + let users = users_db.get('users').value(); + for (let i = 0; i < users.length; i++) { + if (users[i]['subscriptions']) subscriptions = subscriptions.concat(users[i]['subscriptions']); + } + } else { + subscriptions = subscriptions_api.getSubscriptions(); + } + return subscriptions; +} + function getSubscription(subID, user_uid = null) { if (user_uid) return users_db.get('users').find({uid: user_uid}).get('subscriptions').find({id: subID}).value(); @@ -490,6 +511,21 @@ function updateSubscription(sub, user_uid = null) { return true; } +function updateSubscriptionPropertyMultiple(subs, assignment_obj) { + subs.forEach(sub => { + updateSubscriptionProperty(sub, assignment_obj, sub.user_uid); + }); +} + +function updateSubscriptionProperty(sub, assignment_obj, user_uid = null) { + if (user_uid) { + users_db.get('users').find({uid: user_uid}).get('subscriptions').find({id: sub.id}).assign(assignment_obj).write(); + } else { + db.get('subscriptions').find({id: sub.id}).assign(assignment_obj).write(); + } + return true; +} + function subExists(subID, user_uid = null) { if (user_uid) return !!users_db.get('users').find({uid: user_uid}).get('subscriptions').find({id: subID}).value(); @@ -580,6 +616,7 @@ async function removeIDFromArchive(archive_path, id) { module.exports = { getSubscription : getSubscription, getSubscriptionByName : getSubscriptionByName, + getSubscriptions : getSubscriptions, getAllSubscriptions : getAllSubscriptions, updateSubscription : updateSubscription, subscribe : subscribe, @@ -588,5 +625,6 @@ module.exports = { getVideosForSub : getVideosForSub, removeIDFromArchive : removeIDFromArchive, setLogger : setLogger, - initialize : initialize + initialize : initialize, + updateSubscriptionPropertyMultiple : updateSubscriptionPropertyMultiple } diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 77acefc..4ae90dd 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -374,7 +374,7 @@ export class PostsService implements CanActivate { } getAllSubscriptions() { - return this.http.post(this.path + 'getAllSubscriptions', {}, this.httpOptions); + return this.http.post(this.path + 'getSubscriptions', {}, this.httpOptions); } // current downloads diff --git a/src/app/subscription/subscription/subscription.component.html b/src/app/subscription/subscription/subscription.component.html index e404df3..82747ac 100644 --- a/src/app/subscription/subscription/subscription.component.html +++ b/src/app/subscription/subscription/subscription.component.html @@ -4,6 +4,7 @@