mirror of
https://github.com/LuanRT/YouTube.js.git
synced 2026-06-19 20:41:17 +00:00
* deps: update linkedom
* refactor!: remove YTNodeGenerator in favour of namespaced pure functions
BREAKING CHANGES:
- Removes `YTNodeGenerator` from `import('youtubei.js').Generator` and exposes its functions directly in `import('youtubei.js').Generator`
* refactor!: replace Parser class with pure functions
- Remove Parser class in favour of pure functions
- Merge duplicate classes `AppendContinuationItemsAction` into a single class
- Move continuation parsers into a seperate file
- Add better custom logging support to parser methods as per issue #460
* refactor!: replace Proto class with pure functions
* chore: update package-lock.json
* refactor!: replace FormatUtils with pure functions and JSX components
- Replace linkedom DASH manifest generation with a dependency free JSX implementation
- Remove FormatUtils class in favour of pure functions
- Remove DOMParser requirement
- Remove duplicate types
* refactor: implement changes from #462
* chore: lint
* fix: deno support
* fix: render valid xml document
* fix: wrong function call in DashUtils
* fix: typo in parser
Co-authored-by: LuanRT <luan.lrt4@gmail.com>
* refactor!: move streaming info logic into seperate function
This allows users to access the same data available in the dash manifest while also simplifying the manifest generation
* chore: lint
* refactor: readability improvements & fixes
Remove redundant getAudioTrackGroups
General readability improvements in StreamingInfo.ts
Share response object between `getBitrate` and `getMimeType` as to not make duplicate requests
* build: remove unnecessary step in deno build
Co-authored-by: absidue <48293849+absidue@users.noreply.github.com>
* refactor: move types to `types` directory
* docs: add back comments lost during refactor
* chore: lint
---------
Co-authored-by: LuanRT <luan.lrt4@gmail.com>
Co-authored-by: absidue <48293849+absidue@users.noreply.github.com>
120 lines
3.3 KiB
TypeScript
120 lines
3.3 KiB
TypeScript
import AccountInfo from '../../parser/youtube/AccountInfo.js';
|
|
import Analytics from '../../parser/youtube/Analytics.js';
|
|
import Settings from '../../parser/youtube/Settings.js';
|
|
import TimeWatched from '../../parser/youtube/TimeWatched.js';
|
|
|
|
import * as Proto from '../../proto/index.js';
|
|
import { InnertubeError } from '../../utils/Utils.js';
|
|
import { Account, BrowseEndpoint, Channel } from '../endpoints/index.js';
|
|
|
|
import type Actions from '../Actions.js';
|
|
import type { ApiResponse } from '../Actions.js';
|
|
|
|
export default class AccountManager {
|
|
#actions: Actions;
|
|
|
|
channel: {
|
|
editName: (new_name: string) => Promise<ApiResponse>;
|
|
editDescription: (new_description: string) => Promise<ApiResponse>;
|
|
getBasicAnalytics: () => Promise<Analytics>;
|
|
};
|
|
|
|
constructor(actions: Actions) {
|
|
this.#actions = actions;
|
|
|
|
this.channel = {
|
|
/**
|
|
* Edits channel name.
|
|
* @param new_name - The new channel name.
|
|
*/
|
|
editName: (new_name: string) => {
|
|
if (!this.#actions.session.logged_in)
|
|
throw new InnertubeError('You must be signed in to perform this operation.');
|
|
|
|
return this.#actions.execute(
|
|
Channel.EditNameEndpoint.PATH,
|
|
Channel.EditNameEndpoint.build({
|
|
given_name: new_name
|
|
})
|
|
);
|
|
},
|
|
/**
|
|
* Edits channel description.
|
|
* @param new_description - The new description.
|
|
*/
|
|
editDescription: (new_description: string) => {
|
|
if (!this.#actions.session.logged_in)
|
|
throw new InnertubeError('You must be signed in to perform this operation.');
|
|
|
|
return this.#actions.execute(
|
|
Channel.EditDescriptionEndpoint.PATH,
|
|
Channel.EditDescriptionEndpoint.build({
|
|
given_description: new_description
|
|
})
|
|
);
|
|
},
|
|
/**
|
|
* Retrieves basic channel analytics.
|
|
*/
|
|
getBasicAnalytics: () => this.getAnalytics()
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Retrieves channel info.
|
|
*/
|
|
async getInfo(): Promise<AccountInfo> {
|
|
if (!this.#actions.session.logged_in)
|
|
throw new InnertubeError('You must be signed in to perform this operation.');
|
|
|
|
const response = await this.#actions.execute(
|
|
Account.AccountListEndpoint.PATH,
|
|
Account.AccountListEndpoint.build()
|
|
);
|
|
|
|
return new AccountInfo(response);
|
|
}
|
|
|
|
/**
|
|
* Retrieves time watched statistics.
|
|
*/
|
|
async getTimeWatched(): Promise<TimeWatched> {
|
|
const response = await this.#actions.execute(
|
|
BrowseEndpoint.PATH, BrowseEndpoint.build({
|
|
browse_id: 'SPtime_watched',
|
|
client: 'ANDROID'
|
|
})
|
|
);
|
|
|
|
return new TimeWatched(response);
|
|
}
|
|
|
|
/**
|
|
* Opens YouTube settings.
|
|
*/
|
|
async getSettings(): Promise<Settings> {
|
|
const response = await this.#actions.execute(
|
|
BrowseEndpoint.PATH, BrowseEndpoint.build({
|
|
browse_id: 'SPaccount_overview'
|
|
})
|
|
);
|
|
return new Settings(this.#actions, response);
|
|
}
|
|
|
|
/**
|
|
* Retrieves basic channel analytics.
|
|
*/
|
|
async getAnalytics(): Promise<Analytics> {
|
|
const info = await this.getInfo();
|
|
|
|
const response = await this.#actions.execute(
|
|
BrowseEndpoint.PATH, BrowseEndpoint.build({
|
|
browse_id: 'FEanalytics_screen',
|
|
params: Proto.encodeChannelAnalyticsParams(info.footers?.endpoint.payload.browseId),
|
|
client: 'ANDROID'
|
|
})
|
|
);
|
|
|
|
return new Analytics(response);
|
|
}
|
|
} |