@ -6,20 +6,21 @@ const config_api = require('./config');
const archive _api = require ( './archive' ) ;
const utils = require ( './utils' ) ;
const logger = require ( './logger' ) ;
const CONSTS = require ( './consts' ) ;
const debugMode = process . env . YTDL _MODE === 'debug' ;
const db _api = require ( './db' ) ;
const downloader _api = require ( './downloader' ) ;
async function subscribe ( sub , user _uid = null ) {
exports . subscribe = async ( sub , user _uid = null , skip _get _info = false ) => {
const result _obj = {
success : false ,
error : ''
} ;
return new Promise ( async resolve => {
// sub should just have url and name. here we will get isPlaylist and path
sub . isPlaylist = sub . url. includes ( 'playlist' ) ;
sub . isPlaylist = sub . isPlaylist || sub . url. includes ( 'playlist' ) ;
sub . videos = [ ] ;
let url _exists = ! ! ( await db _api . getRecord ( 'subscriptions' , { url : sub . url , user _uid : user _uid } ) ) ;
@ -34,10 +35,11 @@ async function subscribe(sub, user_uid = null) {
sub [ 'user_uid' ] = user _uid ? user _uid : undefined ;
await db _api . insertRecordIntoTable ( 'subscriptions' , sub ) ;
let success = await getSubscriptionInfo ( sub ) ;
let success = skip _get _info ? true : await getSubscriptionInfo ( sub ) ;
exports . writeSubscriptionMetadata ( sub ) ;
if ( success ) {
getVideosForSub ( sub , user _uid ) ;
if ( ! sub . paused ) exports . getVideosForSub ( sub , user _uid ) ;
} else {
logger . error ( 'Subscribe: Failed to get subscription info. Subscribe failed.' )
}
@ -109,7 +111,7 @@ async function getSubscriptionInfo(sub) {
} ) ;
}
async function unsubscribe ( sub , deleteMode , user _uid = null ) {
exports . unsubscribe = async ( sub , deleteMode , user _uid = null ) => {
let basePath = null ;
if ( user _uid )
basePath = path . join ( config _api . getConfigItem ( 'ytdl_users_base_path' ) , user _uid , 'subscriptions' ) ;
@ -148,7 +150,7 @@ async function unsubscribe(sub, deleteMode, user_uid = null) {
await db _api . removeAllRecords ( 'archives' , { sub _id : sub . id } ) ;
}
async function deleteSubscriptionFile ( sub , file , deleteForever , file _uid = null , user _uid = null ) {
exports . deleteSubscriptionFile = async ( sub , file , deleteForever , file _uid = null , user _uid = null ) => {
if ( typeof sub === 'string' ) {
// TODO: fix bad workaround where sub is a sub_id
sub = await db _api . getRecord ( 'subscriptions' , { sub _id : sub } ) ;
@ -216,8 +218,8 @@ async function deleteSubscriptionFile(sub, file, deleteForever, file_uid = null,
}
}
async function getVideosForSub ( sub , user _uid = null ) {
const latest _sub _obj = await getSubscription( sub . id ) ;
exports . getVideosForSub = async ( sub , user _uid = null ) => {
const latest _sub _obj = await exports. getSubscription( sub . id ) ;
if ( ! latest _sub _obj || latest _sub _obj [ 'downloading' ] ) {
return false ;
}
@ -305,7 +307,7 @@ async function handleOutputJSON(output, sub, user_uid) {
}
const files _to _download = await getFilesToDownload ( sub , output _jsons ) ;
const base _download _options = generateOptionsForSubscriptionDownload( sub , user _uid ) ;
const base _download _options = exports. generateOptionsForSubscriptionDownload( sub , user _uid ) ;
for ( let j = 0 ; j < files _to _download . length ; j ++ ) {
const file _to _download = files _to _download [ j ] ;
@ -316,7 +318,7 @@ async function handleOutputJSON(output, sub, user_uid) {
return files _to _download ;
}
function generateOptionsForSubscriptionDownload ( sub , user _uid ) {
exports . generateOptionsForSubscriptionDownload = ( sub , user _uid ) => {
let basePath = null ;
if ( user _uid )
basePath = path . join ( config _api . getConfigItem ( 'ytdl_users_base_path' ) , user _uid , 'subscriptions' ) ;
@ -443,35 +445,36 @@ async function getFilesToDownload(sub, output_jsons) {
}
async function getSubscriptions ( user _uid = null ) {
exports . getSubscriptions = async ( user _uid = null ) => {
return await db _api . getRecords ( 'subscriptions' , { user _uid : user _uid } ) ;
}
async function getAllSubscriptions ( ) {
exports . getAllSubscriptions = async ( ) => {
const all _subs = await db _api . getRecords ( 'subscriptions' ) ;
const multiUserMode = config _api . getConfigItem ( 'ytdl_multi_user_mode' ) ;
return all _subs . filter ( sub => ! ! ( sub . user _uid ) === ! ! multiUserMode ) ;
}
async function getSubscription ( subID ) {
exports . getSubscription = async ( subID ) => {
// stringify and parse because we may override the 'downloading' property
const sub = JSON . parse ( JSON . stringify ( await db _api . getRecord ( 'subscriptions' , { id : subID } ) ) ) ;
// now with the download_queue, we may need to override 'downloading'
const current _downloads = await db _api . getRecords ( 'download_queue' , { running : true , sub _id : sub . id } , true ) ;
const current _downloads = await db _api . getRecords ( 'download_queue' , { running : true , sub _id : sub ID } , true ) ;
if ( ! sub [ 'downloading' ] ) sub [ 'downloading' ] = current _downloads > 0 ;
return sub ;
}
async function getSubscriptionByName ( subName , user _uid = null ) {
exports . getSubscriptionByName = async ( subName , user _uid = null ) => {
return await db _api . getRecord ( 'subscriptions' , { name : subName , user _uid : user _uid } ) ;
}
async function updateSubscription ( sub ) {
exports . updateSubscription = async ( sub ) => {
await db _api . updateRecord ( 'subscriptions' , { id : sub . id } , sub ) ;
exports . writeSubscriptionMetadata ( sub ) ;
return true ;
}
async function updateSubscriptionPropertyMultiple ( subs , assignment _obj ) {
exports . updateSubscriptionPropertyMultiple = async ( subs , assignment _obj ) => {
subs . forEach ( async sub => {
await updateSubscriptionProperty ( sub , assignment _obj ) ;
} ) ;
@ -483,6 +486,14 @@ async function updateSubscriptionProperty(sub, assignment_obj) {
return true ;
}
exports . writeSubscriptionMetadata = ( sub ) => {
let basePath = sub . user _uid ? path . join ( config _api . getConfigItem ( 'ytdl_users_base_path' ) , sub . user _uid , 'subscriptions' )
: config _api . getConfigItem ( 'ytdl_subscriptions_base_path' ) ;
const appendedBasePath = getAppendedBasePath ( sub , basePath ) ;
const metadata _path = path . join ( appendedBasePath , CONSTS . SUBSCRIPTION _BACKUP _PATH ) ;
fs . writeJSONSync ( metadata _path , sub ) ;
}
async function setFreshUploads ( sub ) {
const sub _files = await db _api . getRecords ( 'files' , { sub _id : sub . id } ) ;
if ( ! sub _files ) return ;
@ -537,17 +548,3 @@ async function checkVideoIfBetterExists(file_obj, sub, user_uid) {
function getAppendedBasePath ( sub , base _path ) {
return path . join ( base _path , ( sub . isPlaylist ? 'playlists/' : 'channels/' ) , sub . name ) ;
}
module . exports = {
getSubscription : getSubscription ,
getSubscriptionByName : getSubscriptionByName ,
getSubscriptions : getSubscriptions ,
getAllSubscriptions : getAllSubscriptions ,
updateSubscription : updateSubscription ,
subscribe : subscribe ,
unsubscribe : unsubscribe ,
deleteSubscriptionFile : deleteSubscriptionFile ,
getVideosForSub : getVideosForSub ,
updateSubscriptionPropertyMultiple : updateSubscriptionPropertyMultiple ,
generateOptionsForSubscriptionDownload : generateOptionsForSubscriptionDownload
}