diff --git a/src/Innertube.ts b/src/Innertube.ts index 6e3f6b9cc..e9f4944f1 100644 --- a/src/Innertube.ts +++ b/src/Innertube.ts @@ -42,7 +42,7 @@ import type { DownloadOptions, FormatOptions } from './utils/FormatUtils.js'; export type InnertubeConfig = SessionOptions; -export type InnerTubeClient = 'WEB' | 'ANDROID' | 'YTMUSIC_ANDROID' | 'YTMUSIC' | 'YTSTUDIO_ANDROID' | 'TV_EMBEDDED' | 'YTKIDS' +export type InnerTubeClient = 'WEB' | 'iOS' | 'ANDROID' | 'YTMUSIC_ANDROID' | 'YTMUSIC' | 'YTSTUDIO_ANDROID' | 'TV_EMBEDDED' | 'YTKIDS'; export type SearchFilters = Partial<{ upload_date: 'all' | 'hour' | 'today' | 'week' | 'month' | 'year'; diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 36ee278be..aae19d9c4 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -33,6 +33,12 @@ export const OAUTH = Object.freeze({ }) }); export const CLIENTS = Object.freeze({ + iOS: { + NAME: 'iOS', + VERSION: '18.06.35', + USER_AGENT: 'com.google.ios.youtube/18.06.35 (iPhone; CPU iPhone OS 14_4 like Mac OS X; en_US)', + DEVICE_MODEL: 'iPhone10,6' + }, WEB: { NAME: 'WEB', VERSION: '2.20230622.06.00', diff --git a/src/utils/HTTPClient.ts b/src/utils/HTTPClient.ts index b1aa0b9ac..414e87fc3 100644 --- a/src/utils/HTTPClient.ts +++ b/src/utils/HTTPClient.ts @@ -95,6 +95,8 @@ export default class HTTPClient { if (Platform.shim.server) { if (n_body.context.client.clientName === 'ANDROID' || n_body.context.client.clientName === 'ANDROID_MUSIC') { request_headers.set('User-Agent', Constants.CLIENTS.ANDROID.USER_AGENT); + } else if (n_body.context.client.clientName === 'iOS') { + request_headers.set('User-Agent', Constants.CLIENTS.iOS.USER_AGENT); } } @@ -139,7 +141,8 @@ export default class HTTPClient { // Check if 2xx if (response.ok) { return response; - } throw new InnertubeError(`Request to ${response.url} failed with status ${response.status}`, await response.text()); + } + throw new InnertubeError(`Request to ${response.url} failed with status ${response.status}`, await response.text()); } #adjustContext(ctx: Context, client: string): void { @@ -157,6 +160,12 @@ export default class HTTPClient { } switch (client) { + case 'iOS': + ctx.client.deviceModel = Constants.CLIENTS.iOS.DEVICE_MODEL; + ctx.client.clientVersion = Constants.CLIENTS.iOS.VERSION; + ctx.client.clientName = Constants.CLIENTS.iOS.NAME; + ctx.client.platform = 'MOBILE'; + break; case 'YTMUSIC': ctx.client.clientVersion = Constants.CLIENTS.YTMUSIC.VERSION; ctx.client.clientName = Constants.CLIENTS.YTMUSIC.NAME;