@vknext/shared 1.6.36 → 1.6.37

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,4 +1,4 @@
1
1
  export * from "./audioUnmaskSource";
2
- export * from "./convertTrackToBlob";
2
+ export * from "./convertTrackToStream";
3
3
  export * from "./getTrackDetails";
4
4
  export * from "./utils/sendMessage";
@@ -1 +1 @@
1
- export{audioUnmaskSource}from"./audioUnmaskSource.js";export{convertTrackToBlob}from"./convertTrackToBlob.js";export{getTrackDetails}from"./getTrackDetails.js";export{sendMessage}from"./utils/sendMessage.js";
1
+ export{audioUnmaskSource}from"./audioUnmaskSource.js";export{convertTrackToStream}from"./convertTrackToStream.js";export{getTrackDetails}from"./getTrackDetails.js";export{sendMessage}from"./utils/sendMessage.js";
@@ -0,0 +1,10 @@
1
+ export interface ConvertVideoToStreamOptions {
2
+ url: string;
3
+ /**
4
+ * индекс из getVideoQualities.
5
+ * если не передан — будет выбрано максимальное качество, но не больше 1080p
6
+ */
7
+ levelIndex?: number;
8
+ onProgress?: (progress: number) => void;
9
+ }
10
+ export declare const convertVideoToStream: ({ url, levelIndex, onProgress, }: ConvertVideoToStreamOptions) => ReadableStream<Uint8Array>;
@@ -0,0 +1 @@
1
+ import{attachHlsErrorHandlers as e}from"../audio/utils/attachHlsErrorHandlers.js";import{getHlsInstance as t}from"../audio/utils/getHlsInstance.js";const r=({url:r,levelIndex:n,onProgress:a})=>{let o=null,l=null;const s=()=>{o&&(o.stopLoad(),o.destroy()),l&&(l.pause(),l.remove())};return new ReadableStream({async start(i){const c=await t();o=new c({maxBufferHole:.5,maxBufferLength:300,maxBufferSize:12e7,backBufferLength:0,fragLoadingRetryDelay:500,fragLoadingMaxRetry:20,enableWorker:!0,startLevel:void 0!==n?n:-1}),l=document.createElement("video"),l.muted=!0;let d=0,u=0;o.on(c.Events.MANIFEST_PARSED,((e,t)=>{if(!o)return;if(void 0===n){let e=-1;for(let t=o.levels.length-1;t>=0;t--){const r=o.levels[t];if(!r)continue;if(Math.min(r.width,r.height)<=1080){e=t;break}}o.currentLevel=-1!==e?e:o.levels.length-1}else o.currentLevel=n;const r=o?.currentLevel??0,a=t.levels[r]?.details;a&&(d=a.fragments.length),l?.play().catch((()=>{}))})),o.on(c.Events.LEVEL_LOADED,((e,t)=>{t.details&&(d=t.details.fragments.length)})),o.on(c.Events.BUFFER_APPENDING,((e,t)=>{"video"===t.type||"audiovideo"===t.type?i.enqueue(t.data):console.warn("[convertVideoToStream] при загрузке фрагмента пришел неожиданный тип",t)})),o.on(c.Events.FRAG_BUFFERED,(async(e,t)=>{u++,l&&(l.currentTime=Math.max(0,t.frag.start+t.frag.duration-.5));try{a&&d>0&&a(Math.min(.99,u/d))}catch(e){console.error(e)}u>=d&&(a&&a(1),s(),i.close())})),e({Hls:c,hlsInstance:o,onError:e=>{i.error(new Error(e||"HLS Error")),s()}}),o.loadSource(r),o.attachMedia(l)},cancel(){s()}})};export{r as convertVideoToStream};
@@ -0,0 +1,15 @@
1
+ export interface VideoQuality {
2
+ /**
3
+ * передавать в convertVideoToStream
4
+ */
5
+ levelIndex: number;
6
+ height: number;
7
+ width: number;
8
+ bitrate: number;
9
+ /**
10
+ * используется для подсчета размера видео
11
+ */
12
+ averageBitrate: number | null;
13
+ frameRate: number;
14
+ }
15
+ export declare const getVideoQualities: (url: string) => Promise<VideoQuality[]>;
@@ -0,0 +1 @@
1
+ import{getHlsInstance as t}from"../audio/utils/getHlsInstance.js";const e=async e=>{const r=await t();return new Promise(((t,a)=>{const n=new r({enableWorker:!1});n.on(r.Events.MANIFEST_PARSED,((e,r)=>{const a=r.levels.map(((t,e)=>{const r=t.attrs["AVERAGE-BANDWIDTH"]?parseInt(t.attrs["AVERAGE-BANDWIDTH"],10):null;return{levelIndex:e,height:t.height,width:t.width,bitrate:t.bitrate,averageBitrate:r,frameRate:t.frameRate}}));a.sort(((t,e)=>e.bitrate-t.bitrate)),n.destroy(),t(a)})),n.on(r.Events.ERROR,((t,e)=>{e.fatal&&(n.destroy(),a(new Error(`HLS Error: ${e.details}`)))})),n.loadSource(e)}))};export{e as getVideoQualities};
@@ -0,0 +1,2 @@
1
+ export * from "./convertVideoToStream";
2
+ export * from "./getVideoQualities";
@@ -0,0 +1 @@
1
+ export{convertVideoToStream}from"./convertVideoToStream.js";export{getVideoQualities}from"./getVideoQualities.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vknext/shared",
3
- "version": "1.6.36",
3
+ "version": "1.6.37",
4
4
  "description": "vk next shared",
5
5
  "type": "module",
6
6
  "files": [
@@ -39,6 +39,10 @@
39
39
  "types": "./dist/vkcom/audio/index.d.ts",
40
40
  "default": "./dist/vkcom/audio/index.js"
41
41
  },
42
+ "./vkcom/video": {
43
+ "types": "./dist/vkcom/audio/index.d.ts",
44
+ "default": "./dist/vkcom/audio/index.js"
45
+ },
42
46
  "./vkcom/globalVars": {
43
47
  "types": "./dist/vkcom/globalVars/index.d.ts",
44
48
  "default": "./dist/vkcom/globalVars/index.js"
@@ -1,14 +0,0 @@
1
- export interface ConvertTrackToBlobOptions {
2
- url: string;
3
- filename?: string;
4
- /**
5
- *
6
- * @param progress значение от 0 до 1
7
- */
8
- onProgress?: (progress: number) => void;
9
- forceHls?: boolean;
10
- }
11
- /**
12
- * @deprecated use convertTrackToStream
13
- */
14
- export declare const convertTrackToBlob: ({ url, filename, onProgress, forceHls, }: ConvertTrackToBlobOptions) => Promise<Blob>;
@@ -1 +0,0 @@
1
- import{createPromise as e}from"../../utils/createPromise.js";import"../../utils/parseSvg.js";import{getHlsInstance as r}from"./utils/getHlsInstance.js";import{sendMessage as o}from"./utils/sendMessage.js";const t=async({url:t,filename:s,onProgress:n,forceHls:a})=>{if(!a)try{return await o({url:t,filename:s,type:"convertHlsToMp3",onProgress:n})}catch(e){console.error(e)}const{promise:i,resolve:l,reject:c}=e(),d=await r(),u=new d,E=new Audio;let p=null;const m=[];let f,g,v=0;const y=e=>{c(e),u.stopLoad(),u.destroy()};return u.on(d.Events.MANIFEST_PARSED,((e,r)=>{const o=r.levels[0]?.details;o&&(g=o.fragments.length)})),u.on(d.Events.BUFFER_CODECS,((e,r)=>{r.audio&&"audio/mp4"!==r.audio.container||(f=r.audio)})),u.on(d.Events.BUFFER_APPENDING,((e,r)=>{p=r.data})),u.on(d.Events.ERROR,((e,r)=>{if(!["bufferFullError","fragLoadError"].includes(r.details))return r.type==d.ErrorTypes.MEDIA_ERROR&&v<2?(++v>1&&u.swapAudioCodec(),void u.recoverMediaError()):void y(e);y(e)})),u.on(d.Events.FRAG_BUFFERED,(async(e,r)=>{p&&m.push(f?p.slice(8,p.length):p),E.currentTime=r.frag.start+r.frag.duration;try{n&&n(m.length/g)}catch(e){console.error(e)}if(m.length>=g){u.stopLoad(),u.destroy();const e=m.map((e=>new Uint8Array(e))),r=new Blob(e,{type:"audio/mp3"});l(r)}})),u.loadSource(t),u.attachMedia(E),await i};export{t as convertTrackToBlob};