@yimou6/common-ui 1.14.1 → 1.14.2

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.
@@ -134,7 +134,6 @@ export declare const ITzjPlayer: import("../../types").SFCWithInstall<import("vu
134
134
  showBottomBar: import("vue").Ref<boolean, boolean>;
135
135
  playerRef: import("vue").ShallowRef<any, any>;
136
136
  isPlaying: import("vue").Ref<boolean, boolean>;
137
- isFullscreen: import("vue").Ref<boolean, boolean>;
138
137
  isVolumeMuted: import("vue").Ref<boolean, boolean>;
139
138
  audioMsg: import("vue").Ref<{
140
139
  type: string;
@@ -147,13 +146,8 @@ export declare const ITzjPlayer: import("../../types").SFCWithInstall<import("vu
147
146
  msg: string;
148
147
  }>;
149
148
  initPlayer: () => Promise<void>;
150
- playerPlay: () => void;
151
- playerPause: () => void;
152
- playerScreenShot: () => void;
153
- playerFullscreen: (fullscreen: boolean) => void;
154
149
  handleVideoInfo: () => void;
155
150
  handleMute: (mute: boolean) => void;
156
- handleSetMute: (volume: number) => void;
157
151
  EasyPlayer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
158
152
  url: {
159
153
  type: StringConstructor;
@@ -880,6 +874,291 @@ export declare const ITzjPlayer: import("../../types").SFCWithInstall<import("vu
880
874
  areaName: string;
881
875
  platformTypeName: string;
882
876
  pauseMode: number;
877
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any> | import("vue").DefineComponent<import("vue").ExtractPropTypes<{
878
+ url: {
879
+ type: StringConstructor;
880
+ default: string;
881
+ };
882
+ accessToken: {
883
+ type: StringConstructor;
884
+ default: string;
885
+ };
886
+ areaName: {
887
+ type: StringConstructor;
888
+ default: string;
889
+ };
890
+ deviceSerial: {
891
+ type: StringConstructor;
892
+ default: string;
893
+ };
894
+ platformTypeName: {
895
+ type: StringConstructor;
896
+ default: string;
897
+ };
898
+ debug: {
899
+ type: BooleanConstructor;
900
+ default: boolean;
901
+ };
902
+ pauseMode: {
903
+ type: NumberConstructor;
904
+ default: number;
905
+ validator: (value: number) => boolean;
906
+ };
907
+ }>, {
908
+ props: import("@vue/shared").LooseRequired<Readonly<import("vue").ExtractPropTypes<{
909
+ url: {
910
+ type: StringConstructor;
911
+ default: string;
912
+ };
913
+ accessToken: {
914
+ type: StringConstructor;
915
+ default: string;
916
+ };
917
+ areaName: {
918
+ type: StringConstructor;
919
+ default: string;
920
+ };
921
+ deviceSerial: {
922
+ type: StringConstructor;
923
+ default: string;
924
+ };
925
+ platformTypeName: {
926
+ type: StringConstructor;
927
+ default: string;
928
+ };
929
+ debug: {
930
+ type: BooleanConstructor;
931
+ default: boolean;
932
+ };
933
+ pauseMode: {
934
+ type: NumberConstructor;
935
+ default: number;
936
+ validator: (value: number) => boolean;
937
+ };
938
+ }>> & Readonly<{}> & {}>;
939
+ videoUrl: import("vue").Ref<string, string>;
940
+ errorMsg: import("vue").Ref<string, string>;
941
+ showBottomBar: import("vue").Ref<boolean, boolean>;
942
+ playerRef: import("vue").ShallowRef<any, any>;
943
+ isPlaying: import("vue").Ref<boolean, boolean>;
944
+ isVolumeMuted: import("vue").Ref<boolean, boolean>;
945
+ audioMsg: import("vue").Ref<{
946
+ type: string;
947
+ msg: string;
948
+ }, {
949
+ type: string;
950
+ msg: string;
951
+ } | {
952
+ type: string;
953
+ msg: string;
954
+ }>;
955
+ initPlayer: () => Promise<void>;
956
+ handleVideoInfo: () => void;
957
+ handleMute: (mute: boolean) => void;
958
+ EasyPlayer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
959
+ url: {
960
+ type: StringConstructor;
961
+ default: string;
962
+ };
963
+ accessToken: {
964
+ type: StringConstructor;
965
+ default: string;
966
+ };
967
+ areaName: {
968
+ type: StringConstructor;
969
+ default: string;
970
+ };
971
+ deviceSerial: {
972
+ type: StringConstructor;
973
+ default: string;
974
+ };
975
+ platformTypeName: {
976
+ type: StringConstructor;
977
+ default: string;
978
+ };
979
+ debug: {
980
+ type: BooleanConstructor;
981
+ default: boolean;
982
+ };
983
+ pauseMode: {
984
+ type: NumberConstructor;
985
+ default: number;
986
+ validator: (value: number) => boolean;
987
+ };
988
+ }>, {
989
+ props: import("@vue/shared").LooseRequired<Readonly<import("vue").ExtractPropTypes<{
990
+ url: {
991
+ type: StringConstructor;
992
+ default: string;
993
+ };
994
+ accessToken: {
995
+ type: StringConstructor;
996
+ default: string;
997
+ };
998
+ areaName: {
999
+ type: StringConstructor;
1000
+ default: string;
1001
+ };
1002
+ deviceSerial: {
1003
+ type: StringConstructor;
1004
+ default: string;
1005
+ };
1006
+ platformTypeName: {
1007
+ type: StringConstructor;
1008
+ default: string;
1009
+ };
1010
+ debug: {
1011
+ type: BooleanConstructor;
1012
+ default: boolean;
1013
+ };
1014
+ pauseMode: {
1015
+ type: NumberConstructor;
1016
+ default: number;
1017
+ validator: (value: number) => boolean;
1018
+ };
1019
+ }>> & Readonly<{
1020
+ onPlay?: ((...args: any[]) => any) | undefined;
1021
+ onPause?: ((...args: any[]) => any) | undefined;
1022
+ onError?: ((...args: any[]) => any) | undefined;
1023
+ onVideoInfo?: ((...args: any[]) => any) | undefined;
1024
+ onTimeout?: ((...args: any[]) => any) | undefined;
1025
+ onMute?: ((...args: any[]) => any) | undefined;
1026
+ }> & {}>;
1027
+ emits: (event: "error" | "play" | "pause" | "videoInfo" | "timeout" | "mute", ...args: any[]) => void;
1028
+ slots: Readonly<{
1029
+ [name: string]: import("vue").Slot<any> | undefined;
1030
+ }>;
1031
+ customBar: import("vue").ComputedRef<import("vue").Slot<any> | undefined>;
1032
+ player: any;
1033
+ id: string;
1034
+ playerRef: import("vue").ShallowRef<HTMLDivElement | undefined, HTMLDivElement | undefined>;
1035
+ playSuccess: import("vue").Ref<boolean, boolean>;
1036
+ playUrl: import("vue").Ref<string, string>;
1037
+ videoInfo: import("vue").Ref<any, any>;
1038
+ eventHandlers: import("vue").Ref<Map<string, Function> & Omit<Map<string, Function>, keyof Map<any, any>>, Map<string, Function> | (Map<string, Function> & Omit<Map<string, Function>, keyof Map<any, any>>)>;
1039
+ waitTimer: number | null;
1040
+ restartTimer: import("vue").Ref<number | null, number | null>;
1041
+ pauseCycleTimer: import("vue").Ref<number | null, number | null>;
1042
+ resizeObserver: ResizeObserver | null;
1043
+ createRetryCount: number;
1044
+ MAX_CREATE_RETRY: number;
1045
+ isUnmounted: boolean;
1046
+ play: (url?: string) => void;
1047
+ playerPause: () => void;
1048
+ playerScreenShot: () => void;
1049
+ formatUrl: (url: string) => string;
1050
+ initPlayer: (url: string) => Promise<void>;
1051
+ removePlayerDom: () => void;
1052
+ createPlayerDom: () => Promise<HTMLDivElement>;
1053
+ createPlayer: () => Promise<void>;
1054
+ startPlayer: () => Promise<void>;
1055
+ destroy: (flag?: boolean) => void;
1056
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("error" | "play" | "pause" | "videoInfo" | "timeout" | "mute")[], "error" | "play" | "pause" | "videoInfo" | "timeout" | "mute", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
1057
+ url: {
1058
+ type: StringConstructor;
1059
+ default: string;
1060
+ };
1061
+ accessToken: {
1062
+ type: StringConstructor;
1063
+ default: string;
1064
+ };
1065
+ areaName: {
1066
+ type: StringConstructor;
1067
+ default: string;
1068
+ };
1069
+ deviceSerial: {
1070
+ type: StringConstructor;
1071
+ default: string;
1072
+ };
1073
+ platformTypeName: {
1074
+ type: StringConstructor;
1075
+ default: string;
1076
+ };
1077
+ debug: {
1078
+ type: BooleanConstructor;
1079
+ default: boolean;
1080
+ };
1081
+ pauseMode: {
1082
+ type: NumberConstructor;
1083
+ default: number;
1084
+ validator: (value: number) => boolean;
1085
+ };
1086
+ }>> & Readonly<{
1087
+ onPlay?: ((...args: any[]) => any) | undefined;
1088
+ onPause?: ((...args: any[]) => any) | undefined;
1089
+ onError?: ((...args: any[]) => any) | undefined;
1090
+ onVideoInfo?: ((...args: any[]) => any) | undefined;
1091
+ onTimeout?: ((...args: any[]) => any) | undefined;
1092
+ onMute?: ((...args: any[]) => any) | undefined;
1093
+ }>, {
1094
+ url: string;
1095
+ accessToken: string;
1096
+ debug: boolean;
1097
+ deviceSerial: string;
1098
+ areaName: string;
1099
+ platformTypeName: string;
1100
+ pauseMode: number;
1101
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
1102
+ ErrorPage: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
1103
+ videoName: {
1104
+ type: StringConstructor;
1105
+ default: string;
1106
+ };
1107
+ message: {
1108
+ type: StringConstructor;
1109
+ default: string;
1110
+ };
1111
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
1112
+ videoName: {
1113
+ type: StringConstructor;
1114
+ default: string;
1115
+ };
1116
+ message: {
1117
+ type: StringConstructor;
1118
+ default: string;
1119
+ };
1120
+ }>> & Readonly<{}>, {
1121
+ message: string;
1122
+ videoName: string;
1123
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
1124
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
1125
+ url: {
1126
+ type: StringConstructor;
1127
+ default: string;
1128
+ };
1129
+ accessToken: {
1130
+ type: StringConstructor;
1131
+ default: string;
1132
+ };
1133
+ areaName: {
1134
+ type: StringConstructor;
1135
+ default: string;
1136
+ };
1137
+ deviceSerial: {
1138
+ type: StringConstructor;
1139
+ default: string;
1140
+ };
1141
+ platformTypeName: {
1142
+ type: StringConstructor;
1143
+ default: string;
1144
+ };
1145
+ debug: {
1146
+ type: BooleanConstructor;
1147
+ default: boolean;
1148
+ };
1149
+ pauseMode: {
1150
+ type: NumberConstructor;
1151
+ default: number;
1152
+ validator: (value: number) => boolean;
1153
+ };
1154
+ }>> & Readonly<{}>, {
1155
+ url: string;
1156
+ accessToken: string;
1157
+ debug: boolean;
1158
+ deviceSerial: string;
1159
+ areaName: string;
1160
+ platformTypeName: string;
1161
+ pauseMode: number;
883
1162
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any> | import("vue").DefineComponent<import("vue").ExtractPropTypes<{
884
1163
  url: {
885
1164
  type: StringConstructor;
@@ -5,16 +5,16 @@ var __defProp = Object.defineProperty;
5
5
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
6
  function getAccessKey() {
7
7
  if (typeof localStorage !== "undefined") {
8
- return localStorage.getItem("CTYUNAK") || "9XCW5FIP7RX85ZZ9FJDD";
8
+ return localStorage.getItem("CTYUNAK") || "";
9
9
  }
10
- return "9XCW5FIP7RX85ZZ9FJDD";
10
+ return "";
11
11
  }
12
12
  __name(getAccessKey, "getAccessKey");
13
13
  function getSecretKey() {
14
14
  if (typeof localStorage !== "undefined") {
15
- return localStorage.getItem("CTYUNSK") || "qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK";
15
+ return localStorage.getItem("CTYUNSK") || "";
16
16
  }
17
- return "qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK";
17
+ return "";
18
18
  }
19
19
  __name(getSecretKey, "getSecretKey");
20
20
  const AK = getAccessKey();
@@ -52,6 +52,11 @@ ${HashedRequestPayload}`;
52
52
  ${RequestTimestamp}
53
53
  ${CredentialScope}
54
54
  ${HashedCanonicalRequest}`;
55
+ if (!AK || !SK) {
56
+ console.warn(
57
+ "[tzj-player] \u5929\u7FFC\u4E91\u7B7E\u540D\u5BC6\u94A5 CTYUNAK / CTYUNSK \u4E3A\u7A7A\uFF0C\u7B7E\u540D\u7ED3\u679C\u5C06\u4E0D\u88AB\u670D\u52A1\u7AEF\u8BA4\u53EF\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u5199\u5165 localStorage"
58
+ );
59
+ }
55
60
  const dateString = formatTimestamp(timestamp);
56
61
  const secretKey = `CT${SK}`;
57
62
  const SecretDate = CryptoJS.HmacSHA256(dateString, secretKey);
@@ -1 +1 @@
1
- {"version":3,"file":"ctyun-player.mjs","sources":["../../../../../../../packages/components/tzj-player/src/ctyun-player.ts"],"sourcesContent":["import axios from \"axios\";\nimport CryptoJS from \"crypto-js\";\n\n/**\n * 获取访问密钥,支持 SSR 环境\n */\nfunction getAccessKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"CTYUNAK\") || \"9XCW5FIP7RX85ZZ9FJDD\";\n }\n return \"9XCW5FIP7RX85ZZ9FJDD\";\n}\n\n/**\n * 获取签名密钥,支持 SSR 环境\n */\nfunction getSecretKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return (\n localStorage.getItem(\"CTYUNSK\") ||\n \"qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK\"\n );\n }\n return \"qTBbJjIo8RZmDMqAN7OQlg1O13j6R5OjYx40nLrK\";\n}\n\nconst AK = getAccessKey();\nconst SK = getSecretKey();\n\n/**\n * 获取UNIX时间戳,精确到秒\n */\nfunction getUnixTimestamp() {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * 将UNIX时间戳转成YYYY-MM-DD格式\n */\nfunction formatTimestamp(timestamp: number) {\n const date = new Date(timestamp * 1000);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * 拼接规范请求串\n * @param HTTPRequestMethod 请求方法\n * @param CanonicalURI 请求 URI\n * @param CanonicalQueryString 请求参数\n * @param CanonicalHeaders\n * @param SignedHeaders\n * @param body 请求体\n * @param timestamp 时间戳\n */\nfunction sign(\n HTTPRequestMethod: \"GET\" | \"POST\",\n CanonicalURI: string,\n CanonicalQueryString: string = \"\",\n CanonicalHeaders: string | Record<string, any> = \"\",\n SignedHeaders: string | number = \"\",\n body: Record<string, any> | null,\n timestamp: number,\n) {\n // 拼接规范请求串\n const HashedRequestPayload = CryptoJS.SHA256(\n body ? JSON.stringify(body) : \"\",\n ).toString(CryptoJS.enc.Hex);\n const CanonicalRequest = `${HTTPRequestMethod}\\n${CanonicalURI}\\n${CanonicalQueryString}\\n${CanonicalHeaders}\\n\\n${SignedHeaders}\\n${\n HashedRequestPayload\n }`;\n // console.log(\"\\n--- CanonicalRequest ---\");\n // console.log(CanonicalRequest);\n\n // 拼接待签名字符串\n const Algorithm = \"CT-HMAC-SHA256\";\n const RequestTimestamp = timestamp;\n const CredentialScope = `${formatTimestamp(timestamp)}/vss`;\n const HashedCanonicalRequest = CryptoJS.SHA256(CanonicalRequest).toString(\n CryptoJS.enc.Hex,\n );\n const StringToSign = `${Algorithm}\\n${RequestTimestamp}\\n${CredentialScope}\\n${HashedCanonicalRequest}`;\n // console.log(\"\\n--- StringToSign ---\");\n // console.log(StringToSign);\n\n // 计算签名\n // 第一步:计算SecretDate\n const dateString = formatTimestamp(timestamp);\n const secretKey = `CT${SK}`;\n const SecretDate = CryptoJS.HmacSHA256(dateString, secretKey);\n // console.log(\"\\n--- SecretDate ---\");\n // console.log(SecretDate.toString(CryptoJS.enc.Hex));\n\n // 第二步:计算SigningKey\n const SigningKey = CryptoJS.HmacSHA256(\"vss\", SecretDate);\n // console.log(\"\\n--- SigningKey ---\");\n // console.log(SigningKey.toString(CryptoJS.enc.Hex));\n\n // 第三步:计算最终签名\n const Signature = CryptoJS.HmacSHA256(StringToSign, SigningKey).toString(\n CryptoJS.enc.Hex,\n );\n // console.log(\"\\n--- Signature ---\");\n // console.log(Signature);\n\n // 构建Authorization头\n return `${Algorithm} Credential=${AK}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;\n}\n\nexport async function ctyunRequest(\n method: \"GET\" | \"POST\",\n url: string,\n params?: {\n query?: Record<string, any> | null;\n body?: Record<string, any> | null;\n },\n): Promise<any> {\n const timestamp = getUnixTimestamp();\n // const timestamp = 1756374060;\n let queryString = \"\";\n let uri = url;\n if (params && params?.query) {\n const temp = params.query;\n queryString = Object.keys(temp)\n .map((key) => `${key}=${temp[key]}`)\n .join(\"&\");\n uri = `${uri}?${queryString}`;\n }\n const Authorization = sign(\n method,\n url,\n queryString,\n `host:vssapi.ctyun.cn\\ntimestamp:${timestamp}`,\n \"host;timestamp\",\n params?.body || null,\n timestamp,\n );\n return new Promise((resolve, reject) => {\n axios({\n method,\n url: `/ctyun${uri}`,\n headers: {\n Authorization,\n Version: \"2021-11-25\",\n Timestamp: timestamp,\n },\n data: params?.body,\n })\n .then((res) => {\n // console.log(res);\n resolve(res.data);\n })\n .catch((err) => {\n // console.log(err);\n if (err.status === 403) {\n resolve(err.response?.data);\n } else {\n reject(err.response?.data);\n }\n });\n });\n}\n\n/**\n * 通过设备ID获取播放流地址\n */\nexport async function GetCtyunDeviceVideoUrl(\n deviceId: string,\n): Promise<string> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return \"\";\n }\n\n const result = await ctyunRequest(\n \"GET\",\n `/devices/${deviceId}/live/stream`,\n {\n query: {\n StreamNum: 1,\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device video stream\", result);\n return \"\";\n }\n\n // 安全地提取播放URL\n const liveStream = result.returnObj?.LiveStreams?.[0];\n const flvUrl = liveStream?.PlayUrl?.FlvUrl;\n\n console.log(flvUrl);\n if (flvUrl) {\n return flvUrl;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return \"\";\n } catch (error) {\n console.error(\"Error getting device video URL:\", error);\n return \"\";\n }\n}\n\n/**\n * 获取语音对讲WebSocket地址\n */\nexport async function GetCtyunDeviceAudioUrl(deviceId: string): Promise<any> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return {};\n }\n\n const result = await ctyunRequest(\n \"POST\",\n `/devices/${deviceId}/startTalk`,\n {\n body: {\n // 传输优先级 tcp/udp\n TransPriority: \"tcp\",\n // 接入协议\n InProtocol: \"gb28181\",\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device audio stream\", result);\n return {};\n }\n if (result?.returnObj) {\n return result?.returnObj;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n } catch (error) {\n console.error(\"Error getting device audio URL:\", error);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ctyun-player.mjs","sources":["../../../../../../../packages/components/tzj-player/src/ctyun-player.ts"],"sourcesContent":["import axios from \"axios\";\nimport CryptoJS from \"crypto-js\";\n\n/**\n * 获取访问密钥,支持 SSR 环境\n */\nfunction getAccessKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"CTYUNAK\") || \"\";\n }\n return \"\";\n}\n\n/**\n * 获取签名密钥,支持 SSR 环境\n */\nfunction getSecretKey(): string {\n if (typeof localStorage !== \"undefined\") {\n return localStorage.getItem(\"CTYUNSK\") || \"\";\n }\n return \"\";\n}\n\nconst AK = getAccessKey();\nconst SK = getSecretKey();\n\n/**\n * 获取UNIX时间戳,精确到秒\n */\nfunction getUnixTimestamp() {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * 将UNIX时间戳转成YYYY-MM-DD格式\n */\nfunction formatTimestamp(timestamp: number) {\n const date = new Date(timestamp * 1000);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * 拼接规范请求串\n * @param HTTPRequestMethod 请求方法\n * @param CanonicalURI 请求 URI\n * @param CanonicalQueryString 请求参数\n * @param CanonicalHeaders\n * @param SignedHeaders\n * @param body 请求体\n * @param timestamp 时间戳\n */\nfunction sign(\n HTTPRequestMethod: \"GET\" | \"POST\",\n CanonicalURI: string,\n CanonicalQueryString: string = \"\",\n CanonicalHeaders: string | Record<string, any> = \"\",\n SignedHeaders: string | number = \"\",\n body: Record<string, any> | null,\n timestamp: number,\n) {\n // 拼接规范请求串\n const HashedRequestPayload = CryptoJS.SHA256(\n body ? JSON.stringify(body) : \"\",\n ).toString(CryptoJS.enc.Hex);\n const CanonicalRequest = `${HTTPRequestMethod}\\n${CanonicalURI}\\n${CanonicalQueryString}\\n${CanonicalHeaders}\\n\\n${SignedHeaders}\\n${\n HashedRequestPayload\n }`;\n // console.log(\"\\n--- CanonicalRequest ---\");\n // console.log(CanonicalRequest);\n\n // 拼接待签名字符串\n const Algorithm = \"CT-HMAC-SHA256\";\n const RequestTimestamp = timestamp;\n const CredentialScope = `${formatTimestamp(timestamp)}/vss`;\n const HashedCanonicalRequest = CryptoJS.SHA256(CanonicalRequest).toString(\n CryptoJS.enc.Hex,\n );\n const StringToSign = `${Algorithm}\\n${RequestTimestamp}\\n${CredentialScope}\\n${HashedCanonicalRequest}`;\n // console.log(\"\\n--- StringToSign ---\");\n // console.log(StringToSign);\n\n // 计算签名\n if (!AK || !SK) {\n console.warn(\n \"[tzj-player] 天翼云签名密钥 CTYUNAK / CTYUNSK 为空,签名结果将不被服务端认可,请确认已写入 localStorage\",\n );\n }\n // 第一步:计算SecretDate\n const dateString = formatTimestamp(timestamp);\n const secretKey = `CT${SK}`;\n const SecretDate = CryptoJS.HmacSHA256(dateString, secretKey);\n // console.log(\"\\n--- SecretDate ---\");\n // console.log(SecretDate.toString(CryptoJS.enc.Hex));\n\n // 第二步:计算SigningKey\n const SigningKey = CryptoJS.HmacSHA256(\"vss\", SecretDate);\n // console.log(\"\\n--- SigningKey ---\");\n // console.log(SigningKey.toString(CryptoJS.enc.Hex));\n\n // 第三步:计算最终签名\n const Signature = CryptoJS.HmacSHA256(StringToSign, SigningKey).toString(\n CryptoJS.enc.Hex,\n );\n // console.log(\"\\n--- Signature ---\");\n // console.log(Signature);\n\n // 构建Authorization头\n return `${Algorithm} Credential=${AK}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;\n}\n\nexport async function ctyunRequest(\n method: \"GET\" | \"POST\",\n url: string,\n params?: {\n query?: Record<string, any> | null;\n body?: Record<string, any> | null;\n },\n): Promise<any> {\n const timestamp = getUnixTimestamp();\n // const timestamp = 1756374060;\n let queryString = \"\";\n let uri = url;\n if (params && params?.query) {\n const temp = params.query;\n queryString = Object.keys(temp)\n .map((key) => `${key}=${temp[key]}`)\n .join(\"&\");\n uri = `${uri}?${queryString}`;\n }\n const Authorization = sign(\n method,\n url,\n queryString,\n `host:vssapi.ctyun.cn\\ntimestamp:${timestamp}`,\n \"host;timestamp\",\n params?.body || null,\n timestamp,\n );\n return new Promise((resolve, reject) => {\n axios({\n method,\n url: `/ctyun${uri}`,\n headers: {\n Authorization,\n Version: \"2021-11-25\",\n Timestamp: timestamp,\n },\n data: params?.body,\n })\n .then((res) => {\n // console.log(res);\n resolve(res.data);\n })\n .catch((err) => {\n // console.log(err);\n if (err.status === 403) {\n resolve(err.response?.data);\n } else {\n reject(err.response?.data);\n }\n });\n });\n}\n\n/**\n * 通过设备ID获取播放流地址\n */\nexport async function GetCtyunDeviceVideoUrl(\n deviceId: string,\n): Promise<string> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return \"\";\n }\n\n const result = await ctyunRequest(\n \"GET\",\n `/devices/${deviceId}/live/stream`,\n {\n query: {\n StreamNum: 1,\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device video stream\", result);\n return \"\";\n }\n\n // 安全地提取播放URL\n const liveStream = result.returnObj?.LiveStreams?.[0];\n const flvUrl = liveStream?.PlayUrl?.FlvUrl;\n\n console.log(flvUrl);\n if (flvUrl) {\n return flvUrl;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return \"\";\n } catch (error) {\n console.error(\"Error getting device video URL:\", error);\n return \"\";\n }\n}\n\n/**\n * 获取语音对讲WebSocket地址\n */\nexport async function GetCtyunDeviceAudioUrl(deviceId: string): Promise<any> {\n try {\n // 参数校验\n if (!deviceId) {\n console.warn(\"Device ID is required\");\n return {};\n }\n\n const result = await ctyunRequest(\n \"POST\",\n `/devices/${deviceId}/startTalk`,\n {\n body: {\n // 传输优先级 tcp/udp\n TransPriority: \"tcp\",\n // 接入协议\n InProtocol: \"gb28181\",\n },\n },\n );\n console.log(result);\n // 检查响应状态\n if (!result || result.statusCode !== 200) {\n console.error(\"Failed to get device audio stream\", result);\n return {};\n }\n if (result?.returnObj) {\n return result?.returnObj;\n }\n\n console.warn(\"No FLV URL found in response\", result);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n } catch (error) {\n console.error(\"Error getting device audio URL:\", error);\n return {\n audioUrl: \"\",\n audioKey: \"\",\n };\n }\n}\n"],"names":[],"mappings":"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"}