export interface ChannelIconInterface { url?: string; width: number; height: number; } export class Channel { name?: string; verified?: boolean; id?: string; url?: string; icon?: ChannelIconInterface; subscribers?: string; constructor(data: any) { if (!data) throw new Error(`Cannot instantiate the ${this.constructor.name} class without data!`); this._patch(data); } private _patch(data: any): void { if (!data) data = {}; this.name = data.name || null; this.verified = !!data.verified || false; this.id = data.id || null; this.url = data.url || null; this.icon = data.icon || { url: null, width: 0, height: 0 }; this.subscribers = data.subscribers || null; } /** * Returns channel icon url * @param {object} options Icon options * @param {number} [options.size=0] Icon size. **Default is 0** */ iconURL(options = { size: 0 }): string | undefined { if (typeof options.size !== 'number' || options.size < 0) throw new Error('invalid icon size'); if (!this.icon?.url) return undefined; const def = this.icon.url.split('=s')[1].split('-c')[0]; return this.icon.url.replace(`=s${def}-c`, `=s${options.size}-c`); } get type(): 'channel' { return 'channel'; } toString(): string { return this.name || ''; } toJSON() { return { name: this.name, verified: this.verified, id: this.id, url: this.url, iconURL: this.iconURL(), type: this.type, subscribers: this.subscribers }; } }