import ExternalAPI from '@server/api/externalapi' ;
import type { AvailableCacheIds } from '@server/lib/cache' ;
import cacheManager from '@server/lib/cache' ;
import type { DVRSettings } from '@server/lib/settings' ;
export interface SystemStatus {
version : string ;
buildTime : Date ;
isDebug : boolean ;
isProduction : boolean ;
isAdmin : boolean ;
isUserInteractive : boolean ;
startupPath : string ;
appData : string ;
osName : string ;
osVersion : string ;
isNetCore : boolean ;
isMono : boolean ;
isLinux : boolean ;
isOsx : boolean ;
isWindows : boolean ;
isDocker : boolean ;
mode : string ;
branch : string ;
authentication : string ;
sqliteVersion : string ;
migrationVersion : number ;
urlBase : string ;
runtimeVersion : string ;
runtimeName : string ;
startTime : Date ;
packageUpdateMechanism : string ;
}
export interface RootFolder {
id : number ;
path : string ;
freeSpace : number ;
totalSpace : number ;
unmappedFolders : {
name : string ;
path : string ;
} [ ] ;
}
export interface QualityProfile {
id : number ;
name : string ;
}
interface QueueItem {
size : number ;
title : string ;
sizeleft : number ;
timeleft : string ;
estimatedCompletionTime : string ;
status : string ;
trackedDownloadStatus : string ;
trackedDownloadState : string ;
downloadId : string ;
protocol : string ;
downloadClient : string ;
indexer : string ;
id : number ;
}
export interface Tag {
id : number ;
label : string ;
}
interface QueueResponse < QueueItemAppendT > {
page : number ;
pageSize : number ;
sortKey : string ;
sortDirection : string ;
totalRecords : number ;
records : ( QueueItem & QueueItemAppendT ) [ ] ;
}
class ServarrBase < QueueItemAppendT > extends ExternalAPI {
static buildUrl ( settings : DVRSettings , path? : string ) : string {
return ` ${ settings . useSsl ? 'https' : 'http' } :// ${ settings . hostname } : ${
settings . port
} $ { settings . baseUrl ? ? '' } $ { path } ` ;
}
protected apiName : string ;
constructor ( {
url ,
apiKey ,
cacheName ,
apiName ,
} : {
url : string ;
apiKey : string ;
cacheName : AvailableCacheIds ;
apiName : string ;
} ) {
super (
url ,
{
apikey : apiKey ,
} ,
{
nodeCache : cacheManager.getCache ( cacheName ) . data ,
}
) ;
this . apiName = apiName ;
}
public getSystemStatus = async ( ) : Promise < SystemStatus > = > {
try {
const response = await this . axios . get < SystemStatus > ( '/system/status' ) ;
return response . data ;
} catch ( e ) {
throw new Error (
` [ ${ this . apiName } ] Failed to retrieve system status: ${ e . message } `
) ;
}
} ;
public getProfiles = async ( ) : Promise < QualityProfile [ ] > = > {
try {
const data = await this . getRolling < QualityProfile [ ] > (
` /qualityProfile ` ,
undefined ,
3600
) ;
return data ;
} catch ( e ) {
throw new Error (
` [ ${ this . apiName } ] Failed to retrieve profiles: ${ e . message } `
) ;
}
} ;
public getRootFolders = async ( ) : Promise < RootFolder [ ] > = > {
try {
const data = await this . getRolling < RootFolder [ ] > (
` /rootfolder ` ,
undefined ,
3600
) ;
return data ;
} catch ( e ) {
throw new Error (
` [ ${ this . apiName } ] Failed to retrieve root folders: ${ e . message } `
) ;
}
} ;
public getQueue = async ( ) : Promise < ( QueueItem & QueueItemAppendT ) [ ] > = > {
try {
const response = await this . axios . get < QueueResponse < QueueItemAppendT > > (
` /queue `
) ;
return response . data . records ;
} catch ( e ) {
throw new Error (
` [ ${ this . apiName } ] Failed to retrieve queue: ${ e . message } `
) ;
}
} ;
public getTags = async ( ) : Promise < Tag [ ] > = > {
try {
const response = await this . axios . get < Tag [ ] > ( ` /tag ` ) ;
return response . data ;
} catch ( e ) {
throw new Error (
` [ ${ this . apiName } ] Failed to retrieve tags: ${ e . message } `
) ;
}
} ;
public createTag = async ( { label } : { label : string } ) : Promise < Tag > = > {
try {
const response = await this . axios . post < Tag > ( ` /tag ` , {
label ,
} ) ;
return response . data ;
} catch ( e ) {
throw new Error ( ` [ ${ this . apiName } ] Failed to create tag: ${ e . message } ` ) ;
}
} ;
protected async runCommand (
commandName : string ,
options : Record < string , unknown >
) : Promise < void > {
try {
await this . axios . post ( ` /command ` , {
name : commandName ,
. . . options ,
} ) ;
} catch ( e ) {
throw new Error ( ` [ ${ this . apiName } ] Failed to run command: ${ e . message } ` ) ;
}
}
}
export default ServarrBase ;