Merge pull request #655 from Tzahi12345/improved-downloads-management

Improved downloads management
pull/659/head
Tzahi12345 3 years ago committed by GitHub
commit c91e51de15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -129,6 +129,27 @@ paths:
description: User is not authorized to view the file. description: User is not authorized to view the file.
security: security:
- Auth query parameter: [] - Auth query parameter: []
/api/updateFile:
post:
tags:
- files
summary: Updates file database object
description: Updates a file db object using its uid and a change object.
operationId: post-updateFile
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateFileRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/SuccessObject'
security:
- Auth query parameter: []
/api/enableSharing: /api/enableSharing:
post: post:
tags: tags:
@ -841,17 +862,10 @@ paths:
- Auth query parameter: [] - Auth query parameter: []
tags: tags:
- downloader - downloader
/api/clearFinishedDownloads: /api/clearDownloads:
post: post:
tags: summary: Clear multiple downloads
- downloader operationId: post-api-clear-downloads
summary: Clear finished downloads
operationId: post-api-clear-finished-downloads
requestBody:
content:
application/json:
schema:
type: object
responses: responses:
'200': '200':
description: OK description: OK
@ -859,8 +873,17 @@ paths:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/SuccessObject' $ref: '#/components/schemas/SuccessObject'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ClearDownloadsRequest'
description: ''
description: "Clears multiple downloads based on a given filter."
security: security:
- Auth query parameter: [] - Auth query parameter: []
tags:
- downloader
/api/getTask: /api/getTask:
post: post:
summary: Get info for one task summary: Get info for one task
@ -1507,6 +1530,8 @@ components:
properties: properties:
success: success:
type: boolean type: boolean
error:
type: string
FileType: FileType:
type: string type: string
enum: enum:
@ -1607,6 +1632,15 @@ components:
type: array type: array
items: items:
$ref: '#/components/schemas/Download' $ref: '#/components/schemas/Download'
ClearDownloadsRequest:
type: object
properties:
clear_finished:
type: boolean
clear_paused:
type: boolean
clear_errors:
type: boolean
GetTaskRequest: GetTaskRequest:
type: object type: object
properties: properties:
@ -1727,6 +1761,18 @@ components:
type: boolean type: boolean
file: file:
$ref: '#/components/schemas/DatabaseFile' $ref: '#/components/schemas/DatabaseFile'
UpdateFileRequest:
required:
- uid
- change_obj
type: object
properties:
uid:
type: string
description: Video UID
change_obj:
type: object
description: Object with fields to update as keys and their new values
SharingToggle: SharingToggle:
required: required:
- uid - uid
@ -2153,7 +2199,6 @@ components:
type: boolean type: boolean
result: result:
allOf: allOf:
- $ref: '#/components/schemas/file'
- type: object - type: object
properties: properties:
formats: formats:
@ -2311,6 +2356,9 @@ components:
type: string type: string
thumbnailURL: thumbnailURL:
type: string type: string
description: Backup if thumbnailPath is not defined
thumbnailPath:
type: string
isAudio: isAudio:
type: boolean type: boolean
duration: duration:
@ -2322,6 +2370,7 @@ components:
type: string type: string
size: size:
type: number type: number
description: In bytes
path: path:
type: string type: string
upload_date: upload_date:
@ -2330,6 +2379,12 @@ components:
type: string type: string
sharingEnabled: sharingEnabled:
type: boolean type: boolean
category:
$ref: '#/components/schemas/Category'
view_count:
type: number
local_view_count:
type: number
Playlist: Playlist:
required: required:
- uids - uids
@ -2359,6 +2414,8 @@ components:
type: number type: number
user_uid: user_uid:
type: string type: string
auto:
type: boolean
Download: Download:
required: required:
- url - url
@ -2545,28 +2602,6 @@ components:
type: string type: string
passhash: passhash:
type: string type: string
files:
type: object
properties:
audio:
type: array
items:
$ref: '#/components/schemas/file'
video:
type: array
items:
$ref: '#/components/schemas/file'
playlists:
type: object
properties:
audio:
type: array
items:
$ref: '#/components/schemas/file'
video:
type: array
items:
$ref: '#/components/schemas/file'
subscriptions: subscriptions:
type: array type: array
items: items:

@ -30,7 +30,8 @@
"src/backend" "src/backend"
], ],
"styles": [ "styles": [
"src/styles.scss" "src/styles.scss",
"src/bootstrap.min.css"
], ],
"scripts": [], "scripts": [],
"vendorChunk": true, "vendorChunk": true,
@ -118,7 +119,8 @@
"src/backend" "src/backend"
], ],
"styles": [ "styles": [
"src/styles.scss" "src/styles.scss",
"src/bootstrap.min.css"
], ],
"scripts": [] "scripts": []
}, },
@ -151,7 +153,8 @@
"tsConfig": "src/tsconfig.spec.json", "tsConfig": "src/tsconfig.spec.json",
"scripts": [], "scripts": [],
"styles": [ "styles": [
"src/styles.scss" "src/styles.scss",
"src/bootstrap.min.css"
], ],
"assets": [ "assets": [
"src/assets", "src/assets",

@ -933,23 +933,34 @@ app.post('/api/getAllFiles', optionalJwt, async function (req, res) {
else if (file_type_filter === 'video_only') filter_obj['isAudio'] = false; else if (file_type_filter === 'video_only') filter_obj['isAudio'] = false;
files = await db_api.getRecords('files', filter_obj, false, sort, range, text_search); files = await db_api.getRecords('files', filter_obj, false, sort, range, text_search);
let file_count = await db_api.getRecords('files', filter_obj, true); const file_count = await db_api.getRecords('files', filter_obj, true);
playlists = await db_api.getRecords('playlists', {user_uid: uuid});
const categories = await categories_api.getCategoriesAsPlaylists(files);
if (categories) {
playlists = playlists.concat(categories);
}
files = JSON.parse(JSON.stringify(files)); files = JSON.parse(JSON.stringify(files));
res.send({ res.send({
files: files, files: files,
file_count: file_count, file_count: file_count,
playlists: playlists
}); });
}); });
app.post('/api/updateFile', optionalJwt, async function (req, res) {
const uid = req.body.uid;
const change_obj = req.body.change_obj;
const file = await db_api.updateRecord('files', {uid: uid}, change_obj);
if (!file) {
res.send({
success: false,
error: 'File could not be found'
});
} else {
res.send({
success: true
});
}
});
app.post('/api/checkConcurrentStream', async (req, res) => { app.post('/api/checkConcurrentStream', async (req, res) => {
const uid = req.body.uid; const uid = req.body.uid;
@ -1365,7 +1376,7 @@ app.post('/api/getPlaylists', optionalJwt, async (req, res) => {
let playlists = await db_api.getRecords('playlists', {user_uid: uuid}); let playlists = await db_api.getRecords('playlists', {user_uid: uuid});
if (include_categories) { if (include_categories) {
const categories = await categories_api.getCategoriesAsPlaylists(files); const categories = await categories_api.getCategoriesAsPlaylists();
if (categories) { if (categories) {
playlists = playlists.concat(categories); playlists = playlists.concat(categories);
} }
@ -1669,9 +1680,15 @@ app.post('/api/download', optionalJwt, async (req, res) => {
} }
}); });
app.post('/api/clearFinishedDownloads', optionalJwt, async (req, res) => { app.post('/api/clearDownloads', optionalJwt, async (req, res) => {
const user_uid = req.isAuthenticated() ? req.user.uid : null; const user_uid = req.isAuthenticated() ? req.user.uid : null;
const success = db_api.removeAllRecords('download_queue', {finished: true, user_uid: user_uid}); const clear_finished = req.body.clear_finished;
const clear_paused = req.body.clear_paused;
const clear_errors = req.body.clear_errors;
let success = true;
if (clear_finished) success &= await db_api.removeAllRecords('download_queue', {finished: true, user_uid: user_uid});
if (clear_paused) success &= await db_api.removeAllRecords('download_queue', {paused: true, user_uid: user_uid});
if (clear_errors) success &= await db_api.removeAllRecords('download_queue', {error: {$ne: null}, user_uid: user_uid});
res.send({success: success}); res.send({success: success});
}); });

@ -171,8 +171,12 @@ exports.registerUser = async function(req, res) {
exports.login = async (username, password) => { exports.login = async (username, password) => {
// even if we're using LDAP, we still want users to be able to login using internal credentials
const user = await db_api.getRecord('users', {name: username}); const user = await db_api.getRecord('users', {name: username});
if (!user) { logger.error(`User ${username} not found`); return false } if (!user) {
if (config_api.getConfigItem('ytdl_auth_method') === 'internal') logger.error(`User ${username} not found`);
return false;
}
if (user.auth_method && user.auth_method !== 'internal') { return false } if (user.auth_method && user.auth_method !== 'internal') { return false }
return await bcrypt.compare(password, user.passhash) ? user : false; return await bcrypt.compare(password, user.passhash) ? user : false;
} }

@ -55,17 +55,18 @@ async function getCategories() {
return categories ? categories : null; return categories ? categories : null;
} }
async function getCategoriesAsPlaylists(files = null) { async function getCategoriesAsPlaylists() {
const categories_as_playlists = []; const categories_as_playlists = [];
const available_categories = await getCategories(); const available_categories = await getCategories();
if (available_categories && files) { if (available_categories) {
for (let category of available_categories) { for (let category of available_categories) {
const files_that_match = utils.addUIDsToCategory(category, files); const files_that_match = await db_api.getRecords('files', {'category.uid': category['uid']});
if (files_that_match && files_that_match.length > 0) { if (files_that_match && files_that_match.length > 0) {
category['thumbnailURL'] = files_that_match[0].thumbnailURL; category['thumbnailURL'] = files_that_match[0].thumbnailURL;
category['thumbnailPath'] = files_that_match[0].thumbnailPath; category['thumbnailPath'] = files_that_match[0].thumbnailPath;
category['duration'] = files_that_match.reduce((a, b) => a + utils.durationStringToNumber(b.duration), 0); category['duration'] = files_that_match.reduce((a, b) => a + utils.durationStringToNumber(b.duration), 0);
category['id'] = category['uid']; category['id'] = category['uid'];
category['auto'] = true;
categories_as_playlists.push(category); categories_as_playlists.push(category);
} }
} }

@ -127,7 +127,7 @@ function setConfigItem(key, value) {
success = setConfigFile(config_json); success = setConfigFile(config_json);
return success; return success;
}; }
function setConfigItems(items) { function setConfigItems(items) {
let success = false; let success = false;

@ -387,9 +387,9 @@ exports.getPlaylist = async (playlist_id, user_uid = null, require_sharing = fal
if (!playlist) { if (!playlist) {
playlist = await exports.getRecord('categories', {uid: playlist_id}); playlist = await exports.getRecord('categories', {uid: playlist_id});
if (playlist) { if (playlist) {
// category found const uids = (await exports.getRecords('files', {'category.uid': playlist_id})).map(file => file.uid);
const files = await exports.getFiles(user_uid); playlist['uids'] = uids;
utils.addUIDsToCategory(playlist, files); playlist['auto'] = true;
} }
} }
@ -629,7 +629,7 @@ exports.bulkInsertRecordsIntoTable = async (table, docs) => {
exports.getRecord = async (table, filter_obj) => { exports.getRecord = async (table, filter_obj) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
return applyFilterLocalDB(local_db.get(table), filter_obj, 'find').value(); return exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'find').value();
} }
return await database.collection(table).findOne(filter_obj); return await database.collection(table).findOne(filter_obj);
@ -638,7 +638,7 @@ exports.getRecord = async (table, filter_obj) => {
exports.getRecords = async (table, filter_obj = null, return_count = false, sort = null, range = null) => { exports.getRecords = async (table, filter_obj = null, return_count = false, sort = null, range = null) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
let cursor = filter_obj ? applyFilterLocalDB(local_db.get(table), filter_obj, 'filter').value() : local_db.get(table).value(); let cursor = filter_obj ? exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'filter').value() : local_db.get(table).value();
if (sort) { if (sort) {
cursor = cursor.sort((a, b) => (a[sort['by']] > b[sort['by']] ? sort['order'] : sort['order']*-1)); cursor = cursor.sort((a, b) => (a[sort['by']] > b[sort['by']] ? sort['order'] : sort['order']*-1));
} }
@ -664,7 +664,7 @@ exports.getRecords = async (table, filter_obj = null, return_count = false, sort
exports.updateRecord = async (table, filter_obj, update_obj) => { exports.updateRecord = async (table, filter_obj, update_obj) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
applyFilterLocalDB(local_db.get(table), filter_obj, 'find').assign(update_obj).write(); exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'find').assign(update_obj).write();
return true; return true;
} }
@ -677,7 +677,7 @@ exports.updateRecord = async (table, filter_obj, update_obj) => {
exports.updateRecords = async (table, filter_obj, update_obj) => { exports.updateRecords = async (table, filter_obj, update_obj) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
applyFilterLocalDB(local_db.get(table), filter_obj, 'filter').assign(update_obj).write(); exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'filter').assign(update_obj).write();
return true; return true;
} }
@ -722,7 +722,7 @@ exports.bulkUpdateRecords = async (table, key_label, update_obj) => {
exports.pushToRecordsArray = async (table, filter_obj, key, value) => { exports.pushToRecordsArray = async (table, filter_obj, key, value) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
applyFilterLocalDB(local_db.get(table), filter_obj, 'find').get(key).push(value).write(); exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'find').get(key).push(value).write();
return true; return true;
} }
@ -733,7 +733,7 @@ exports.pushToRecordsArray = async (table, filter_obj, key, value) => {
exports.pullFromRecordsArray = async (table, filter_obj, key, value) => { exports.pullFromRecordsArray = async (table, filter_obj, key, value) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
applyFilterLocalDB(local_db.get(table), filter_obj, 'find').get(key).pull(value).write(); exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'find').get(key).pull(value).write();
return true; return true;
} }
@ -746,7 +746,7 @@ exports.pullFromRecordsArray = async (table, filter_obj, key, value) => {
exports.removeRecord = async (table, filter_obj) => { exports.removeRecord = async (table, filter_obj) => {
// local db override // local db override
if (using_local_db) { if (using_local_db) {
applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write(); exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write();
return true; return true;
} }
@ -757,7 +757,7 @@ exports.removeRecord = async (table, filter_obj) => {
// exports.removeRecordsByUIDBulk = async (table, uids) => { // exports.removeRecordsByUIDBulk = async (table, uids) => {
// // local db override // // local db override
// if (using_local_db) { // if (using_local_db) {
// applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write(); // exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write();
// return true; // return true;
// } // }
@ -821,7 +821,7 @@ exports.removeAllRecords = async (table = null, filter_obj = null) => {
if (using_local_db) { if (using_local_db) {
for (let i = 0; i < tables_to_remove.length; i++) { for (let i = 0; i < tables_to_remove.length; i++) {
const table_to_remove = tables_to_remove[i]; const table_to_remove = tables_to_remove[i];
if (filter_obj) applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write(); if (filter_obj) exports.applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write();
else local_db.assign({[table_to_remove]: []}).write(); else local_db.assign({[table_to_remove]: []}).write();
logger.debug(`Successfully removed records from ${table_to_remove}`); logger.debug(`Successfully removed records from ${table_to_remove}`);
} }
@ -1075,8 +1075,13 @@ exports.transferDB = async (local_to_remote) => {
This function is necessary to emulate mongodb's ability to search for null or missing values. This function is necessary to emulate mongodb's ability to search for null or missing values.
A filter of null or undefined for a property will find docs that have that property missing, or have it A filter of null or undefined for a property will find docs that have that property missing, or have it
null or undefined. We want that same functionality for the local DB as well null or undefined. We want that same functionality for the local DB as well
error: {$ne: null}
^ ^
| |
filter_prop filter_prop_value
*/ */
const applyFilterLocalDB = (db_path, filter_obj, operation) => { exports.applyFilterLocalDB = (db_path, filter_obj, operation) => {
const filter_props = Object.keys(filter_obj); const filter_props = Object.keys(filter_obj);
const return_val = db_path[operation](record => { const return_val = db_path[operation](record => {
if (!filter_props) return true; if (!filter_props) return true;
@ -1085,14 +1090,20 @@ const applyFilterLocalDB = (db_path, filter_obj, operation) => {
const filter_prop = filter_props[i]; const filter_prop = filter_props[i];
const filter_prop_value = filter_obj[filter_prop]; const filter_prop_value = filter_obj[filter_prop];
if (filter_prop_value === undefined || filter_prop_value === null) { if (filter_prop_value === undefined || filter_prop_value === null) {
filtered &= record[filter_prop] === undefined || record[filter_prop] === null filtered &= record[filter_prop] === undefined || record[filter_prop] === null;
} else { } else {
if (typeof filter_prop_value === 'object') { if (typeof filter_prop_value === 'object') {
if (filter_prop_value['$regex']) { if ('$regex' in filter_prop_value) {
filtered &= (record[filter_prop].search(new RegExp(filter_prop_value['$regex'], filter_prop_value['$options'])) !== -1); filtered &= (record[filter_prop].search(new RegExp(filter_prop_value['$regex'], filter_prop_value['$options'])) !== -1);
} else if ('$ne' in filter_prop_value) {
filtered &= filter_prop in record && record[filter_prop] !== filter_prop_value['$ne'];
} }
} else { } else {
filtered &= record[filter_prop] === filter_prop_value; // handle case of nested property check
if (filter_prop.includes('.'))
filtered &= utils.searchObjectByString(record, filter_prop) === filter_prop_value;
else
filtered &= record[filter_prop] === filter_prop_value;
} }
} }
} }

@ -108,6 +108,7 @@ exports.clearDownload = async (download_uid) => {
} }
async function handleDownloadError(download_uid, error_message) { async function handleDownloadError(download_uid, error_message) {
if (!download_uid) return;
await db_api.updateRecord('download_queue', {uid: download_uid}, {error: error_message, finished: true, running: false}); await db_api.updateRecord('download_queue', {uid: download_uid}, {error: error_message, finished: true, running: false});
} }
@ -186,7 +187,7 @@ async function collectInfo(download_uid) {
let args = await exports.generateArgs(url, type, options, download['user_uid']); let args = await exports.generateArgs(url, type, options, download['user_uid']);
// get video info prior to download // get video info prior to download
let info = await getVideoInfoByURL(url, args, download_uid); let info = await exports.getVideoInfoByURL(url, args, download_uid);
if (!info) { if (!info) {
// info failed, error presumably already recorded // info failed, error presumably already recorded
@ -203,9 +204,11 @@ async function collectInfo(download_uid) {
options.customOutput = category['custom_output']; options.customOutput = category['custom_output'];
options.noRelativePath = true; options.noRelativePath = true;
args = await exports.generateArgs(url, type, options, download['user_uid']); args = await exports.generateArgs(url, type, options, download['user_uid']);
info = await getVideoInfoByURL(url, args, download_uid); info = await exports.getVideoInfoByURL(url, args, download_uid);
} }
download['category'] = category;
// setup info required to calculate download progress // setup info required to calculate download progress
const expected_file_size = utils.getExpectedFileSize(info); const expected_file_size = utils.getExpectedFileSize(info);
@ -507,7 +510,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f
return downloadConfig; return downloadConfig;
} }
async function getVideoInfoByURL(url, args = [], download_uid = null) { exports.getVideoInfoByURL = async (url, args = [], download_uid = null) => {
return new Promise(resolve => { return new Promise(resolve => {
// remove bad args // remove bad args
const new_args = [...args]; const new_args = [...args];

@ -148,6 +148,7 @@ exports.updateTaskSchedule = async (task_key, schedule) => {
await db_api.updateRecord('tasks', {key: task_key}, {schedule: schedule}); await db_api.updateRecord('tasks', {key: task_key}, {schedule: schedule});
if (TASKS[task_key]['job']) { if (TASKS[task_key]['job']) {
TASKS[task_key]['job'].cancel(); TASKS[task_key]['job'].cancel();
TASKS[task_key]['job'] = null;
} }
if (schedule) { if (schedule) {
TASKS[task_key]['job'] = scheduleJob(task_key, schedule); TASKS[task_key]['job'] = scheduleJob(task_key, schedule);

@ -42,6 +42,25 @@ const { uuid } = require('uuidv4');
db_api.initialize(db, users_db); db_api.initialize(db, users_db);
const sample_video_json = {
id: "Sample Video",
title: "Sample Video",
thumbnailURL: "https://sampleurl.jpg",
isAudio: false,
duration: 177.413,
url: "sampleurl.com",
uploader: "Sample Uploader",
size: 2838445,
path: "users\\admin\\video\\Sample Video.mp4",
upload_date: "2017-07-28",
description: null,
view_count: 230,
abr: 128,
thumbnailPath: null,
user_uid: "admin",
uid: "1ada04ab-2773-4dd4-bbdd-3e2d40761c50",
registered: 1628469039377
}
describe('Database', async function() { describe('Database', async function() {
describe('Import', async function() { describe('Import', async function() {
@ -214,7 +233,7 @@ describe('Database', async function() {
for (let i = 0; i < NUM_RECORDS_TO_ADD; i++) { for (let i = 0; i < NUM_RECORDS_TO_ADD; i++) {
const uid = uuid(); const uid = uuid();
if (i === NUM_RECORDS_TO_ADD/2) random_uid = uid; if (i === NUM_RECORDS_TO_ADD/2) random_uid = uid;
test_records.push({"id":"A$AP Mob - Yamborghini High (Official Music Video) ft. Juicy J","title":"A$AP Mob - Yamborghini High (Official Music Video) ft. Juicy J","thumbnailURL":"https://i.ytimg.com/vi/tt7gP_IW-1w/maxresdefault.jpg","isAudio":true,"duration":312,"url":"https://www.youtube.com/watch?v=tt7gP_IW-1w","uploader":"asapmobVEVO","size":5060157,"path":"audio\\A$AP Mob - Yamborghini High (Official Music Video) ft. Juicy J.mp3","upload_date":"2016-05-11","description":"A$AP Mob ft. Juicy J - \"Yamborghini High\" Get it now on:\niTunes: http://smarturl.it/iYAMH?IQid=yt\nListen on Spotify: http://smarturl.it/sYAMH?IQid=yt\nGoogle Play: http://smarturl.it/gYAMH?IQid=yt\nAmazon: http://smarturl.it/aYAMH?IQid=yt\n\nFollow A$AP Mob:\nhttps://www.facebook.com/asapmobofficial\nhttps://twitter.com/ASAPMOB\nhttp://instagram.com/asapmob \nhttp://www.asapmob.com/\n\n#AsapMob #YamborghiniHigh #Vevo #HipHop #OfficialMusicVideo #JuicyJ","view_count":118689353,"height":null,"abr":160,"uid": uid,"registered":1626672120632}); test_records.push({"id":"RandomTextRandomText","title":"RandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomText","thumbnailURL":"https://i.ytimg.com/vi/randomurl/maxresdefault.jpg","isAudio":true,"duration":312,"url":"https://www.youtube.com/watch?v=randomvideo","uploader":"randomUploader","size":5060157,"path":"audio\\RandomTextRandomText.mp3","upload_date":"2016-05-11","description":"RandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomTextRandomText","view_count":118689353,"height":null,"abr":160,"uid": uid,"registered":1626672120632});
} }
const insert_start = Date.now(); const insert_start = Date.now();
let success = await db_api.bulkInsertRecordsIntoTable('test', test_records); let success = await db_api.bulkInsertRecordsIntoTable('test', test_records);
@ -235,6 +254,30 @@ describe('Database', async function() {
assert(success); assert(success);
}); });
}); });
describe('Local DB Filters', async function() {
it('Basic', async function() {
const result = db_api.applyFilterLocalDB([{test: 'test'}, {test: 'test1'}], {test: 'test'}, 'find');
assert(result && result['test'] === 'test');
});
it('Regex', async function() {
const filter = {$regex: `\\w+\\d`, $options: 'i'};
const result = db_api.applyFilterLocalDB([{test: 'test'}, {test: 'test1'}], {test: filter}, 'find');
assert(result && result['test'] === 'test1');
});
it('Not equals', async function() {
const filter = {$ne: 'test'};
const result = db_api.applyFilterLocalDB([{test: 'test'}, {test: 'test1'}], {test: filter}, 'find');
assert(result && result['test'] === 'test1');
});
it('Nested', async function() {
const result = db_api.applyFilterLocalDB([{test1: {test2: 'test3'}}, {test4: 'test5'}], {'test1.test2': 'test3'}, 'find');
assert(result && result['test1']['test2'] === 'test3');
});
})
}); });
describe('Multi User', async function() { describe('Multi User', async function() {
@ -253,10 +296,12 @@ describe('Multi User', async function() {
assert(user); assert(user);
}); });
}); });
describe('Video player - normal', function() { describe('Video player - normal', async function() {
const video_to_test = 'ebbcfffb-d6f1-4510-ad25-d1ec82e0477e'; await db_api.removeRecord('files', {uid: sample_video_json['uid']});
await db_api.insertRecordIntoTable('files', sample_video_json);
const video_to_test = sample_video_json['uid'];
it('Get video', async function() { it('Get video', async function() {
const video_obj = db_api.getVideo(video_to_test, 'admin'); const video_obj = await db_api.getVideo(video_to_test);
assert(video_obj); assert(video_obj);
}); });
@ -341,7 +386,9 @@ describe('Downloader', function() {
}); });
it('Get file info', async function() { it('Get file info', async function() {
this.timeout(300000);
const info = await downloader_api.getVideoInfoByURL(url);
assert(!!info);
}); });
it('Download file', async function() { it('Download file', async function() {
@ -360,20 +407,23 @@ describe('Downloader', function() {
}); });
it('Pause file', async function() { it('Pause file', async function() {
const returned_download = await downloader_api.createDownload(url, 'video', options);
await downloader_api.pauseDownload(returned_download['uid']);
const updated_download = await db_api.getRecord('download_queue', {uid: returned_download['uid']});
assert(updated_download['paused'] && !updated_download['running']);
}); });
it('Generate args', async function() { it('Generate args', async function() {
const args = await downloader_api.generateArgs(url, 'video', options); const args = await downloader_api.generateArgs(url, 'video', options);
console.log(args); assert(args.length > 0);
}); });
it('Generate args - subscription', async function() { it('Generate args - subscription', async function() {
subscriptions_api.initialize(db_api, logger);
const sub = await subscriptions_api.getSubscription(sub_id); const sub = await subscriptions_api.getSubscription(sub_id);
const sub_options = subscriptions_api.generateOptionsForSubscriptionDownload(sub, 'admin'); const sub_options = subscriptions_api.generateOptionsForSubscriptionDownload(sub, 'admin');
const args = await downloader_api.generateArgs(url, 'video', sub_options, 'admin'); const args_normal = await downloader_api.generateArgs(url, 'video', options);
console.log(args); const args_sub = await downloader_api.generateArgs(url, 'video', sub_options, 'admin');
console.log(JSON.stringify(args_normal) !== JSON.stringify(args_sub));
}); });
it('Generate kodi NFO file', async function() { it('Generate kodi NFO file', async function() {
@ -417,7 +467,7 @@ describe('Tasks', function() {
}; };
tasks_api.TASKS['dummy_task'] = dummy_task; tasks_api.TASKS['dummy_task'] = dummy_task;
await tasks_api.initialize(); await tasks_api.setupTasks();
}); });
it('Backup db', async function() { it('Backup db', async function() {
const backups_original = await utils.recFindByExt('appdata', 'bak'); const backups_original = await utils.recFindByExt('appdata', 'bak');
@ -429,12 +479,13 @@ describe('Tasks', function() {
}); });
it('Check for missing files', async function() { it('Check for missing files', async function() {
this.timeout(300000);
await db_api.removeAllRecords('files', {uid: 'test'}); await db_api.removeAllRecords('files', {uid: 'test'});
const test_missing_file = {uid: 'test', path: 'test/missing_file.mp4'}; const test_missing_file = {uid: 'test', path: 'test/missing_file.mp4'};
await db_api.insertRecordIntoTable('files', test_missing_file); await db_api.insertRecordIntoTable('files', test_missing_file);
await tasks_api.executeTask('missing_files_check'); await tasks_api.executeTask('missing_files_check');
const task_obj = await db_api.getRecord('tasks', {key: 'missing_files_check'}); const missing_file_db_record = await db_api.getRecord('files', {uid: 'test'});
assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); assert(!missing_file_db_record, true);
}); });
it('Check for duplicate files', async function() { it('Check for duplicate files', async function() {
@ -447,10 +498,13 @@ describe('Tasks', function() {
await db_api.insertRecordIntoTable('files', test_duplicate_file1); await db_api.insertRecordIntoTable('files', test_duplicate_file1);
await db_api.insertRecordIntoTable('files', test_duplicate_file2); await db_api.insertRecordIntoTable('files', test_duplicate_file2);
await db_api.insertRecordIntoTable('files', test_duplicate_file3); await db_api.insertRecordIntoTable('files', test_duplicate_file3);
await tasks_api.executeTask('duplicate_files_check');
await tasks_api.executeRun('duplicate_files_check');
const task_obj = await db_api.getRecord('tasks', {key: 'duplicate_files_check'}); const task_obj = await db_api.getRecord('tasks', {key: 'duplicate_files_check'});
const duplicated_record_count = await db_api.getRecords('files', {path: 'test/missing_file.mp4'}, true);
assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true);
await tasks_api.executeTask('duplicate_files_check');
const duplicated_record_count = await db_api.getRecords('files', {path: 'test/missing_file.mp4'}, true);
assert(duplicated_record_count == 1, true); assert(duplicated_record_count == 1, true);
}); });
@ -475,22 +529,36 @@ describe('Tasks', function() {
}); });
it('Schedule and cancel task', async function() { it('Schedule and cancel task', async function() {
const today_4_hours = new Date(); this.timeout(5000);
today_4_hours.setHours(today_4_hours.getHours() + 4); const today_one_year = new Date();
await tasks_api.updateTaskSchedule('dummy_task', today_4_hours); today_one_year.setFullYear(today_one_year.getFullYear() + 1);
assert(!!tasks_api.TASKS['dummy_task']['job'], true); const schedule_obj = {
type: 'timestamp',
data: { timestamp: today_one_year.getTime() }
}
await tasks_api.updateTaskSchedule('dummy_task', schedule_obj);
const dummy_task = await db_api.getRecord('tasks', {key: 'dummy_task'});
assert(!!tasks_api.TASKS['dummy_task']['job']);
assert(!!dummy_task['schedule']);
await tasks_api.updateTaskSchedule('dummy_task', null); await tasks_api.updateTaskSchedule('dummy_task', null);
assert(!!tasks_api.TASKS['dummy_task']['job'], false); const dummy_task_updated = await db_api.getRecord('tasks', {key: 'dummy_task'});
assert(!tasks_api.TASKS['dummy_task']['job']);
assert(!dummy_task_updated['schedule']);
}); });
it('Schedule and run task', async function() { it('Schedule and run task', async function() {
this.timeout(5000); this.timeout(5000);
const today_1_second = new Date(); const today_1_second = new Date();
today_1_second.setSeconds(today_1_second.getSeconds() + 1); today_1_second.setSeconds(today_1_second.getSeconds() + 1);
await tasks_api.updateTaskSchedule('dummy_task', today_1_second); const schedule_obj = {
assert(!!tasks_api.TASKS['dummy_task']['job'], true); type: 'timestamp',
data: { timestamp: today_1_second.getTime() }
}
await tasks_api.updateTaskSchedule('dummy_task', schedule_obj);
assert(!!tasks_api.TASKS['dummy_task']['job']);
await utils.wait(2000); await utils.wait(2000);
const dummy_task_obj = await db_api.getRecord('tasks', {key: 'dummy_task'}); const dummy_task_obj = await db_api.getRecord('tasks', {key: 'dummy_task'});
assert(dummy_task_obj['data'], true); assert(dummy_task_obj['data']);
}); });
}); });

@ -456,6 +456,21 @@ function injectArgs(original_args, new_args) {
return updated_args; return updated_args;
} }
const searchObjectByString = function(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
} else {
return;
}
}
return o;
}
// objects // objects
function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) {
@ -489,7 +504,6 @@ module.exports = {
createContainerZipFile: createContainerZipFile, createContainerZipFile: createContainerZipFile,
durationStringToNumber: durationStringToNumber, durationStringToNumber: durationStringToNumber,
getMatchingCategoryFiles: getMatchingCategoryFiles, getMatchingCategoryFiles: getMatchingCategoryFiles,
addUIDsToCategory: addUIDsToCategory,
getCurrentDownloader: getCurrentDownloader, getCurrentDownloader: getCurrentDownloader,
recFindByExt: recFindByExt, recFindByExt: recFindByExt,
removeFileExtension: removeFileExtension, removeFileExtension: removeFileExtension,
@ -501,5 +515,6 @@ module.exports = {
fetchFile: fetchFile, fetchFile: fetchFile,
restartServer: restartServer, restartServer: restartServer,
injectArgs: injectArgs, injectArgs: injectArgs,
searchObjectByString: searchObjectByString,
File: File File: File
} }

@ -90,7 +90,7 @@ exports.updateYoutubeDL = async (latest_update_version) => {
exports.verifyBinaryExistsLinux = () => { exports.verifyBinaryExistsLinux = () => {
const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH);
if (!is_windows && details_json && details_json['path'] && details_json['path'].includes('.exe')) { if (!is_windows && details_json && (details_json['path'].includes('.exe') || !details_json['path'])) {
details_json['path'] = 'node_modules/youtube-dl/bin/youtube-dl'; details_json['path'] = 'node_modules/youtube-dl/bin/youtube-dl';
details_json['exec'] = 'youtube-dl'; details_json['exec'] = 'youtube-dl';
details_json['version'] = OUTDATED_VERSION; details_json['version'] = OUTDATED_VERSION;

59
package-lock.json generated

@ -3295,65 +3295,12 @@
"safer-buffer": "~2.1.0" "safer-buffer": "~2.1.0"
} }
}, },
"asn1.js": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
"integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
"dev": true,
"requires": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0",
"safer-buffer": "^2.1.0"
},
"dependencies": {
"bn.js": {
"version": "4.11.9",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
"integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
"dev": true
}
}
},
"assert": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
"integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
"dev": true,
"requires": {
"object-assign": "^4.1.1",
"util": "0.10.3"
},
"dependencies": {
"inherits": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
"integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
"dev": true
},
"util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
"dev": true,
"requires": {
"inherits": "2.0.1"
}
}
}
},
"assert-plus": { "assert-plus": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true "dev": true
}, },
"assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
"ast-types-flow": { "ast-types-flow": {
"version": "0.0.7", "version": "0.0.7",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
@ -3367,9 +3314,9 @@
"dev": true "dev": true
}, },
"async": { "async": {
"version": "2.6.3", "version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"dev": true, "dev": true,
"requires": { "requires": {
"lodash": "^4.17.14" "lodash": "^4.17.14"

@ -4,6 +4,7 @@
export type { AddFileToPlaylistRequest } from './models/AddFileToPlaylistRequest'; export type { AddFileToPlaylistRequest } from './models/AddFileToPlaylistRequest';
export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest'; export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest';
export type { binary } from './models/binary';
export type { body_19 } from './models/body_19'; export type { body_19 } from './models/body_19';
export type { body_20 } from './models/body_20'; export type { body_20 } from './models/body_20';
export type { Category } from './models/Category'; export type { Category } from './models/Category';
@ -12,6 +13,7 @@ export type { ChangeRolePermissionsRequest } from './models/ChangeRolePermission
export type { ChangeUserPermissionsRequest } from './models/ChangeUserPermissionsRequest'; export type { ChangeUserPermissionsRequest } from './models/ChangeUserPermissionsRequest';
export type { CheckConcurrentStreamRequest } from './models/CheckConcurrentStreamRequest'; export type { CheckConcurrentStreamRequest } from './models/CheckConcurrentStreamRequest';
export type { CheckConcurrentStreamResponse } from './models/CheckConcurrentStreamResponse'; export type { CheckConcurrentStreamResponse } from './models/CheckConcurrentStreamResponse';
export type { ClearDownloadsRequest } from './models/ClearDownloadsRequest';
export type { ConcurrentStream } from './models/ConcurrentStream'; export type { ConcurrentStream } from './models/ConcurrentStream';
export type { Config } from './models/Config'; export type { Config } from './models/Config';
export type { ConfigResponse } from './models/ConfigResponse'; export type { ConfigResponse } from './models/ConfigResponse';
@ -23,6 +25,7 @@ export type { CropFileSettings } from './models/CropFileSettings';
export type { DatabaseFile } from './models/DatabaseFile'; export type { DatabaseFile } from './models/DatabaseFile';
export { DBBackup } from './models/DBBackup'; export { DBBackup } from './models/DBBackup';
export type { DBInfoResponse } from './models/DBInfoResponse'; export type { DBInfoResponse } from './models/DBInfoResponse';
export type { DeleteAllFilesResponse } from './models/DeleteAllFilesResponse';
export type { DeleteCategoryRequest } from './models/DeleteCategoryRequest'; export type { DeleteCategoryRequest } from './models/DeleteCategoryRequest';
export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request';
export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest'; export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest';
@ -36,7 +39,6 @@ export type { DownloadResponse } from './models/DownloadResponse';
export type { DownloadTwitchChatByVODIDRequest } from './models/DownloadTwitchChatByVODIDRequest'; export type { DownloadTwitchChatByVODIDRequest } from './models/DownloadTwitchChatByVODIDRequest';
export type { DownloadTwitchChatByVODIDResponse } from './models/DownloadTwitchChatByVODIDResponse'; export type { DownloadTwitchChatByVODIDResponse } from './models/DownloadTwitchChatByVODIDResponse';
export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest'; export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest';
export type { File } from './models/File';
export { FileType } from './models/FileType'; export { FileType } from './models/FileType';
export type { GenerateArgsResponse } from './models/GenerateArgsResponse'; export type { GenerateArgsResponse } from './models/GenerateArgsResponse';
export type { GenerateNewApiKeyResponse } from './models/GenerateNewApiKeyResponse'; export type { GenerateNewApiKeyResponse } from './models/GenerateNewApiKeyResponse';
@ -98,6 +100,7 @@ export type { UpdateCategoriesRequest } from './models/UpdateCategoriesRequest';
export type { UpdateCategoryRequest } from './models/UpdateCategoryRequest'; export type { UpdateCategoryRequest } from './models/UpdateCategoryRequest';
export type { UpdateConcurrentStreamRequest } from './models/UpdateConcurrentStreamRequest'; export type { UpdateConcurrentStreamRequest } from './models/UpdateConcurrentStreamRequest';
export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentStreamResponse'; export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentStreamResponse';
export type { UpdateFileRequest } from './models/UpdateFileRequest';
export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest';
export type { UpdaterStatus } from './models/UpdaterStatus'; export type { UpdaterStatus } from './models/UpdaterStatus';
export type { UpdateServerRequest } from './models/UpdateServerRequest'; export type { UpdateServerRequest } from './models/UpdateServerRequest';

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type AddFileToPlaylistRequest = {
export interface AddFileToPlaylistRequest {
file_uid: string; file_uid: string;
playlist_id: string; playlist_id: string;
} };

@ -2,10 +2,10 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { UserPermission } from './UserPermission'; import type { UserPermission } from './UserPermission';
import { YesNo } from './YesNo'; import type { YesNo } from './YesNo';
export interface BaseChangePermissionsRequest { export type BaseChangePermissionsRequest = {
permission: UserPermission; permission: UserPermission;
new_value: YesNo; new_value: YesNo;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { CategoryRule } from './CategoryRule'; import type { CategoryRule } from './CategoryRule';
export interface Category { export type Category = {
name?: string; name?: string;
uid?: string; uid?: string;
rules?: Array<CategoryRule>; rules?: Array<CategoryRule>;
@ -12,4 +12,4 @@ export interface Category {
* Overrides file output for downloaded files in category * Overrides file output for downloaded files in category
*/ */
custom_output?: string; custom_output?: string;
} };

@ -2,11 +2,10 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type CategoryRule = {
export interface CategoryRule {
preceding_operator?: CategoryRule.preceding_operator; preceding_operator?: CategoryRule.preceding_operator;
comparator?: CategoryRule.comparator; comparator?: CategoryRule.comparator;
} };
export namespace CategoryRule { export namespace CategoryRule {

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; import type { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest';
export interface ChangeRolePermissionsRequest extends BaseChangePermissionsRequest { export type ChangeRolePermissionsRequest = (BaseChangePermissionsRequest & {
role: string; role: string;
} });

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; import type { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest';
export interface ChangeUserPermissionsRequest extends BaseChangePermissionsRequest { export type ChangeUserPermissionsRequest = (BaseChangePermissionsRequest & {
user_uid: string; user_uid: string;
} });

@ -2,10 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type CheckConcurrentStreamRequest = {
export interface CheckConcurrentStreamRequest {
/** /**
* UID of the concurrent stream * UID of the concurrent stream
*/ */
uid: string; uid: string;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { ConcurrentStream } from './ConcurrentStream'; import type { ConcurrentStream } from './ConcurrentStream';
export interface CheckConcurrentStreamResponse { export type CheckConcurrentStreamResponse = {
stream: ConcurrentStream; stream: ConcurrentStream;
} };

@ -0,0 +1,9 @@
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type ClearDownloadsRequest = {
clear_finished?: boolean;
clear_paused?: boolean;
clear_errors?: boolean;
};

@ -2,9 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type ConcurrentStream = {
export interface ConcurrentStream {
playback_timestamp?: number; playback_timestamp?: number;
unix_timestamp?: number; unix_timestamp?: number;
playing?: boolean; playing?: boolean;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type Config = {
export interface Config {
YoutubeDLMaterial: any; YoutubeDLMaterial: any;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Config } from './Config'; import type { Config } from './Config';
export interface ConfigResponse { export type ConfigResponse = {
config_file: Config; config_file: Config;
success: boolean; success: boolean;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type CreateCategoryRequest = {
export interface CreateCategoryRequest {
name: string; name: string;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Category } from './Category'; import type { Category } from './Category';
export interface CreateCategoryResponse { export type CreateCategoryResponse = {
new_category?: Category; new_category?: Category;
success?: boolean; success?: boolean;
} };

@ -2,11 +2,11 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface CreatePlaylistRequest { export type CreatePlaylistRequest = {
playlistName: string; playlistName: string;
uids: Array<string>; uids: Array<string>;
type: FileType; type: FileType;
thumbnailURL: string; thumbnailURL: string;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Playlist } from './Playlist'; import type { Playlist } from './Playlist';
export interface CreatePlaylistResponse { export type CreatePlaylistResponse = {
new_playlist: Playlist; new_playlist: Playlist;
success: boolean; success: boolean;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type CropFileSettings = {
export interface CropFileSettings {
cropFileStart: number; cropFileStart: number;
cropFileEnd: number; cropFileEnd: number;
} };

@ -2,13 +2,12 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type DBBackup = {
export interface DBBackup {
name: string; name: string;
timestamp: number; timestamp: number;
size: number; size: number;
source: DBBackup.source; source: DBBackup.source;
} };
export namespace DBBackup { export namespace DBBackup {

@ -2,17 +2,17 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { TableInfo } from './TableInfo'; import type { TableInfo } from './TableInfo';
export interface DBInfoResponse { export type DBInfoResponse = {
using_local_db?: boolean; using_local_db?: boolean;
stats_by_table?: { stats_by_table?: {
files?: TableInfo, files?: TableInfo;
playlists?: TableInfo, playlists?: TableInfo;
categories?: TableInfo, categories?: TableInfo;
subscriptions?: TableInfo, subscriptions?: TableInfo;
users?: TableInfo, users?: TableInfo;
roles?: TableInfo, roles?: TableInfo;
download_queue?: TableInfo, download_queue?: TableInfo;
}; };
} };

@ -2,11 +2,16 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { Category } from './Category';
export interface DatabaseFile { export type DatabaseFile = {
id: string; id: string;
title: string; title: string;
/**
* Backup if thumbnailPath is not defined
*/
thumbnailURL: string; thumbnailURL: string;
thumbnailPath?: string;
isAudio: boolean; isAudio: boolean;
/** /**
* In seconds * In seconds
@ -14,9 +19,15 @@ export interface DatabaseFile {
duration: number; duration: number;
url: string; url: string;
uploader: string; uploader: string;
/**
* In bytes
*/
size: number; size: number;
path: string; path: string;
upload_date: string; upload_date: string;
uid: string; uid: string;
sharingEnabled?: boolean; sharingEnabled?: boolean;
} category?: Category;
view_count?: number;
local_view_count?: number;
};

@ -0,0 +1,14 @@
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type DeleteAllFilesResponse = {
/**
* Number of files found matching search parameters
*/
file_count?: number;
/**
* Number of files removed
*/
delete_count?: number;
};

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type DeleteCategoryRequest = {
export interface DeleteCategoryRequest {
category_uid: string; category_uid: string;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type DeleteMp3Mp4Request = {
export interface DeleteMp3Mp4Request {
uid: string; uid: string;
blacklistMode?: boolean; blacklistMode?: boolean;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface DeletePlaylistRequest { export type DeletePlaylistRequest = {
playlist_id: string; playlist_id: string;
type: FileType; type: FileType;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { SubscriptionRequestData } from './SubscriptionRequestData'; import type { SubscriptionRequestData } from './SubscriptionRequestData';
export interface DeleteSubscriptionFileRequest { export type DeleteSubscriptionFileRequest = {
file: string; file: string;
file_uid?: string; file_uid?: string;
sub: SubscriptionRequestData; sub: SubscriptionRequestData;
@ -12,4 +12,4 @@ export interface DeleteSubscriptionFileRequest {
* If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings. * If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings.
*/ */
deleteForever?: boolean; deleteForever?: boolean;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type DeleteUserRequest = {
export interface DeleteUserRequest {
uid: string; uid: string;
} };

@ -1,7 +0,0 @@
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type Dictionary<T> = {
[key: string]: T;
}

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type Download = {
export interface Download {
uid: string; uid: string;
ui_uid?: string; ui_uid?: string;
running: boolean; running: boolean;
@ -23,4 +22,4 @@ export interface Download {
user_uid?: string; user_uid?: string;
sub_id?: string; sub_id?: string;
sub_name?: string; sub_name?: string;
} };

@ -2,9 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type DownloadArchiveRequest = {
export interface DownloadArchiveRequest {
sub: { sub: {
archive_dir: string, archive_dir: string;
}; };
} };

@ -2,13 +2,13 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface DownloadFileRequest { export type DownloadFileRequest = {
uid?: string; uid?: string;
uuid?: string; uuid?: string;
sub_id?: string; sub_id?: string;
playlist_id?: string; playlist_id?: string;
url?: string; url?: string;
type?: FileType; type?: FileType;
} };

@ -2,10 +2,10 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { CropFileSettings } from './CropFileSettings'; import type { CropFileSettings } from './CropFileSettings';
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface DownloadRequest { export type DownloadRequest = {
url: string; url: string;
/** /**
* Video format code. Overrides other quality options. * Video format code. Overrides other quality options.
@ -41,4 +41,4 @@ export interface DownloadRequest {
maxBitrate?: string; maxBitrate?: string;
type?: FileType; type?: FileType;
cropFileSettings?: CropFileSettings; cropFileSettings?: CropFileSettings;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Download } from './Download'; import type { Download } from './Download';
export interface DownloadResponse { export type DownloadResponse = {
download?: Download; download?: Download;
} };

@ -2,10 +2,10 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
import { Subscription } from './Subscription'; import type { Subscription } from './Subscription';
export interface DownloadTwitchChatByVODIDRequest { export type DownloadTwitchChatByVODIDRequest = {
/** /**
* File ID * File ID
*/ */
@ -20,4 +20,4 @@ export interface DownloadTwitchChatByVODIDRequest {
*/ */
uuid?: string; uuid?: string;
sub?: Subscription; sub?: Subscription;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { TwitchChatMessage } from './TwitchChatMessage'; import type { TwitchChatMessage } from './TwitchChatMessage';
export interface DownloadTwitchChatByVODIDResponse { export type DownloadTwitchChatByVODIDResponse = {
chat: Array<TwitchChatMessage>; chat: Array<TwitchChatMessage>;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type DownloadVideosForSubscriptionRequest = {
export interface DownloadVideosForSubscriptionRequest {
subID: string; subID: string;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export enum FileType { export enum FileType {
AUDIO = 'audio', AUDIO = 'audio',
VIDEO = 'video', VIDEO = 'video',

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GenerateArgsResponse = {
export interface GenerateArgsResponse {
args?: Array<string>; args?: Array<string>;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GenerateNewApiKeyResponse = {
export interface GenerateNewApiKeyResponse {
new_api_key: string; new_api_key: string;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Category } from './Category'; import type { Category } from './Category';
export interface GetAllCategoriesResponse { export type GetAllCategoriesResponse = {
categories: Array<Category>; categories: Array<Category>;
} };

@ -2,10 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetAllDownloadsRequest = {
export interface GetAllDownloadsRequest {
/** /**
* Filters downloads with the array * Filters downloads with the array
*/ */
uids?: Array<string> | null; uids?: Array<string> | null;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Download } from './Download'; import type { Download } from './Download';
export interface GetAllDownloadsResponse { export type GetAllDownloadsResponse = {
downloads?: Array<Download>; downloads?: Array<Download>;
} };

@ -2,13 +2,13 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { DatabaseFile } from './DatabaseFile'; import type { DatabaseFile } from './DatabaseFile';
import { Playlist } from './Playlist'; import type { Playlist } from './Playlist';
export interface GetAllFilesResponse { export type GetAllFilesResponse = {
files: Array<DatabaseFile>; files: Array<DatabaseFile>;
/** /**
* All video playlists * All video playlists
*/ */
playlists: Array<Playlist>; playlists: Array<Playlist>;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Subscription } from './Subscription'; import type { Subscription } from './Subscription';
export interface GetAllSubscriptionsResponse { export type GetAllSubscriptionsResponse = {
subscriptions: Array<Subscription>; subscriptions: Array<Subscription>;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Task } from './Task'; import type { Task } from './Task';
export interface GetAllTasksResponse { export type GetAllTasksResponse = {
tasks?: Array<Task>; tasks?: Array<Task>;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { DBBackup } from './DBBackup'; import type { DBBackup } from './DBBackup';
export interface GetDBBackupsResponse { export type GetDBBackupsResponse = {
tasks?: Array<DBBackup>; tasks?: Array<DBBackup>;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetDownloadRequest = {
export interface GetDownloadRequest {
download_uid: string; download_uid: string;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Download } from './Download'; import type { Download } from './Download';
export interface GetDownloadResponse { export type GetDownloadResponse = {
download?: Download; download?: Download;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetFileFormatsRequest = {
export interface GetFileFormatsRequest {
url?: string; url?: string;
} };

@ -2,11 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { File } from './File'; export type GetFileFormatsResponse = {
export interface GetFileFormatsResponse {
success: boolean; success: boolean;
result: { result: {
formats?: Array<any>, formats?: Array<any>;
}; };
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface GetFileRequest { export type GetFileRequest = {
/** /**
* Video UID * Video UID
*/ */
@ -14,4 +14,4 @@ export interface GetFileRequest {
* User UID * User UID
*/ */
uuid?: string; uuid?: string;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { DatabaseFile } from './DatabaseFile'; import type { DatabaseFile } from './DatabaseFile';
export interface GetFileResponse { export type GetFileResponse = {
success: boolean; success: boolean;
file?: DatabaseFile; file?: DatabaseFile;
} };

@ -2,10 +2,10 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
import { Subscription } from './Subscription'; import type { Subscription } from './Subscription';
export interface GetFullTwitchChatRequest { export type GetFullTwitchChatRequest = {
/** /**
* File ID * File ID
*/ */
@ -16,4 +16,4 @@ export interface GetFullTwitchChatRequest {
*/ */
uuid?: string; uuid?: string;
sub?: Subscription; sub?: Subscription;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetFullTwitchChatResponse = {
export interface GetFullTwitchChatResponse {
success: boolean; success: boolean;
error?: string; error?: string;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetLogsRequest = {
export interface GetLogsRequest {
lines?: number; lines?: number;
} };

@ -2,11 +2,10 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetLogsResponse = {
export interface GetLogsResponse {
/** /**
* Number of lines to retrieve from the bottom * Number of lines to retrieve from the bottom
*/ */
logs?: string; logs?: string;
success?: boolean; success?: boolean;
} };

@ -2,13 +2,13 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { DatabaseFile } from './DatabaseFile'; import type { DatabaseFile } from './DatabaseFile';
import { Playlist } from './Playlist'; import type { Playlist } from './Playlist';
export interface GetMp3sResponse { export type GetMp3sResponse = {
mp3s: Array<DatabaseFile>; mp3s: Array<DatabaseFile>;
/** /**
* All audio playlists * All audio playlists
*/ */
playlists: Array<Playlist>; playlists: Array<Playlist>;
} };

@ -2,13 +2,13 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { DatabaseFile } from './DatabaseFile'; import type { DatabaseFile } from './DatabaseFile';
import { Playlist } from './Playlist'; import type { Playlist } from './Playlist';
export interface GetMp4sResponse { export type GetMp4sResponse = {
mp4s: Array<DatabaseFile>; mp4s: Array<DatabaseFile>;
/** /**
* All video playlists * All video playlists
*/ */
playlists: Array<Playlist>; playlists: Array<Playlist>;
} };

@ -2,11 +2,11 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface GetPlaylistRequest { export type GetPlaylistRequest = {
playlist_id: string; playlist_id: string;
type?: FileType; type?: FileType;
uuid?: string; uuid?: string;
include_file_metadata?: boolean; include_file_metadata?: boolean;
} };

@ -2,11 +2,11 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
import { Playlist } from './Playlist'; import type { Playlist } from './Playlist';
export interface GetPlaylistResponse { export type GetPlaylistResponse = {
playlist: Playlist; playlist: Playlist;
type: FileType; type: FileType;
success: boolean; success: boolean;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetPlaylistsRequest = {
export interface GetPlaylistsRequest {
include_categories?: boolean; include_categories?: boolean;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Playlist } from './Playlist'; import type { Playlist } from './Playlist';
export interface GetPlaylistsResponse { export type GetPlaylistsResponse = {
playlists: Array<Playlist>; playlists: Array<Playlist>;
} };

@ -2,15 +2,15 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { UserPermission } from './UserPermission'; import type { UserPermission } from './UserPermission';
export interface GetRolesResponse { export type GetRolesResponse = {
roles: { roles: {
admin?: { admin?: {
permissions?: Array<UserPermission>, permissions?: Array<UserPermission>;
}, };
user?: { user?: {
permissions?: Array<UserPermission>, permissions?: Array<UserPermission>;
}, };
}; };
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetSubscriptionRequest = {
export interface GetSubscriptionRequest {
/** /**
* Subscription ID * Subscription ID
*/ */
@ -12,4 +11,4 @@ export interface GetSubscriptionRequest {
* Subscription name * Subscription name
*/ */
name?: string; name?: string;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Subscription } from './Subscription'; import type { Subscription } from './Subscription';
export interface GetSubscriptionResponse { export type GetSubscriptionResponse = {
subscription: Subscription; subscription: Subscription;
files: Array<any>; files: Array<any>;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type GetTaskRequest = {
export interface GetTaskRequest {
task_key: string; task_key: string;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Task } from './Task'; import type { Task } from './Task';
export interface GetTaskResponse { export type GetTaskResponse = {
task?: Task; task?: Task;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { User } from './User'; import type { User } from './User';
export interface GetUsersResponse { export type GetUsersResponse = {
users: Array<User>; users: Array<User>;
} };

@ -2,12 +2,11 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type IncrementViewCountRequest = {
export interface IncrementViewCountRequest {
file_uid: string; file_uid: string;
sub_id?: string; sub_id?: string;
/** /**
* User UID * User UID
*/ */
uuid?: string; uuid?: string;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type LoginRequest = {
export interface LoginRequest {
username: string; username: string;
password: string; password: string;
} };

@ -2,12 +2,12 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { User } from './User'; import type { User } from './User';
import { UserPermission } from './UserPermission'; import type { UserPermission } from './UserPermission';
export interface LoginResponse { export type LoginResponse = {
user?: User; user?: User;
token?: string; token?: string;
permissions?: Array<UserPermission>; permissions?: Array<UserPermission>;
available_permissions?: Array<UserPermission>; available_permissions?: Array<UserPermission>;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface Playlist { export type Playlist = {
name: string; name: string;
uids: Array<string>; uids: Array<string>;
id: string; id: string;
@ -13,4 +13,5 @@ export interface Playlist {
registered: number; registered: number;
duration: number; duration: number;
user_uid?: string; user_uid?: string;
} auto?: boolean;
};

@ -2,9 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type RegisterRequest = {
export interface RegisterRequest {
userid: string; userid: string;
username: string; username: string;
password: string; password: string;
} };

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { User } from './User'; import type { User } from './User';
export interface RegisterResponse { export type RegisterResponse = {
user?: User; user?: User;
} };

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type RestoreDBBackupRequest = {
export interface RestoreDBBackupRequest {
file_name: string; file_name: string;
} };

@ -2,16 +2,15 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type Schedule = {
export interface Schedule {
type: Schedule.type; type: Schedule.type;
data: { data: {
dayOfWeek?: Array<number>, dayOfWeek?: Array<number>;
hour?: number, hour?: number;
minute?: number, minute?: number;
timestamp?: number, timestamp?: number;
};
}; };
}
export namespace Schedule { export namespace Schedule {

@ -2,8 +2,8 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Config } from './Config'; import type { Config } from './Config';
export interface SetConfigRequest { export type SetConfigRequest = {
new_config_file: Config; new_config_file: Config;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type SharingToggle = {
export interface SharingToggle {
uid: string; uid: string;
is_playlist?: boolean; is_playlist?: boolean;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type SubscribeRequest = {
export interface SubscribeRequest {
name: string; name: string;
url: string; url: string;
timerange?: string; timerange?: string;
@ -11,4 +10,4 @@ export interface SubscribeRequest {
customArgs?: string; customArgs?: string;
customFileOutput?: string; customFileOutput?: string;
maxQuality?: string; maxQuality?: string;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { Subscription } from './Subscription'; import type { Subscription } from './Subscription';
export interface SubscribeResponse { export type SubscribeResponse = {
new_sub: Subscription; new_sub: Subscription;
error?: string; error?: string;
} };

@ -2,9 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface Subscription { export type Subscription = {
name: string; name: string;
url: string; url: string;
id: string; id: string;
@ -17,4 +17,4 @@ export interface Subscription {
custom_args?: string; custom_args?: string;
custom_output?: string; custom_output?: string;
videos: Array<any>; videos: Array<any>;
} };

@ -2,12 +2,12 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import { FileType } from './FileType'; import type { FileType } from './FileType';
export interface SubscriptionRequestData { export type SubscriptionRequestData = {
name: string; name: string;
id: string; id: string;
type?: FileType; type?: FileType;
isPlaylist?: boolean; isPlaylist?: boolean;
archive?: string; archive?: string;
} };

@ -2,7 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type SuccessObject = {
export interface SuccessObject {
success: boolean; success: boolean;
} error?: string;
};

@ -2,7 +2,6 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type TableInfo = {
export interface TableInfo {
records_count?: number; records_count?: number;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type Task = {
export interface Task {
key: string; key: string;
last_ran: number; last_ran: number;
last_confirmed: number; last_confirmed: number;
@ -12,4 +11,4 @@ export interface Task {
data: any; data: any;
error: string; error: string;
schedule: any; schedule: any;
} };

@ -2,10 +2,9 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type TestConnectionStringRequest = {
export interface TestConnectionStringRequest {
/** /**
* MongoDB connection string * MongoDB connection string
*/ */
connection_string: string; connection_string: string;
} };

@ -2,8 +2,7 @@
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
export type TestConnectionStringResponse = {
export interface TestConnectionStringResponse {
success: boolean; success: boolean;
error?: string; error?: string;
} };

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save