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

Improved downloads management
This commit is contained in:
Tzahi12345
2022-06-20 16:07:02 -04:00
committed by GitHub
149 changed files with 939 additions and 736 deletions

View File

@@ -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:

View File

@@ -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",

View File

@@ -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});
}); });

View File

@@ -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;
} }

View File

@@ -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);
} }
} }

View File

@@ -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;

View File

@@ -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;
} }
} }
} }

View File

@@ -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];

View File

@@ -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);

View File

@@ -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']);
}); });
}); });

View File

@@ -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
} }

View 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
View File

@@ -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"

View File

@@ -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';

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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 {

View File

@@ -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;
} });

View File

@@ -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;
} });

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

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

View File

@@ -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;
} };

View File

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

View File

@@ -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;
} };

View File

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

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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 {

View File

@@ -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;
}; };
} };

View File

@@ -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;
};

View File

@@ -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;
};

View File

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

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

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

View File

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

View File

@@ -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;
} };

View File

@@ -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;
}; };
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

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

View File

@@ -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',

View File

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

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

@@ -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>;
} };

View File

@@ -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>;
} };

View File

@@ -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>;
} };

View File

@@ -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>;
} };

View File

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

View File

@@ -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;
} };

View File

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

View File

@@ -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>;
}; };
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

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

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

@@ -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>;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

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

View File

@@ -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>;
} };

View File

@@ -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?: {
permissions?: Array<UserPermission>,
},
}; };
} user?: {
permissions?: Array<UserPermission>;
};
};
};

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

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

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

@@ -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;
};

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

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

View File

@@ -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 {

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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>;
} };

View File

@@ -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;
} };

View File

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

View File

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

View File

@@ -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;
} };

View File

@@ -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;
} };

View File

@@ -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