mirror of
https://github.com/Tzahi12345/YoutubeDL-Material.git
synced 2026-04-18 14:11:29 +03:00
Added audioOnlyMode, customArgs, and customFileOutput fields to the subscribe dialog
This commit is contained in:
@@ -2099,6 +2099,9 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => {
|
|||||||
let url = req.body.url;
|
let url = req.body.url;
|
||||||
let timerange = req.body.timerange;
|
let timerange = req.body.timerange;
|
||||||
let streamingOnly = req.body.streamingOnly;
|
let streamingOnly = req.body.streamingOnly;
|
||||||
|
let audioOnly = req.body.audioOnly;
|
||||||
|
let customArgs = req.body.customArgs;
|
||||||
|
let customOutput = req.body.customOutput;
|
||||||
let user_uid = req.isAuthenticated() ? req.user.uid : null;
|
let user_uid = req.isAuthenticated() ? req.user.uid : null;
|
||||||
|
|
||||||
const new_sub = {
|
const new_sub = {
|
||||||
@@ -2106,7 +2109,8 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => {
|
|||||||
url: url,
|
url: url,
|
||||||
id: uuid(),
|
id: uuid(),
|
||||||
streamingOnly: streamingOnly,
|
streamingOnly: streamingOnly,
|
||||||
user_uid: user_uid
|
user_uid: user_uid,
|
||||||
|
type: audioOnly ? 'audio' : 'video'
|
||||||
};
|
};
|
||||||
|
|
||||||
// adds timerange if it exists, otherwise all videos will be downloaded
|
// adds timerange if it exists, otherwise all videos will be downloaded
|
||||||
@@ -2114,6 +2118,14 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => {
|
|||||||
new_sub.timerange = timerange;
|
new_sub.timerange = timerange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (customArgs && customArgs !== '') {
|
||||||
|
sub.custom_args = customArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customOutput && customOutput !== '') {
|
||||||
|
sub.custom_output = customOutput;
|
||||||
|
}
|
||||||
|
|
||||||
const result_obj = await subscriptions_api.subscribe(new_sub, user_uid);
|
const result_obj = await subscriptions_api.subscribe(new_sub, user_uid);
|
||||||
|
|
||||||
if (result_obj.success) {
|
if (result_obj.success) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ var fs = require('fs-extra')
|
|||||||
var path = require('path')
|
var path = require('path')
|
||||||
var utils = require('./utils')
|
var utils = require('./utils')
|
||||||
const { uuid } = require('uuidv4');
|
const { uuid } = require('uuidv4');
|
||||||
|
const config_api = require('./config');
|
||||||
|
|
||||||
var logger = null;
|
var logger = null;
|
||||||
var db = null;
|
var db = null;
|
||||||
@@ -16,7 +17,7 @@ function initialize(input_db, input_users_db, input_logger) {
|
|||||||
|
|
||||||
function registerFileDB(file_path, type, multiUserMode = null, sub = null) {
|
function registerFileDB(file_path, type, multiUserMode = null, sub = null) {
|
||||||
const file_id = file_path.substring(0, file_path.length-4);
|
const file_id = file_path.substring(0, file_path.length-4);
|
||||||
const file_object = generateFileObject(file_id, type, multiUserMode && multiUserMode.file_path);
|
const file_object = generateFileObject(file_id, type, multiUserMode && multiUserMode.file_path, sub);
|
||||||
if (!file_object) {
|
if (!file_object) {
|
||||||
logger.error(`Could not find associated JSON file for ${type} file ${file_id}`);
|
logger.error(`Could not find associated JSON file for ${type} file ${file_id}`);
|
||||||
return false;
|
return false;
|
||||||
@@ -64,7 +65,10 @@ function registerFileDB(file_path, type, multiUserMode = null, sub = null) {
|
|||||||
return file_object['uid'];
|
return file_object['uid'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateFileObject(id, type, customPath = null) {
|
function generateFileObject(id, type, customPath = null, sub = null) {
|
||||||
|
if (!customPath && sub) {
|
||||||
|
customPath = getAppendedBasePathSub(sub, config_api.getConfigItem('ytdl_subscriptions_base_path'));
|
||||||
|
}
|
||||||
var jsonobj = (type === 'audio') ? utils.getJSONMp3(id, customPath, true) : utils.getJSONMp4(id, customPath, true);
|
var jsonobj = (type === 'audio') ? utils.getJSONMp3(id, customPath, true) : utils.getJSONMp4(id, customPath, true);
|
||||||
if (!jsonobj) {
|
if (!jsonobj) {
|
||||||
return null;
|
return null;
|
||||||
@@ -89,6 +93,10 @@ function generateFileObject(id, type, customPath = null) {
|
|||||||
return file_obj;
|
return file_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getAppendedBasePathSub(sub, base_path) {
|
||||||
|
return path.join(base_path, (sub.isPlaylist ? 'playlists/' : 'channels/'), sub.name);
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
initialize: initialize,
|
initialize: initialize,
|
||||||
registerFileDB: registerFileDB
|
registerFileDB: registerFileDB
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ async function subscribe(sub, user_uid = null) {
|
|||||||
return new Promise(async resolve => {
|
return new Promise(async resolve => {
|
||||||
// sub should just have url and name. here we will get isPlaylist and path
|
// sub should just have url and name. here we will get isPlaylist and path
|
||||||
sub.isPlaylist = sub.url.includes('playlist');
|
sub.isPlaylist = sub.url.includes('playlist');
|
||||||
sub.type = 'video'; // TODO: eventually change
|
|
||||||
sub.videos = [];
|
sub.videos = [];
|
||||||
|
|
||||||
let url_exists = false;
|
let url_exists = false;
|
||||||
|
|||||||
@@ -3,16 +3,20 @@
|
|||||||
<mat-dialog-content>
|
<mat-dialog-content>
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12 mb-4">
|
||||||
<mat-form-field color="accent">
|
<mat-form-field color="accent">
|
||||||
<input [(ngModel)]="url" matInput placeholder="URL" i18n-placeholder="Subscription URL input placeholder" required aria-required="true">
|
<input [(ngModel)]="url" matInput placeholder="URL" i18n-placeholder="Subscription URL input placeholder" required aria-required="true">
|
||||||
<mat-hint><ng-container i18n="Subscription URL input hint">The playlist or channel URL</ng-container></mat-hint>
|
<mat-hint><ng-container i18n="Subscription URL input hint">The playlist or channel URL</ng-container></mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<mat-divider></mat-divider>
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<mat-form-field color="accent">
|
<mat-form-field color="accent">
|
||||||
<input [(ngModel)]="name" matInput placeholder="Custom name" i18n-placeholder="Subscription custom name placeholder">
|
<input [(ngModel)]="name" matInput placeholder="Custom name" i18n-placeholder="Subscription custom name placeholder">
|
||||||
<mat-hint><ng-container i18n="Custom name input hint">This is optional</ng-container></mat-hint>
|
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 mt-3">
|
<div class="col-12 mt-3">
|
||||||
@@ -31,9 +35,32 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox [(ngModel)]="streamingOnlyMode"><ng-container i18n="Streaming-only mode">Streaming-only mode</ng-container></mat-checkbox>
|
<mat-checkbox [(ngModel)]="audioOnlyMode"><ng-container i18n="Streaming-only mode">Audio-only mode</ng-container></mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<div>
|
||||||
|
<mat-checkbox [disabled]="audioOnlyMode" [(ngModel)]="streamingOnlyMode"><ng-container i18n="Streaming-only mode">Streaming-only mode</ng-container></mat-checkbox>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 mb-2">
|
||||||
|
<mat-form-field color="accent">
|
||||||
|
<input [(ngModel)]="customArgs" matInput placeholder="Custom args" i18n-placeholder="Subscription custom args placeholder">
|
||||||
|
<mat-hint>
|
||||||
|
<ng-container i18n="Custom args hint">These are added after the standard args.</ng-container>
|
||||||
|
</mat-hint>
|
||||||
|
</mat-form-field>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<mat-form-field color="accent">
|
||||||
|
<input [(ngModel)]="customFileOutput" matInput placeholder="Custom file output" i18n-placeholder="Subscription custom file output placeholder">
|
||||||
|
<mat-hint>
|
||||||
|
<a target="_blank" href="https://github.com/ytdl-org/youtube-dl/blob/master/README.md#output-template">
|
||||||
|
<ng-container i18n="Custom output template documentation link">Documentation</ng-container></a>.
|
||||||
|
<ng-container i18n="Custom Output input hint">Path is relative to the config download path. Don't include extension.</ng-container>
|
||||||
|
</mat-hint>
|
||||||
|
</mat-form-field>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</mat-dialog-content>
|
</mat-dialog-content>
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ export class SubscribeDialogComponent implements OnInit {
|
|||||||
// no videos actually downloaded, just streamed
|
// no videos actually downloaded, just streamed
|
||||||
streamingOnlyMode = false;
|
streamingOnlyMode = false;
|
||||||
|
|
||||||
|
// audio only mode
|
||||||
|
audioOnlyMode = false;
|
||||||
|
|
||||||
|
customFileOutput = null;
|
||||||
|
customArgs = null;
|
||||||
|
|
||||||
time_units = [
|
time_units = [
|
||||||
'day',
|
'day',
|
||||||
'week',
|
'week',
|
||||||
@@ -49,7 +55,8 @@ export class SubscribeDialogComponent implements OnInit {
|
|||||||
if (!this.download_all) {
|
if (!this.download_all) {
|
||||||
timerange = 'now-' + this.timerange_amount.toString() + this.timerange_unit;
|
timerange = 'now-' + this.timerange_amount.toString() + this.timerange_unit;
|
||||||
}
|
}
|
||||||
this.postsService.createSubscription(this.url, this.name, timerange, this.streamingOnlyMode).subscribe(res => {
|
this.postsService.createSubscription(this.url, this.name, timerange, this.streamingOnlyMode,
|
||||||
|
this.audioOnlyMode, this.customArgs, this.customFileOutput).subscribe(res => {
|
||||||
this.subscribing = false;
|
this.subscribing = false;
|
||||||
if (res['new_sub']) {
|
if (res['new_sub']) {
|
||||||
this.dialogRef.close(res['new_sub']);
|
this.dialogRef.close(res['new_sub']);
|
||||||
|
|||||||
@@ -280,9 +280,9 @@ export class PostsService implements CanActivate {
|
|||||||
return this.http.post(this.path + 'deletePlaylist', {playlistID: playlistID, type: type}, this.httpOptions);
|
return this.http.post(this.path + 'deletePlaylist', {playlistID: playlistID, type: type}, this.httpOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
createSubscription(url, name, timerange = null, streamingOnly = false) {
|
createSubscription(url, name, timerange = null, streamingOnly = false, audioOnly = false, customArgs = null, customFileOutput = null) {
|
||||||
return this.http.post(this.path + 'subscribe', {url: url, name: name, timerange: timerange, streamingOnly: streamingOnly},
|
return this.http.post(this.path + 'subscribe', {url: url, name: name, timerange: timerange, streamingOnly: streamingOnly,
|
||||||
this.httpOptions);
|
audioOnly: audioOnly, customArgs: customArgs, customFileOutput: customFileOutput}, this.httpOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsubscribe(sub, deleteMode = false) {
|
unsubscribe(sub, deleteMode = false) {
|
||||||
|
|||||||
Reference in New Issue
Block a user