Compare commits

..

2 Commits

5 changed files with 32 additions and 43 deletions

View File

@@ -849,12 +849,13 @@ function getVideoFormatID(name)
} }
} }
async function createPlaylistZipFile(fileNames, type, outputName, fullPathProvided = null) { async function createPlaylistZipFile(fileNames, type, outputName, fullPathProvided = null, user_uid = null) {
return new Promise(async resolve => { return new Promise(async resolve => {
let zipFolderPath = null; let zipFolderPath = null;
if (!fullPathProvided) { if (!fullPathProvided) {
zipFolderPath = path.join(__dirname, (type === 'audio') ? audioFolderPath : videoFolderPath); zipFolderPath = path.join(type === 'audio' ? audioFolderPath : videoFolderPath);
if (user_uid) zipFolderPath = path.join(config_api.getConfigItem('ytdl_users_base_path'), user_uid, zipFolderPath);
} else { } else {
zipFolderPath = path.join(__dirname, config_api.getConfigItem('ytdl_subscriptions_base_path')); zipFolderPath = path.join(__dirname, config_api.getConfigItem('ytdl_subscriptions_base_path'));
} }
@@ -879,7 +880,7 @@ async function createPlaylistZipFile(fileNames, type, outputName, fullPathProvid
for (let i = 0; i < fileNames.length; i++) { for (let i = 0; i < fileNames.length; i++) {
let fileName = fileNames[i]; let fileName = fileNames[i];
let fileNamePathRemoved = path.parse(fileName).base; let fileNamePathRemoved = path.parse(fileName).base;
let file_path = !fullPathProvided ? zipFolderPath + fileName + ext : fileName; let file_path = !fullPathProvided ? path.join(zipFolderPath, fileName + ext) : fileName;
archive.file(file_path, {name: fileNamePathRemoved + ext}) archive.file(file_path, {name: fileNamePathRemoved + ext})
} }
@@ -1159,12 +1160,7 @@ async function downloadFileByURL_exec(url, type, options, sessionID = null) {
return; return;
} else { } else {
// store info in download for future use // store info in download for future use
if (Array.isArray(info)) { download['_filename'] = info['_filename'];
download['fileNames'] = [];
for (let info_obj of info) download['fileNames'].push(info_obj['_filename']);
} else {
download['_filename'] = info['_filename'];
}
download['filesize'] = utils.getExpectedFileSize(info); download['filesize'] = utils.getExpectedFileSize(info);
} }
@@ -1618,15 +1614,12 @@ function checkDownloadPercent(download) {
Any file that starts with <video title> will be counted as part of the "bytes downloaded", which will Any file that starts with <video title> will be counted as part of the "bytes downloaded", which will
be divided by the "total expected bytes." be divided by the "total expected bytes."
*/ */
// assume it's a playlist for logic reasons const file_id = download['file_id'];
const fileNames = Array.isArray(download['fileNames']) ? download['fileNames'] const filename = path.format(path.parse(download['_filename'].substring(0, download['_filename'].length-4)));
: [path.format(path.parse(download['_filename'].substring(0, download['_filename'].length-4)))];
const resulting_file_size = download['filesize']; const resulting_file_size = download['filesize'];
let sum_size = 0;
let glob_str = ''; glob(`${filename}*`, (err, files) => {
glob(`{${fileNames.join(',')}, }*`, (err, files) => { let sum_size = 0;
files.forEach(file => { files.forEach(file => {
try { try {
const file_stats = fs.statSync(file); const file_stats = fs.statSync(file);
@@ -1801,9 +1794,9 @@ const optionalJwt = function (req, res, next) {
const uuid = using_body ? req.body.uuid : req.query.uuid; const uuid = using_body ? req.body.uuid : req.query.uuid;
const uid = using_body ? req.body.uid : req.query.uid; const uid = using_body ? req.body.uid : req.query.uid;
const type = using_body ? req.body.type : req.query.type; const type = using_body ? req.body.type : req.query.type;
const file = !req.query.id ? auth_api.getUserVideo(uuid, uid, type, true, req.body) : auth_api.getUserPlaylist(uuid, req.query.id, null, true); const playlist_id = using_body ? req.body.id : req.query.id;
const is_shared = file ? file['sharingEnabled'] : false; const file = !playlist_id ? auth_api.getUserVideo(uuid, uid, type, true, req.body) : auth_api.getUserPlaylist(uuid, playlist_id, null, false);
if (is_shared) { if (file) {
req.can_watch = true; req.can_watch = true;
return next(); return next();
} else { } else {
@@ -2008,7 +2001,7 @@ app.post('/api/getAllFiles', optionalJwt, function (req, res) {
let audios = null; let audios = null;
let audio_playlists = null; let audio_playlists = null;
let video_playlists = null; let video_playlists = null;
let subscriptions = subscriptions_api.getAllSubscriptions(req.isAuthenticated() ? req.user.uid : null); let subscriptions = config_api.getConfigItem('ytdl_allow_subscriptions') ? (subscriptions_api.getAllSubscriptions(req.isAuthenticated() ? req.user.uid : null)) : [];
// get basic info depending on multi-user mode being enabled // get basic info depending on multi-user mode being enabled
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
@@ -2556,7 +2549,8 @@ app.post('/api/downloadFile', optionalJwt, async (req, res) => {
for (let i = 0; i < fileNames.length; i++) { for (let i = 0; i < fileNames.length; i++) {
fileNames[i] = decodeURIComponent(fileNames[i]); fileNames[i] = decodeURIComponent(fileNames[i]);
} }
file = await createPlaylistZipFile(fileNames, type, outputName, fullPathProvided); file = await createPlaylistZipFile(fileNames, type, outputName, fullPathProvided, req.body.uuid);
file = path.join(__dirname, file);
} }
res.sendFile(file, function (err) { res.sendFile(file, function (err) {
if (err) { if (err) {

View File

@@ -283,6 +283,7 @@ exports.getUserVideos = function(user_uid, type) {
} }
exports.getUserVideo = function(user_uid, file_uid, type, requireSharing = false) { exports.getUserVideo = function(user_uid, file_uid, type, requireSharing = false) {
let file = null;
if (!type) { if (!type) {
file = users_db.get('users').find({uid: user_uid}).get(`files.audio`).find({uid: file_uid}).value(); file = users_db.get('users').find({uid: user_uid}).get(`files.audio`).find({uid: file_uid}).value();
if (!file) { if (!file) {

View File

@@ -105,27 +105,19 @@ function getDownloadedThumbnail(name, type, customPath = null) {
return null; return null;
} }
function getExpectedFileSize(input_info_jsons) { function getExpectedFileSize(info_json) {
// treat single videos as arrays to have the file sizes checked/added to. makes the code cleaner if (info_json['filesize']) {
const info_jsons = Array.isArray(input_info_jsons) ? input_info_jsons : [input_info_jsons]; return info_json['filesize'];
}
const formats = info_json['format_id'].split('+');
let expected_filesize = 0; let expected_filesize = 0;
formats.forEach(format_id => {
info_jsons.forEach(info_json => { info_json.formats.forEach(available_format => {
if (info_json['filesize']) { if (available_format.format_id === format_id && available_format.filesize) {
expected_filesize += info_json['filesize']; expected_filesize += available_format.filesize;
return; }
}
const formats = info_json['format_id'].split('+');
let individual_expected_filesize = 0;
formats.forEach(format_id => {
info_json.formats.forEach(available_format => {
if (available_format.format_id === format_id && available_format.filesize) {
individual_expected_filesize += available_format.filesize;
}
});
}); });
expected_filesize += individual_expected_filesize;
}); });
return expected_filesize; return expected_filesize;

View File

@@ -317,7 +317,8 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy {
const zipName = fileNames[0].split(' ')[0] + fileNames[1].split(' ')[0]; const zipName = fileNames[0].split(' ')[0] + fileNames[1].split(' ')[0];
this.downloading = true; this.downloading = true;
this.postsService.downloadFileFromServer(fileNames, this.type, zipName).subscribe(res => { this.postsService.downloadFileFromServer(fileNames, this.type, zipName, null, null, null, null,
!this.uuid ? this.postsService.user.uid : this.uuid, this.id).subscribe(res => {
this.downloading = false; this.downloading = false;
const blob: Blob = res; const blob: Blob = res;
saveAs(blob, zipName + '.zip'); saveAs(blob, zipName + '.zip');

View File

@@ -223,7 +223,7 @@ export class PostsService implements CanActivate {
} }
downloadFileFromServer(fileName, type, outputName = null, fullPathProvided = null, subscriptionName = null, subPlaylist = null, downloadFileFromServer(fileName, type, outputName = null, fullPathProvided = null, subscriptionName = null, subPlaylist = null,
uid = null, uuid = null) { uid = null, uuid = null, id = null) {
return this.http.post(this.path + 'downloadFile', {fileNames: fileName, return this.http.post(this.path + 'downloadFile', {fileNames: fileName,
type: type, type: type,
zip_mode: Array.isArray(fileName), zip_mode: Array.isArray(fileName),
@@ -232,7 +232,8 @@ export class PostsService implements CanActivate {
subscriptionName: subscriptionName, subscriptionName: subscriptionName,
subPlaylist: subPlaylist, subPlaylist: subPlaylist,
uuid: uuid, uuid: uuid,
uid: uid uid: uid,
id: id
}, },
{responseType: 'blob', params: this.httpOptions.params}); {responseType: 'blob', params: this.httpOptions.params});
} }