@autorecord/douyin-recorder 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,33 +1,33 @@
1
- export declare function getRoomInfo(webRoomId: string, retryOnSpecialCode?: boolean): Promise<{
2
- living: boolean;
3
- roomId: string;
4
- owner: string;
5
- title: string;
6
- streams: StreamProfile[];
7
- sources: SourceProfile[];
8
- }>;
9
- export interface StreamProfile {
10
- desc: string;
11
- key: string;
12
- bitRate: number;
13
- }
14
- export interface SourceProfile {
15
- name: string;
16
- streamMap: StreamData['data'];
17
- }
18
- interface StreamData {
19
- common: unknown;
20
- data: Record<string, {
21
- main: {
22
- flv: string;
23
- hls: string;
24
- cmaf: string;
25
- dash: string;
26
- lls: string;
27
- tsl: string;
28
- tile: string;
29
- sdk_params: string;
30
- };
31
- }>;
32
- }
33
- export {};
1
+ export declare function getRoomInfo(webRoomId: string, retryOnSpecialCode?: boolean): Promise<{
2
+ living: boolean;
3
+ roomId: string;
4
+ owner: string;
5
+ title: string;
6
+ streams: StreamProfile[];
7
+ sources: SourceProfile[];
8
+ }>;
9
+ export interface StreamProfile {
10
+ desc: string;
11
+ key: string;
12
+ bitRate: number;
13
+ }
14
+ export interface SourceProfile {
15
+ name: string;
16
+ streamMap: StreamData['data'];
17
+ }
18
+ interface StreamData {
19
+ common: unknown;
20
+ data: Record<string, {
21
+ main: {
22
+ flv: string;
23
+ hls: string;
24
+ cmaf: string;
25
+ dash: string;
26
+ lls: string;
27
+ tsl: string;
28
+ tile: string;
29
+ sdk_params: string;
30
+ };
31
+ }>;
32
+ }
33
+ export {};
package/lib/douyin_api.js CHANGED
@@ -1,92 +1,100 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getRoomInfo = void 0;
16
- const axios_1 = __importDefault(require("axios"));
17
- const axios_cookiejar_support_1 = require("axios-cookiejar-support");
18
- const tough_cookie_1 = require("tough-cookie");
19
- const utils_1 = require("./utils");
20
- const jar = new tough_cookie_1.CookieJar();
21
- const requester = (0, axios_cookiejar_support_1.wrapper)(axios_1.default.create({
22
- timeout: 10e3,
23
- jar,
24
- }));
25
- function getRoomInfo(webRoomId, retryOnSpecialCode = true) {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- const res = yield requester.get('https://live.douyin.com/webcast/web/enter/', {
28
- params: {
29
- aid: 6383,
30
- live_id: 1,
31
- device_platform: 'web',
32
- language: 'zh-CN',
33
- enter_from: 'web_live',
34
- cookie_enabled: 'true',
35
- screen_width: 1920,
36
- screen_height: 1080,
37
- browser_language: 'zh-CN',
38
- browser_platform: 'MacIntel',
39
- browser_name: 'Chrome',
40
- browser_version: '108.0.0.0',
41
- web_rid: webRoomId,
42
- // enter_source:,
43
- 'Room-Enter-User-Login-Ab': 0,
44
- is_need_double_stream: 'false',
45
- },
46
- });
47
- // 无 cookie 时 code 为 10037
48
- if (res.data.status_code === 10037 && retryOnSpecialCode) {
49
- // resp 自动设置 cookie
50
- yield requester.get('https://live.douyin.com/favicon.ico');
51
- return getRoomInfo(webRoomId, false);
52
- }
53
- (0, utils_1.assert)(res.data.status_code === 0, `Unexpected resp, code ${res.data.status_code}, msg ${res.data.data}`);
54
- const data = res.data.data;
55
- const room = data.data[0];
56
- if (room.stream_url == null) {
57
- return {
58
- living: false,
59
- roomId: webRoomId,
60
- owner: data.user.nickname,
61
- title: room.title,
62
- streams: [],
63
- sources: [],
64
- };
65
- }
66
- const { options: { qualities }, stream_data, } = room.stream_url.live_core_sdk_data.pull_data;
67
- const streamData = JSON.parse(stream_data).data;
68
- const streams = qualities.map((info) => ({
69
- desc: info.name,
70
- key: info.sdk_key,
71
- bitRate: info.v_bit_rate,
72
- }));
73
- // 看起来抖音是自动切换 cdn 的,所以这里固定返回一个默认的 source。
74
- const sources = [
75
- {
76
- name: '自动切换线路',
77
- streamMap: streamData,
78
- },
79
- ];
80
- return {
81
- living: data.room_status === 0,
82
- // 接口里不会再返回 web room id,只能直接用入参原路返回了。
83
- roomId: webRoomId,
84
- owner: data.user.nickname,
85
- title: room.title,
86
- streams,
87
- sources,
88
- };
89
- });
90
- }
91
- exports.getRoomInfo = getRoomInfo;
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getRoomInfo = void 0;
16
+ const axios_1 = __importDefault(require("axios"));
17
+ const axios_cookiejar_support_1 = require("axios-cookiejar-support");
18
+ const tough_cookie_1 = require("tough-cookie");
19
+ const utils_1 = require("./utils");
20
+ const jar = new tough_cookie_1.CookieJar();
21
+ const requester = (0, axios_cookiejar_support_1.wrapper)(axios_1.default.create({
22
+ timeout: 10e3,
23
+ jar,
24
+ // axios 会自动读取环境变量中的 http_proxy 和 https_proxy 并应用,这会让请求发往代理的 host。
25
+ // 于是 set-cookie domain 与请求的 host 无法匹配上,tough-cookie 在检查时会丢弃它,导致 cookie 丢失。
26
+ // 所以这里需要主动禁用代理功能。
27
+ proxy: false,
28
+ }));
29
+ function getRoomInfo(webRoomId, retryOnSpecialCode = true) {
30
+ var _a;
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ // 抖音的 'webcast/room/web/enter' api 会需要 ttwid 的 cookie,这个 cookie 是由这个请求的响应头设置的,
33
+ // 所以在这里请求一次自动设置。
34
+ yield requester.get('https://live.douyin.com/');
35
+ const res = yield requester.get('https://live.douyin.com/webcast/room/web/enter/', {
36
+ params: {
37
+ aid: 6383,
38
+ live_id: 1,
39
+ device_platform: 'web',
40
+ language: 'zh-CN',
41
+ enter_from: 'web_live',
42
+ cookie_enabled: 'true',
43
+ screen_width: 1920,
44
+ screen_height: 1080,
45
+ browser_language: 'zh-CN',
46
+ browser_platform: 'MacIntel',
47
+ browser_name: 'Chrome',
48
+ browser_version: '108.0.0.0',
49
+ web_rid: webRoomId,
50
+ // enter_source:,
51
+ 'Room-Enter-User-Login-Ab': 0,
52
+ is_need_double_stream: 'false',
53
+ },
54
+ });
55
+ // cookie 时 code 为 10037
56
+ if (res.data.status_code === 10037 && retryOnSpecialCode) {
57
+ // resp 自动设置 cookie
58
+ yield requester.get('https://live.douyin.com/favicon.ico');
59
+ return getRoomInfo(webRoomId, false);
60
+ }
61
+ (0, utils_1.assert)(res.data.status_code === 0, `Unexpected resp, code ${res.data.status_code}, msg ${res.data.data}`);
62
+ const data = res.data.data;
63
+ const room = data.data[0];
64
+ if ((room === null || room === void 0 ? void 0 : room.stream_url) == null) {
65
+ return {
66
+ living: false,
67
+ roomId: webRoomId,
68
+ owner: data.user.nickname,
69
+ title: (_a = room === null || room === void 0 ? void 0 : room.title) !== null && _a !== void 0 ? _a : data.user.nickname,
70
+ streams: [],
71
+ sources: [],
72
+ };
73
+ }
74
+ const { options: { qualities }, stream_data, } = room.stream_url.live_core_sdk_data.pull_data;
75
+ const streamData = JSON.parse(stream_data).data;
76
+ const streams = qualities.map((info) => ({
77
+ desc: info.name,
78
+ key: info.sdk_key,
79
+ bitRate: info.v_bit_rate,
80
+ }));
81
+ // 看起来抖音是自动切换 cdn 的,所以这里固定返回一个默认的 source。
82
+ const sources = [
83
+ {
84
+ name: '自动切换线路',
85
+ streamMap: streamData,
86
+ },
87
+ ];
88
+ return {
89
+ living: data.room_status === 0,
90
+ // 接口里不会再返回 web room id,只能直接用入参原路返回了。
91
+ roomId: webRoomId,
92
+ owner: data.user.nickname,
93
+ title: room.title,
94
+ streams,
95
+ sources,
96
+ };
97
+ });
98
+ }
99
+ exports.getRoomInfo = getRoomInfo;
92
100
  //# sourceMappingURL=douyin_api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"douyin_api.js","sourceRoot":"","sources":["../src/douyin_api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"douyin_api.js","sourceRoot":"","sources":["../src/douyin_api.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { RecorderProvider } from '@autorecord/manager';
2
- export declare const provider: RecorderProvider<{}>;
1
+ import { RecorderProvider } from '@autorecord/manager';
2
+ export declare const provider: RecorderProvider<{}>;