mirror of
https://github.com/LuanRT/YouTube.js.git
synced 2026-06-18 03:59:38 +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>
45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import { YTNode } from '../helpers.js';
|
|
import type { RawNode } from '../index.js';
|
|
|
|
export interface StoryboardData {
|
|
template_url: string;
|
|
thumbnail_width: number;
|
|
thumbnail_height: number;
|
|
thumbnail_count: number;
|
|
interval: number;
|
|
columns: number;
|
|
rows: number;
|
|
storyboard_count: number;
|
|
}
|
|
|
|
export default class PlayerStoryboardSpec extends YTNode {
|
|
static type = 'PlayerStoryboardSpec';
|
|
|
|
boards: StoryboardData[];
|
|
|
|
constructor(data: RawNode) {
|
|
super();
|
|
|
|
const parts = data.spec.split('|');
|
|
const url = new URL(parts.shift());
|
|
|
|
this.boards = parts.map((part: any, i: any) => {
|
|
const [ thumbnail_width, thumbnail_height, thumbnail_count, columns, rows, interval, name, sigh ] = part.split('#');
|
|
|
|
url.searchParams.set('sigh', sigh);
|
|
|
|
const storyboard_count = Math.ceil(parseInt(thumbnail_count, 10) / (parseInt(columns, 10) * parseInt(rows, 10)));
|
|
|
|
return {
|
|
template_url: url.toString().replace('$L', i).replace('$N', name),
|
|
thumbnail_width: parseInt(thumbnail_width, 10),
|
|
thumbnail_height: parseInt(thumbnail_height, 10),
|
|
thumbnail_count: parseInt(thumbnail_count, 10),
|
|
interval: parseInt(interval, 10),
|
|
columns: parseInt(columns, 10),
|
|
rows: parseInt(rows, 10),
|
|
storyboard_count
|
|
};
|
|
});
|
|
}
|
|
} |