diff --git a/deno/package.json b/deno/package.json index 425e1400..f07fa49c 100644 --- a/deno/package.json +++ b/deno/package.json @@ -1,6 +1,6 @@ { "name": "youtubei.js", - "version": "6.2.0", + "version": "6.3.0", "description": "A wrapper around YouTube's private API. Supports YouTube, YouTube Music, YouTube Kids and YouTube Studio (WIP).", "type": "module", "types": "./dist/src/platform/lib.d.ts", diff --git a/deno/src/core/Session.ts b/deno/src/core/Session.ts index 3379029c..145bc5aa 100644 --- a/deno/src/core/Session.ts +++ b/deno/src/core/Session.ts @@ -63,6 +63,7 @@ export interface Context { user: { enableSafetyMode: boolean; lockedSafetyMode: boolean; + onBehalfOfUser?: string; }; thirdParty?: { embedUrl: string; @@ -84,6 +85,10 @@ export interface SessionOptions { * Only works if you are signed in with cookies. */ account_index?: number; + /** + * Specify the Page ID of the YouTube profile/channel to use, if the logged-in account has multiple profiles. + */ + on_behalf_of_user?: string; /** * Specifies whether to retrieve the JS player. Disabling this will make session creation faster. * **NOTE:** Deciphering formats is not possible without the JS player. @@ -193,7 +198,8 @@ export default class Session extends EventEmitterLike { options.device_category, options.client_type, options.timezone, - options.fetch + options.fetch, + options.on_behalf_of_user ); return new Session( @@ -213,11 +219,12 @@ export default class Session extends EventEmitterLike { device_category: DeviceCategory = 'desktop', client_name: ClientType = ClientType.WEB, tz: string = Intl.DateTimeFormat().resolvedOptions().timeZone, - fetch: FetchFunction = Platform.shim.fetch + fetch: FetchFunction = Platform.shim.fetch, + on_behalf_of_user?: string ) { let session_data: SessionData; - const session_args = { lang, location, time_zone: tz, device_category, client_name, enable_safety_mode, visitor_data }; + const session_args = { lang, location, time_zone: tz, device_category, client_name, enable_safety_mode, visitor_data, on_behalf_of_user }; if (generate_session_locally) { session_data = this.#generateSessionData(session_args); @@ -241,6 +248,7 @@ export default class Session extends EventEmitterLike { client_name: string; enable_safety_mode: boolean; visitor_data: string; + on_behalf_of_user?: string; }, fetch: FetchFunction = Platform.shim.fetch): Promise { const url = new URL('/sw.js_data', Constants.URLS.YT_BASE); @@ -300,7 +308,8 @@ export default class Session extends EventEmitterLike { }, user: { enableSafetyMode: options.enable_safety_mode, - lockedSafetyMode: false + lockedSafetyMode: false, + onBehalfOfUser: options.on_behalf_of_user } }; @@ -315,6 +324,7 @@ export default class Session extends EventEmitterLike { client_name: string; enable_safety_mode: boolean; visitor_data: string; + on_behalf_of_user?: string; }): SessionData { let visitor_id = generateRandomString(11); @@ -347,7 +357,8 @@ export default class Session extends EventEmitterLike { }, user: { enableSafetyMode: options.enable_safety_mode, - lockedSafetyMode: false + lockedSafetyMode: false, + onBehalfOfUser: options.on_behalf_of_user } }; diff --git a/deno/src/parser/classes/ChannelMetadata.ts b/deno/src/parser/classes/ChannelMetadata.ts index bf8395ab..d516bcfa 100644 --- a/deno/src/parser/classes/ChannelMetadata.ts +++ b/deno/src/parser/classes/ChannelMetadata.ts @@ -14,6 +14,7 @@ export default class ChannelMetadata extends YTNode { is_family_safe: boolean; keywords: string[]; avatar: Thumbnail[]; + music_artist_name?: string; available_countries: string[]; android_deep_link: string; android_appindexing_link: string; @@ -30,6 +31,8 @@ export default class ChannelMetadata extends YTNode { this.is_family_safe = data.isFamilySafe; this.keywords = data.keywords; this.avatar = Thumbnail.fromResponse(data.avatar); + // Can be an empty string sometimes, so we need the extra length check + this.music_artist_name = typeof data.musicArtistName === 'string' && data.musicArtistName.length > 0 ? data.musicArtistName : undefined; this.available_countries = data.availableCountryCodes; this.android_deep_link = data.androidDeepLink; this.android_appindexing_link = data.androidAppindexingLink; diff --git a/deno/src/parser/classes/CompactMovie.ts b/deno/src/parser/classes/CompactMovie.ts index ebe5d478..684b5f28 100644 --- a/deno/src/parser/classes/CompactMovie.ts +++ b/deno/src/parser/classes/CompactMovie.ts @@ -3,6 +3,7 @@ import type { RawNode } from '../index.ts'; import Parser from '../index.ts'; import Author from './misc/Author.ts'; import NavigationEndpoint from './NavigationEndpoint.ts'; +import Text from './misc/Text.ts'; import Thumbnail from './misc/Thumbnail.ts'; import Menu from './menus/Menu.ts'; import { timeToSeconds } from '../../utils/Utils.ts'; @@ -29,7 +30,6 @@ export default class CompactMovie extends YTNode { constructor(data: RawNode) { super(); - console.log(data); const overlay_time_status = data.thumbnailOverlays .find((overlay: RawNode) => overlay.thumbnailOverlayTimeStatusRenderer) ?.thumbnailOverlayTimeStatusRenderer.text || 'N/A';