diff --git a/Public API v1.yaml b/Public API v1.yaml index b1bccb7..f554398 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -129,6 +129,27 @@ paths: description: User is not authorized to view the file. security: - 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: post: tags: @@ -841,17 +862,10 @@ paths: - Auth query parameter: [] tags: - downloader - /api/clearFinishedDownloads: + /api/clearDownloads: post: - tags: - - downloader - summary: Clear finished downloads - operationId: post-api-clear-finished-downloads - requestBody: - content: - application/json: - schema: - type: object + summary: Clear multiple downloads + operationId: post-api-clear-downloads responses: '200': description: OK @@ -859,8 +873,17 @@ paths: application/json: schema: $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClearDownloadsRequest' + description: '' + description: "Clears multiple downloads based on a given filter." security: - Auth query parameter: [] + tags: + - downloader /api/getTask: post: summary: Get info for one task @@ -1507,6 +1530,8 @@ components: properties: success: type: boolean + error: + type: string FileType: type: string enum: @@ -1607,6 +1632,15 @@ components: type: array items: $ref: '#/components/schemas/Download' + ClearDownloadsRequest: + type: object + properties: + clear_finished: + type: boolean + clear_paused: + type: boolean + clear_errors: + type: boolean GetTaskRequest: type: object properties: @@ -1727,6 +1761,18 @@ components: type: boolean file: $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: required: - uid @@ -2153,7 +2199,6 @@ components: type: boolean result: allOf: - - $ref: '#/components/schemas/file' - type: object properties: formats: @@ -2311,6 +2356,9 @@ components: type: string thumbnailURL: type: string + description: Backup if thumbnailPath is not defined + thumbnailPath: + type: string isAudio: type: boolean duration: @@ -2322,6 +2370,7 @@ components: type: string size: type: number + description: In bytes path: type: string upload_date: @@ -2330,6 +2379,12 @@ components: type: string sharingEnabled: type: boolean + category: + $ref: '#/components/schemas/Category' + view_count: + type: number + local_view_count: + type: number Playlist: required: - uids @@ -2359,6 +2414,8 @@ components: type: number user_uid: type: string + auto: + type: boolean Download: required: - url @@ -2545,28 +2602,6 @@ components: type: string passhash: 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: type: array items: diff --git a/angular.json b/angular.json index 613cfa8..74d280b 100644 --- a/angular.json +++ b/angular.json @@ -30,7 +30,8 @@ "src/backend" ], "styles": [ - "src/styles.scss" + "src/styles.scss", + "src/bootstrap.min.css" ], "scripts": [], "vendorChunk": true, @@ -118,7 +119,8 @@ "src/backend" ], "styles": [ - "src/styles.scss" + "src/styles.scss", + "src/bootstrap.min.css" ], "scripts": [] }, @@ -151,7 +153,8 @@ "tsConfig": "src/tsconfig.spec.json", "scripts": [], "styles": [ - "src/styles.scss" + "src/styles.scss", + "src/bootstrap.min.css" ], "assets": [ "src/assets", diff --git a/backend/app.js b/backend/app.js index af6089a..a508702 100644 --- a/backend/app.js +++ b/backend/app.js @@ -933,23 +933,34 @@ app.post('/api/getAllFiles', optionalJwt, async function (req, res) { else if (file_type_filter === 'video_only') filter_obj['isAudio'] = false; files = await db_api.getRecords('files', filter_obj, false, sort, range, text_search); - let 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); - } + const file_count = await db_api.getRecords('files', filter_obj, true); files = JSON.parse(JSON.stringify(files)); res.send({ files: files, 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) => { 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}); if (include_categories) { - const categories = await categories_api.getCategoriesAsPlaylists(files); + const categories = await categories_api.getCategoriesAsPlaylists(); if (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 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}); }); diff --git a/backend/authentication/auth.js b/backend/authentication/auth.js index 7607c9b..e6fa23c 100644 --- a/backend/authentication/auth.js +++ b/backend/authentication/auth.js @@ -171,8 +171,12 @@ exports.registerUser = async function(req, res) { 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}); - 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 } return await bcrypt.compare(password, user.passhash) ? user : false; } diff --git a/backend/categories.js b/backend/categories.js index 2236d9f..2faebfb 100644 --- a/backend/categories.js +++ b/backend/categories.js @@ -55,17 +55,18 @@ async function getCategories() { return categories ? categories : null; } -async function getCategoriesAsPlaylists(files = null) { +async function getCategoriesAsPlaylists() { const categories_as_playlists = []; const available_categories = await getCategories(); - if (available_categories && files) { + if (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) { category['thumbnailURL'] = files_that_match[0].thumbnailURL; category['thumbnailPath'] = files_that_match[0].thumbnailPath; category['duration'] = files_that_match.reduce((a, b) => a + utils.durationStringToNumber(b.duration), 0); category['id'] = category['uid']; + category['auto'] = true; categories_as_playlists.push(category); } } diff --git a/backend/config.js b/backend/config.js index 95e364c..4e208fb 100644 --- a/backend/config.js +++ b/backend/config.js @@ -127,7 +127,7 @@ function setConfigItem(key, value) { success = setConfigFile(config_json); return success; -}; +} function setConfigItems(items) { let success = false; diff --git a/backend/db.js b/backend/db.js index 17c2e5a..73f56f1 100644 --- a/backend/db.js +++ b/backend/db.js @@ -387,9 +387,9 @@ exports.getPlaylist = async (playlist_id, user_uid = null, require_sharing = fal if (!playlist) { playlist = await exports.getRecord('categories', {uid: playlist_id}); if (playlist) { - // category found - const files = await exports.getFiles(user_uid); - utils.addUIDsToCategory(playlist, files); + const uids = (await exports.getRecords('files', {'category.uid': playlist_id})).map(file => file.uid); + playlist['uids'] = uids; + playlist['auto'] = true; } } @@ -629,7 +629,7 @@ exports.bulkInsertRecordsIntoTable = async (table, docs) => { exports.getRecord = async (table, filter_obj) => { // local db override 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); @@ -638,7 +638,7 @@ exports.getRecord = async (table, filter_obj) => { exports.getRecords = async (table, filter_obj = null, return_count = false, sort = null, range = null) => { // local db override 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) { 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) => { // local db override 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; } @@ -677,7 +677,7 @@ exports.updateRecord = async (table, filter_obj, update_obj) => { exports.updateRecords = async (table, filter_obj, update_obj) => { // local db override 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; } @@ -722,7 +722,7 @@ exports.bulkUpdateRecords = async (table, key_label, update_obj) => { exports.pushToRecordsArray = async (table, filter_obj, key, value) => { // local db override 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; } @@ -733,7 +733,7 @@ exports.pushToRecordsArray = async (table, filter_obj, key, value) => { exports.pullFromRecordsArray = async (table, filter_obj, key, value) => { // local db override 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; } @@ -746,7 +746,7 @@ exports.pullFromRecordsArray = async (table, filter_obj, key, value) => { exports.removeRecord = async (table, filter_obj) => { // local db override 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; } @@ -757,7 +757,7 @@ exports.removeRecord = async (table, filter_obj) => { // exports.removeRecordsByUIDBulk = async (table, uids) => { // // local db override // 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; // } @@ -821,7 +821,7 @@ exports.removeAllRecords = async (table = null, filter_obj = null) => { if (using_local_db) { for (let i = 0; i < tables_to_remove.length; 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(); 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. 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 + + 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 return_val = db_path[operation](record => { 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_value = filter_obj[filter_prop]; 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 { 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); + } else if ('$ne' in filter_prop_value) { + filtered &= filter_prop in record && record[filter_prop] !== filter_prop_value['$ne']; } } 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; } } } diff --git a/backend/downloader.js b/backend/downloader.js index 99ed686..aef46f1 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -108,6 +108,7 @@ exports.clearDownload = async (download_uid) => { } 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}); } @@ -186,7 +187,7 @@ async function collectInfo(download_uid) { let args = await exports.generateArgs(url, type, options, download['user_uid']); // 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) { // info failed, error presumably already recorded @@ -203,9 +204,11 @@ async function collectInfo(download_uid) { options.customOutput = category['custom_output']; options.noRelativePath = true; 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 const expected_file_size = utils.getExpectedFileSize(info); @@ -507,7 +510,7 @@ exports.generateArgs = async (url, type, options, user_uid = null, simulated = f return downloadConfig; } -async function getVideoInfoByURL(url, args = [], download_uid = null) { +exports.getVideoInfoByURL = async (url, args = [], download_uid = null) => { return new Promise(resolve => { // remove bad args const new_args = [...args]; diff --git a/backend/tasks.js b/backend/tasks.js index ba6379c..5fd2fc6 100644 --- a/backend/tasks.js +++ b/backend/tasks.js @@ -148,6 +148,7 @@ exports.updateTaskSchedule = async (task_key, schedule) => { await db_api.updateRecord('tasks', {key: task_key}, {schedule: schedule}); if (TASKS[task_key]['job']) { TASKS[task_key]['job'].cancel(); + TASKS[task_key]['job'] = null; } if (schedule) { TASKS[task_key]['job'] = scheduleJob(task_key, schedule); diff --git a/backend/test/tests.js b/backend/test/tests.js index 0a05f6b..448db7b 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -42,6 +42,25 @@ const { uuid } = require('uuidv4'); 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('Import', async function() { @@ -214,7 +233,7 @@ describe('Database', async function() { for (let i = 0; i < NUM_RECORDS_TO_ADD; i++) { const uid = uuid(); 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(); let success = await db_api.bulkInsertRecordsIntoTable('test', test_records); @@ -235,6 +254,30 @@ describe('Database', async function() { 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() { @@ -253,10 +296,12 @@ describe('Multi User', async function() { assert(user); }); }); - describe('Video player - normal', function() { - const video_to_test = 'ebbcfffb-d6f1-4510-ad25-d1ec82e0477e'; + describe('Video player - normal', async function() { + 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() { - const video_obj = db_api.getVideo(video_to_test, 'admin'); + const video_obj = await db_api.getVideo(video_to_test); assert(video_obj); }); @@ -341,7 +386,9 @@ describe('Downloader', function() { }); it('Get file info', async function() { - + this.timeout(300000); + const info = await downloader_api.getVideoInfoByURL(url); + assert(!!info); }); it('Download file', async function() { @@ -360,20 +407,23 @@ describe('Downloader', 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() { const args = await downloader_api.generateArgs(url, 'video', options); - console.log(args); + assert(args.length > 0); }); it('Generate args - subscription', async function() { - subscriptions_api.initialize(db_api, logger); const sub = await subscriptions_api.getSubscription(sub_id); const sub_options = subscriptions_api.generateOptionsForSubscriptionDownload(sub, 'admin'); - const args = await downloader_api.generateArgs(url, 'video', sub_options, 'admin'); - console.log(args); + const args_normal = await downloader_api.generateArgs(url, 'video', options); + 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() { @@ -417,7 +467,7 @@ describe('Tasks', function() { }; tasks_api.TASKS['dummy_task'] = dummy_task; - await tasks_api.initialize(); + await tasks_api.setupTasks(); }); it('Backup db', async function() { const backups_original = await utils.recFindByExt('appdata', 'bak'); @@ -429,12 +479,13 @@ describe('Tasks', function() { }); it('Check for missing files', async function() { + this.timeout(300000); await db_api.removeAllRecords('files', {uid: 'test'}); const test_missing_file = {uid: 'test', path: 'test/missing_file.mp4'}; await db_api.insertRecordIntoTable('files', test_missing_file); await tasks_api.executeTask('missing_files_check'); - const task_obj = await db_api.getRecord('tasks', {key: 'missing_files_check'}); - assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); + const missing_file_db_record = await db_api.getRecord('files', {uid: 'test'}); + assert(!missing_file_db_record, true); }); 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_file2); 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 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); + + 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); }); @@ -475,22 +529,36 @@ describe('Tasks', function() { }); it('Schedule and cancel task', async function() { - const today_4_hours = new Date(); - today_4_hours.setHours(today_4_hours.getHours() + 4); - await tasks_api.updateTaskSchedule('dummy_task', today_4_hours); - assert(!!tasks_api.TASKS['dummy_task']['job'], true); + this.timeout(5000); + const today_one_year = new Date(); + today_one_year.setFullYear(today_one_year.getFullYear() + 1); + 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); - 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() { this.timeout(5000); const today_1_second = new Date(); today_1_second.setSeconds(today_1_second.getSeconds() + 1); - await tasks_api.updateTaskSchedule('dummy_task', today_1_second); - assert(!!tasks_api.TASKS['dummy_task']['job'], true); + const schedule_obj = { + 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); const dummy_task_obj = await db_api.getRecord('tasks', {key: 'dummy_task'}); - assert(dummy_task_obj['data'], true); + assert(dummy_task_obj['data']); }); }); \ No newline at end of file diff --git a/backend/utils.js b/backend/utils.js index 56f12bb..805d591 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -456,6 +456,21 @@ function injectArgs(original_args, new_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 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, durationStringToNumber: durationStringToNumber, getMatchingCategoryFiles: getMatchingCategoryFiles, - addUIDsToCategory: addUIDsToCategory, getCurrentDownloader: getCurrentDownloader, recFindByExt: recFindByExt, removeFileExtension: removeFileExtension, @@ -501,5 +515,6 @@ module.exports = { fetchFile: fetchFile, restartServer: restartServer, injectArgs: injectArgs, + searchObjectByString: searchObjectByString, File: File } diff --git a/backend/youtube-dl.js b/backend/youtube-dl.js index 4e1c5ff..37c4c1c 100644 --- a/backend/youtube-dl.js +++ b/backend/youtube-dl.js @@ -90,7 +90,7 @@ exports.updateYoutubeDL = async (latest_update_version) => { exports.verifyBinaryExistsLinux = () => { 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['exec'] = 'youtube-dl'; details_json['version'] = OUTDATED_VERSION; diff --git a/package-lock.json b/package-lock.json index 06f052e..eab9318 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3295,65 +3295,12 @@ "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": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "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": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -3367,9 +3314,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" diff --git a/src/api-types/index.ts b/src/api-types/index.ts index 43f0f06..db5be04 100644 --- a/src/api-types/index.ts +++ b/src/api-types/index.ts @@ -4,6 +4,7 @@ export type { AddFileToPlaylistRequest } from './models/AddFileToPlaylistRequest'; export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest'; +export type { binary } from './models/binary'; export type { body_19 } from './models/body_19'; export type { body_20 } from './models/body_20'; export type { Category } from './models/Category'; @@ -12,6 +13,7 @@ export type { ChangeRolePermissionsRequest } from './models/ChangeRolePermission export type { ChangeUserPermissionsRequest } from './models/ChangeUserPermissionsRequest'; export type { CheckConcurrentStreamRequest } from './models/CheckConcurrentStreamRequest'; export type { CheckConcurrentStreamResponse } from './models/CheckConcurrentStreamResponse'; +export type { ClearDownloadsRequest } from './models/ClearDownloadsRequest'; export type { ConcurrentStream } from './models/ConcurrentStream'; export type { Config } from './models/Config'; export type { ConfigResponse } from './models/ConfigResponse'; @@ -23,6 +25,7 @@ export type { CropFileSettings } from './models/CropFileSettings'; export type { DatabaseFile } from './models/DatabaseFile'; export { DBBackup } from './models/DBBackup'; export type { DBInfoResponse } from './models/DBInfoResponse'; +export type { DeleteAllFilesResponse } from './models/DeleteAllFilesResponse'; export type { DeleteCategoryRequest } from './models/DeleteCategoryRequest'; export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest'; @@ -36,7 +39,6 @@ export type { DownloadResponse } from './models/DownloadResponse'; export type { DownloadTwitchChatByVODIDRequest } from './models/DownloadTwitchChatByVODIDRequest'; export type { DownloadTwitchChatByVODIDResponse } from './models/DownloadTwitchChatByVODIDResponse'; export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest'; -export type { File } from './models/File'; export { FileType } from './models/FileType'; export type { GenerateArgsResponse } from './models/GenerateArgsResponse'; export type { GenerateNewApiKeyResponse } from './models/GenerateNewApiKeyResponse'; @@ -98,6 +100,7 @@ export type { UpdateCategoriesRequest } from './models/UpdateCategoriesRequest'; export type { UpdateCategoryRequest } from './models/UpdateCategoryRequest'; export type { UpdateConcurrentStreamRequest } from './models/UpdateConcurrentStreamRequest'; export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentStreamResponse'; +export type { UpdateFileRequest } from './models/UpdateFileRequest'; export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; export type { UpdaterStatus } from './models/UpdaterStatus'; export type { UpdateServerRequest } from './models/UpdateServerRequest'; diff --git a/src/api-types/models/AddFileToPlaylistRequest.ts b/src/api-types/models/AddFileToPlaylistRequest.ts index b701175..a08c586 100644 --- a/src/api-types/models/AddFileToPlaylistRequest.ts +++ b/src/api-types/models/AddFileToPlaylistRequest.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface AddFileToPlaylistRequest { +export type AddFileToPlaylistRequest = { file_uid: string; playlist_id: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/BaseChangePermissionsRequest.ts b/src/api-types/models/BaseChangePermissionsRequest.ts index d548225..fd418de 100644 --- a/src/api-types/models/BaseChangePermissionsRequest.ts +++ b/src/api-types/models/BaseChangePermissionsRequest.ts @@ -2,10 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { UserPermission } from './UserPermission'; -import { YesNo } from './YesNo'; +import type { UserPermission } from './UserPermission'; +import type { YesNo } from './YesNo'; -export interface BaseChangePermissionsRequest { +export type BaseChangePermissionsRequest = { permission: UserPermission; new_value: YesNo; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Category.ts b/src/api-types/models/Category.ts index 055a3d7..cfabd8b 100644 --- a/src/api-types/models/Category.ts +++ b/src/api-types/models/Category.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { CategoryRule } from './CategoryRule'; +import type { CategoryRule } from './CategoryRule'; -export interface Category { +export type Category = { name?: string; uid?: string; rules?: Array; @@ -12,4 +12,4 @@ export interface Category { * Overrides file output for downloaded files in category */ custom_output?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CategoryRule.ts b/src/api-types/models/CategoryRule.ts index 9a8acb9..e99cda1 100644 --- a/src/api-types/models/CategoryRule.ts +++ b/src/api-types/models/CategoryRule.ts @@ -2,11 +2,10 @@ /* tslint:disable */ /* eslint-disable */ - -export interface CategoryRule { +export type CategoryRule = { preceding_operator?: CategoryRule.preceding_operator; comparator?: CategoryRule.comparator; -} +}; export namespace CategoryRule { diff --git a/src/api-types/models/ChangeRolePermissionsRequest.ts b/src/api-types/models/ChangeRolePermissionsRequest.ts index 417c8ef..9d786e7 100644 --- a/src/api-types/models/ChangeRolePermissionsRequest.ts +++ b/src/api-types/models/ChangeRolePermissionsRequest.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; +import type { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; -export interface ChangeRolePermissionsRequest extends BaseChangePermissionsRequest { - role: string; -} \ No newline at end of file +export type ChangeRolePermissionsRequest = (BaseChangePermissionsRequest & { +role: string; +}); \ No newline at end of file diff --git a/src/api-types/models/ChangeUserPermissionsRequest.ts b/src/api-types/models/ChangeUserPermissionsRequest.ts index c74dc09..ffa4817 100644 --- a/src/api-types/models/ChangeUserPermissionsRequest.ts +++ b/src/api-types/models/ChangeUserPermissionsRequest.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; +import type { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; -export interface ChangeUserPermissionsRequest extends BaseChangePermissionsRequest { - user_uid: string; -} \ No newline at end of file +export type ChangeUserPermissionsRequest = (BaseChangePermissionsRequest & { +user_uid: string; +}); \ No newline at end of file diff --git a/src/api-types/models/CheckConcurrentStreamRequest.ts b/src/api-types/models/CheckConcurrentStreamRequest.ts index 416ab37..7c30670 100644 --- a/src/api-types/models/CheckConcurrentStreamRequest.ts +++ b/src/api-types/models/CheckConcurrentStreamRequest.ts @@ -2,10 +2,9 @@ /* tslint:disable */ /* eslint-disable */ - -export interface CheckConcurrentStreamRequest { +export type CheckConcurrentStreamRequest = { /** * UID of the concurrent stream */ uid: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CheckConcurrentStreamResponse.ts b/src/api-types/models/CheckConcurrentStreamResponse.ts index bd4c70d..2d1df1c 100644 --- a/src/api-types/models/CheckConcurrentStreamResponse.ts +++ b/src/api-types/models/CheckConcurrentStreamResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { ConcurrentStream } from './ConcurrentStream'; +import type { ConcurrentStream } from './ConcurrentStream'; -export interface CheckConcurrentStreamResponse { +export type CheckConcurrentStreamResponse = { stream: ConcurrentStream; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/ClearDownloadsRequest.ts b/src/api-types/models/ClearDownloadsRequest.ts new file mode 100644 index 0000000..efee2c9 --- /dev/null +++ b/src/api-types/models/ClearDownloadsRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ClearDownloadsRequest = { + clear_finished?: boolean; + clear_paused?: boolean; + clear_errors?: boolean; +}; \ No newline at end of file diff --git a/src/api-types/models/ConcurrentStream.ts b/src/api-types/models/ConcurrentStream.ts index 19eab7d..486cc57 100644 --- a/src/api-types/models/ConcurrentStream.ts +++ b/src/api-types/models/ConcurrentStream.ts @@ -2,9 +2,8 @@ /* tslint:disable */ /* eslint-disable */ - -export interface ConcurrentStream { +export type ConcurrentStream = { playback_timestamp?: number; unix_timestamp?: number; playing?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Config.ts b/src/api-types/models/Config.ts index 855217a..cb05dea 100644 --- a/src/api-types/models/Config.ts +++ b/src/api-types/models/Config.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface Config { +export type Config = { YoutubeDLMaterial: any; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/ConfigResponse.ts b/src/api-types/models/ConfigResponse.ts index d3ff49a..0912cac 100644 --- a/src/api-types/models/ConfigResponse.ts +++ b/src/api-types/models/ConfigResponse.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { Config } from './Config'; +import type { Config } from './Config'; -export interface ConfigResponse { +export type ConfigResponse = { config_file: Config; success: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CreateCategoryRequest.ts b/src/api-types/models/CreateCategoryRequest.ts index 0871041..7c091b6 100644 --- a/src/api-types/models/CreateCategoryRequest.ts +++ b/src/api-types/models/CreateCategoryRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface CreateCategoryRequest { +export type CreateCategoryRequest = { name: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CreateCategoryResponse.ts b/src/api-types/models/CreateCategoryResponse.ts index 16efded..2be83f6 100644 --- a/src/api-types/models/CreateCategoryResponse.ts +++ b/src/api-types/models/CreateCategoryResponse.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { Category } from './Category'; +import type { Category } from './Category'; -export interface CreateCategoryResponse { +export type CreateCategoryResponse = { new_category?: Category; success?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CreatePlaylistRequest.ts b/src/api-types/models/CreatePlaylistRequest.ts index 2fef41b..c747d8d 100644 --- a/src/api-types/models/CreatePlaylistRequest.ts +++ b/src/api-types/models/CreatePlaylistRequest.ts @@ -2,11 +2,11 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface CreatePlaylistRequest { +export type CreatePlaylistRequest = { playlistName: string; uids: Array; type: FileType; thumbnailURL: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CreatePlaylistResponse.ts b/src/api-types/models/CreatePlaylistResponse.ts index 4cac9cf..48b5d06 100644 --- a/src/api-types/models/CreatePlaylistResponse.ts +++ b/src/api-types/models/CreatePlaylistResponse.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { Playlist } from './Playlist'; +import type { Playlist } from './Playlist'; -export interface CreatePlaylistResponse { +export type CreatePlaylistResponse = { new_playlist: Playlist; success: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/CropFileSettings.ts b/src/api-types/models/CropFileSettings.ts index ec8edec..e4ab45a 100644 --- a/src/api-types/models/CropFileSettings.ts +++ b/src/api-types/models/CropFileSettings.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface CropFileSettings { +export type CropFileSettings = { cropFileStart: number; cropFileEnd: number; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DBBackup.ts b/src/api-types/models/DBBackup.ts index 710c591..b137cad 100644 --- a/src/api-types/models/DBBackup.ts +++ b/src/api-types/models/DBBackup.ts @@ -2,13 +2,12 @@ /* tslint:disable */ /* eslint-disable */ - -export interface DBBackup { +export type DBBackup = { name: string; timestamp: number; size: number; source: DBBackup.source; -} +}; export namespace DBBackup { diff --git a/src/api-types/models/DBInfoResponse.ts b/src/api-types/models/DBInfoResponse.ts index 543f12b..f368ffe 100644 --- a/src/api-types/models/DBInfoResponse.ts +++ b/src/api-types/models/DBInfoResponse.ts @@ -2,17 +2,17 @@ /* tslint:disable */ /* eslint-disable */ -import { TableInfo } from './TableInfo'; +import type { TableInfo } from './TableInfo'; -export interface DBInfoResponse { +export type DBInfoResponse = { using_local_db?: boolean; stats_by_table?: { -files?: TableInfo, -playlists?: TableInfo, -categories?: TableInfo, -subscriptions?: TableInfo, -users?: TableInfo, -roles?: TableInfo, -download_queue?: TableInfo, +files?: TableInfo; +playlists?: TableInfo; +categories?: TableInfo; +subscriptions?: TableInfo; +users?: TableInfo; +roles?: TableInfo; +download_queue?: TableInfo; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DatabaseFile.ts b/src/api-types/models/DatabaseFile.ts index b1a17c0..796c2fe 100644 --- a/src/api-types/models/DatabaseFile.ts +++ b/src/api-types/models/DatabaseFile.ts @@ -2,11 +2,16 @@ /* tslint:disable */ /* eslint-disable */ +import type { Category } from './Category'; -export interface DatabaseFile { +export type DatabaseFile = { id: string; title: string; + /** + * Backup if thumbnailPath is not defined + */ thumbnailURL: string; + thumbnailPath?: string; isAudio: boolean; /** * In seconds @@ -14,9 +19,15 @@ export interface DatabaseFile { duration: number; url: string; uploader: string; + /** + * In bytes + */ size: number; path: string; upload_date: string; uid: string; sharingEnabled?: boolean; -} \ No newline at end of file + category?: Category; + view_count?: number; + local_view_count?: number; +}; \ No newline at end of file diff --git a/src/api-types/models/DeleteAllFilesResponse.ts b/src/api-types/models/DeleteAllFilesResponse.ts new file mode 100644 index 0000000..94efef7 --- /dev/null +++ b/src/api-types/models/DeleteAllFilesResponse.ts @@ -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; +}; \ No newline at end of file diff --git a/src/api-types/models/DeleteCategoryRequest.ts b/src/api-types/models/DeleteCategoryRequest.ts index 37db8d5..50e736b 100644 --- a/src/api-types/models/DeleteCategoryRequest.ts +++ b/src/api-types/models/DeleteCategoryRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface DeleteCategoryRequest { +export type DeleteCategoryRequest = { category_uid: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DeleteMp3Mp4Request.ts b/src/api-types/models/DeleteMp3Mp4Request.ts index 3202c4f..ec74390 100644 --- a/src/api-types/models/DeleteMp3Mp4Request.ts +++ b/src/api-types/models/DeleteMp3Mp4Request.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface DeleteMp3Mp4Request { +export type DeleteMp3Mp4Request = { uid: string; blacklistMode?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DeletePlaylistRequest.ts b/src/api-types/models/DeletePlaylistRequest.ts index 76f2f81..07cf9f7 100644 --- a/src/api-types/models/DeletePlaylistRequest.ts +++ b/src/api-types/models/DeletePlaylistRequest.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface DeletePlaylistRequest { +export type DeletePlaylistRequest = { playlist_id: string; type: FileType; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DeleteSubscriptionFileRequest.ts b/src/api-types/models/DeleteSubscriptionFileRequest.ts index 7a166a9..56ac66a 100644 --- a/src/api-types/models/DeleteSubscriptionFileRequest.ts +++ b/src/api-types/models/DeleteSubscriptionFileRequest.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { SubscriptionRequestData } from './SubscriptionRequestData'; +import type { SubscriptionRequestData } from './SubscriptionRequestData'; -export interface DeleteSubscriptionFileRequest { +export type DeleteSubscriptionFileRequest = { file: string; file_uid?: string; 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. */ deleteForever?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DeleteUserRequest.ts b/src/api-types/models/DeleteUserRequest.ts index 15a1d09..50b2ce6 100644 --- a/src/api-types/models/DeleteUserRequest.ts +++ b/src/api-types/models/DeleteUserRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface DeleteUserRequest { +export type DeleteUserRequest = { uid: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Dictionary.ts b/src/api-types/models/Dictionary.ts deleted file mode 100644 index 8ba0443..0000000 --- a/src/api-types/models/Dictionary.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type Dictionary = { - [key: string]: T; -} diff --git a/src/api-types/models/Download.ts b/src/api-types/models/Download.ts index d91dd00..6556da0 100644 --- a/src/api-types/models/Download.ts +++ b/src/api-types/models/Download.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface Download { +export type Download = { uid: string; ui_uid?: string; running: boolean; @@ -23,4 +22,4 @@ export interface Download { user_uid?: string; sub_id?: string; sub_name?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadArchiveRequest.ts b/src/api-types/models/DownloadArchiveRequest.ts index 857910c..dad4328 100644 --- a/src/api-types/models/DownloadArchiveRequest.ts +++ b/src/api-types/models/DownloadArchiveRequest.ts @@ -2,9 +2,8 @@ /* tslint:disable */ /* eslint-disable */ - -export interface DownloadArchiveRequest { +export type DownloadArchiveRequest = { sub: { -archive_dir: string, +archive_dir: string; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts index a874a8c..b14f3ea 100644 --- a/src/api-types/models/DownloadFileRequest.ts +++ b/src/api-types/models/DownloadFileRequest.ts @@ -2,13 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface DownloadFileRequest { +export type DownloadFileRequest = { uid?: string; uuid?: string; sub_id?: string; playlist_id?: string; url?: string; type?: FileType; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadRequest.ts b/src/api-types/models/DownloadRequest.ts index 5c6da09..9740512 100644 --- a/src/api-types/models/DownloadRequest.ts +++ b/src/api-types/models/DownloadRequest.ts @@ -2,10 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { CropFileSettings } from './CropFileSettings'; -import { FileType } from './FileType'; +import type { CropFileSettings } from './CropFileSettings'; +import type { FileType } from './FileType'; -export interface DownloadRequest { +export type DownloadRequest = { url: string; /** * Video format code. Overrides other quality options. @@ -41,4 +41,4 @@ export interface DownloadRequest { maxBitrate?: string; type?: FileType; cropFileSettings?: CropFileSettings; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadResponse.ts b/src/api-types/models/DownloadResponse.ts index 3452abc..9428f00 100644 --- a/src/api-types/models/DownloadResponse.ts +++ b/src/api-types/models/DownloadResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Download } from './Download'; +import type { Download } from './Download'; -export interface DownloadResponse { +export type DownloadResponse = { download?: Download; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts index 8b86a4e..c807f13 100644 --- a/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts +++ b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts @@ -2,10 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; -import { Subscription } from './Subscription'; +import type { FileType } from './FileType'; +import type { Subscription } from './Subscription'; -export interface DownloadTwitchChatByVODIDRequest { +export type DownloadTwitchChatByVODIDRequest = { /** * File ID */ @@ -20,4 +20,4 @@ export interface DownloadTwitchChatByVODIDRequest { */ uuid?: string; sub?: Subscription; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts b/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts index 9771759..673fd08 100644 --- a/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts +++ b/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { TwitchChatMessage } from './TwitchChatMessage'; +import type { TwitchChatMessage } from './TwitchChatMessage'; -export interface DownloadTwitchChatByVODIDResponse { +export type DownloadTwitchChatByVODIDResponse = { chat: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/DownloadVideosForSubscriptionRequest.ts b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts index 31d0c6d..e68b4e4 100644 --- a/src/api-types/models/DownloadVideosForSubscriptionRequest.ts +++ b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface DownloadVideosForSubscriptionRequest { +export type DownloadVideosForSubscriptionRequest = { subID: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/FileType.ts b/src/api-types/models/FileType.ts index e1b6f79..c220762 100644 --- a/src/api-types/models/FileType.ts +++ b/src/api-types/models/FileType.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - export enum FileType { AUDIO = 'audio', VIDEO = 'video', diff --git a/src/api-types/models/GenerateArgsResponse.ts b/src/api-types/models/GenerateArgsResponse.ts index 953a57c..0201d16 100644 --- a/src/api-types/models/GenerateArgsResponse.ts +++ b/src/api-types/models/GenerateArgsResponse.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GenerateArgsResponse { +export type GenerateArgsResponse = { args?: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GenerateNewApiKeyResponse.ts b/src/api-types/models/GenerateNewApiKeyResponse.ts index 378a642..3eb90e0 100644 --- a/src/api-types/models/GenerateNewApiKeyResponse.ts +++ b/src/api-types/models/GenerateNewApiKeyResponse.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GenerateNewApiKeyResponse { +export type GenerateNewApiKeyResponse = { new_api_key: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetAllCategoriesResponse.ts b/src/api-types/models/GetAllCategoriesResponse.ts index e34671d..6623016 100644 --- a/src/api-types/models/GetAllCategoriesResponse.ts +++ b/src/api-types/models/GetAllCategoriesResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Category } from './Category'; +import type { Category } from './Category'; -export interface GetAllCategoriesResponse { +export type GetAllCategoriesResponse = { categories: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetAllDownloadsRequest.ts b/src/api-types/models/GetAllDownloadsRequest.ts index 5d26f57..fa0ea24 100644 --- a/src/api-types/models/GetAllDownloadsRequest.ts +++ b/src/api-types/models/GetAllDownloadsRequest.ts @@ -2,10 +2,9 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetAllDownloadsRequest { +export type GetAllDownloadsRequest = { /** * Filters downloads with the array */ uids?: Array | null; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetAllDownloadsResponse.ts b/src/api-types/models/GetAllDownloadsResponse.ts index 5367f56..16f6f8c 100644 --- a/src/api-types/models/GetAllDownloadsResponse.ts +++ b/src/api-types/models/GetAllDownloadsResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Download } from './Download'; +import type { Download } from './Download'; -export interface GetAllDownloadsResponse { +export type GetAllDownloadsResponse = { downloads?: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetAllFilesResponse.ts b/src/api-types/models/GetAllFilesResponse.ts index d067555..22aa333 100644 --- a/src/api-types/models/GetAllFilesResponse.ts +++ b/src/api-types/models/GetAllFilesResponse.ts @@ -2,13 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { DatabaseFile } from './DatabaseFile'; -import { Playlist } from './Playlist'; +import type { DatabaseFile } from './DatabaseFile'; +import type { Playlist } from './Playlist'; -export interface GetAllFilesResponse { +export type GetAllFilesResponse = { files: Array; /** * All video playlists */ playlists: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetAllSubscriptionsResponse.ts b/src/api-types/models/GetAllSubscriptionsResponse.ts index 485d0cd..4c2d1a8 100644 --- a/src/api-types/models/GetAllSubscriptionsResponse.ts +++ b/src/api-types/models/GetAllSubscriptionsResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Subscription } from './Subscription'; +import type { Subscription } from './Subscription'; -export interface GetAllSubscriptionsResponse { +export type GetAllSubscriptionsResponse = { subscriptions: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetAllTasksResponse.ts b/src/api-types/models/GetAllTasksResponse.ts index 221d44a..9bbd394 100644 --- a/src/api-types/models/GetAllTasksResponse.ts +++ b/src/api-types/models/GetAllTasksResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Task } from './Task'; +import type { Task } from './Task'; -export interface GetAllTasksResponse { +export type GetAllTasksResponse = { tasks?: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetDBBackupsResponse.ts b/src/api-types/models/GetDBBackupsResponse.ts index b02ced9..0ec58d8 100644 --- a/src/api-types/models/GetDBBackupsResponse.ts +++ b/src/api-types/models/GetDBBackupsResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { DBBackup } from './DBBackup'; +import type { DBBackup } from './DBBackup'; -export interface GetDBBackupsResponse { +export type GetDBBackupsResponse = { tasks?: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetDownloadRequest.ts b/src/api-types/models/GetDownloadRequest.ts index 49f102a..e166f9f 100644 --- a/src/api-types/models/GetDownloadRequest.ts +++ b/src/api-types/models/GetDownloadRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetDownloadRequest { +export type GetDownloadRequest = { download_uid: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetDownloadResponse.ts b/src/api-types/models/GetDownloadResponse.ts index 69579b5..c6eeb51 100644 --- a/src/api-types/models/GetDownloadResponse.ts +++ b/src/api-types/models/GetDownloadResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Download } from './Download'; +import type { Download } from './Download'; -export interface GetDownloadResponse { +export type GetDownloadResponse = { download?: Download; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetFileFormatsRequest.ts b/src/api-types/models/GetFileFormatsRequest.ts index 1ea3502..3b9fa54 100644 --- a/src/api-types/models/GetFileFormatsRequest.ts +++ b/src/api-types/models/GetFileFormatsRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetFileFormatsRequest { +export type GetFileFormatsRequest = { url?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetFileFormatsResponse.ts b/src/api-types/models/GetFileFormatsResponse.ts index dc0f859..d195660 100644 --- a/src/api-types/models/GetFileFormatsResponse.ts +++ b/src/api-types/models/GetFileFormatsResponse.ts @@ -2,11 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { File } from './File'; - -export interface GetFileFormatsResponse { +export type GetFileFormatsResponse = { success: boolean; result: { -formats?: Array, +formats?: Array; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetFileRequest.ts b/src/api-types/models/GetFileRequest.ts index 3bb14b1..6c3e0cb 100644 --- a/src/api-types/models/GetFileRequest.ts +++ b/src/api-types/models/GetFileRequest.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface GetFileRequest { +export type GetFileRequest = { /** * Video UID */ @@ -14,4 +14,4 @@ export interface GetFileRequest { * User UID */ uuid?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetFileResponse.ts b/src/api-types/models/GetFileResponse.ts index df78e28..ad64755 100644 --- a/src/api-types/models/GetFileResponse.ts +++ b/src/api-types/models/GetFileResponse.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { DatabaseFile } from './DatabaseFile'; +import type { DatabaseFile } from './DatabaseFile'; -export interface GetFileResponse { +export type GetFileResponse = { success: boolean; file?: DatabaseFile; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatRequest.ts b/src/api-types/models/GetFullTwitchChatRequest.ts index 64a043d..0b10d98 100644 --- a/src/api-types/models/GetFullTwitchChatRequest.ts +++ b/src/api-types/models/GetFullTwitchChatRequest.ts @@ -2,10 +2,10 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; -import { Subscription } from './Subscription'; +import type { FileType } from './FileType'; +import type { Subscription } from './Subscription'; -export interface GetFullTwitchChatRequest { +export type GetFullTwitchChatRequest = { /** * File ID */ @@ -16,4 +16,4 @@ export interface GetFullTwitchChatRequest { */ uuid?: string; sub?: Subscription; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatResponse.ts b/src/api-types/models/GetFullTwitchChatResponse.ts index 3bd27f7..1f52375 100644 --- a/src/api-types/models/GetFullTwitchChatResponse.ts +++ b/src/api-types/models/GetFullTwitchChatResponse.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetFullTwitchChatResponse { +export type GetFullTwitchChatResponse = { success: boolean; error?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetLogsRequest.ts b/src/api-types/models/GetLogsRequest.ts index 170ce8b..e5029ee 100644 --- a/src/api-types/models/GetLogsRequest.ts +++ b/src/api-types/models/GetLogsRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetLogsRequest { +export type GetLogsRequest = { lines?: number; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetLogsResponse.ts b/src/api-types/models/GetLogsResponse.ts index 2acf83a..760d5f4 100644 --- a/src/api-types/models/GetLogsResponse.ts +++ b/src/api-types/models/GetLogsResponse.ts @@ -2,11 +2,10 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetLogsResponse { +export type GetLogsResponse = { /** * Number of lines to retrieve from the bottom */ logs?: string; success?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetMp3sResponse.ts b/src/api-types/models/GetMp3sResponse.ts index 23a80d7..ed63f48 100644 --- a/src/api-types/models/GetMp3sResponse.ts +++ b/src/api-types/models/GetMp3sResponse.ts @@ -2,13 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { DatabaseFile } from './DatabaseFile'; -import { Playlist } from './Playlist'; +import type { DatabaseFile } from './DatabaseFile'; +import type { Playlist } from './Playlist'; -export interface GetMp3sResponse { +export type GetMp3sResponse = { mp3s: Array; /** * All audio playlists */ playlists: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetMp4sResponse.ts b/src/api-types/models/GetMp4sResponse.ts index 06e1f98..bfa0ed0 100644 --- a/src/api-types/models/GetMp4sResponse.ts +++ b/src/api-types/models/GetMp4sResponse.ts @@ -2,13 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { DatabaseFile } from './DatabaseFile'; -import { Playlist } from './Playlist'; +import type { DatabaseFile } from './DatabaseFile'; +import type { Playlist } from './Playlist'; -export interface GetMp4sResponse { +export type GetMp4sResponse = { mp4s: Array; /** * All video playlists */ playlists: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistRequest.ts b/src/api-types/models/GetPlaylistRequest.ts index 9a48a9b..51c85bd 100644 --- a/src/api-types/models/GetPlaylistRequest.ts +++ b/src/api-types/models/GetPlaylistRequest.ts @@ -2,11 +2,11 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface GetPlaylistRequest { +export type GetPlaylistRequest = { playlist_id: string; type?: FileType; uuid?: string; include_file_metadata?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistResponse.ts b/src/api-types/models/GetPlaylistResponse.ts index afe4184..daca2d4 100644 --- a/src/api-types/models/GetPlaylistResponse.ts +++ b/src/api-types/models/GetPlaylistResponse.ts @@ -2,11 +2,11 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; -import { Playlist } from './Playlist'; +import type { FileType } from './FileType'; +import type { Playlist } from './Playlist'; -export interface GetPlaylistResponse { +export type GetPlaylistResponse = { playlist: Playlist; type: FileType; success: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistsRequest.ts b/src/api-types/models/GetPlaylistsRequest.ts index 2693d19..50edba9 100644 --- a/src/api-types/models/GetPlaylistsRequest.ts +++ b/src/api-types/models/GetPlaylistsRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetPlaylistsRequest { +export type GetPlaylistsRequest = { include_categories?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistsResponse.ts b/src/api-types/models/GetPlaylistsResponse.ts index e01f586..7d5a4d4 100644 --- a/src/api-types/models/GetPlaylistsResponse.ts +++ b/src/api-types/models/GetPlaylistsResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Playlist } from './Playlist'; +import type { Playlist } from './Playlist'; -export interface GetPlaylistsResponse { +export type GetPlaylistsResponse = { playlists: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetRolesResponse.ts b/src/api-types/models/GetRolesResponse.ts index 2209ec4..cddc679 100644 --- a/src/api-types/models/GetRolesResponse.ts +++ b/src/api-types/models/GetRolesResponse.ts @@ -2,15 +2,15 @@ /* tslint:disable */ /* eslint-disable */ -import { UserPermission } from './UserPermission'; +import type { UserPermission } from './UserPermission'; -export interface GetRolesResponse { +export type GetRolesResponse = { roles: { admin?: { -permissions?: Array, -}, +permissions?: Array; +}; user?: { -permissions?: Array, -}, +permissions?: Array; +}; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetSubscriptionRequest.ts b/src/api-types/models/GetSubscriptionRequest.ts index c11c5fa..3a9bf63 100644 --- a/src/api-types/models/GetSubscriptionRequest.ts +++ b/src/api-types/models/GetSubscriptionRequest.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetSubscriptionRequest { +export type GetSubscriptionRequest = { /** * Subscription ID */ @@ -12,4 +11,4 @@ export interface GetSubscriptionRequest { * Subscription name */ name?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetSubscriptionResponse.ts b/src/api-types/models/GetSubscriptionResponse.ts index 0efb102..7b6663d 100644 --- a/src/api-types/models/GetSubscriptionResponse.ts +++ b/src/api-types/models/GetSubscriptionResponse.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { Subscription } from './Subscription'; +import type { Subscription } from './Subscription'; -export interface GetSubscriptionResponse { +export type GetSubscriptionResponse = { subscription: Subscription; files: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetTaskRequest.ts b/src/api-types/models/GetTaskRequest.ts index 655a69f..5602d3c 100644 --- a/src/api-types/models/GetTaskRequest.ts +++ b/src/api-types/models/GetTaskRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface GetTaskRequest { +export type GetTaskRequest = { task_key: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetTaskResponse.ts b/src/api-types/models/GetTaskResponse.ts index 7f11c6e..a901123 100644 --- a/src/api-types/models/GetTaskResponse.ts +++ b/src/api-types/models/GetTaskResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Task } from './Task'; +import type { Task } from './Task'; -export interface GetTaskResponse { +export type GetTaskResponse = { task?: Task; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/GetUsersResponse.ts b/src/api-types/models/GetUsersResponse.ts index 2f17953..5a18ec7 100644 --- a/src/api-types/models/GetUsersResponse.ts +++ b/src/api-types/models/GetUsersResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { User } from './User'; +import type { User } from './User'; -export interface GetUsersResponse { +export type GetUsersResponse = { users: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/IncrementViewCountRequest.ts b/src/api-types/models/IncrementViewCountRequest.ts index 1294d10..19011c1 100644 --- a/src/api-types/models/IncrementViewCountRequest.ts +++ b/src/api-types/models/IncrementViewCountRequest.ts @@ -2,12 +2,11 @@ /* tslint:disable */ /* eslint-disable */ - -export interface IncrementViewCountRequest { +export type IncrementViewCountRequest = { file_uid: string; sub_id?: string; /** * User UID */ uuid?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/LoginRequest.ts b/src/api-types/models/LoginRequest.ts index 2e99447..544a1a2 100644 --- a/src/api-types/models/LoginRequest.ts +++ b/src/api-types/models/LoginRequest.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface LoginRequest { +export type LoginRequest = { username: string; password: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/LoginResponse.ts b/src/api-types/models/LoginResponse.ts index 7f5c42d..cd4b380 100644 --- a/src/api-types/models/LoginResponse.ts +++ b/src/api-types/models/LoginResponse.ts @@ -2,12 +2,12 @@ /* tslint:disable */ /* eslint-disable */ -import { User } from './User'; -import { UserPermission } from './UserPermission'; +import type { User } from './User'; +import type { UserPermission } from './UserPermission'; -export interface LoginResponse { +export type LoginResponse = { user?: User; token?: string; permissions?: Array; available_permissions?: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Playlist.ts b/src/api-types/models/Playlist.ts index 7741f41..3c8512f 100644 --- a/src/api-types/models/Playlist.ts +++ b/src/api-types/models/Playlist.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface Playlist { +export type Playlist = { name: string; uids: Array; id: string; @@ -13,4 +13,5 @@ export interface Playlist { registered: number; duration: number; user_uid?: string; -} \ No newline at end of file + auto?: boolean; +}; \ No newline at end of file diff --git a/src/api-types/models/RegisterRequest.ts b/src/api-types/models/RegisterRequest.ts index 87b7f0f..0cd5a87 100644 --- a/src/api-types/models/RegisterRequest.ts +++ b/src/api-types/models/RegisterRequest.ts @@ -2,9 +2,8 @@ /* tslint:disable */ /* eslint-disable */ - -export interface RegisterRequest { +export type RegisterRequest = { userid: string; username: string; password: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/RegisterResponse.ts b/src/api-types/models/RegisterResponse.ts index 5aaa76a..62d0387 100644 --- a/src/api-types/models/RegisterResponse.ts +++ b/src/api-types/models/RegisterResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { User } from './User'; +import type { User } from './User'; -export interface RegisterResponse { +export type RegisterResponse = { user?: User; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/RestoreDBBackupRequest.ts b/src/api-types/models/RestoreDBBackupRequest.ts index b5fde8a..6804f46 100644 --- a/src/api-types/models/RestoreDBBackupRequest.ts +++ b/src/api-types/models/RestoreDBBackupRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface RestoreDBBackupRequest { +export type RestoreDBBackupRequest = { file_name: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Schedule.ts b/src/api-types/models/Schedule.ts index 452202d..93206fe 100644 --- a/src/api-types/models/Schedule.ts +++ b/src/api-types/models/Schedule.ts @@ -2,16 +2,15 @@ /* tslint:disable */ /* eslint-disable */ - -export interface Schedule { +export type Schedule = { type: Schedule.type; data: { -dayOfWeek?: Array, -hour?: number, -minute?: number, -timestamp?: number, +dayOfWeek?: Array; +hour?: number; +minute?: number; +timestamp?: number; +}; }; -} export namespace Schedule { diff --git a/src/api-types/models/SetConfigRequest.ts b/src/api-types/models/SetConfigRequest.ts index f307009..e0edf66 100644 --- a/src/api-types/models/SetConfigRequest.ts +++ b/src/api-types/models/SetConfigRequest.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Config } from './Config'; +import type { Config } from './Config'; -export interface SetConfigRequest { +export type SetConfigRequest = { new_config_file: Config; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/SharingToggle.ts b/src/api-types/models/SharingToggle.ts index 5acba30..8c486f5 100644 --- a/src/api-types/models/SharingToggle.ts +++ b/src/api-types/models/SharingToggle.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface SharingToggle { +export type SharingToggle = { uid: string; is_playlist?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/SubscribeRequest.ts b/src/api-types/models/SubscribeRequest.ts index 2cca0df..d7490bf 100644 --- a/src/api-types/models/SubscribeRequest.ts +++ b/src/api-types/models/SubscribeRequest.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface SubscribeRequest { +export type SubscribeRequest = { name: string; url: string; timerange?: string; @@ -11,4 +10,4 @@ export interface SubscribeRequest { customArgs?: string; customFileOutput?: string; maxQuality?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/SubscribeResponse.ts b/src/api-types/models/SubscribeResponse.ts index a1f1331..0440340 100644 --- a/src/api-types/models/SubscribeResponse.ts +++ b/src/api-types/models/SubscribeResponse.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { Subscription } from './Subscription'; +import type { Subscription } from './Subscription'; -export interface SubscribeResponse { +export type SubscribeResponse = { new_sub: Subscription; error?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Subscription.ts b/src/api-types/models/Subscription.ts index 1184827..5c87886 100644 --- a/src/api-types/models/Subscription.ts +++ b/src/api-types/models/Subscription.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface Subscription { +export type Subscription = { name: string; url: string; id: string; @@ -17,4 +17,4 @@ export interface Subscription { custom_args?: string; custom_output?: string; videos: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/SubscriptionRequestData.ts b/src/api-types/models/SubscriptionRequestData.ts index 056ff28..a7c9650 100644 --- a/src/api-types/models/SubscriptionRequestData.ts +++ b/src/api-types/models/SubscriptionRequestData.ts @@ -2,12 +2,12 @@ /* tslint:disable */ /* eslint-disable */ -import { FileType } from './FileType'; +import type { FileType } from './FileType'; -export interface SubscriptionRequestData { +export type SubscriptionRequestData = { name: string; id: string; type?: FileType; isPlaylist?: boolean; archive?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/SuccessObject.ts b/src/api-types/models/SuccessObject.ts index f59e3fa..9cfdf8b 100644 --- a/src/api-types/models/SuccessObject.ts +++ b/src/api-types/models/SuccessObject.ts @@ -2,7 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface SuccessObject { +export type SuccessObject = { success: boolean; -} \ No newline at end of file + error?: string; +}; \ No newline at end of file diff --git a/src/api-types/models/TableInfo.ts b/src/api-types/models/TableInfo.ts index 244c1a9..58b651a 100644 --- a/src/api-types/models/TableInfo.ts +++ b/src/api-types/models/TableInfo.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface TableInfo { +export type TableInfo = { records_count?: number; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/Task.ts b/src/api-types/models/Task.ts index 95c864a..2533c98 100644 --- a/src/api-types/models/Task.ts +++ b/src/api-types/models/Task.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface Task { +export type Task = { key: string; last_ran: number; last_confirmed: number; @@ -12,4 +11,4 @@ export interface Task { data: any; error: string; schedule: any; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/TestConnectionStringRequest.ts b/src/api-types/models/TestConnectionStringRequest.ts index 156c01f..af83b84 100644 --- a/src/api-types/models/TestConnectionStringRequest.ts +++ b/src/api-types/models/TestConnectionStringRequest.ts @@ -2,10 +2,9 @@ /* tslint:disable */ /* eslint-disable */ - -export interface TestConnectionStringRequest { +export type TestConnectionStringRequest = { /** * MongoDB connection string */ connection_string: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/TestConnectionStringResponse.ts b/src/api-types/models/TestConnectionStringResponse.ts index 0cd0573..745d63f 100644 --- a/src/api-types/models/TestConnectionStringResponse.ts +++ b/src/api-types/models/TestConnectionStringResponse.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface TestConnectionStringResponse { +export type TestConnectionStringResponse = { success: boolean; error?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/TransferDBRequest.ts b/src/api-types/models/TransferDBRequest.ts index fd14f56..5119252 100644 --- a/src/api-types/models/TransferDBRequest.ts +++ b/src/api-types/models/TransferDBRequest.ts @@ -2,10 +2,9 @@ /* tslint:disable */ /* eslint-disable */ - -export interface TransferDBRequest { +export type TransferDBRequest = { /** * True if transfering DB from Local to MongoDB, false if transferring DB from MongoDB to Local */ local_to_remote: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/TransferDBResponse.ts b/src/api-types/models/TransferDBResponse.ts index d8cc1c5..ab744d4 100644 --- a/src/api-types/models/TransferDBResponse.ts +++ b/src/api-types/models/TransferDBResponse.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface TransferDBResponse { +export type TransferDBResponse = { success: boolean; error?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/TwitchChatMessage.ts b/src/api-types/models/TwitchChatMessage.ts index 76da85f..cc7efd7 100644 --- a/src/api-types/models/TwitchChatMessage.ts +++ b/src/api-types/models/TwitchChatMessage.ts @@ -2,17 +2,16 @@ /* tslint:disable */ /* eslint-disable */ - -export interface TwitchChatMessage { +export type TwitchChatMessage = { created_at?: string; content_offset_seconds?: number; commenter?: { -name?: string, -_id?: string, -created_at?: string, +name?: string; +_id?: string; +created_at?: string; }; message?: { -body?: string, -user_color?: string, +body?: string; +user_color?: string; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UnsubscribeRequest.ts b/src/api-types/models/UnsubscribeRequest.ts index 1ee72e3..ffc939c 100644 --- a/src/api-types/models/UnsubscribeRequest.ts +++ b/src/api-types/models/UnsubscribeRequest.ts @@ -2,12 +2,12 @@ /* tslint:disable */ /* eslint-disable */ -import { SubscriptionRequestData } from './SubscriptionRequestData'; +import type { SubscriptionRequestData } from './SubscriptionRequestData'; -export interface UnsubscribeRequest { +export type UnsubscribeRequest = { sub: SubscriptionRequestData; /** * Defaults to false */ deleteMode?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UnsubscribeResponse.ts b/src/api-types/models/UnsubscribeResponse.ts index 1d43b7b..6eb1c36 100644 --- a/src/api-types/models/UnsubscribeResponse.ts +++ b/src/api-types/models/UnsubscribeResponse.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface UnsubscribeResponse { +export type UnsubscribeResponse = { success: boolean; error?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateCategoriesRequest.ts b/src/api-types/models/UpdateCategoriesRequest.ts index cbb3436..6a611ab 100644 --- a/src/api-types/models/UpdateCategoriesRequest.ts +++ b/src/api-types/models/UpdateCategoriesRequest.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Category } from './Category'; +import type { Category } from './Category'; -export interface UpdateCategoriesRequest { +export type UpdateCategoriesRequest = { categories: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateCategoryRequest.ts b/src/api-types/models/UpdateCategoryRequest.ts index 273bde1..7b3e1cb 100644 --- a/src/api-types/models/UpdateCategoryRequest.ts +++ b/src/api-types/models/UpdateCategoryRequest.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Category } from './Category'; +import type { Category } from './Category'; -export interface UpdateCategoryRequest { +export type UpdateCategoryRequest = { category: Category; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateConcurrentStreamRequest.ts b/src/api-types/models/UpdateConcurrentStreamRequest.ts index 2a8f9e4..ce78768 100644 --- a/src/api-types/models/UpdateConcurrentStreamRequest.ts +++ b/src/api-types/models/UpdateConcurrentStreamRequest.ts @@ -2,11 +2,11 @@ /* tslint:disable */ /* eslint-disable */ -import { ConcurrentStream } from './ConcurrentStream'; +import type { ConcurrentStream } from './ConcurrentStream'; -export interface UpdateConcurrentStreamRequest extends ConcurrentStream { - /** - * Concurrent stream UID - */ - uid: string; -} \ No newline at end of file +export type UpdateConcurrentStreamRequest = (ConcurrentStream & { +/** + * Concurrent stream UID + */ +uid: string; +}); \ No newline at end of file diff --git a/src/api-types/models/UpdateConcurrentStreamResponse.ts b/src/api-types/models/UpdateConcurrentStreamResponse.ts index b1d32e8..f3dc88d 100644 --- a/src/api-types/models/UpdateConcurrentStreamResponse.ts +++ b/src/api-types/models/UpdateConcurrentStreamResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { ConcurrentStream } from './ConcurrentStream'; +import type { ConcurrentStream } from './ConcurrentStream'; -export interface UpdateConcurrentStreamResponse { +export type UpdateConcurrentStreamResponse = { stream: ConcurrentStream; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateFileRequest.ts b/src/api-types/models/UpdateFileRequest.ts new file mode 100644 index 0000000..cada2e5 --- /dev/null +++ b/src/api-types/models/UpdateFileRequest.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type UpdateFileRequest = { + /** + * Video UID + */ + uid: string; + /** + * Object with fields to update as keys and their new values + */ + change_obj: any; +}; \ No newline at end of file diff --git a/src/api-types/models/UpdatePlaylistRequest.ts b/src/api-types/models/UpdatePlaylistRequest.ts index 38f98ac..ba015b3 100644 --- a/src/api-types/models/UpdatePlaylistRequest.ts +++ b/src/api-types/models/UpdatePlaylistRequest.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Playlist } from './Playlist'; +import type { Playlist } from './Playlist'; -export interface UpdatePlaylistRequest { +export type UpdatePlaylistRequest = { playlist: Playlist; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateServerRequest.ts b/src/api-types/models/UpdateServerRequest.ts index 8c616f6..8239869 100644 --- a/src/api-types/models/UpdateServerRequest.ts +++ b/src/api-types/models/UpdateServerRequest.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface UpdateServerRequest { +export type UpdateServerRequest = { tag: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateTaskDataRequest.ts b/src/api-types/models/UpdateTaskDataRequest.ts index 7768eaa..afe9b54 100644 --- a/src/api-types/models/UpdateTaskDataRequest.ts +++ b/src/api-types/models/UpdateTaskDataRequest.ts @@ -2,8 +2,7 @@ /* tslint:disable */ /* eslint-disable */ - -export interface UpdateTaskDataRequest { +export type UpdateTaskDataRequest = { task_key: string; new_data: any; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateTaskScheduleRequest.ts b/src/api-types/models/UpdateTaskScheduleRequest.ts index b9e61d6..62d8775 100644 --- a/src/api-types/models/UpdateTaskScheduleRequest.ts +++ b/src/api-types/models/UpdateTaskScheduleRequest.ts @@ -2,9 +2,9 @@ /* tslint:disable */ /* eslint-disable */ -import { Schedule } from './Schedule'; +import type { Schedule } from './Schedule'; -export interface UpdateTaskScheduleRequest { +export type UpdateTaskScheduleRequest = { task_key: string; new_schedule: Schedule; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdateUserRequest.ts b/src/api-types/models/UpdateUserRequest.ts index 19e32c8..db522c6 100644 --- a/src/api-types/models/UpdateUserRequest.ts +++ b/src/api-types/models/UpdateUserRequest.ts @@ -2,11 +2,10 @@ /* tslint:disable */ /* eslint-disable */ - -export interface UpdateUserRequest { +export type UpdateUserRequest = { change_object: { -uid: string, -name?: string, -role?: string, +uid: string; +name?: string; +role?: string; }; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UpdaterStatus.ts b/src/api-types/models/UpdaterStatus.ts index 8db6a17..47a2e99 100644 --- a/src/api-types/models/UpdaterStatus.ts +++ b/src/api-types/models/UpdaterStatus.ts @@ -2,9 +2,8 @@ /* tslint:disable */ /* eslint-disable */ - -export interface UpdaterStatus { +export type UpdaterStatus = { updating: boolean; details: string; error?: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/User.ts b/src/api-types/models/User.ts index 0568e06..aa9802e 100644 --- a/src/api-types/models/User.ts +++ b/src/api-types/models/User.ts @@ -2,24 +2,16 @@ /* tslint:disable */ /* eslint-disable */ -import { Subscription } from './Subscription'; -import { UserPermission } from './UserPermission'; +import type { Subscription } from './Subscription'; +import type { UserPermission } from './UserPermission'; -export interface User { +export type User = { uid?: string; name?: string; passhash?: string; - files?: { -audio?: Array, -video?: Array, -}; - playlists?: { -audio?: Array, -video?: Array, -}; subscriptions?: Array; created?: number; role?: string; permissions?: Array; permission_overrides?: Array; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/UserPermission.ts b/src/api-types/models/UserPermission.ts index b22ef87..ca8df45 100644 --- a/src/api-types/models/UserPermission.ts +++ b/src/api-types/models/UserPermission.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - export enum UserPermission { FILEMANAGER = 'filemanager', SETTINGS = 'settings', diff --git a/src/api-types/models/Version.ts b/src/api-types/models/Version.ts index 5049571..37c4289 100644 --- a/src/api-types/models/Version.ts +++ b/src/api-types/models/Version.ts @@ -2,10 +2,9 @@ /* tslint:disable */ /* eslint-disable */ - -export interface Version { +export type Version = { type?: string; tag?: string; commit?: string; date?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/VersionInfoResponse.ts b/src/api-types/models/VersionInfoResponse.ts index 369927b..20d77da 100644 --- a/src/api-types/models/VersionInfoResponse.ts +++ b/src/api-types/models/VersionInfoResponse.ts @@ -2,8 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -import { Version } from './Version'; +import type { Version } from './Version'; -export interface VersionInfoResponse { +export type VersionInfoResponse = { version_info: Version; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/YesNo.ts b/src/api-types/models/YesNo.ts index dbe9c62..b30f848 100644 --- a/src/api-types/models/YesNo.ts +++ b/src/api-types/models/YesNo.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - export enum YesNo { YES = 'yes', NO = 'no', diff --git a/src/api-types/models/File.ts b/src/api-types/models/binary.ts similarity index 76% rename from src/api-types/models/File.ts rename to src/api-types/models/binary.ts index 5114e53..e8c6812 100644 --- a/src/api-types/models/File.ts +++ b/src/api-types/models/binary.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface File { +export type binary = { id?: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/body_19.ts b/src/api-types/models/body_19.ts index c7f8fb8..69df745 100644 --- a/src/api-types/models/body_19.ts +++ b/src/api-types/models/body_19.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface body_19 { +export type body_19 = { input_pin: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/body_20.ts b/src/api-types/models/body_20.ts index 559ea14..be997a7 100644 --- a/src/api-types/models/body_20.ts +++ b/src/api-types/models/body_20.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface body_20 { +export type body_20 = { unhashed_pin: string; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/api-types/models/inline_response_200_15.ts b/src/api-types/models/inline_response_200_15.ts index 7147a1e..c8d731d 100644 --- a/src/api-types/models/inline_response_200_15.ts +++ b/src/api-types/models/inline_response_200_15.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ - -export interface inline_response_200_15 { +export type inline_response_200_15 = { is_set: boolean; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 0e9bf59..a9e2ad4 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,7 +1,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NgModule, LOCALE_ID } from '@angular/core'; -import { registerLocaleData, CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { registerLocaleData, CommonModule, DatePipe } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; @@ -189,7 +189,8 @@ registerLocaleData(es, 'es'); ], providers: [ PostsService, - { provide: HTTP_INTERCEPTORS, useClass: H401Interceptor, multi: true } + { provide: HTTP_INTERCEPTORS, useClass: H401Interceptor, multi: true }, + DatePipe ], exports: [ HighlightPipe, diff --git a/src/app/components/custom-playlists/custom-playlists.component.ts b/src/app/components/custom-playlists/custom-playlists.component.ts index 9654013..e659724 100644 --- a/src/app/components/custom-playlists/custom-playlists.component.ts +++ b/src/app/components/custom-playlists/custom-playlists.component.ts @@ -35,7 +35,7 @@ export class CustomPlaylistsComponent implements OnInit { getAllPlaylists() { this.playlists_received = false; // must call getAllFiles as we need to get category playlists as well - this.postsService.getPlaylists().subscribe(res => { + this.postsService.getPlaylists(true).subscribe(res => { this.playlists = res['playlists']; this.playlists_received = true; }); diff --git a/src/app/components/downloads/downloads.component.html b/src/app/components/downloads/downloads.component.html index 86e6600..9dabe7e 100644 --- a/src/app/components/downloads/downloads.component.html +++ b/src/app/components/downloads/downloads.component.html @@ -3,7 +3,7 @@ - + Date {{element.timestamp_start | date: 'short'}} @@ -19,7 +19,7 @@ - + Subscription @@ -32,13 +32,13 @@ - + Stage {{STEP_INDEX_TO_LABEL[element.step_index]}} - + Progress @@ -82,7 +82,7 @@
- +
diff --git a/src/app/components/downloads/downloads.component.ts b/src/app/components/downloads/downloads.component.ts index 6b4cedb..81cdd8c 100644 --- a/src/app/components/downloads/downloads.component.ts +++ b/src/app/components/downloads/downloads.component.ts @@ -61,7 +61,7 @@ export class DownloadsComponent implements OnInit, OnDestroy { 3: $localize`Complete` } - displayedColumns: string[] = ['date', 'title', 'stage', 'subscription', 'progress', 'actions']; + displayedColumns: string[] = ['timestamp_start', 'title', 'step_index', 'sub_name', 'percent_complete', 'actions']; dataSource = null; // new MatTableDataSource(); downloads_retrieved = false; @@ -104,7 +104,6 @@ export class DownloadsComponent implements OnInit, OnDestroy { getCurrentDownloads(): void { this.postsService.getCurrentDownloads(this.uids).subscribe(res => { - this.downloads_retrieved = true; if (res['downloads'] !== null && res['downloads'] !== undefined && JSON.stringify(this.downloads) !== JSON.stringify(res['downloads'])) { @@ -114,29 +113,50 @@ export class DownloadsComponent implements OnInit, OnDestroy { this.dataSource = new MatTableDataSource(this.downloads); this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; - this.paused_download_exists = this.downloads.find(download => download['paused'] && !download['error']); this.running_download_exists = this.downloads.find(download => !download['paused'] && !download['finished']); } else { // failed to get downloads } + this.downloads_retrieved = true; }); } - clearFinishedDownloads(): void { + clearDownloadsByType(): void { + const clearEmitter = new EventEmitter(); const dialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - dialogTitle: $localize`Clear finished downloads`, - dialogText: $localize`Would you like to clear your finished downloads?`, + dialogType: 'selection_list', + dialogTitle: $localize`Clear downloads`, + dialogText: $localize`Select downloads to clear`, submitText: $localize`Clear`, - warnSubmitColor: true + doneEmitter: clearEmitter, + warnSubmitColor: true, + list: [ + { + title: $localize`Finished downloads`, + key: 'clear_finished' + }, + { + title: $localize`Paused downloads`, + key: 'clear_paused' + }, + { + title: $localize`Errored downloads`, + key: 'clear_errors' + } + ] } }); - dialogRef.afterClosed().subscribe(confirmed => { - if (confirmed) { - this.postsService.clearFinishedDownloads().subscribe(res => { + clearEmitter.subscribe((done: boolean) => { + if (done) { + const selected_items = dialogRef.componentInstance.selected_items; + this.postsService.clearDownloads(selected_items.includes('clear_finished'), selected_items.includes('clear_paused'), selected_items.includes('clear_errors')).subscribe(res => { if (!res['success']) { - this.postsService.openSnackBar('Failed to clear finished downloads!'); + this.postsService.openSnackBar($localize`Failed to clear finished downloads!`); + } else { + this.postsService.openSnackBar($localize`Cleared downloads!`); + dialogRef.close(); } }); } diff --git a/src/app/components/login/login.component.html b/src/app/components/login/login.component.html index 7ff151f..39987c5 100644 --- a/src/app/components/login/login.component.html +++ b/src/app/components/login/login.component.html @@ -1,31 +1,31 @@