@bylqwjc/media-editor-server 1.0.14 → 1.0.18
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.
- package/core/dist/browser.cjs +1 -1
- package/core/dist/browser.js +2 -2
- package/core/dist/chunk-MGKYVYOH.js +1 -1
- package/core/dist/chunk-USY6UDGL.js +1 -1
- package/core/dist/chunk-XCBM7P7N.js +1 -1
- package/core/dist/engine.cjs +1 -1
- package/core/dist/engine.js +1 -1
- package/core/dist/filerobot.cjs +1 -1
- package/core/dist/filerobot.js +1 -1
- package/core/dist/index.cjs +1 -1
- package/core/dist/index.js +1 -1
- package/core/package.json +1 -1
- package/core/zod/index.cjs +1 -1
- package/core/zod/index.js +1 -1
- package/core/zod/v3/ZodError.cjs +1 -1
- package/core/zod/v3/ZodError.js +1 -1
- package/core/zod/v3/errors.cjs +1 -1
- package/core/zod/v3/errors.js +1 -1
- package/core/zod/v3/external.cjs +1 -1
- package/core/zod/v3/helpers/errorUtil.cjs +1 -1
- package/core/zod/v3/helpers/errorUtil.js +1 -1
- package/core/zod/v3/helpers/parseUtil.cjs +1 -1
- package/core/zod/v3/helpers/parseUtil.js +1 -1
- package/core/zod/v3/helpers/util.cjs +1 -1
- package/core/zod/v3/helpers/util.js +1 -1
- package/core/zod/v3/index.cjs +1 -1
- package/core/zod/v3/index.js +1 -1
- package/core/zod/v3/locales/en.cjs +1 -1
- package/core/zod/v3/locales/en.js +1 -1
- package/core/zod/v3/types.cjs +1 -1
- package/core/zod/v3/types.js +1 -1
- package/dist/adapters/express.cjs +1 -1
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +1 -1
- package/dist/adapters/web.cjs +1 -1
- package/dist/adapters/web.d.ts +2 -2
- package/dist/adapters/web.js +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/core/dist/browser.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var v=Math.PI/180;function y(e,t,a){e.strokeStyle=t,e.lineWidth=a,e.lineCap="round",e.lineJoin="round"}function j(e,t,a,n,r,i){const o=Math.atan2(r-a,n-t),c=Math.max(12,i*3.5);e.beginPath(),e.moveTo(n,r),e.lineTo(n-c*Math.cos(o-Math.PI/7),r-c*Math.sin(o-Math.PI/7)),e.moveTo(n,r),e.lineTo(n-c*Math.cos(o+Math.PI/7),r-c*Math.sin(o+Math.PI/7)),e.stroke()}function b(e){if(!Number.isFinite(e))return 0;let t=e%360;return t>180&&(t-=360),t<-180&&(t+=360),Math.abs(t)<.001?0:t}function g(e){return b(e.rotation??0)}function S(e){switch(e.type){case"pen":{let t=1/0,a=1/0,n=-1/0,r=-1/0;for(let i=0;i<e.points.length;i+=2)t=Math.min(t,e.points[i]),n=Math.max(n,e.points[i]),a=Math.min(a,e.points[i+1]),r=Math.max(r,e.points[i+1]);return{x:t,y:a,w:n-t,h:r-a}}case"line":case"arrow":return{x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),w:Math.abs(e.x2-e.x1),h:Math.abs(e.y2-e.y1)};case"rect":case"ellipse":case"sticker":return{x:e.x,y:e.y,w:e.w,h:e.h};case"text":return{x:e.x,y:e.y,w:e.text.length*e.fontSize*.6,h:e.fontSize*1.2}}}function M(e){const t=S(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function A(e,t,a,n,r){const i=r*v,o=Math.cos(i),c=Math.sin(i),h=e-a,s=t-n;return{x:a+h*o-s*c,y:n+h*c+s*o}}function F(e,t,a,n,r){return{x:a+(e-a)*r,y:n+(t-n)*r}}function T(e,t,a){const n=g(t);if(n){const r=M(t);e.save(),e.translate(r.x,r.y),e.rotate(n*v),e.translate(-r.x,-r.y),O(e,t,a),e.restore();return}O(e,t,a)}function O(e,t,a){switch(t.type){case"pen":{y(e,t.color,t.width),e.beginPath(),e.moveTo(t.points[0],t.points[1]);for(let n=2;n<t.points.length;n+=2)e.lineTo(t.points[n],t.points[n+1]);e.stroke();break}case"line":case"arrow":{y(e,t.color,t.width),e.beginPath(),e.moveTo(t.x1,t.y1),e.lineTo(t.x2,t.y2),e.stroke(),t.type==="arrow"&&j(e,t.x1,t.y1,t.x2,t.y2,t.width);break}case"rect":{y(e,t.color,t.width),e.strokeRect(t.x,t.y,t.w,t.h);break}case"ellipse":{y(e,t.color,t.width),e.beginPath(),e.ellipse(t.x+t.w/2,t.y+t.h/2,Math.abs(t.w/2),Math.abs(t.h/2),0,0,Math.PI*2),e.stroke();break}case"text":{e.fillStyle=t.color,e.font=`bold ${t.fontSize}px -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif`,e.textBaseline="top",e.strokeStyle="rgba(0,0,0,0.45)",e.lineWidth=Math.max(2,t.fontSize/16),e.lineJoin="round",e.strokeText(t.text,t.x,t.y),e.fillText(t.text,t.x,t.y);break}case"sticker":{if(t.emoji)e.font=`${Math.min(t.w,t.h)}px -apple-system, "Apple Color Emoji", "Segoe UI Emoji", sans-serif`,e.textBaseline="top",e.fillText(t.emoji,t.x,t.y);else if(t.src){const n=a?.get(t.src);n&&e.drawImage(n,t.x,t.y,t.w,t.h)}break}}}function x(e,t,a){for(const n of t)T(e,n,a)}async function P(e){const t=new Map,a=[...new Set(e.filter(n=>n.type==="sticker"&&n.src).map(n=>n.src))];return await Promise.all(a.map(n=>new Promise(r=>{const i=new Image;i.onload=()=>{t.set(n,i),r()},i.onerror=()=>r(),i.src=n}))),t}async function E(e,t,a){if(!e?.length)return null;const n=document.createElement("canvas");n.width=t,n.height=a;const r=n.getContext("2d");if(!r)return null;const i=await P(e);return x(r,e,i),new Promise(o=>n.toBlob(c=>o(c),"image/png"))}function $(e,t,a,n=12){for(let r=e.length-1;r>=0;r--){const i=e[r];if(D(i,t,a,n))return r}return-1}function V(e,t,a,n,r){return Math.abs(e-a)<=r&&Math.abs(t-n)<=r}function C(e,t,a,n,r,i,o){const c=r-a,h=i-n,s=c*c+h*h||1,u=Math.max(0,Math.min(1,((e-a)*c+(t-n)*h)/s)),l=a+u*c,p=n+u*h;return(e-l)**2+(t-p)**2<=o*o}function D(e,t,a,n){const r=g(e);if(r){const i=M(e),o=A(t,a,i.x,i.y,-r);return k(e,o.x,o.y,n)}return k(e,t,a,n)}function k(e,t,a,n){switch(e.type){case"pen":{for(let r=0;r+3<e.points.length;r+=2)if(C(t,a,e.points[r],e.points[r+1],e.points[r+2],e.points[r+3],n+e.width/2))return!0;return!1}case"line":case"arrow":return C(t,a,e.x1,e.y1,e.x2,e.y2,n+e.width/2);case"rect":case"ellipse":return t>=e.x-n&&t<=e.x+e.w+n&&a>=e.y-n&&a<=e.y+e.h+n;case"text":return t>=e.x-n&&t<=e.x+e.text.length*e.fontSize*.6+n&&a>=e.y-n&&a<=e.y+e.fontSize+n;case"sticker":return V(t,a,e.x+e.w/2,e.y+e.h/2,Math.max(e.w,e.h)/2+n)}}function _(e,t,a){const n=Math.max(8,a);if(!(e>0)||!(t>0))return{w:n,h:n};const r=n/Math.max(e,t);return{w:Math.max(8,Math.round(e*r)),h:Math.max(8,Math.round(t*r))}}function N(e,t){const a=Math.max(.05,t),n=M(e);switch(e.type){case"pen":return{...e,points:e.points.map((r,i)=>i%2===0?n.x+(r-n.x)*a:n.y+(r-n.y)*a)};case"line":case"arrow":{const r=F(e.x1,e.y1,n.x,n.y,a),i=F(e.x2,e.y2,n.x,n.y,a);return{...e,x1:r.x,y1:r.y,x2:i.x,y2:i.y}}case"rect":case"ellipse":case"sticker":return{...e,w:Math.max(8,e.w*a),h:Math.max(8,e.h*a)};case"text":return{...e,fontSize:Math.min(512,Math.max(8,e.fontSize*a))};default:return e}}function U(e,t){return{...e,rotation:b(t)}}function Y(e,t,a){switch(e.type){case"pen":{const n=e.points.map((r,i)=>i%2===0?r+t:r+a);return{...e,points:n}}case"line":case"arrow":return{...e,x1:e.x1+t,y1:e.y1+a,x2:e.x2+t,y2:e.y2+a};case"rect":case"ellipse":case"sticker":return{...e,x:e.x+t,y:e.y+a};case"text":return{...e,x:e.x+t,y:e.y+a}}}var I=Math.PI/180;function B(e,t,a){const n=J(a);if(n===0||n===180)return{w:e,h:t};if(n===90||n===270)return{w:t,h:e};const r=n*I;return{w:Math.round(Math.abs(e*Math.cos(r))+Math.abs(t*Math.sin(r))),h:Math.round(Math.abs(e*Math.sin(r))+Math.abs(t*Math.cos(r)))}}function J(e){return(e%360+360)%360}function f(e){const t=Math.round(e);return t-t%2}function z(e,t){let a=e.w,n=a/t;return n>e.h&&(n=e.h,a=n*t),{x:Math.round((e.w-a)/2),y:Math.round((e.h-n)/2),width:Math.round(a),height:Math.round(n)}}function L(e,t,a){const n={x:0,y:0,width:e.width,height:e.height},r={x:0,y:0,width:t.w,height:t.h};return a==="cover"?{src:z({w:e.width,h:e.height},t.w/t.h),dst:r}:a==="contain"?{src:n,dst:z({w:t.w,h:t.h},e.width/e.height)}:{src:n,dst:r}}function R(e,t){if(t.scale)return{w:f(t.scale.width),h:f(t.scale.height)};if(t.crop)return{w:f(t.crop.width),h:f(t.crop.height)};const a=B(e.w,e.h,t.rotation);return{w:f(a.w),h:f(a.h)}}function X(e){const t=String(e??"").match(/^data:(image\/(?:png|jpe?g));base64,([a-z0-9+/=]+)$/i);if(!t)return null;const a=atob(t[2]),n=new Uint8Array(a.length);for(let r=0;r<a.length;r++)n[r]=a.charCodeAt(r);return new Blob([n],{type:t[1].toLowerCase()})}async function q(e,t,a=[]){const n=e.getExportPlan(),r=new FormData;n.videoSrcOrder.forEach((s,u)=>{const l=t[s];l&&r.append(`video_${u}`,l,l.name||`video_${u}.mp4`)}),n.audioSrcOrder.forEach((s,u)=>{const l=a[s];l&&r.append(`audio_${u}`,l,l.name||`audio_${u}`)});const i=R(n.state.canvas,n.state),o=await E(n.state.overlays,i.w,i.h);o&&r.append("overlay",o,"overlay.png");const c=n.state.poster?.useAsVideoCover?X(n.state.poster.preview):null;c&&r.append("videoCover",c,"video-cover.png");const h=n.state.poster?.preview?{...n.state,poster:{...n.state.poster,preview:void 0}}:n.state;return r.append("editState",JSON.stringify(h)),r}var G=[{id:"bw",label:"\u9ED1\u767D",vf:"hue=s=0",css:"grayscale(1)"},{id:"sepia",label:"\u590D\u53E4",vf:"colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131",css:"sepia(0.85)"},{id:"warm",label:"\u6696\u9633",vf:"colorbalance=rs=.15:gs=.04:bs=-.15",css:"sepia(0.25) saturate(1.25) brightness(1.03)"},{id:"cool",label:"\u51B7\u8C03",vf:"colorbalance=rs=-.14:bs=.16",css:"hue-rotate(12deg) saturate(0.95) brightness(1.02)"},{id:"vivid",label:"\u9C9C\u8273",vf:"eq=saturation=1.45:contrast=1.08",css:"saturate(1.45) contrast(1.08)"}];function H(e){return e?G.find(t=>t.id===e):void 0}function W(e,t){const a=H(t)?.css??"";return[`brightness(${1+e.brightness})`,`contrast(${1+e.contrast})`,`saturate(${1+e.saturation})`,a].filter(Boolean).join(" ")}function K(e,t,a,n,r,i=1,o,c=!0){const h=R(n,r);e.width=Math.max(2,Math.round(h.w*i)),e.height=Math.max(2,Math.round(h.h*i));const s=e.getContext("2d");if(!s)return;const u=B(n.w,n.h,r.rotation),l=r.crop??{x:0,y:0,width:u.w,height:u.h},p=r.scale?.fit??"force",{src:w,dst:d}=L({width:l.width,height:l.height},h,p);p==="contain"&&(s.fillStyle="#000",s.fillRect(0,0,e.width,e.height)),s.filter=W(r.filters,r.filterPreset),s.save(),p==="contain"&&(s.beginPath(),s.rect(i*d.x,i*d.y,i*d.width,i*d.height),s.clip()),s.translate(i*d.x,i*d.y),s.scale(i*d.width/w.width,i*d.height/w.height),s.translate(-(l.x+w.x),-(l.y+w.y)),s.translate(u.w/2,u.h/2),s.rotate(r.rotation*I),s.scale(r.flipX?-1:1,r.flipY?-1:1);const m=L({width:a.w,height:a.h},{w:n.w,h:n.h},"cover");s.drawImage(t,m.src.x,m.src.y,m.src.width,m.src.height,-n.w/2,-n.h/2,n.w,n.h),s.restore(),s.filter="none",c&&r.overlays?.length&&(s.setTransform(i,0,0,i,0,0),x(s,r.overlays,o),s.setTransform(1,0,0,1,0,0))}function Q(e,t){return new Promise(a=>{const n=()=>{e.removeEventListener("seeked",n),a()};e.addEventListener("seeked",n),e.currentTime=Math.min(Math.max(0,t),e.duration||t)})}async function Z(e,t,a=160){const n=e.duration;if(!n||!isFinite(n)||t<=0)return[];const r=e.videoWidth||16,i=e.videoHeight||9,o=Math.min(a,r),c=Math.max(1,Math.round(o*i/r)),h=document.createElement("canvas");h.width=o,h.height=c;const s=h.getContext("2d");if(!s)return[];const u=[];for(let l=0;l<t;l++)await Q(e,n*(l+.5)/t),s.drawImage(e,0,0,o,c),u.push(h.toDataURL("image/jpeg",.6));return u}function ee(e,t={}){const a=t.mode??"overlay",n=document.createElement("button");n.type="button",n.className=["me-fullscreen-toggle",t.className].filter(Boolean).join(" "),n.dataset.meFullscreenToggle="true",n.dataset.mode=a,n.title="\u5168\u5C4F / \u9000\u51FA\u5168\u5C4F",n.style.cssText=[a==="overlay"?"position:absolute;left:8px;bottom:8px;z-index:30;":"position:static;","width:32px;height:32px;padding:0;","display:inline-flex;align-items:center;justify-content:center;","border:1px solid var(--me-border,#26262b);border-radius:6px;","background:var(--me-chip,#1c1c20);color:var(--me-fg,#e7e7ee);","cursor:pointer;font-size:15px;line-height:1;opacity:0.9;font:inherit;"].join(""),e.classList.add("me-fullscreen-host");const r=()=>{const c=document.fullscreenElement===e;n.textContent=c?"\xD7":"\u26F6",n.setAttribute("aria-label",c?"\u9000\u51FA\u5168\u5C4F":"\u5168\u5C4F"),e.classList.toggle("me-is-fullscreen",c),e.dataset.meFullscreen=c?"true":"false"};r();const i=()=>r(),o=()=>{(document.fullscreenElement===e?document.exitFullscreen?.():e.requestFullscreen?.())?.catch?.(()=>{})};return n.addEventListener("click",o),document.addEventListener("fullscreenchange",i),{button:n,dispose:()=>{document.removeEventListener("fullscreenchange",i),n.removeEventListener("click",o),n.remove(),e.classList.remove("me-fullscreen-host","me-is-fullscreen"),delete e.dataset.meFullscreen}}}exports.buildVideoExportFormData=q,exports.createFullscreenToggle=ee,exports.drawOverlay=T,exports.drawOverlays=x,exports.drawVideoFrame=K,exports.fitStickerBox=_,exports.generateThumbnails=Z,exports.getOverlayRotation=g,exports.hitTestOverlay=$,exports.loadOverlayImages=P,exports.overlayBBox=S,exports.renderOverlaysToPng=E,exports.rotateOverlay=U,exports.scaleOverlay=N,exports.translateOverlay=Y;
|
|
1
|
+
"use strict";var v=Math.PI/180;function y(t,e,a){t.strokeStyle=e,t.lineWidth=a,t.lineCap="round",t.lineJoin="round"}function $(t,e,a,n,r,o){const i=Math.atan2(r-a,n-e),c=Math.max(12,o*3.5);t.beginPath(),t.moveTo(n,r),t.lineTo(n-c*Math.cos(i-Math.PI/7),r-c*Math.sin(i-Math.PI/7)),t.moveTo(n,r),t.lineTo(n-c*Math.cos(i+Math.PI/7),r-c*Math.sin(i+Math.PI/7)),t.stroke()}function b(t){if(!Number.isFinite(t))return 0;let e=t%360;return e>180&&(e-=360),e<-180&&(e+=360),Math.abs(e)<.001?0:e}function m(t){return b(t.rotation??0)}function k(t){switch(t.type){case"pen":{let e=1/0,a=1/0,n=-1/0,r=-1/0;for(let o=0;o<t.points.length;o+=2)e=Math.min(e,t.points[o]),n=Math.max(n,t.points[o]),a=Math.min(a,t.points[o+1]),r=Math.max(r,t.points[o+1]);return{x:e,y:a,w:n-e,h:r-a}}case"line":case"arrow":return{x:Math.min(t.x1,t.x2),y:Math.min(t.y1,t.y2),w:Math.abs(t.x2-t.x1),h:Math.abs(t.y2-t.y1)};case"rect":case"ellipse":case"sticker":return{x:t.x,y:t.y,w:t.w,h:t.h};case"text":return{x:t.x,y:t.y,w:t.text.length*t.fontSize*.6,h:t.fontSize*1.2}}}function g(t){const e=k(t);return{x:e.x+e.w/2,y:e.y+e.h/2}}function A(t,e,a,n,r){const o=r*v,i=Math.cos(o),c=Math.sin(o),h=t-a,s=e-n;return{x:a+h*i-s*c,y:n+h*c+s*i}}function S(t,e,a,n,r){return{x:a+(t-a)*r,y:n+(e-n)*r}}function P(t,e,a){const n=m(e);if(n){const r=g(e);t.save(),t.translate(r.x,r.y),t.rotate(n*v),t.translate(-r.x,-r.y),T(t,e,a),t.restore();return}T(t,e,a)}function T(t,e,a){switch(e.type){case"pen":{y(t,e.color,e.width),t.beginPath(),t.moveTo(e.points[0],e.points[1]);for(let n=2;n<e.points.length;n+=2)t.lineTo(e.points[n],e.points[n+1]);t.stroke();break}case"line":case"arrow":{y(t,e.color,e.width),t.beginPath(),t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.stroke(),e.type==="arrow"&&$(t,e.x1,e.y1,e.x2,e.y2,e.width);break}case"rect":{y(t,e.color,e.width),t.strokeRect(e.x,e.y,e.w,e.h);break}case"ellipse":{y(t,e.color,e.width),t.beginPath(),t.ellipse(e.x+e.w/2,e.y+e.h/2,Math.abs(e.w/2),Math.abs(e.h/2),0,0,Math.PI*2),t.stroke();break}case"text":{t.fillStyle=e.color,t.font=`bold ${e.fontSize}px -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif`,t.textBaseline="top",t.strokeStyle="rgba(0,0,0,0.45)",t.lineWidth=Math.max(2,e.fontSize/16),t.lineJoin="round",t.strokeText(e.text,e.x,e.y),t.fillText(e.text,e.x,e.y);break}case"sticker":{if(e.emoji)t.font=`${Math.min(e.w,e.h)}px -apple-system, "Apple Color Emoji", "Segoe UI Emoji", sans-serif`,t.textBaseline="top",t.fillText(e.emoji,e.x,e.y);else if(e.src){const n=a?.get(e.src);n&&t.drawImage(n,e.x,e.y,e.w,e.h)}break}}}function M(t,e,a){for(const n of e)P(t,n,a)}async function E(t){const e=new Map,a=[...new Set(t.filter(n=>n.type==="sticker"&&n.src).map(n=>n.src))];return await Promise.all(a.map(n=>new Promise(r=>{const o=new Image;o.onload=()=>{e.set(n,o),r()},o.onerror=()=>r(),o.src=n}))),e}async function F(t,e,a){if(!t?.length)return null;const n=document.createElement("canvas");n.width=e,n.height=a;const r=n.getContext("2d");if(!r)return null;const o=await E(t);return M(r,t,o),new Promise(i=>n.toBlob(c=>i(c),"image/png"))}function D(t,e,a,n=12){for(let r=t.length-1;r>=0;r--){const o=t[r];if(R(o,e,a,n))return r}return-1}function N(t,e,a,n,r){return Math.abs(t-a)<=r&&Math.abs(e-n)<=r}function C(t,e,a,n,r,o,i){const c=r-a,h=o-n,s=c*c+h*h||1,u=Math.max(0,Math.min(1,((t-a)*c+(e-n)*h)/s)),l=a+u*c,x=n+u*h;return(t-l)**2+(e-x)**2<=i*i}function R(t,e,a,n){const r=m(t);if(r){const o=g(t),i=A(e,a,o.x,o.y,-r);return I(t,i.x,i.y,n)}return I(t,e,a,n)}function I(t,e,a,n){switch(t.type){case"pen":{for(let r=0;r+3<t.points.length;r+=2)if(C(e,a,t.points[r],t.points[r+1],t.points[r+2],t.points[r+3],n+t.width/2))return!0;return!1}case"line":case"arrow":return C(e,a,t.x1,t.y1,t.x2,t.y2,n+t.width/2);case"rect":case"ellipse":return e>=t.x-n&&e<=t.x+t.w+n&&a>=t.y-n&&a<=t.y+t.h+n;case"text":return e>=t.x-n&&e<=t.x+t.text.length*t.fontSize*.6+n&&a>=t.y-n&&a<=t.y+t.fontSize+n;case"sticker":return N(e,a,t.x+t.w/2,t.y+t.h/2,Math.max(t.w,t.h)/2+n)}}function _(t,e,a){const n=Math.max(8,a);if(!(t>0)||!(e>0))return{w:n,h:n};const r=n/Math.max(t,e);return{w:Math.max(8,Math.round(t*r)),h:Math.max(8,Math.round(e*r))}}function J(t,e){const a=Math.max(.05,e),n=g(t);switch(t.type){case"pen":return{...t,points:t.points.map((r,o)=>o%2===0?n.x+(r-n.x)*a:n.y+(r-n.y)*a)};case"line":case"arrow":{const r=S(t.x1,t.y1,n.x,n.y,a),o=S(t.x2,t.y2,n.x,n.y,a);return{...t,x1:r.x,y1:r.y,x2:o.x,y2:o.y}}case"rect":case"ellipse":case"sticker":return{...t,w:Math.max(8,t.w*a),h:Math.max(8,t.h*a)};case"text":return{...t,fontSize:Math.min(512,Math.max(8,t.fontSize*a))};default:return t}}function U(t,e){return{...t,rotation:b(e)}}function V(t,e,a){switch(t.type){case"pen":{const n=t.points.map((r,o)=>o%2===0?r+e:r+a);return{...t,points:n}}case"line":case"arrow":return{...t,x1:t.x1+e,y1:t.y1+a,x2:t.x2+e,y2:t.y2+a};case"rect":case"ellipse":case"sticker":return{...t,x:t.x+e,y:t.y+a};case"text":return{...t,x:t.x+e,y:t.y+a}}}var O=Math.PI/180;function z(t,e,a){const n=W(a);if(n===0||n===180)return{w:t,h:e};if(n===90||n===270)return{w:e,h:t};const r=n*O;return{w:Math.round(Math.abs(t*Math.cos(r))+Math.abs(e*Math.sin(r))),h:Math.round(Math.abs(t*Math.sin(r))+Math.abs(e*Math.cos(r)))}}function W(t){return(t%360+360)%360}function f(t){const e=Math.round(t);return e-e%2}function L(t,e){let a=t.w,n=a/e;return n>t.h&&(n=t.h,a=n*e),{x:Math.round((t.w-a)/2),y:Math.round((t.h-n)/2),width:Math.round(a),height:Math.round(n)}}function j(t,e,a){const n={x:0,y:0,width:t.width,height:t.height},r={x:0,y:0,width:e.w,height:e.h};return a==="cover"?{src:L({w:t.width,h:t.height},e.w/e.h),dst:r}:a==="contain"?{src:n,dst:L({w:e.w,h:e.h},t.width/t.height)}:{src:n,dst:r}}function B(t,e){if(e.scale)return{w:f(e.scale.width),h:f(e.scale.height)};if(e.crop)return{w:f(e.crop.width),h:f(e.crop.height)};const a=z(t.w,t.h,e.rotation);return{w:f(a.w),h:f(a.h)}}function q(t){const e=String(t??"").match(/^data:(image\/(?:png|jpe?g));base64,([a-z0-9+/=]+)$/i);if(!e)return null;const a=atob(e[2]),n=new Uint8Array(a.length);for(let r=0;r<a.length;r++)n[r]=a.charCodeAt(r);return new Blob([n],{type:e[1].toLowerCase()})}async function H(t,e,a=[]){const n=t.getExportPlan(),r=new FormData;n.videoSrcOrder.forEach((s,u)=>{const l=e[s];l&&r.append(`video_${u}`,l,l.name||`video_${u}.mp4`)}),n.audioSrcOrder.forEach((s,u)=>{const l=a[s];l&&r.append(`audio_${u}`,l,l.name||`audio_${u}`)});const o=B(n.state.canvas,n.state),i=await F(n.state.overlays,o.w,o.h);i&&r.append("overlay",i,"overlay.png");const c=n.state.poster?.useAsVideoCover?q(n.state.poster.preview):null;c&&r.append("videoCover",c,"video-cover.png");const h=n.state.poster?.preview?{...n.state,poster:{...n.state.poster,preview:void 0}}:n.state;return r.append("editState",JSON.stringify(h)),r}var Y=[{id:"bw",label:"\u9ED1\u767D",vf:"hue=s=0",css:"grayscale(1)"},{id:"sepia",label:"\u590D\u53E4",vf:"colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131",css:"sepia(0.85)"},{id:"warm",label:"\u6696\u9633",vf:"colorbalance=rs=.15:gs=.04:bs=-.15",css:"sepia(0.25) saturate(1.25) brightness(1.03)"},{id:"cool",label:"\u51B7\u8C03",vf:"colorbalance=rs=-.14:bs=.16",css:"hue-rotate(12deg) saturate(0.95) brightness(1.02)"},{id:"vivid",label:"\u9C9C\u8273",vf:"eq=saturation=1.45:contrast=1.08",css:"saturate(1.45) contrast(1.08)"}];function X(t){return t?Y.find(e=>e.id===t):void 0}function G(t,e){const a=X(e)?.css??"";return[`brightness(${1+t.brightness})`,`contrast(${1+t.contrast})`,`saturate(${1+t.saturation})`,a].filter(Boolean).join(" ")}function K(t,e,a,n,r,o=1,i,c=!0){const h=B(n,r);t.width=Math.max(2,Math.round(h.w*o)),t.height=Math.max(2,Math.round(h.h*o));const s=t.getContext("2d");if(!s)return;const u=z(n.w,n.h,r.rotation),l=r.crop??{x:0,y:0,width:u.w,height:u.h},x=r.scale?.fit??"force",{src:p,dst:d}=j({width:l.width,height:l.height},h,x);x==="contain"&&(s.fillStyle="#000",s.fillRect(0,0,t.width,t.height)),s.filter=G(r.filters,r.filterPreset),s.save(),x==="contain"&&(s.beginPath(),s.rect(o*d.x,o*d.y,o*d.width,o*d.height),s.clip()),s.translate(o*d.x,o*d.y),s.scale(o*d.width/p.width,o*d.height/p.height),s.translate(-(l.x+p.x),-(l.y+p.y)),s.translate(u.w/2,u.h/2),s.rotate(r.rotation*O),s.scale(r.flipX?-1:1,r.flipY?-1:1);const w=j({width:a.w,height:a.h},{w:n.w,h:n.h},"cover");s.drawImage(e,w.src.x,w.src.y,w.src.width,w.src.height,-n.w/2,-n.h/2,n.w,n.h),s.restore(),s.filter="none",c&&r.overlays?.length&&(s.setTransform(o,0,0,o,0,0),M(s,r.overlays,i),s.setTransform(1,0,0,1,0,0))}function Q(t,e){return new Promise(a=>{const n=()=>{t.removeEventListener("seeked",n),a()};t.addEventListener("seeked",n),t.currentTime=Math.min(Math.max(0,e),t.duration||e)})}async function Z(t,e,a=160){const n=t.duration;if(!n||!isFinite(n)||e<=0)return[];const r=t.videoWidth||16,o=t.videoHeight||9,i=Math.min(a,r),c=Math.max(1,Math.round(i*o/r)),h=document.createElement("canvas");h.width=i,h.height=c;const s=h.getContext("2d");if(!s)return[];const u=[];for(let l=0;l<e;l++)await Q(t,n*(l+.5)/e),s.drawImage(t,0,0,i,c),u.push(h.toDataURL("image/jpeg",.6));return u}function tt(t,e={}){const a=e.mode??"overlay",n=document.createElement("button");n.type="button",n.className=["me-fullscreen-toggle",e.className].filter(Boolean).join(" "),n.dataset.meFullscreenToggle="true",n.dataset.mode=a,n.title="\u5168\u5C4F / \u9000\u51FA\u5168\u5C4F",n.style.cssText=[a==="overlay"?"position:absolute;left:8px;bottom:8px;z-index:30;":"position:static;","width:32px;height:32px;padding:0;","display:inline-flex;align-items:center;justify-content:center;","border:1px solid var(--me-border,#26262b);border-radius:6px;","background:var(--me-chip,#1c1c20);color:var(--me-fg,#e7e7ee);","cursor:pointer;font-size:15px;line-height:1;opacity:0.9;font:inherit;"].join(""),t.classList.add("me-fullscreen-host");const r=()=>{const c=document.fullscreenElement===t;n.textContent=c?"\xD7":"\u26F6",n.setAttribute("aria-label",c?"\u9000\u51FA\u5168\u5C4F":"\u5168\u5C4F"),t.classList.toggle("me-is-fullscreen",c),t.dataset.meFullscreen=c?"true":"false"};r();const o=()=>r(),i=()=>{(document.fullscreenElement===t?document.exitFullscreen?.():t.requestFullscreen?.())?.catch?.(()=>{})};return n.addEventListener("click",i),document.addEventListener("fullscreenchange",o),{button:n,dispose:()=>{document.removeEventListener("fullscreenchange",o),n.removeEventListener("click",i),n.remove(),t.classList.remove("me-fullscreen-host","me-is-fullscreen"),delete t.dataset.meFullscreen}}}exports.buildVideoExportFormData=H,exports.createFullscreenToggle=tt,exports.drawOverlay=P,exports.drawOverlays=M,exports.drawVideoFrame=K,exports.fitStickerBox=_,exports.generateThumbnails=Z,exports.getOverlayRotation=m,exports.hitTestOverlay=D,exports.loadOverlayImages=E,exports.overlayBBox=k,exports.renderOverlaysToPng=F,exports.rotateOverlay=U,exports.scaleOverlay=J,exports.translateOverlay=V;
|
package/core/dist/browser.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{outputSize as
|
|
1
|
+
import{outputSize as q,rotatedSize as ke,fitRects as ae,buildFilterCss as ie,DEG2RAD as Se,findFilterPreset as Te}from"./chunk-USY6UDGL.js";var oe=Math.PI/180;function B(e,t,r){e.strokeStyle=t,e.lineWidth=r,e.lineCap="round",e.lineJoin="round"}function Ne(e,t,r,n,a,i){const s=Math.atan2(a-r,n-t),c=Math.max(12,i*3.5);e.beginPath(),e.moveTo(n,a),e.lineTo(n-c*Math.cos(s-Math.PI/7),a-c*Math.sin(s-Math.PI/7)),e.moveTo(n,a),e.lineTo(n-c*Math.cos(s+Math.PI/7),a-c*Math.sin(s+Math.PI/7)),e.stroke()}function se(e){if(!Number.isFinite(e))return 0;let t=e%360;return t>180&&(t-=360),t<-180&&(t+=360),Math.abs(t)<.001?0:t}var Fe=.84;function Ce(e){const t=Math.max(8,Number(e?.w)||0),r=Math.max(8,Number(e?.h)||0),n=Math.max(8,Math.min(t,r)*Fe);return{x:(Number(e?.x)||0)+(t-n)/2,y:(Number(e?.y)||0)+(r-n)/2,size:n}}var J=null;function Ae(){return typeof document>"u"?null:(J??(J=document.createElement("canvas")),J.getContext("2d"))}function ce(e){return Math.min(512,Math.max(8,Number(e.fontSize)||24))}function Pe(e,t){return Number.isFinite(e.paddingX)?Math.max(0,e.paddingX):Math.max(8,Math.round(t*.18))}function Ee(e,t){return Number.isFinite(e.paddingY)?Math.max(0,e.paddingY):Math.max(6,Math.round(t*.14))}function ze(e,t){return(Number.isFinite(e.lineHeight)?Math.max(.9,e.lineHeight):1.1)*t}function We(e){return e.textAlign==="center"||e.textAlign==="right"?e.textAlign:"left"}function Oe(e){const t=ce(e),r=e.fontStyle||"normal",n=e.fontWeight||"700",a=e.fontFamily||'-apple-system, "PingFang SC", "Microsoft YaHei", sans-serif';return`${r} ${n} ${t}px ${a}`}function Ie(e,t){const r=e==null?"":String(e);switch(t){case"uppercase":return r.toUpperCase();case"lowercase":return r.toLowerCase();case"capitalize":return r.toLowerCase().replace(/(^|\s)(\S)/g,(n,a,i)=>`${a}${i.toUpperCase()}`);default:return r}}function $e(e,t){const r=Ie(e,t).replace(/\r\n/g,`
|
|
2
2
|
`).split(`
|
|
3
|
-
`);return n.length?n:[""]}function X(t){return Number.isFinite(t)&&t>=0}function Lt(t){if(!J(t))return null;const e=X(t.startAt)?Number(t.startAt):null,r=X(t.endAt)?Number(t.endAt):null;if(e==null&&r==null)return null;const n=Math.max(0,e??0),i=Math.max(n,r??n);return{start:n,end:i}}function lt(t){const e=Lt(t);return!!e&&e.end>e.start}function J(t){return t?.type==="pen"||t?.type==="line"||t?.type==="arrow"||t?.type==="rect"||t?.type==="ellipse"||t?.type==="text"||t?.type==="sticker"}function Yt(t){if(!J(t)&&t?.type!=="filter"&&t?.type!=="adjust")return null;const e=X(t.startAt)?Number(t.startAt):null,r=X(t.endAt)?Number(t.endAt):null;if(e==null&&r==null)return null;const n=Math.max(0,e??0),i=Math.max(n,r??n);return{start:n,end:i}}function jt(t,e){const r=Yt(t);return r?Number.isFinite(e)?e>=r.start&&e<=r.end:!1:!0}function Xt(t,e){return t?.length?Number.isFinite(e)?t.filter(r=>jt(r,e)):t:[]}function ut(t){return t?.type==="text"||t?.type==="sticker"||t?.type==="filter"||t?.type==="adjust"}function ht(t){return Number.isFinite(t?.timelineTrack)?Math.max(0,Math.round(Number(t.timelineTrack))):0}function dt(t){return X(t?.startAt)?Number(t.startAt):0}function q(t){const e=ct(t),r=kt(t,e),n=Pt(t,e),i=Et(t,e),a=Bt(t.text,t.textTransform),c=Ot(),o=It(t);c&&(c.font=o);const f=a.map(x=>{const y=x===""?" ":x;return c?c.measureText(y).width:Math.max(1,y.length)*e*.6}),s=f.length?Math.max(...f):e*.6,w=Math.max(e,a.length*i),b=Math.max(Number.isFinite(t.width)?t.width:0,s+r*2),m=w+n*2;return{font:o,fontSize:e,paddingX:r,paddingY:n,lineHeight:i,lines:a,widths:f,boxWidth:b,boxHeight:m,align:Wt(t)}}function Rt(t,e,r){return e.align==="center"?t.x+e.boxWidth/2-r/2:e.align==="right"?t.x+e.boxWidth-e.paddingX-r:t.x+e.paddingX}function $t(t,e,r,n,i,a){if(!e.textDecoration||a<=0)return;const c=r.fontSize,o=String(e.textDecoration).includes("underline"),f=String(e.textDecoration).includes("line-through");if(!(!o&&!f)){if(t.save(),t.strokeStyle=e.color||"#fff",t.lineWidth=Math.max(1,c/18),o){const s=i+c+Math.max(1,c*.08);t.beginPath(),t.moveTo(n,s),t.lineTo(n+a,s),t.stroke()}if(f){const s=i+c*.56;t.beginPath(),t.moveTo(n,s),t.lineTo(n+a,s),t.stroke()}t.restore()}}function K(t){return ot(t.rotation??0)}function ft(t){switch(t.type){case"pen":{let e=1/0,r=1/0,n=-1/0,i=-1/0;for(let a=0;a<t.points.length;a+=2)e=Math.min(e,t.points[a]),n=Math.max(n,t.points[a]),r=Math.min(r,t.points[a+1]),i=Math.max(i,t.points[a+1]);return{x:e,y:r,w:n-e,h:i-r}}case"line":case"arrow":return{x:Math.min(t.x1,t.x2),y:Math.min(t.y1,t.y2),w:Math.abs(t.x2-t.x1),h:Math.abs(t.y2-t.y1)};case"rect":case"ellipse":case"sticker":return{x:t.x,y:t.y,w:t.w,h:t.h};case"text":{const e=q(t);return{x:t.x,y:t.y,w:e.boxWidth,h:e.boxHeight}}}}function Q(t){const e=ft(t);return{x:e.x+e.w/2,y:e.y+e.h/2}}function Ht(t,e,r,n,i){const a=i*st,c=Math.cos(a),o=Math.sin(a),f=t-r,s=e-n;return{x:r+f*c-s*o,y:n+f*o+s*c}}function mt(t,e,r,n,i){return{x:r+(t-r)*i,y:n+(e-n)*i}}function Z(t,e,r){const n=K(e);if(n){const i=Q(e);t.save(),t.translate(i.x,i.y),t.rotate(n*st),t.translate(-i.x,-i.y),pt(t,e,r),t.restore();return}pt(t,e,r)}function pt(t,e,r){switch(e.type){case"pen":{D(t,e.color,e.width),t.beginPath(),t.moveTo(e.points[0],e.points[1]);for(let n=2;n<e.points.length;n+=2)t.lineTo(e.points[n],e.points[n+1]);t.stroke();break}case"line":case"arrow":{D(t,e.color,e.width),t.beginPath(),t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.stroke(),e.type==="arrow"&&Ft(t,e.x1,e.y1,e.x2,e.y2,e.width);break}case"rect":{D(t,e.color,e.width),t.strokeRect(e.x,e.y,e.w,e.h);break}case"ellipse":{D(t,e.color,e.width),t.beginPath(),t.ellipse(e.x+e.w/2,e.y+e.h/2,Math.abs(e.w/2),Math.abs(e.h/2),0,0,Math.PI*2),t.stroke();break}case"text":{const n=q(e),i=Number.isFinite(e.opacity)?Math.min(1,Math.max(0,e.opacity/100)):1,a=Number.isFinite(e.borderWidth)?Math.max(0,e.borderWidth):0,c=e.autoOutline!==!1;t.save(),t.globalAlpha*=i,e.backgroundColor&&e.backgroundColor!=="transparent"&&(t.fillStyle=e.backgroundColor,t.fillRect(e.x,e.y,n.boxWidth,n.boxHeight)),t.fillStyle=e.color||"#fff",t.font=n.font,t.textBaseline="top",t.lineJoin="round";const o=e.boxShadow;o&&(t.shadowColor=o.color||"transparent",t.shadowOffsetX=o.x||0,t.shadowOffsetY=o.y||0,t.shadowBlur=o.blur||0),n.lines.forEach((f,s)=>{const w=n.widths[s]??0,b=Rt(e,n,w),m=e.y+n.paddingY+s*n.lineHeight;(a>0||c)&&(t.strokeStyle=a>0?e.borderColor||"#000":e.strokeColor||"rgba(0,0,0,0.45)",t.lineWidth=a>0?a:Math.max(1,n.fontSize/18),t.strokeText(f,b,m)),t.fillText(f,b,m),$t(t,e,n,b,m,w)}),t.restore();break}case"sticker":{if(e.emoji){const n=Nt(e);t.save(),t.font=`${n.size}px -apple-system, "Apple Color Emoji", "Segoe UI Emoji", sans-serif`,t.textAlign="center",t.textBaseline="middle",t.fillText(e.emoji,n.x+n.size/2,n.y+n.size/2),t.restore()}else if(e.src){const n=r?.get(e.src);n&&t.drawImage(n,e.x,e.y,e.w,e.h)}break}}}function tt(t,e,r){for(const n of e)Z(t,n,r)}async function gt(t){const e=new Map,r=[...new Set(t.filter(n=>n.type==="sticker"&&n.src).map(n=>n.src))];return await Promise.all(r.map(n=>new Promise(i=>{const a=new Image;a.onload=()=>{e.set(n,a),i()},a.onerror=()=>i(),a.src=n}))),e}async function et(t,e,r){if(!t?.length)return null;const n=document.createElement("canvas");n.width=e,n.height=r;const i=n.getContext("2d");if(!i)return null;const a=await gt(t);return tt(i,t,a),new Promise(c=>n.toBlob(o=>c(o),"image/png"))}function Dt(t,e,r,n=12){for(let i=t.length-1;i>=0;i--){const a=t[i];if(Ut(a,e,r,n))return i}return-1}function _t(t,e,r,n,i){return Math.abs(t-r)<=i&&Math.abs(e-n)<=i}function yt(t,e,r,n,i,a,c){const o=i-r,f=a-n,s=o*o+f*f||1,w=Math.max(0,Math.min(1,((t-r)*o+(e-n)*f)/s)),b=r+w*o,m=n+w*f;return(t-b)**2+(e-m)**2<=c*c}function Ut(t,e,r,n){const i=K(t);if(i){const a=Q(t),c=Ht(e,r,a.x,a.y,-i);return wt(t,c.x,c.y,n)}return wt(t,e,r,n)}function wt(t,e,r,n){switch(t.type){case"pen":{for(let i=0;i+3<t.points.length;i+=2)if(yt(e,r,t.points[i],t.points[i+1],t.points[i+2],t.points[i+3],n+t.width/2))return!0;return!1}case"line":case"arrow":return yt(e,r,t.x1,t.y1,t.x2,t.y2,n+t.width/2);case"rect":case"ellipse":return e>=t.x-n&&e<=t.x+t.w+n&&r>=t.y-n&&r<=t.y+t.h+n;case"text":{const i=q(t);return e>=t.x-n&&e<=t.x+i.boxWidth+n&&r>=t.y-n&&r<=t.y+i.boxHeight+n}case"sticker":return _t(e,r,t.x+t.w/2,t.y+t.h/2,Math.max(t.w,t.h)/2+n)}}function Gt(t,e,r){const n=Math.max(8,r);if(!(t>0)||!(e>0))return{w:n,h:n};const i=n/Math.max(t,e);return{w:Math.max(8,Math.round(t*i)),h:Math.max(8,Math.round(e*i))}}function Vt(t,e){const r=Math.max(.05,e),n=Q(t);switch(t.type){case"pen":return{...t,points:t.points.map((i,a)=>a%2===0?n.x+(i-n.x)*r:n.y+(i-n.y)*r)};case"line":case"arrow":{const i=mt(t.x1,t.y1,n.x,n.y,r),a=mt(t.x2,t.y2,n.x,n.y,r);return{...t,x1:i.x,y1:i.y,x2:a.x,y2:a.y}}case"rect":case"ellipse":case"sticker":return{...t,w:Math.max(8,t.w*r),h:Math.max(8,t.h*r)};case"text":return{...t,fontSize:Math.min(512,Math.max(8,t.fontSize*r)),width:Number.isFinite(t.width)?Math.max(80,t.width*r):t.width,paddingX:Number.isFinite(t.paddingX)?Math.max(0,t.paddingX*r):t.paddingX,paddingY:Number.isFinite(t.paddingY)?Math.max(0,t.paddingY*r):t.paddingY,borderWidth:Number.isFinite(t.borderWidth)?Math.max(0,t.borderWidth*r):t.borderWidth,boxShadow:t.boxShadow?{...t.boxShadow,x:(t.boxShadow.x||0)*r,y:(t.boxShadow.y||0)*r,blur:(t.boxShadow.blur||0)*r}:t.boxShadow};default:return t}}function Jt(t,e){return{...t,rotation:ot(e)}}function qt(t,e,r){switch(t.type){case"pen":{const n=t.points.map((i,a)=>a%2===0?i+e:i+r);return{...t,points:n}}case"line":case"arrow":return{...t,x1:t.x1+e,y1:t.y1+r,x2:t.x2+e,y2:t.y2+r};case"rect":case"ellipse":case"sticker":return{...t,x:t.x+e,y:t.y+r};case"text":return{...t,x:t.x+e,y:t.y+r}}}function Y(t,e){const r=Math.min(8192,Math.max(2,Math.round(Number(t)||e)));return r%2===0?r:r-1}function ce(t){const e=G(t.canvas,t),r=t?.exportSettings??null;if(!r)return e;const n=Number.isFinite(Number(r.width))&&Number(r.width)>0,i=Number.isFinite(Number(r.height))&&Number(r.height)>0;if(!n&&!i)return e;const a=e.w>0&&e.h>0?e.w/e.h:1;if(n&&i)return{w:Y(r.width,e.w),h:Y(r.height,e.h)};if(n){const o=Y(r.width,e.w);return{w:o,h:Y(o/a,e.h)}}const c=Y(r.height,e.h);return{w:Y(c*a,e.w),h:c}}function Kt(t){const e=String(t??"").match(/^data:(image\/(?:png|jpe?g));base64,([a-z0-9+/=]+)$/i);if(!e)return null;const r=atob(e[2]),n=new Uint8Array(r.length);for(let i=0;i<r.length;i++)n[i]=r.charCodeAt(i);return new Blob([n],{type:e[1].toLowerCase()})}async function Qt(t,e,r=[]){const n=t.getExportPlan(),i=new FormData;n.videoSrcOrder.forEach((m,x)=>{const y=e[m];y&&i.append(`video_${x}`,y,y.name||`video_${x}.mp4`)}),n.audioSrcOrder.forEach((m,x)=>{const y=r[m];y&&i.append(`audio_${x}`,y,y.name||`audio_${x}`)});const a=G(n.state.canvas,n.state),c=n.state.overlays??[],o=c.filter(m=>lt(m)),f=c.filter(m=>!lt(m)&&J(m)),s=await et(f,a.w,a.h);s&&i.append("overlay",s,"overlay.png");for(let m=0;m<o.length;m++){const x=await et([o[m]],a.w,a.h);x&&i.append(`textOverlay_${m}`,x,`text-overlay-${m}.png`)}const w=n.state.poster?.useAsVideoCover?Kt(n.state.poster.preview):null;w&&i.append("videoCover",w,"video-cover.png");const b=n.state.poster?.preview?{...n.state,poster:{...n.state.poster,preview:void 0}}:n.state;return i.append("editState",JSON.stringify(b)),i}function F(t){return Math.max(-1,Math.min(1,Number(t)||0))}function j(t){return Math.max(0,Math.min(1,Number(t)||0))}function T(t){return Math.max(0,Math.min(1,t))}function N(t){return Math.max(0,Math.min(255,t))}function W(t,e,r){if(t===e)return r<t?0:1;const n=Math.max(0,Math.min(1,(r-t)/(e-t)));return n*n*(3-2*n)}function nt(t){const e=W(.08,.4,t),r=1-W(.6,.92,t);return T(e*r*2.2)}function bt(t,e,r=0){const n=Math.sin(t*12.9898+e*78.233+r*37.719)*43758.5453;return n-Math.floor(n)}var I=null;function Zt(t,e){return typeof document>"u"?null:(I??(I=document.createElement("canvas")),I.width!==t&&(I.width=t),I.height!==e&&(I.height=e),I)}function xt(t,e,r,n){if(!n||n==="none")return;const i=Zt(e,r),a=i?.getContext("2d");!i||!a||(a.setTransform(1,0,0,1,0,0),a.clearRect(0,0,e,r),a.drawImage(t.canvas,0,0,e,r),t.save(),t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e,r),t.filter=n,t.drawImage(i,0,0,e,r),t.restore(),t.filter="none")}function te(t,e,r,n){const i=Ct(n?.filterPreset)?.css??"";xt(t,e,r,i)}function ee(t,e,r,n){xt(t,e,r,at(n??{},"")),Mt(t,e,r,n??{})}function ne(t={}){return["temperature","tint","vibrance","gamma","highlights","shadows","whites","blacks","lightSense"].some(r=>Math.abs(F(t[r]))>1e-4)?!0:["sharpen","clarity","grain","fade","vignette"].some(r=>j(t[r])>1e-4)}function Mt(t,e,r,n={}){if(!ne(n))return;let i;try{i=t.getImageData(0,0,e,r)}catch{return}const a=F(n.temperature),c=F(n.tint),o=F(n.vibrance),f=F(n.gamma),s=F(n.highlights),w=F(n.shadows),b=F(n.whites),m=F(n.blacks),x=F(n.lightSense),y=j(n.sharpen),O=j(n.clarity),z=j(n.grain),k=j(n.fade),R=j(n.vignette),_=1+f*(f>0?1:.5),M=f===0?1:1/Math.max(.01,_),P=a*.18,$=a*.02,H=-a*.18,rt=c*.1,vt=-c*.12,g=i.data;for(let u=0;u<g.length;u+=4){let d=g[u]/255,p=g[u+1]/255,h=g[u+2]/255;if((a!==0||c!==0)&&(d=T(d+P+rt),p=T(p+$+vt),h=T(h+H+rt)),o!==0){const l=Math.max(d,p,h),S=Math.min(d,p,h),C=l-S,v=(d+p+h)/3,A=o>0?o*(1-C):o*(.35+C*.65);d=T(v+(d-v)*(1+A)),p=T(v+(p-v)*(1+A)),h=T(v+(h-v)*(1+A))}if(f!==0&&(d=T(Math.pow(d,M)),p=T(Math.pow(p,M)),h=T(Math.pow(h,M))),s!==0||w!==0||b!==0||m!==0||x!==0||k!==0){const l=.2126*d+.7152*p+.0722*h,S=1-W(.18,.62,l),C=1-W(.04,.32,l),v=W(.38,.84,l),A=W(.7,.98,l),B=nt(l),E=w*S*.28+s*v*.24+m*C*.2+b*A*.2+x*B*.18+k*(.12+S*.06);if(d=T(d+E),p=T(p+E),h=T(h+E),k>0){const U=(d+p+h)/3,L=k*.16;d=T(d*(1-L)+U*L),p=T(p*(1-L)+U*L),h=T(h*(1-L)+U*L)}}g[u]=Math.round(d*255),g[u+1]=Math.round(p*255),g[u+2]=Math.round(h*255)}if(y>1e-4||O>1e-4){const u=new Uint8ClampedArray(g),d=e*4;for(let p=1;p<r-1;p++)for(let h=1;h<e-1;h++){const l=p*d+h*4,S=(u[l-4]+u[l+4]+u[l-d]+u[l+d]+u[l]*4)/8,C=(u[l-3]+u[l+5]+u[l-d+1]+u[l+d+1]+u[l+1]*4)/8,v=(u[l-2]+u[l+6]+u[l-d+2]+u[l+d+2]+u[l+2]*4)/8,A=(.2126*u[l]+.7152*u[l+1]+.0722*u[l+2])/255,B=Math.min(1.8,y*1.45+O*.9*nt(A));g[l]=N(u[l]+(u[l]-S)*B),g[l+1]=N(u[l+1]+(u[l+1]-C)*B),g[l+2]=N(u[l+2]+(u[l+2]-v)*B)}}if(z>1e-4){const u=z*26;for(let d=0;d<r;d++)for(let p=0;p<e;p++){const h=(d*e+p)*4,l=(.2126*g[h]+.7152*g[h+1]+.0722*g[h+2])/255,S=.4+nt(l)*.9,C=(bt(p,d)-.5)*u*S,v=(bt(p,d,1)-.5)*u*.22*z;g[h]=N(g[h]+C+v),g[h+1]=N(g[h+1]+C*.88),g[h+2]=N(g[h+2]+C-v)}}if(R>1e-4){const u=(e-1)/2,d=(r-1)/2,p=Math.sqrt(u*u+d*d)||1;for(let h=0;h<r;h++)for(let l=0;l<e;l++){const S=(h*e+l)*4,C=l-u,v=h-d,A=Math.sqrt(C*C+v*v)/p,E=1-W(.32,1,A)*R*.62;g[S]=N(g[S]*E),g[S+1]=N(g[S+1]*E),g[S+2]=N(g[S+2]*E)}}t.putImageData(i,0,0)}function re(t,e,r,n,i,a=1,c,o=!0){const f=G(n,i);t.width=Math.max(2,Math.round(f.w*a)),t.height=Math.max(2,Math.round(f.h*a));const s=t.getContext("2d");if(!s)return;const w=Tt(n.w,n.h,i.rotation),b=i.crop??{x:0,y:0,width:w.w,height:w.h},m=i.scale?.fit??"force",{src:x,dst:y}=it({width:b.width,height:b.height},f,m);m==="contain"&&(s.fillStyle="#000",s.fillRect(0,0,t.width,t.height)),s.filter=at(i.filters,i.filterPreset),s.save(),m==="contain"&&(s.beginPath(),s.rect(a*y.x,a*y.y,a*y.width,a*y.height),s.clip()),s.translate(a*y.x,a*y.y),s.scale(a*y.width/x.width,a*y.height/x.height),s.translate(-(b.x+x.x),-(b.y+x.y)),s.translate(w.w/2,w.h/2),s.rotate(i.rotation*St),s.scale(i.flipX?-1:1,i.flipY?-1:1);const O=it({width:r.w,height:r.h},{w:n.w,h:n.h},"cover");if(s.drawImage(e,O.src.x,O.src.y,O.src.width,O.src.height,-n.w/2,-n.h/2,n.w,n.h),s.restore(),s.filter="none",Mt(s,t.width,t.height,i.filters),o&&i.overlays?.length){const z=Number.isFinite(i?.__mePreviewTimelineTime)?Number(i.__mePreviewTimelineTime):null,k=z==null?i.overlays:Xt(i.overlays,z),R=k.map((M,P)=>({overlay:M,index:P})).filter(M=>ut(M.overlay)).sort((M,P)=>{const $=ht(P.overlay)-ht(M.overlay);if($!==0)return $;const H=dt(M.overlay)-dt(P.overlay);return Math.abs(H)>1e-6?H:M.index-P.index}),_=k.filter(M=>!ut(M));s.setTransform(a,0,0,a,0,0),R.forEach(M=>{if(M.overlay?.type==="filter"){s.setTransform(1,0,0,1,0,0),te(s,t.width,t.height,M.overlay),s.setTransform(a,0,0,a,0,0);return}if(M.overlay?.type==="adjust"){s.setTransform(1,0,0,1,0,0),ee(s,t.width,t.height,M.overlay),s.setTransform(a,0,0,a,0,0);return}Z(s,M.overlay,c)}),tt(s,_,c),s.setTransform(1,0,0,1,0,0)}}function ie(t,e){return new Promise(r=>{const n=()=>{t.removeEventListener("seeked",n),r()};t.addEventListener("seeked",n),t.currentTime=Math.min(Math.max(0,e),t.duration||e)})}async function ae(t,e,r=160){const n=t.duration;if(!n||!isFinite(n)||e<=0)return[];const i=t.videoWidth||16,a=t.videoHeight||9,c=Math.min(r,i),o=Math.max(1,Math.round(c*a/i)),f=document.createElement("canvas");f.width=c,f.height=o;const s=f.getContext("2d");if(!s)return[];const w=[];for(let b=0;b<e;b++)await ie(t,n*(b+.5)/e),s.drawImage(t,0,0,c,o),w.push(f.toDataURL("image/jpeg",.6));return w}function se(t,e={}){const r=e.mode??"overlay",n=document.createElement("button");n.type="button",n.className=["me-fullscreen-toggle",e.className].filter(Boolean).join(" "),n.dataset.meFullscreenToggle="true",n.dataset.mode=r,n.title="\u5168\u5C4F / \u9000\u51FA\u5168\u5C4F",n.style.cssText=[r==="overlay"?"position:absolute;left:8px;bottom:8px;z-index:30;":"position:static;","width:32px;height:32px;padding:0;","display:inline-flex;align-items:center;justify-content:center;","border:1px solid var(--me-border,#26262b);border-radius:6px;","background:var(--me-chip,#1c1c20);color:var(--me-fg,#e7e7ee);","cursor:pointer;font-size:15px;line-height:1;opacity:0.9;font:inherit;"].join(""),t.classList.add("me-fullscreen-host");const i=()=>{const o=document.fullscreenElement===t;n.textContent=o?"\xD7":"\u26F6",n.setAttribute("aria-label",o?"\u9000\u51FA\u5168\u5C4F":"\u5168\u5C4F"),t.classList.toggle("me-is-fullscreen",o),t.dataset.meFullscreen=o?"true":"false"};i();const a=()=>i(),c=()=>{(document.fullscreenElement===t?document.exitFullscreen?.():t.requestFullscreen?.())?.catch?.(()=>{})};return n.addEventListener("click",c),document.addEventListener("fullscreenchange",a),{button:n,dispose:()=>{document.removeEventListener("fullscreenchange",a),n.removeEventListener("click",c),n.remove(),t.classList.remove("me-fullscreen-host","me-is-fullscreen"),delete t.dataset.meFullscreen}}}export{Qt as buildVideoExportFormData,se as createFullscreenToggle,Z as drawOverlay,tt as drawOverlays,re as drawVideoFrame,Gt as fitStickerBox,ae as generateThumbnails,K as getOverlayRotation,Dt as hitTestOverlay,gt as loadOverlayImages,ft as overlayBBox,et as renderOverlaysToPng,Jt as rotateOverlay,Vt as scaleOverlay,qt as translateOverlay};
|
|
3
|
+
`);return r.length?r:[""]}function D(e){return Number.isFinite(e)&&e>=0}function Le(e){if(!V(e))return null;const t=D(e.startAt)?Number(e.startAt):null,r=D(e.endAt)?Number(e.endAt):null;if(t==null&&r==null)return null;const n=Math.max(0,t??0),a=Math.max(n,r??n);return{start:n,end:a}}function le(e){const t=Le(e);return!!t&&t.end>t.start}function V(e){return e?.type==="pen"||e?.type==="line"||e?.type==="arrow"||e?.type==="rect"||e?.type==="ellipse"||e?.type==="text"||e?.type==="sticker"}function je(e){if(!V(e)&&e?.type!=="filter"&&e?.type!=="adjust")return null;const t=D(e.startAt)?Number(e.startAt):null,r=D(e.endAt)?Number(e.endAt):null;if(t==null&&r==null)return null;const n=Math.max(0,t??0),a=Math.max(n,r??n);return{start:n,end:a}}function De(e,t){const r=je(e);return r?Number.isFinite(t)?t>=r.start&&t<=r.end:!1:!0}function Ye(e,t){return e?.length?Number.isFinite(t)?e.filter(r=>De(r,t)):e:[]}function he(e){return e?.type==="text"||e?.type==="sticker"||e?.type==="filter"||e?.type==="adjust"}function ue(e){return Number.isFinite(e?.timelineTrack)?Math.max(0,Math.round(Number(e.timelineTrack))):0}function de(e){return D(e?.startAt)?Number(e.startAt):0}function G(e){const t=ce(e),r=Pe(e,t),n=Ee(e,t),a=ze(e,t),i=$e(e.text,e.textTransform),s=Ae(),c=Oe(e);s&&(s.font=c);const m=i.map(b=>{const g=b===""?" ":b;return s?s.measureText(g).width:Math.max(1,g.length)*t*.6}),o=m.length?Math.max(...m):t*.6,y=Math.max(t,i.length*a),w=Math.max(Number.isFinite(e.width)?e.width:0,o+r*2),f=y+n*2;return{font:c,fontSize:t,paddingX:r,paddingY:n,lineHeight:a,lines:i,widths:m,boxWidth:w,boxHeight:f,align:We(e)}}function He(e,t,r){return t.align==="center"?e.x+t.boxWidth/2-r/2:t.align==="right"?e.x+t.boxWidth-t.paddingX-r:e.x+t.paddingX}function Xe(e,t,r,n,a,i){if(!t.textDecoration||i<=0)return;const s=r.fontSize,c=String(t.textDecoration).includes("underline"),m=String(t.textDecoration).includes("line-through");if(!(!c&&!m)){if(e.save(),e.strokeStyle=t.color||"#fff",e.lineWidth=Math.max(1,s/18),c){const o=a+s+Math.max(1,s*.08);e.beginPath(),e.moveTo(n,o),e.lineTo(n+i,o),e.stroke()}if(m){const o=a+s*.56;e.beginPath(),e.moveTo(n,o),e.lineTo(n+i,o),e.stroke()}e.restore()}}function K(e){return se(e.rotation??0)}function me(e){switch(e.type){case"pen":{let t=1/0,r=1/0,n=-1/0,a=-1/0;for(let i=0;i<e.points.length;i+=2)t=Math.min(t,e.points[i]),n=Math.max(n,e.points[i]),r=Math.min(r,e.points[i+1]),a=Math.max(a,e.points[i+1]);return{x:t,y:r,w:n-t,h:a-r}}case"line":case"arrow":return{x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),w:Math.abs(e.x2-e.x1),h:Math.abs(e.y2-e.y1)};case"rect":case"ellipse":case"sticker":return{x:e.x,y:e.y,w:e.w,h:e.h};case"text":{const t=G(e);return{x:e.x,y:e.y,w:t.boxWidth,h:t.boxHeight}}}}function Q(e){const t=me(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function Be(e,t,r,n,a){const i=a*oe,s=Math.cos(i),c=Math.sin(i),m=e-r,o=t-n;return{x:r+m*s-o*c,y:n+m*c+o*s}}function fe(e,t,r,n,a){return{x:r+(e-r)*a,y:n+(t-n)*a}}function Z(e,t,r){const n=K(t);if(n){const a=Q(t);e.save(),e.translate(a.x,a.y),e.rotate(n*oe),e.translate(-a.x,-a.y),xe(e,t,r),e.restore();return}xe(e,t,r)}function xe(e,t,r){switch(t.type){case"pen":{B(e,t.color,t.width),e.beginPath(),e.moveTo(t.points[0],t.points[1]);for(let n=2;n<t.points.length;n+=2)e.lineTo(t.points[n],t.points[n+1]);e.stroke();break}case"line":case"arrow":{B(e,t.color,t.width),e.beginPath(),e.moveTo(t.x1,t.y1),e.lineTo(t.x2,t.y2),e.stroke(),t.type==="arrow"&&Ne(e,t.x1,t.y1,t.x2,t.y2,t.width);break}case"rect":{B(e,t.color,t.width),e.strokeRect(t.x,t.y,t.w,t.h);break}case"ellipse":{B(e,t.color,t.width),e.beginPath(),e.ellipse(t.x+t.w/2,t.y+t.h/2,Math.abs(t.w/2),Math.abs(t.h/2),0,0,Math.PI*2),e.stroke();break}case"text":{const n=G(t),a=Number.isFinite(t.opacity)?Math.min(1,Math.max(0,t.opacity/100)):1,i=Number.isFinite(t.borderWidth)?Math.max(0,t.borderWidth):0,s=t.autoOutline!==!1;e.save(),e.globalAlpha*=a,t.backgroundColor&&t.backgroundColor!=="transparent"&&(e.fillStyle=t.backgroundColor,e.fillRect(t.x,t.y,n.boxWidth,n.boxHeight)),e.fillStyle=t.color||"#fff",e.font=n.font,e.textBaseline="top",e.lineJoin="round";const c=t.boxShadow;c&&(e.shadowColor=c.color||"transparent",e.shadowOffsetX=c.x||0,e.shadowOffsetY=c.y||0,e.shadowBlur=c.blur||0),n.lines.forEach((m,o)=>{const y=n.widths[o]??0,w=He(t,n,y),f=t.y+n.paddingY+o*n.lineHeight;(i>0||s)&&(e.strokeStyle=i>0?t.borderColor||"#000":t.strokeColor||"rgba(0,0,0,0.45)",e.lineWidth=i>0?i:Math.max(1,n.fontSize/18),e.strokeText(m,w,f)),e.fillText(m,w,f),Xe(e,t,n,w,f,y)}),e.restore();break}case"sticker":{if(t.emoji){const n=Ce(t);e.save(),e.font=`${n.size}px -apple-system, "Apple Color Emoji", "Segoe UI Emoji", sans-serif`,e.textAlign="center",e.textBaseline="middle",e.fillText(t.emoji,n.x+n.size/2,n.y+n.size/2),e.restore()}else if(t.src){const n=r?.get(t.src);n&&e.drawImage(n,t.x,t.y,t.w,t.h)}break}}}function ee(e,t,r){for(const n of t)Z(e,n,r)}async function pe(e){const t=new Map,r=[...new Set(e.filter(n=>n.type==="sticker"&&n.src).map(n=>n.src))];return await Promise.all(r.map(n=>new Promise(a=>{const i=new Image;i.onload=()=>{t.set(n,i),a()},i.onerror=()=>a(),i.src=n}))),t}async function te(e,t,r){if(!e?.length)return null;const n=document.createElement("canvas");n.width=t,n.height=r;const a=n.getContext("2d");if(!a)return null;const i=await pe(e);return ee(a,e,i),new Promise(s=>n.toBlob(c=>s(c),"image/png"))}function Re(e,t,r,n=12){for(let a=e.length-1;a>=0;a--){const i=e[a];if(Ue(i,t,r,n))return a}return-1}function _e(e,t,r,n,a){return Math.abs(e-r)<=a&&Math.abs(t-n)<=a}function ge(e,t,r,n,a,i,s){const c=a-r,m=i-n,o=c*c+m*m||1,y=Math.max(0,Math.min(1,((e-r)*c+(t-n)*m)/o)),w=r+y*c,f=n+y*m;return(e-w)**2+(t-f)**2<=s*s}function Ue(e,t,r,n){const a=K(e);if(a){const i=Q(e),s=Be(t,r,i.x,i.y,-a);return ye(e,s.x,s.y,n)}return ye(e,t,r,n)}function ye(e,t,r,n){switch(e.type){case"pen":{for(let a=0;a+3<e.points.length;a+=2)if(ge(t,r,e.points[a],e.points[a+1],e.points[a+2],e.points[a+3],n+e.width/2))return!0;return!1}case"line":case"arrow":return ge(t,r,e.x1,e.y1,e.x2,e.y2,n+e.width/2);case"rect":case"ellipse":return t>=e.x-n&&t<=e.x+e.w+n&&r>=e.y-n&&r<=e.y+e.h+n;case"text":{const a=G(e);return t>=e.x-n&&t<=e.x+a.boxWidth+n&&r>=e.y-n&&r<=e.y+a.boxHeight+n}case"sticker":return _e(t,r,e.x+e.w/2,e.y+e.h/2,Math.max(e.w,e.h)/2+n)}}function qe(e,t,r){const n=Math.max(8,r);if(!(e>0)||!(t>0))return{w:n,h:n};const a=n/Math.max(e,t);return{w:Math.max(8,Math.round(e*a)),h:Math.max(8,Math.round(t*a))}}function Je(e,t){const r=Math.max(.05,t),n=Q(e);switch(e.type){case"pen":return{...e,points:e.points.map((a,i)=>i%2===0?n.x+(a-n.x)*r:n.y+(a-n.y)*r)};case"line":case"arrow":{const a=fe(e.x1,e.y1,n.x,n.y,r),i=fe(e.x2,e.y2,n.x,n.y,r);return{...e,x1:a.x,y1:a.y,x2:i.x,y2:i.y}}case"rect":case"ellipse":case"sticker":return{...e,w:Math.max(8,e.w*r),h:Math.max(8,e.h*r)};case"text":return{...e,fontSize:Math.min(512,Math.max(8,e.fontSize*r)),width:Number.isFinite(e.width)?Math.max(80,e.width*r):e.width,paddingX:Number.isFinite(e.paddingX)?Math.max(0,e.paddingX*r):e.paddingX,paddingY:Number.isFinite(e.paddingY)?Math.max(0,e.paddingY*r):e.paddingY,borderWidth:Number.isFinite(e.borderWidth)?Math.max(0,e.borderWidth*r):e.borderWidth,boxShadow:e.boxShadow?{...e.boxShadow,x:(e.boxShadow.x||0)*r,y:(e.boxShadow.y||0)*r,blur:(e.boxShadow.blur||0)*r}:e.boxShadow};default:return e}}function Ve(e,t){return{...e,rotation:se(t)}}function Ge(e,t,r){switch(e.type){case"pen":{const n=e.points.map((a,i)=>i%2===0?a+t:a+r);return{...e,points:n}}case"line":case"arrow":return{...e,x1:e.x1+t,y1:e.y1+r,x2:e.x2+t,y2:e.y2+r};case"rect":case"ellipse":case"sticker":return{...e,x:e.x+t,y:e.y+r};case"text":return{...e,x:e.x+t,y:e.y+r}}}function L(e,t){const r=Math.min(8192,Math.max(2,Math.round(Number(e)||t)));return r%2===0?r:r-1}function ct(e){const t=q(e.canvas,e),r=e?.exportSettings??null;if(!r)return t;const n=Number.isFinite(Number(r.width))&&Number(r.width)>0,a=Number.isFinite(Number(r.height))&&Number(r.height)>0;if(!n&&!a)return t;const i=t.w>0&&t.h>0?t.w/t.h:1;if(n&&a)return{w:L(r.width,t.w),h:L(r.height,t.h)};if(n){const c=L(r.width,t.w);return{w:c,h:L(c/i,t.h)}}const s=L(r.height,t.h);return{w:L(s*i,t.w),h:s}}function Ke(e){const t=String(e??"").match(/^data:(image\/(?:png|jpe?g));base64,([a-z0-9+/=]+)$/i);if(!t)return null;const r=atob(t[2]),n=new Uint8Array(r.length);for(let a=0;a<r.length;a++)n[a]=r.charCodeAt(a);return new Blob([n],{type:t[1].toLowerCase()})}async function Qe(e,t,r=[]){const n=e.getExportPlan(),a=new FormData;n.videoSrcOrder.forEach((f,b)=>{const g=t[f];g&&a.append(`video_${b}`,g,g.name||`video_${b}.mp4`)}),n.audioSrcOrder.forEach((f,b)=>{const g=r[f];g&&a.append(`audio_${b}`,g,g.name||`audio_${b}`)});const i=q(n.state.canvas,n.state),s=n.state.overlays??[],c=s.filter(f=>le(f)),m=s.filter(f=>!le(f)&&V(f)),o=await te(m,i.w,i.h);o&&a.append("overlay",o,"overlay.png");for(let f=0;f<c.length;f++){const b=await te([c[f]],i.w,i.h);b&&a.append(`textOverlay_${f}`,b,`text-overlay-${f}.png`)}const y=n.state.poster?.useAsVideoCover?Ke(n.state.poster.preview):null;y&&a.append("videoCover",y,"video-cover.png");const w=n.state.poster?.preview?{...n.state,poster:{...n.state.poster,preview:void 0}}:n.state;return a.append("editState",JSON.stringify(w)),a}function N(e){return Math.max(-1,Math.min(1,Number(e)||0))}function j(e){return Math.max(0,Math.min(1,Number(e)||0))}function k(e){return Math.max(0,Math.min(1,e))}function A(e){return Math.max(0,Math.min(255,e))}function W(e,t,r){if(e===t)return r<e?0:1;const n=Math.max(0,Math.min(1,(r-e)/(t-e)));return n*n*(3-2*n)}function ne(e){const t=W(.08,.4,e),r=1-W(.6,.92,e);return k(t*r*2.2)}function we(e,t,r=0){const n=Math.sin(e*12.9898+t*78.233+r*37.719)*43758.5453;return n-Math.floor(n)}var O=null;function Ze(e,t){return typeof document>"u"?null:(O??(O=document.createElement("canvas")),O.width!==e&&(O.width=e),O.height!==t&&(O.height=t),O)}function be(e,t,r,n){if(!n||n==="none")return;const a=Ze(t,r),i=a?.getContext("2d");!a||!i||(i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,t,r),i.drawImage(e.canvas,0,0,t,r),e.save(),e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t,r),e.filter=n,e.drawImage(a,0,0,t,r),e.restore(),e.filter="none")}function et(e,t,r,n){const a=Te(n?.filterPreset)?.css??"";be(e,t,r,a)}function tt(e,t,r,n){be(e,t,r,ie(n??{},"")),Me(e,t,r,n??{})}function nt(e={}){return["temperature","tint","vibrance","gamma","highlights","shadows","whites","blacks","lightSense"].some(t=>Math.abs(N(e[t]))>1e-4)?!0:["sharpen","clarity","grain","fade","vignette"].some(t=>j(e[t])>1e-4)}function Me(e,t,r,n={}){if(!nt(n))return;let a;try{a=e.getImageData(0,0,t,r)}catch{return}const i=N(n.temperature),s=N(n.tint),c=N(n.vibrance),m=N(n.gamma),o=N(n.highlights),y=N(n.shadows),w=N(n.whites),f=N(n.blacks),b=N(n.lightSense),g=j(n.sharpen),P=j(n.clarity),I=j(n.grain),E=j(n.fade),Y=j(n.vignette),R=1+m*(m>0?1:.5),M=m===0?1:1/Math.max(.01,R),z=i*.18,H=i*.02,X=-i*.18,re=s*.1,ve=-s*.12,p=a.data;for(let h=0;h<p.length;h+=4){let d=p[h]/255,x=p[h+1]/255,u=p[h+2]/255;if((i!==0||s!==0)&&(d=k(d+z+re),x=k(x+H+ve),u=k(u+X+re)),c!==0){const l=Math.max(d,x,u),S=Math.min(d,x,u),T=l-S,v=(d+x+u)/3,F=c>0?c*(1-T):c*(.35+T*.65);d=k(v+(d-v)*(1+F)),x=k(v+(x-v)*(1+F)),u=k(v+(u-v)*(1+F))}if(m!==0&&(d=k(Math.pow(d,M)),x=k(Math.pow(x,M)),u=k(Math.pow(u,M))),o!==0||y!==0||w!==0||f!==0||b!==0||E!==0){const l=.2126*d+.7152*x+.0722*u,S=1-W(.18,.62,l),T=1-W(.04,.32,l),v=W(.38,.84,l),F=W(.7,.98,l),C=ne(l),_=y*S*.28+o*v*.24+f*T*.2+w*F*.2+b*C*.18+E*(.12+S*.06);if(d=k(d+_),x=k(x+_),u=k(u+_),E>0){const U=(d+x+u)/3,$=E*.16;d=k(d*(1-$)+U*$),x=k(x*(1-$)+U*$),u=k(u*(1-$)+U*$)}}p[h]=Math.round(d*255),p[h+1]=Math.round(x*255),p[h+2]=Math.round(u*255)}if(g>1e-4||P>1e-4){const h=new Uint8ClampedArray(p),d=t*4;for(let x=1;x<r-1;x++)for(let u=1;u<t-1;u++){const l=x*d+u*4,S=(h[l-4]+h[l+4]+h[l-d]+h[l+d]+h[l]*4)/8,T=(h[l-3]+h[l+5]+h[l-d+1]+h[l+d+1]+h[l+1]*4)/8,v=(h[l-2]+h[l+6]+h[l-d+2]+h[l+d+2]+h[l+2]*4)/8,F=(.2126*h[l]+.7152*h[l+1]+.0722*h[l+2])/255,C=Math.min(1.8,g*1.45+P*.9*ne(F));p[l]=A(h[l]+(h[l]-S)*C),p[l+1]=A(h[l+1]+(h[l+1]-T)*C),p[l+2]=A(h[l+2]+(h[l+2]-v)*C)}}if(I>1e-4){const h=I*26;for(let d=0;d<r;d++)for(let x=0;x<t;x++){const u=(d*t+x)*4,l=(.2126*p[u]+.7152*p[u+1]+.0722*p[u+2])/255,S=.4+ne(l)*.9,T=(we(x,d)-.5)*h*S,v=(we(x,d,1)-.5)*h*.22*I;p[u]=A(p[u]+T+v),p[u+1]=A(p[u+1]+T*.88),p[u+2]=A(p[u+2]+T-v)}}if(Y>1e-4){const h=(t-1)/2,d=(r-1)/2,x=Math.sqrt(h*h+d*d)||1;for(let u=0;u<r;u++)for(let l=0;l<t;l++){const S=(u*t+l)*4,T=l-h,v=u-d,F=Math.sqrt(T*T+v*v)/x,C=1-W(.32,1,F)*Y*.62;p[S]=A(p[S]*C),p[S+1]=A(p[S+1]*C),p[S+2]=A(p[S+2]*C)}}e.putImageData(a,0,0)}function rt(e,t,r,n,a,i=1,s,c=!0){const m=q(n,a);e.width=Math.max(2,Math.round(m.w*i)),e.height=Math.max(2,Math.round(m.h*i));const o=e.getContext("2d");if(!o)return;const y=ke(n.w,n.h,a.rotation),w=a.crop??{x:0,y:0,width:y.w,height:y.h},f=a.scale?.fit??"force",{src:b,dst:g}=ae({width:w.width,height:w.height},m,f);f==="contain"&&(o.fillStyle="#000",o.fillRect(0,0,e.width,e.height)),o.filter=ie(a.filters,a.filterPreset),o.save(),f==="contain"&&(o.beginPath(),o.rect(i*g.x,i*g.y,i*g.width,i*g.height),o.clip()),o.translate(i*g.x,i*g.y),o.scale(i*g.width/b.width,i*g.height/b.height),o.translate(-(w.x+b.x),-(w.y+b.y)),o.translate(y.w/2,y.h/2),o.rotate(a.rotation*Se),o.scale(a.flipX?-1:1,a.flipY?-1:1);const P=ae({width:r.w,height:r.h},{w:n.w,h:n.h},"cover");if(o.drawImage(t,P.src.x,P.src.y,P.src.width,P.src.height,-n.w/2,-n.h/2,n.w,n.h),o.restore(),o.filter="none",Me(o,e.width,e.height,a.filters),c&&a.overlays?.length){const I=Number.isFinite(a?.__mePreviewTimelineTime)?Number(a.__mePreviewTimelineTime):null,E=I==null?a.overlays:Ye(a.overlays,I),Y=E.map((M,z)=>({overlay:M,index:z})).filter(M=>he(M.overlay)).sort((M,z)=>{const H=ue(z.overlay)-ue(M.overlay);if(H!==0)return H;const X=de(M.overlay)-de(z.overlay);return Math.abs(X)>1e-6?X:M.index-z.index}),R=E.filter(M=>!he(M));o.setTransform(i,0,0,i,0,0),Y.forEach(M=>{if(M.overlay?.type==="filter"){o.setTransform(1,0,0,1,0,0),et(o,e.width,e.height,M.overlay),o.setTransform(i,0,0,i,0,0);return}if(M.overlay?.type==="adjust"){o.setTransform(1,0,0,1,0,0),tt(o,e.width,e.height,M.overlay),o.setTransform(i,0,0,i,0,0);return}Z(o,M.overlay,s)}),ee(o,R,s),o.setTransform(1,0,0,1,0,0)}}function at(e,t){return new Promise(r=>{const n=()=>{e.removeEventListener("seeked",n),r()};e.addEventListener("seeked",n),e.currentTime=Math.min(Math.max(0,t),e.duration||t)})}async function it(e,t,r=160){const n=e.duration;if(!n||!isFinite(n)||t<=0)return[];const a=e.videoWidth||16,i=e.videoHeight||9,s=Math.min(r,a),c=Math.max(1,Math.round(s*i/a)),m=document.createElement("canvas");m.width=s,m.height=c;const o=m.getContext("2d");if(!o)return[];const y=[];for(let w=0;w<t;w++)await at(e,n*(w+.5)/t),o.drawImage(e,0,0,s,c),y.push(m.toDataURL("image/jpeg",.6));return y}function ot(e,t={}){const r=t.mode??"overlay",n=document.createElement("button");n.type="button",n.className=["me-fullscreen-toggle",t.className].filter(Boolean).join(" "),n.dataset.meFullscreenToggle="true",n.dataset.mode=r,n.title="\u5168\u5C4F / \u9000\u51FA\u5168\u5C4F",n.style.cssText=[r==="overlay"?"position:absolute;left:8px;bottom:8px;z-index:30;":"position:static;","width:32px;height:32px;padding:0;","display:inline-flex;align-items:center;justify-content:center;","border:1px solid var(--me-border,#26262b);border-radius:6px;","background:var(--me-chip,#1c1c20);color:var(--me-fg,#e7e7ee);","cursor:pointer;font-size:15px;line-height:1;opacity:0.9;font:inherit;"].join(""),e.classList.add("me-fullscreen-host");const a=()=>{const c=document.fullscreenElement===e;n.textContent=c?"\xD7":"\u26F6",n.setAttribute("aria-label",c?"\u9000\u51FA\u5168\u5C4F":"\u5168\u5C4F"),e.classList.toggle("me-is-fullscreen",c),e.dataset.meFullscreen=c?"true":"false"};a();const i=()=>a(),s=()=>{(document.fullscreenElement===e?document.exitFullscreen?.():e.requestFullscreen?.())?.catch?.(()=>{})};return n.addEventListener("click",s),document.addEventListener("fullscreenchange",i),{button:n,dispose:()=>{document.removeEventListener("fullscreenchange",i),n.removeEventListener("click",s),n.remove(),e.classList.remove("me-fullscreen-host","me-is-fullscreen"),delete e.dataset.meFullscreen}}}export{Qe as buildVideoExportFormData,ot as createFullscreenToggle,Z as drawOverlay,ee as drawOverlays,rt as drawVideoFrame,qe as fitStickerBox,it as generateThumbnails,K as getOverlayRotation,Re as hitTestOverlay,pe as loadOverlayImages,me as overlayBBox,te as renderOverlaysToPng,Ve as rotateOverlay,Je as scaleOverlay,Ge as translateOverlay};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as t}from"../zod/index.js";var
|
|
1
|
+
import{z as t}from"../zod/index.js";var c={color:t.string().max(32),width:t.number().positive().max(200)},m={rotation:t.number().min(-180).max(180).optional()},s={startAt:t.number().min(0).optional(),endAt:t.number().min(0).optional(),timelineTrack:t.number().int().min(0).max(99).optional()},f=t.discriminatedUnion("type",[t.object({type:t.literal("pen"),points:t.array(t.number()).min(4),...c,...s,...m}),t.object({type:t.literal("line"),x1:t.number(),y1:t.number(),x2:t.number(),y2:t.number(),...c,...s,...m}),t.object({type:t.literal("arrow"),x1:t.number(),y1:t.number(),x2:t.number(),y2:t.number(),...c,...s,...m}),t.object({type:t.literal("rect"),x:t.number(),y:t.number(),w:t.number(),h:t.number(),...c,...s,...m}),t.object({type:t.literal("ellipse"),x:t.number(),y:t.number(),w:t.number(),h:t.number(),...c,...s,...m}),t.object({type:t.literal("text"),x:t.number(),y:t.number(),text:t.string().max(500),color:t.string().max(32),fontSize:t.number().positive().max(512),startAt:t.number().min(0).optional(),endAt:t.number().min(0).optional(),timelineTrack:t.number().int().min(0).max(99).optional(),...m}),t.object({type:t.literal("sticker"),x:t.number().optional(),y:t.number().optional(),w:t.number().positive().optional(),h:t.number().positive().optional(),emoji:t.string().max(16).optional(),src:t.string().optional(),startAt:t.number().min(0).optional(),endAt:t.number().min(0).optional(),timelineTrack:t.number().int().min(0).max(99).optional(),...m}),t.object({type:t.literal("filter"),x:t.number().optional(),y:t.number().optional(),w:t.number().positive().optional(),h:t.number().positive().optional(),filterPreset:t.string().max(32).optional(),...s,...m}),t.object({type:t.literal("adjust"),x:t.number(),y:t.number(),w:t.number().positive(),h:t.number().positive(),brightness:t.number().min(-1).max(1).default(0),contrast:t.number().min(-1).max(1).default(0),saturation:t.number().min(-1).max(1).default(0),temperature:t.number().min(-1).max(1).default(0),tint:t.number().min(-1).max(1).default(0),vibrance:t.number().min(-1).max(1).default(0),gamma:t.number().min(-1).max(1).default(0),highlights:t.number().min(-1).max(1).default(0),shadows:t.number().min(-1).max(1).default(0),whites:t.number().min(-1).max(1).default(0),blacks:t.number().min(-1).max(1).default(0),lightSense:t.number().min(-1).max(1).default(0),sharpen:t.number().min(0).max(1).default(0),clarity:t.number().min(0).max(1).default(0),grain:t.number().min(0).max(1).default(0),fade:t.number().min(0).max(1).default(0),vignette:t.number().min(0).max(1).default(0),...s,...m})]),x=t.object({srcIdx:t.number().int().min(0).max(7),in:t.number().min(0),out:t.number().min(0)}),h=t.object({srcIdx:t.number().int().min(0).max(2),track:t.number().int().min(0).default(0),startAt:t.number().min(0),in:t.number().min(0),out:t.number().min(0),speed:t.number().min(.5).max(2).default(1),volume:t.number().min(0).max(2),fadeIn:t.number().min(0).default(0),fadeOut:t.number().min(0).default(0)}),C=t.object({type:t.enum(["none","fade","slide","wipe","flip","clockWipe","star","circle","rectangle"]).default("none"),duration:t.number().min(0).max(2).default(.4)}),I=t.object({fileName:t.string().max(120).optional(),format:t.enum(["mp4","mov","mxf"]).default("mp4"),width:t.number().int().min(2).max(8192).optional(),height:t.number().int().min(2).max(8192).optional(),frameRate:t.number().int().min(12).max(120).default(30),videoBitrateKbps:t.number().int().min(100).max(5e4).optional(),audioBitrateKbps:t.number().int().min(32).max(1024).optional(),audioCodec:t.enum(["aac","mp3"]).default("aac")}).optional(),j=t.object({clips:t.array(x).min(1).max(50),audioClips:t.array(h).max(8).default([]),canvas:t.object({w:t.number().int().min(2).max(4096),h:t.number().int().min(2).max(4096)}),crop:t.object({x:t.number().min(0),y:t.number().min(0),width:t.number().positive(),height:t.number().positive()}).optional(),scale:t.object({width:t.number().positive(),height:t.number().positive(),fit:t.enum(["contain","cover","force"])}).optional(),rotation:t.number().min(-180).max(180).default(0),flipX:t.boolean().default(!1),flipY:t.boolean().default(!1),filters:t.object({brightness:t.number().min(-1).max(1).default(0),contrast:t.number().min(-1).max(1).default(0),saturation:t.number().min(-1).max(1).default(0),temperature:t.number().min(-1).max(1).default(0),tint:t.number().min(-1).max(1).default(0),vibrance:t.number().min(-1).max(1).default(0),gamma:t.number().min(-1).max(1).default(0),highlights:t.number().min(-1).max(1).default(0),shadows:t.number().min(-1).max(1).default(0),whites:t.number().min(-1).max(1).default(0),blacks:t.number().min(-1).max(1).default(0),lightSense:t.number().min(-1).max(1).default(0),sharpen:t.number().min(0).max(1).default(0),clarity:t.number().min(0).max(1).default(0),grain:t.number().min(0).max(1).default(0),fade:t.number().min(0).max(1).default(0),vignette:t.number().min(0).max(1).default(0)}).default({brightness:0,contrast:0,saturation:0,temperature:0,tint:0,vibrance:0,gamma:0,highlights:0,shadows:0,whites:0,blacks:0,lightSense:0,sharpen:0,clarity:0,grain:0,fade:0,vignette:0}),filterPreset:t.string().max(32).optional(),overlays:t.array(f).max(200).optional(),transitions:t.array(C).max(49).default([]),keepAudio:t.boolean().default(!0),poster:t.object({time:t.number().min(0),useAsVideoCover:t.boolean().optional(),preview:t.string().optional()}).optional(),exportSettings:I}).superRefine((e,a)=>{e.clips.forEach((n,i)=>{n.out<=n.in&&a.addIssue({code:t.ZodIssueCode.custom,message:`clips[${i}].out \u5FC5\u987B\u5927\u4E8E in`,path:["clips",i,"out"]})}),e.audioClips?.forEach((n,i)=>{n.out<=n.in&&a.addIssue({code:t.ZodIssueCode.custom,message:`audioClips[${i}].out \u5FC5\u987B\u5927\u4E8E in`,path:["audioClips",i,"out"]})}),(e.canvas.w%2!==0||e.canvas.h%2!==0)&&a.addIssue({code:t.ZodIssueCode.custom,message:"canvas \u5BBD\u9AD8\u5FC5\u987B\u4E3A\u5076\u6570",path:["canvas"]}),e.exportSettings?.width!=null&&e.exportSettings.width%2!==0&&a.addIssue({code:t.ZodIssueCode.custom,message:"exportSettings.width \u5FC5\u987B\u4E3A\u5076\u6570",path:["exportSettings","width"]}),e.exportSettings?.height!=null&&e.exportSettings.height%2!==0&&a.addIssue({code:t.ZodIssueCode.custom,message:"exportSettings.height \u5FC5\u987B\u4E3A\u5076\u6570",path:["exportSettings","height"]})});function S(){return{clips:[],audioClips:[],canvas:{w:2,h:2},rotation:0,flipX:!1,flipY:!1,filters:{brightness:0,contrast:0,saturation:0,temperature:0,tint:0,vibrance:0,gamma:0,highlights:0,shadows:0,whites:0,blacks:0,lightSense:0,sharpen:0,clarity:0,grain:0,fade:0,vignette:0},transitions:[],keepAudio:!0}}var o=.1;function d(e){return e.out-e.in}function g(e){return e.reduce((a,n)=>a+d(n),0)}function k(e,a){let n=0;for(let i=0;i<a&&i<e.length;i++)n+=d(e[i]);return n}function v(e,a){if(!e.length||a<0)return null;let n=0;for(let i=0;i<e.length;i++){const r=d(e[i]);if(a<n+r)return{idx:i,srcTime:e[i].in+(a-n)};n+=r}if(Math.abs(a-n)<1e-9||a<=n){const i=e.length-1;return{idx:i,srcTime:e[i].out}}return null}function E(e,a){const n=v(e,a);if(!n)return e;const i=e[n.idx];return n.srcTime<i.in+o||n.srcTime>i.out-o?e:[...e.slice(0,n.idx),{...i,out:n.srcTime},{...i,in:n.srcTime},...e.slice(n.idx+1)]}function N(e,a){return e.length<=1||!e[a]?e:e.filter((n,i)=>i!==a)}function B(e,a){const n=e[a];return n?[...e.slice(0,a+1),{...n},...e.slice(a+1)]:e}function T(e,a,n){if(a===n||!e[a]||n<0||n>=e.length)return e;const i=[...e],[r]=i.splice(a,1);return i.splice(n,0,r),i}function F(e,a,n,i,r){if(!e[a])return e;const u=e.map(l=>({...l}));return n==="in"?u[a].in=Math.min(Math.max(i,0),u[a].out-o):u[a].out=Math.max(Math.min(i,r),u[a].in+o),u}function O(e,a,n){const i=Math.max(Math.min(e.out,a),o),r=Math.min(Math.max(e.in,0),i-o),u=Math.min(Math.max(e.startAt,0),Math.max(0,n-o)),l=Math.max(o,i-r),p=Math.min(Math.max(Number(e.speed)||1,.5),2),M=Number.isInteger(e.track)&&e.track>=0?e.track:0,b=Math.min(Math.max(Number(e.fadeIn)||0,0),l),A=Math.min(Math.max(Number(e.fadeOut)||0,0),Math.max(0,l-b));return{...e,track:M,in:r,out:i,startAt:u,speed:p,fadeIn:b,fadeOut:A}}function D(e=[]){return(e??[]).reduce((a,n)=>{if(n?.type!=="text"&&n?.type!=="sticker")return a;const i=Number.isFinite(n?.startAt)?Math.max(0,Number(n.startAt)):0,r=Number.isFinite(n?.endAt)?Math.max(i,Number(n.endAt)):i;return Math.max(a,r)},0)}function Z(e,a=[],n=[]){const i=g(e),r=a.reduce((l,p)=>Math.max(l,p.startAt+(p.out-p.in)),0),u=D(n);return Math.max(i,r,u)}function P(e){return[...new Set(e.map(a=>a.srcIdx))].sort((a,n)=>a-n)}function V(e,a){const n=new Map(a.map((i,r)=>[i,r]));return e.map(i=>({...i,srcIdx:n.get(i.srcIdx)??0}))}var R=100;function z(e){return{past:[],present:e,future:[]}}function H(e,a){if(a===e.present)return e;const n=[...e.past,e.present];return n.length>R&&n.shift(),{past:n,present:a,future:[]}}function K(e,a){return a===e.present?e:{...e,present:a}}function y(e){return e.past.length>0}function w(e){return e.future.length>0}function U(e){return y(e)?{past:e.past.slice(0,-1),present:e.past[e.past.length-1],future:[e.present,...e.future]}:e}function X(e){if(!w(e))return e;const[a,...n]=e.future;return{past:[...e.past,e.present],present:a,future:n}}export{h as AudioClip,x as Clip,o as MIN_CLIP,f as Overlay,j as VideoEditState,w as canRedo,y as canUndo,O as clampAudioClip,d as clipDuration,k as clipStartsAt,Z as contentDuration,z as createHistory,S as defaultVideoEditState,B as duplicateClip,v as locateOutput,H as pushHistory,X as redo,V as remapSrcIndices,N as removeClip,T as reorderClips,K as replacePresent,E as splitAtOutput,g as totalDuration,F as trimClipEdge,U as undo,P as usedVideoSrcIndices};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var h=Math.PI/180;function o(t,a,s){const r=u(s);if(r===0||r===180)return{w:t,h:a};if(r===90||r===270)return{w:a,h:t};const n=r*h;return{w:Math.round(Math.abs(t*Math.cos(n))+Math.abs(a*Math.sin(n))),h:Math.round(Math.abs(t*Math.sin(n))+Math.abs(a*Math.cos(n)))}}function u(t){return(t%360+360)%360}function e(t){const a=Math.round(t);return a-a%2}function M(t,a,s=40){const r=Math.min(Math.max(s,t.width),a.w),n=Math.min(Math.max(s,t.height),a.h),l=Math.min(Math.max(0,t.x),a.w-r),w=Math.min(Math.max(0,t.y),a.h-n);return{x:Math.round(l),y:Math.round(w),width:Math.round(r),height:Math.round(n)}}function i(t,a){let s=t.w,r=s/a;return r>t.h&&(r=t.h,s=r*a),{x:Math.round((t.w-s)/2),y:Math.round((t.h-r)/2),width:Math.round(s),height:Math.round(r)}}function f(t,a,s){const r={x:0,y:0,width:t.width,height:t.height},n={x:0,y:0,width:a.w,height:a.h};return s==="cover"?{src:i({w:t.width,h:t.height},a.w/a.h),dst:n}:s==="contain"?{src:r,dst:i({w:a.w,h:a.h},t.width/t.height)}:{src:r,dst:n}}function b(t,a){if(a.scale)return{w:e(a.scale.width),h:e(a.scale.height)};if(a.crop)return{w:e(a.crop.width),h:e(a.crop.height)};const s=o(t.w,t.h,a.rotation);return{w:e(s.w),h:e(s.h)}}var c=[{id:"bw",label:"\u9ED1\u767D",vf:"hue=s=0",css:"grayscale(1)"},{id:"sepia",label:"\u590D\u53E4",vf:"colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131",css:"sepia(0.85)"},{id:"warm",label:"\u6696\u9633",vf:"colorbalance=rs=.15:gs=.04:bs=-.15",css:"sepia(0.25) saturate(1.25) brightness(1.03)"},{id:"cool",label:"\u51B7\u8C03",vf:"colorbalance=rs=-.14:bs=.16",css:"hue-rotate(12deg) saturate(0.95) brightness(1.02)"},{id:"vivid",label:"\u9C9C\u8273",vf:"eq=saturation=1.45:contrast=1.08",css:"saturate(1.45) contrast(1.08)"}];function d(t){return t?c.find(a=>a.id===t):void 0}function g(t,a){const s=d(a)?.css??"";return[`brightness(${1+t.brightness})`,`contrast(${1+t.contrast})`,`saturate(${1+t.saturation})`,s].filter(Boolean).join(" ")}export{h as DEG2RAD,c as FILTER_PRESETS,g as buildFilterCss,i as centeredMaxRect,M as clampRect,e as evenize,d as findFilterPreset,f as fitRects,u as normalizeDeg,b as outputSize,o as rotatedSize};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var c={"tool.trim":"\u526A\u8F91","tool.crop":"\u88C1\u526A","tool.tune":"\u8C03\u8272","tool.filter":"\u6EE4\u955C","tool.annotate":"\u6807\u6CE8","tool.sticker":"\u8D34\u7EB8","tool.resize":"\u6BD4\u4F8B","tune.brightness":"\u4EAE\u5EA6","tune.contrast":"\u5BF9\u6BD4","tune.saturation":"\u9971\u548C","tune.gamma":"Gamma","overlay.select":"\u9009\u62E9","overlay.pen":"\u753B\u7B14","overlay.eraser":"\u6A61\u76AE","overlay.line":"\u76F4\u7EBF","overlay.arrow":"\u7BAD\u5934","overlay.rect":"\u77E9\u5F62","overlay.ellipse":"\u692D\u5706","overlay.text":"\u6587\u5B57","overlay.color":"\u7EBF\u8272","overlay.width":"\u7EBF\u5BBD","overlay.copySelected":"\u590D\u5236","overlay.delSelected":"\u5220\u9664\u9009\u4E2D","overlay.editSelected":"\u7F16\u8F91","overlay.pickImage":"\u9009\u62E9\u56FE\u7247","overlay.hint":"\u70B9 emoji/\u56FE\u7247\u6DFB\u52A0 \u2192 \u753B\u5E03\u4E0A\u62D6\u52A8\u6446\u4F4D,\u62D6\u53F3\u4E0B\u89D2\u7D2B\u8272\u628A\u624B\u7F29\u653E","overlay.textPlaceholder":"\u8F93\u5165\u6587\u5B57,\u56DE\u8F66\u786E\u8BA4","filter.none":"\u539F\u56FE","filter.bw":"\u9ED1\u767D","filter.sepia":"\u590D\u53E4","filter.warm":"\u6696\u9633","filter.cool":"\u51B7\u8C03","filter.vivid":"\u9C9C\u8273","ratio.orig":"\u539F\u59CB","ratio.free":"\u81EA\u7531\u6BD4\u4F8B","ratio.9:16":"\u7AD6\u5C4F 9:16","ratio.16:9":"\u6A2A\u5C4F 16:9","ratio.1:1":"\u65B9\u5F62 1:1","ratio.4:5":"\u7AD6\u56FE 4:5","act.fit":"\u9002\u5E94","act.zoomFit":"\u7F29\u653E\u81F3\u9002\u5F53\u5927\u5C0F","act.zoomTo":"\u7F29\u653E\u81F3 {value}%","act.split":"\u5206\u5272","act.copy":"\u590D\u5236","act.delete":"\u5220\u9664","act.restore":"\u8FD8\u539F","act.deleteMusic":"\u5220\u9664\u97F3\u4E50","act.cancel":"\u53D6\u6D88","act.exportPoster":"\u5BFC\u51FA\u5C01\u9762","act.exporting":"\u5BFC\u51FA\u4E2D\u2026","act.poster":"\u{1F5BC} \u5C01\u9762","act.again":"\u518D\u6B21\u4E0B\u8F7D","act.saveDrive":"\u5B58\u7F51\u76D8","act.changeImage":"\u2190 \u6362\u4E00\u5F20","act.changeVideo":"\u2190 \u6362\u4E00\u4E2A","crop.rotateLeft":"\u21BA \u5411\u5DE6\u65CB\u8F6C","crop.flipX":"\u21CB \u6C34\u5E73\u7FFB\u8F6C","crop.flipY":"\u21F5 \u5782\u76F4\u7FFB\u8F6C","crop.rotateLeftShort":"\u5DE6\u8F6C","crop.flipXShort":"\u6A2A\u7FFB","crop.flipYShort":"\u7AD6\u7FFB","tip.close":"\u5173\u95ED(\u6362\u6587\u4EF6)","tip.undo":"\u64A4\u9500","tip.redo":"\u91CD\u505A","tip.resetOpened":"\u91CD\u7F6E\u5230\u6253\u5F00\u6587\u4EF6\u65F6","tip.previewZoom":"\u9884\u89C8\u7F29\u653E\u6BD4\u4F8B","tip.previewZoomOut":"\u7F29\u5C0F\u9884\u89C8","tip.previewZoomIn":"\u653E\u5927\u9884\u89C8","tip.previewZoomFit":"\u9002\u5E94\u9884\u89C8","tip.previewPointer":"\u6307\u9488\u5DE5\u5177","tip.previewPan":"\u624B\u5DE5\u5177\uFF1A\u62D6\u52A8\u753B\u9762","tip.poster":"\u9884\u89C8\u5E76\u9009\u62E9\u5C01\u9762\u5E27","tip.keepAudio":"\u539F\u89C6\u9891\u58F0\u97F3\u5F00\u5173(\u4E0E\u97F3\u4E50\u6DF7\u97F3;\u9884\u89C8\u540C\u6B65)","tip.split":"\u5728\u64AD\u653E\u5934\u5904\u628A\u5F53\u524D\u7247\u6BB5\u4E00\u5206\u4E3A\u4E8C","tip.zoomOut":"\u7F29\u5C0F\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.zoomIn":"\u653E\u5927\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.fit":"\u7F29\u653E\u5230\u9002\u5E94\u5BBD\u5EA6","tip.addVideo":"\u6DFB\u52A0\u89C6\u9891\u7247\u6BB5","tip.addAudio":"\u6DFB\u52A0\u97F3\u4E50(\u97F3\u9891\u6587\u4EF6,\u6216\u9009\u542B\u58F0\u97F3\u7684\u89C6\u9891\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68;\u4E0E\u539F\u58F0\u6DF7\u97F3)","tip.dupClip":"\u590D\u5236\u8BE5\u7247\u6BB5(\u63D2\u5230\u5176\u540E)","tip.delClip":"\u5220\u9664\u8BE5\u7247\u6BB5","tip.lockAspect":"\u9501\u5B9A\u7EB5\u6A2A\u6BD4","tip.dblConfirm":"\u53CC\u51FB\u786E\u8BA4\u88C1\u526A","err.notVideo":"\u8BF7\u9009\u62E9\u89C6\u9891\u6587\u4EF6","err.maxVideo":"\u6700\u591A {max} \u4E2A\u89C6\u9891\u7D20\u6750","err.videoLoad":"\u89C6\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.notAudio":"\u8BF7\u9009\u62E9\u97F3\u9891\u6587\u4EF6(mp3/wav/m4a),\u6216\u542B\u58F0\u97F3\u7684\u89C6\u9891(\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68)","err.maxAudio":"\u6700\u591A {max} \u4E2A\u97F3\u9891\u7D20\u6750","err.audioLoad":"\u97F3\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.processFailed":"\u5904\u7406\u5931\u8D25","err.posterFailed":"\u5C01\u9762\u6E32\u67D3\u5931\u8D25","err.canvas":"canvas \u4E0D\u53EF\u7528","err.imageRead":"\u56FE\u7247\u8BFB\u53D6\u5931\u8D25,\u8BF7\u6362\u4E00\u5F20","err.notImage":"\u8BF7\u9009\u62E9\u56FE\u7247\u6587\u4EF6","err.fileType":"\u53EA\u652F\u6301\u56FE\u7247\u6216\u89C6\u9891\u6587\u4EF6","err.saveDrive":"\u5B58\u7F51\u76D8\u5931\u8D25","msg.processing":"\u6B63\u5728\u5BFC\u51FA\u4E2D\u2026","msg.exportingHint":"\u8BF7\u7A0D\u5019\uFF0C\u5BFC\u51FA\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FD4\u56DE\u7ED3\u679C\u3002","msg.done":"\u5B8C\u6210 \u2713","msg.loading":"\u7D20\u6750\u52A0\u8F7D\u4E2D\u2026","msg.exported":"\u5DF2\u5BFC\u51FA\uFF1A","msg.saving":"\u5B58\u7F51\u76D8\u4E2D\u2026","msg.saved":"\u5DF2\u5B58\u5230\u7F51\u76D8 \u2713","lbl.ratioSection":"\u753B\u9762\u6BD4\u4F8B(\u88C1\u526A,\u4E0D\u53D8\u5F62)","lbl.dragToReposition":"\u2194 \u62D6\u52A8\u9884\u89C8\u53EF\u8C03\u6574\u88C1\u526A\u4F4D\u7F6E","lbl.sizeSection":"\u5BFC\u51FA\u5C3A\u5BF8(\u50CF\u7D20;\u6BD4\u4F8B\u4E0D\u7B26\u65F6 cover \u5C45\u4E2D\u88C1\u526A)","lbl.currentOut":"\u5F53\u524D\u8F93\u51FA","lbl.zoomSize":"\u5927\u5C0F","lbl.noScale":"(\u672A\u7F29\u653E)","lbl.coverNote":"\xB7 \u6BD4\u4F8B\u4E0D\u4E00\u81F4\u65F6\u5C45\u4E2D\u88C1\u526A(cover),\u4E0D\u53D8\u5F62","lbl.audioTrackHint":"\u266A \u97F3\u9891\u8F68(\u53F3\u4FA7 \uFF0B \u6DFB\u52A0\u97F3\u4E50,\u4E0E\u539F\u58F0\u6DF7\u97F3)","lbl.volume":"\u97F3\u91CF","lbl.volNote":"(\u9884\u89C8\u6700\u5927 100%,\u5BFC\u51FA\u6309\u8BBE\u5B9A\u503C)","lbl.music":"\u97F3\u4E50","kbd.fit":"\u21E7 F","poster.title":"\u9009\u62E9\u5C01\u9762\u5E27","panel.title":"\u5A92\u4F53\u7F16\u8F91\u5668","panel.subtitle":"\u4E0A\u4F20\u56FE\u7247 / \u89C6\u9891\uFF0C\u88C1\u526A \xB7 \u6EE4\u955C \xB7 \u6587\u5B57 \xB7 \u5BFC\u51FA","panel.pick":"\u70B9\u51FB\u9009\u62E9\u56FE\u7247\u6216\u89C6\u9891","panel.pickHint":"\u56FE\u7247\u7528 Filerobot \xB7 \u89C6\u9891\u53EF\u88C1\u526A/\u9759\u97F3/\u5C01\u9762"},B={"tool.trim":"Trim","tool.crop":"Crop","tool.tune":"Tune","tool.filter":"Filters","tool.annotate":"Annotate","tool.sticker":"Stickers","tool.resize":"Ratio","tune.brightness":"Brightness","tune.contrast":"Contrast","tune.saturation":"Saturation","tune.gamma":"Gamma","overlay.select":"Select","overlay.pen":"Pen","overlay.eraser":"Eraser","overlay.line":"Line","overlay.arrow":"Arrow","overlay.rect":"Rect","overlay.ellipse":"Ellipse","overlay.text":"Text","overlay.color":"Color","overlay.width":"Width","overlay.copySelected":"Copy","overlay.delSelected":"Delete selected","overlay.editSelected":"Edit","overlay.pickImage":"Pick image","overlay.hint":"Tap emoji/image to add \u2192 drag to place, drag the purple corner handle to scale","overlay.textPlaceholder":"Type text, Enter to confirm","filter.none":"Original","filter.bw":"B&W","filter.sepia":"Sepia","filter.warm":"Warm","filter.cool":"Cool","filter.vivid":"Vivid","ratio.orig":"Original","ratio.free":"Free ratio","ratio.9:16":"Portrait 9:16","ratio.16:9":"Landscape 16:9","ratio.1:1":"Square 1:1","ratio.4:5":"Vertical 4:5","act.fit":"Fit","act.zoomFit":"Zoom to fit","act.zoomTo":"Zoom to {value}%","act.split":"Split","act.copy":"Copy","act.delete":"Delete","act.restore":"Reset","act.deleteMusic":"Remove music","act.cancel":"Cancel","act.exportPoster":"Export cover","act.exporting":"Exporting\u2026","act.poster":"\u{1F5BC} Cover","act.again":"Download again","act.saveDrive":"Save to drive","act.changeImage":"\u2190 Change image","act.changeVideo":"\u2190 Change file","crop.rotateLeft":"\u21BA Rotate left","crop.flipX":"\u21CB Flip horizontal","crop.flipY":"\u21F5 Flip vertical","crop.rotateLeftShort":"Rot","crop.flipXShort":"Flip","crop.flipYShort":"Flip","tip.close":"Close (change file)","tip.undo":"Undo","tip.redo":"Redo","tip.resetOpened":"Reset to opened file","tip.previewZoom":"Preview zoom","tip.previewZoomOut":"Zoom out preview","tip.previewZoomIn":"Zoom in preview","tip.previewZoomFit":"Fit preview","tip.previewPointer":"Pointer tool","tip.previewPan":"Hand tool: pan canvas","tip.poster":"Preview and pick a cover frame","tip.keepAudio":"Original audio on/off (mixed with music; preview follows)","tip.split":"Split the current clip at the playhead","tip.zoomOut":"Zoom out timeline (Ctrl+wheel)","tip.zoomIn":"Zoom in timeline (Ctrl+wheel)","tip.fit":"Fit to width","tip.addVideo":"Add video clip","tip.addAudio":"Add music (audio file, or a video with sound to extract its track; mixed with original)","tip.dupClip":"Duplicate clip (insert after)","tip.delClip":"Delete clip","tip.lockAspect":"Lock aspect ratio","tip.dblConfirm":"Double-click to confirm crop","err.notVideo":"Please choose a video file","err.maxVideo":"Up to {max} video sources","err.videoLoad":"Failed to load video, try another file","err.notAudio":"Choose an audio file (mp3/wav/m4a), or a video with sound (audio auto-extracted)","err.maxAudio":"Up to {max} audio sources","err.audioLoad":"Failed to load audio, try another file","err.processFailed":"Processing failed","err.posterFailed":"Failed to render cover","err.canvas":"Canvas unavailable","err.imageRead":"Failed to read image, try another","err.notImage":"Please choose an image file","err.fileType":"Only image or video files are supported","err.saveDrive":"Failed to save to drive","msg.processing":"Exporting\u2026","msg.exportingHint":"Please wait. The result will be returned automatically when export finishes.","msg.done":"Done \u2713","msg.loading":"Loading media\u2026","msg.exported":"Exported: ","msg.saving":"Saving\u2026","msg.saved":"Saved to drive \u2713","lbl.ratioSection":"Frame ratio (crop, no distortion)","lbl.dragToReposition":"\u2194 Drag the preview to reposition the crop","lbl.sizeSection":"Export size (px; cover center-crop when ratios differ)","lbl.currentOut":"Output","lbl.zoomSize":"Size","lbl.noScale":"(no scaling)","lbl.coverNote":"\xB7 center-cropped (cover) when ratios differ, no distortion","lbl.audioTrackHint":"\u266A Audio track (\uFF0B on the right to add music, mixed with original)","lbl.volume":"Volume","lbl.volNote":"(preview caps at 100%, export uses the set value)","lbl.music":"Music","kbd.fit":"\u21E7 F","poster.title":"Pick a cover frame","panel.title":"Media Editor","panel.subtitle":"Upload an image / video \u2014 crop \xB7 filters \xB7 text \xB7 export","panel.pick":"Click to choose an image or video","panel.pickHint":"Images via Filerobot \xB7 videos: trim/mute/cover"},A={"tool.trim":"Editar","tool.crop":"Recortar","tool.tune":"Ajustar color","tool.filter":"Filtros","tool.annotate":"Anotar","tool.sticker":"Stickers","tool.resize":"Proporci\xF3n","tune.brightness":"Brillo","tune.contrast":"Contraste","tune.saturation":"Saturaci\xF3n","tune.gamma":"Gamma","overlay.select":"Seleccionar","overlay.pen":"Pincel","overlay.eraser":"Borrador","overlay.line":"L\xEDnea","overlay.arrow":"Flecha","overlay.rect":"Rect\xE1ngulo","overlay.ellipse":"Elipse","overlay.text":"Texto","overlay.color":"Color","overlay.width":"Grosor","overlay.copySelected":"Copiar","overlay.delSelected":"Eliminar seleccionado","overlay.editSelected":"Editar","overlay.pickImage":"Elegir imagen","overlay.hint":"Toca un emoji/imagen para a\xF1adirlo \u2192 arrastra para colocarlo, arrastra el tirador morado para escalar","overlay.textPlaceholder":"Escribe texto, Enter para confirmar","filter.none":"Original","filter.bw":"Blanco y negro","filter.sepia":"Sepia","filter.warm":"C\xE1lido","filter.cool":"Fr\xEDo","filter.vivid":"Intenso","ratio.orig":"Original","ratio.free":"Libre","ratio.9:16":"Vertical 9:16","ratio.16:9":"Horizontal 16:9","ratio.1:1":"Cuadrado 1:1","ratio.4:5":"Vertical 4:5","act.fit":"Ajustar","act.zoomFit":"Ajustar a pantalla","act.zoomTo":"Zoom al {value}%","act.split":"Dividir","act.copy":"Copiar","act.delete":"Eliminar","act.restore":"Restablecer","act.deleteMusic":"Quitar m\xFAsica","act.cancel":"Cancelar","act.exportPoster":"Exportar portada","act.exporting":"Exportando\u2026","act.poster":"\u{1F5BC} Portada","act.again":"Descargar de nuevo","act.saveDrive":"Guardar en disco","act.changeImage":"\u2190 Cambiar imagen","act.changeVideo":"\u2190 Cambiar archivo","crop.rotateLeft":"\u21BA Girar a la izquierda","crop.flipX":"\u21CB Voltear horizontal","crop.flipY":"\u21F5 Voltear vertical","crop.rotateLeftShort":"Giro","crop.flipXShort":"Flip","crop.flipYShort":"Flip","tip.close":"Cerrar (cambiar archivo)","tip.undo":"Deshacer","tip.redo":"Rehacer","tip.resetOpened":"Restablecer al archivo abierto","tip.previewZoom":"Zoom de vista previa","tip.previewZoomOut":"Reducir vista previa","tip.previewZoomIn":"Ampliar vista previa","tip.previewZoomFit":"Ajustar vista previa","tip.previewPointer":"Herramienta de puntero","tip.previewPan":"Mano: desplazar lienzo","tip.poster":"Previsualizar y elegir portada","tip.keepAudio":"Activar/desactivar audio original (mezclado con m\xFAsica; la vista previa lo refleja)","tip.split":"Dividir el clip actual en el cursor","tip.zoomOut":"Reducir l\xEDnea de tiempo (Ctrl+rueda)","tip.zoomIn":"Ampliar l\xEDnea de tiempo (Ctrl+rueda)","tip.fit":"Ajustar al ancho","tip.addVideo":"A\xF1adir clip de v\xEDdeo","tip.addAudio":"A\xF1adir m\xFAsica (archivo de audio o v\xEDdeo con sonido para extraer la pista; se mezcla con el original)","tip.dupClip":"Duplicar clip (insertar despu\xE9s)","tip.delClip":"Eliminar clip","tip.lockAspect":"Bloquear proporci\xF3n","tip.dblConfirm":"Doble clic para confirmar recorte","err.notVideo":"Elige un archivo de v\xEDdeo","err.maxVideo":"M\xE1ximo {max} v\xEDdeos","err.videoLoad":"No se pudo cargar el v\xEDdeo, prueba con otro archivo","err.notAudio":"Elige un audio (mp3/wav/m4a) o un v\xEDdeo con sonido (se extrae autom\xE1ticamente)","err.maxAudio":"M\xE1ximo {max} audios","err.audioLoad":"No se pudo cargar el audio, prueba con otro archivo","err.processFailed":"Error de procesamiento","err.posterFailed":"No se pudo renderizar la portada","err.canvas":"Canvas no disponible","err.imageRead":"No se pudo leer la imagen, prueba con otra","err.notImage":"Elige un archivo de imagen","err.fileType":"Solo se admiten archivos de imagen o v\xEDdeo","err.saveDrive":"No se pudo guardar en disco","msg.processing":"Exportando\u2026","msg.exportingHint":"Espera un momento. El resultado se devolver\xE1 autom\xE1ticamente al finalizar.","msg.done":"Listo \u2713","msg.loading":"Cargando medios\u2026","msg.exported":"Exportado: ","msg.saving":"Guardando\u2026","msg.saved":"Guardado en disco \u2713","lbl.ratioSection":"Proporci\xF3n de imagen (recorte, sin deformar)","lbl.dragToReposition":"\u2194 Arrastra la vista previa para reposicionar el recorte","lbl.sizeSection":"Tama\xF1o de exportaci\xF3n (px; recorte cover centrado si la proporci\xF3n difiere)","lbl.currentOut":"Salida","lbl.zoomSize":"Tama\xF1o","lbl.noScale":"(sin escala)","lbl.coverNote":"\xB7 recorte centrado (cover) cuando la proporci\xF3n difiere, sin deformar","lbl.audioTrackHint":"\u266A Pista de audio (\uFF0B a la derecha para a\xF1adir m\xFAsica, mezclada con el original)","lbl.volume":"Volumen","lbl.volNote":"(la vista previa limita a 100%, la exportaci\xF3n usa el valor definido)","lbl.music":"M\xFAsica","kbd.fit":"\u21E7 F","poster.title":"Elegir portada","panel.title":"Editor multimedia","panel.subtitle":"Sube una imagen / v\xEDdeo \u2014 recorta \xB7 filtros \xB7 texto \xB7 exporta","panel.pick":"Haz clic para elegir una imagen o v\xEDdeo","panel.pickHint":"Im\xE1genes con Filerobot \xB7 v\xEDdeos: cortar/silenciar/portada"},D={\u7B80:"\u7C21",\u4F53:"\u9AD4",\u56FE:"\u5716",\u9891:"\u983B",\u89C6:"\u8996",\u8F91:"\u8F2F",\u8C03:"\u8ABF",\u6EE4:"\u6FFE",\u6807:"\u6A19",\u6CE8:"\u8A3B",\u8D34:"\u8CBC",\u9009:"\u9078",\u62E9:"\u64C7",\u7EBF:"\u7DDA",\u7BAD:"\u7BAD",\u5934:"\u982D",\u590D:"\u8907",\u5220:"\u522A",\u9664:"\u9664",\u7F16:"\u7DE8",\u8FB9:"\u908A",\u8F93:"\u8F38",\u5165:"\u5165",\u786E:"\u78BA",\u8BA4:"\u8A8D",\u9971:"\u98FD",\u5BF9:"\u5C0D",\u6696:"\u6696",\u9633:"\u967D",\u51B7:"\u51B7",\u7EB5:"\u7E31",\u6A2A:"\u6A6B",\u9002:"\u9069",\u5E94:"\u61C9",\u7F29:"\u7E2E",\u5B9E:"\u5BE6",\u9645:"\u969B",\u5BFC:"\u5C0E",\u51FA:"\u51FA",\u5C01:"\u5C01",\u9762:"\u9762",\u6362:"\u63DB",\u5F20:"\u5F35",\u9884:"\u9810",\u89C8:"\u89BD",\u52A8:"\u52D5",\u58F0:"\u8072",\u5F00:"\u958B",\u5173:"\u95DC",\u4E0E:"\u8207",\u4E50:"\u6A02",\u6DF7:"\u6DF7",\u5904:"\u8655",\u8F7D:"\u8F09",\u9519:"\u932F",\u8BEF:"\u8AA4",\u8BFB:"\u8B80",\u4EC5:"\u50C5",\u7EC8:"\u7D42",\u7A0D:"\u7A0D",\u5019:"\u5019",\u8FD4\u56DE:"\u8FD4\u56DE",\u5F53\u524D:"\u76EE\u524D",\u8F93\u51FA:"\u8F38\u51FA",\u753B:"\u756B",\u53D8:"\u8B8A",\u97F3\u9891:"\u97F3\u8A0A",\u97F3\u8F68:"\u97F3\u8ECC",\u6DFB\u52A0:"\u65B0\u589E",\u5220\u9664:"\u522A\u9664",\u4FDD\u5B58:"\u5132\u5B58",\u52A0\u8F7D:"\u8F09\u5165",\u7F51\u76D8:"\u7DB2\u76E4"},d=t=>{let u=t;for(const[o,e]of Object.entries(D).sort((a,i)=>i[0].length-a[0].length))u=u.replaceAll(o,e);return u},f=Object.fromEntries(Object.entries(c).map(([t,u])=>[t,d(u)])),n={zh:c,en:B,es:A,"zh-Hant":f};function g(t,u,o){let e=n[t]?.[u]??n.zh[u]??u;if(o)for(const[a,i]of Object.entries(o))e=e.replaceAll(`{${a}}`,String(i));return e}var l=[{platform:"tiktok",postType:"video",label:"TikTok Video",shortLabel:"TT\xB7Video",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"post",label:"Instagram Post",shortLabel:"IG\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"instagram",postType:"reels",label:"Instagram Reels",shortLabel:"IG\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"story",label:"Instagram Story",shortLabel:"IG\xB7Story",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"facebook",postType:"post",label:"Facebook Post",shortLabel:"FB\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"facebook",postType:"reels",label:"Facebook Reels",shortLabel:"FB\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"youtube",postType:"video",label:"YouTube Video",shortLabel:"YT\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"youtube",postType:"shorts",label:"YouTube Shorts",shortLabel:"YT\xB7Shorts",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"pinterest",postType:"pin",label:"Pinterest Pin",shortLabel:"PIN",ratio:"2:3",imageSize:"1664x2496",videoRatio:"9:16",videoResolution:"720p"},{platform:"x",postType:"post",label:"X Post",shortLabel:"X\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"},{platform:"linkedin",postType:"post",label:"LinkedIn Post",shortLabel:"LI\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"linkedin",postType:"video",label:"LinkedIn Video",shortLabel:"LI\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"threads",postType:"post",label:"Threads Post",shortLabel:"TH\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"telegram",postType:"post",label:"Telegram Post",shortLabel:"TG\xB7Post",ratio:"1:1",imageSize:"2048x2048",videoRatio:"9:16",videoResolution:"720p"},{platform:"reddit",postType:"post",label:"Reddit Post",shortLabel:"RD\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"}],x={"1:1":"\u65B9\u5F62 1:1","4:5":"\u7AD6\u56FE 4:5","3:4":"\u7AD6\u56FE 3:4","9:16":"\u7AD6\u5C4F 9:16","16:9":"\u6A2A\u5C4F 16:9","2:3":"\u7AD6\u56FE 2:3","1.91:1":"\u6A2A\u5E45 1.91:1"};function r(t){const[u,o]=t.split(":").map(Number);return!u||!o?1:u/o}function F(t){const u=new Set,o=[];for(const e of t)!e||u.has(e)||(u.add(e),o.push({ratio:e,value:r(e),label:x[e]??e}));return o}var C=F(["1:1","4:5","3:4","2:3","9:16","16:9","1.91:1"]),b=F(["9:16","16:9","1:1","4:5"]);function m(t=l){const u=new Set,o=[];for(const e of t){if(!e.videoRatio)continue;const a=`${e.platform}:${e.postType}:${e.videoRatio}`;if(u.has(a))continue;u.add(a);const i=e.label.split(" ").slice(0,-1).join(" ")||e.label;o.push({platform:e.platform,postType:e.postType,label:`${i} ${e.videoRatio}`,ratio:e.videoRatio,value:r(e.videoRatio)})}return o}var h=m();function v(t=l){const u=new Map;for(const o of t){const e=u.get(o.platform);(!e||e.postType!=="post"&&o.postType==="post")&&u.set(o.platform,o)}return Array.from(u.values()).map(o=>{const[e,a]=o.imageSize.split("x").map(Number),i=o.label.split(" ").slice(0,-1).join(" ")||o.label;return{platform:o.platform,label:`${i} ${o.ratio}`,ratio:o.ratio,value:r(o.ratio),w:e,h:a}})}var y=v();function S(t,u){return t>=1?{w:Math.round(u*t/2)*2,h:u}:{w:u,h:Math.round(u/t/2)*2}}function E(t=l){const u=new Set,o=[];for(const e of t){if(!e.videoRatio||!e.videoResolution)continue;const a=e.videoResolution==="1080p"?1080:720,{w:i,h:p}=S(r(e.videoRatio),a),s=`${i}x${p}`;u.has(s)||(u.add(s),o.push({label:`${e.shortLabel} ${i}\xD7${p}`,w:i,h:p}))}return o}var R=E();function T(t,u){if(t.isDuplicated)return{};if((t.rotation??0)!==0)return{};const o=u.adjustments?.rotation??0;return o?{rotation:-o}:{}}export{l as DEFAULT_PLATFORM_TARGETS,n as EDITOR_MESSAGES,y as IMAGE_PLATFORM_PRESETS,C as IMAGE_RATIO_PRESETS,h as VIDEO_PLATFORM_RATIO_PRESETS,b as VIDEO_RATIO_PRESETS,R as VIDEO_SIZE_PRESETS,v as buildImagePlatformPresets,m as buildVideoPlatformRatioPresets,E as buildVideoSizePresets,T as compensateAnnotationRotation,r as parseRatio,g as tEditor,d as toHant};
|
|
1
|
+
var c={"tool.trim":"\u526A\u8F91","tool.crop":"\u88C1\u526A","tool.tune":"\u8C03\u8272","tool.filter":"\u6EE4\u955C","tool.annotate":"\u6807\u6CE8","tool.sticker":"\u8D34\u7EB8","tool.resize":"\u6BD4\u4F8B","tune.brightness":"\u4EAE\u5EA6","tune.contrast":"\u5BF9\u6BD4","tune.saturation":"\u9971\u548C","tune.gamma":"Gamma","overlay.select":"\u9009\u62E9","overlay.pen":"\u753B\u7B14","overlay.eraser":"\u6A61\u76AE","overlay.line":"\u76F4\u7EBF","overlay.arrow":"\u7BAD\u5934","overlay.rect":"\u77E9\u5F62","overlay.ellipse":"\u692D\u5706","overlay.text":"\u6587\u5B57","overlay.color":"\u7EBF\u8272","overlay.width":"\u7EBF\u5BBD","overlay.copySelected":"\u590D\u5236","overlay.delSelected":"\u5220\u9664\u9009\u4E2D","overlay.editSelected":"\u7F16\u8F91","overlay.pickImage":"\u9009\u62E9\u56FE\u7247","overlay.hint":"\u70B9 emoji/\u56FE\u7247\u6DFB\u52A0 \u2192 \u753B\u5E03\u4E0A\u62D6\u52A8\u6446\u4F4D,\u62D6\u53F3\u4E0B\u89D2\u7D2B\u8272\u628A\u624B\u7F29\u653E","overlay.textPlaceholder":"\u8F93\u5165\u6587\u5B57,\u56DE\u8F66\u786E\u8BA4","filter.none":"\u539F\u56FE","filter.bw":"\u9ED1\u767D","filter.sepia":"\u590D\u53E4","filter.warm":"\u6696\u9633","filter.cool":"\u51B7\u8C03","filter.vivid":"\u9C9C\u8273","ratio.orig":"\u539F\u59CB","ratio.free":"\u81EA\u7531\u6BD4\u4F8B","ratio.9:16":"\u7AD6\u5C4F 9:16","ratio.16:9":"\u6A2A\u5C4F 16:9","ratio.1:1":"\u65B9\u5F62 1:1","ratio.4:5":"\u7AD6\u56FE 4:5","act.fit":"\u9002\u5E94","act.zoomFit":"\u7F29\u653E\u81F3\u9002\u5F53\u5927\u5C0F","act.zoomTo":"\u7F29\u653E\u81F3 {value}%","act.split":"\u5206\u5272","act.copy":"\u590D\u5236","act.delete":"\u5220\u9664","act.restore":"\u8FD8\u539F","act.deleteMusic":"\u5220\u9664\u97F3\u4E50","act.cancel":"\u53D6\u6D88","act.exportPoster":"\u5BFC\u51FA\u5C01\u9762","act.exporting":"\u5BFC\u51FA\u4E2D\u2026","act.poster":"\u{1F5BC} \u5C01\u9762","act.again":"\u518D\u6B21\u4E0B\u8F7D","act.saveDrive":"\u5B58\u7F51\u76D8","act.changeImage":"\u2190 \u6362\u4E00\u5F20","act.changeVideo":"\u2190 \u6362\u4E00\u4E2A","crop.rotateLeft":"\u21BA \u5411\u5DE6\u65CB\u8F6C","crop.flipX":"\u21CB \u6C34\u5E73\u7FFB\u8F6C","crop.flipY":"\u21F5 \u5782\u76F4\u7FFB\u8F6C","crop.rotateLeftShort":"\u5DE6\u8F6C","crop.flipXShort":"\u6A2A\u7FFB","crop.flipYShort":"\u7AD6\u7FFB","tip.close":"\u5173\u95ED(\u6362\u6587\u4EF6)","tip.undo":"\u64A4\u9500","tip.redo":"\u91CD\u505A","tip.resetOpened":"\u91CD\u7F6E\u5230\u6253\u5F00\u6587\u4EF6\u65F6","tip.previewZoom":"\u9884\u89C8\u7F29\u653E\u6BD4\u4F8B","tip.previewZoomOut":"\u7F29\u5C0F\u9884\u89C8","tip.previewZoomIn":"\u653E\u5927\u9884\u89C8","tip.previewZoomFit":"\u9002\u5E94\u9884\u89C8","tip.previewPointer":"\u6307\u9488\u5DE5\u5177","tip.previewPan":"\u624B\u5DE5\u5177\uFF1A\u62D6\u52A8\u753B\u9762","tip.poster":"\u9884\u89C8\u5E76\u9009\u62E9\u5C01\u9762\u5E27","tip.keepAudio":"\u539F\u89C6\u9891\u58F0\u97F3\u5F00\u5173(\u4E0E\u97F3\u4E50\u6DF7\u97F3;\u9884\u89C8\u540C\u6B65)","tip.split":"\u5728\u64AD\u653E\u5934\u5904\u628A\u5F53\u524D\u7247\u6BB5\u4E00\u5206\u4E3A\u4E8C","tip.zoomOut":"\u7F29\u5C0F\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.zoomIn":"\u653E\u5927\u65F6\u95F4\u8F74(Ctrl+\u6EDA\u8F6E)","tip.fit":"\u7F29\u653E\u5230\u9002\u5E94\u5BBD\u5EA6","tip.addVideo":"\u6DFB\u52A0\u89C6\u9891\u7247\u6BB5","tip.addAudio":"\u6DFB\u52A0\u97F3\u4E50(\u97F3\u9891\u6587\u4EF6,\u6216\u9009\u542B\u58F0\u97F3\u7684\u89C6\u9891\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68;\u4E0E\u539F\u58F0\u6DF7\u97F3)","tip.dupClip":"\u590D\u5236\u8BE5\u7247\u6BB5(\u63D2\u5230\u5176\u540E)","tip.delClip":"\u5220\u9664\u8BE5\u7247\u6BB5","tip.lockAspect":"\u9501\u5B9A\u7EB5\u6A2A\u6BD4","tip.dblConfirm":"\u53CC\u51FB\u786E\u8BA4\u88C1\u526A","err.notVideo":"\u8BF7\u9009\u62E9\u89C6\u9891\u6587\u4EF6","err.maxVideo":"\u6700\u591A {max} \u4E2A\u89C6\u9891\u7D20\u6750","err.videoLoad":"\u89C6\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.notAudio":"\u8BF7\u9009\u62E9\u97F3\u9891\u6587\u4EF6(mp3/wav/m4a),\u6216\u542B\u58F0\u97F3\u7684\u89C6\u9891(\u81EA\u52A8\u63D0\u53D6\u97F3\u8F68)","err.maxAudio":"\u6700\u591A {max} \u4E2A\u97F3\u9891\u7D20\u6750","err.audioLoad":"\u97F3\u9891\u52A0\u8F7D\u5931\u8D25,\u8BF7\u6362\u4E00\u4E2A\u6587\u4EF6","err.processFailed":"\u5904\u7406\u5931\u8D25","err.posterFailed":"\u5C01\u9762\u6E32\u67D3\u5931\u8D25","err.canvas":"canvas \u4E0D\u53EF\u7528","err.imageRead":"\u56FE\u7247\u8BFB\u53D6\u5931\u8D25,\u8BF7\u6362\u4E00\u5F20","err.notImage":"\u8BF7\u9009\u62E9\u56FE\u7247\u6587\u4EF6","err.fileType":"\u53EA\u652F\u6301\u56FE\u7247\u6216\u89C6\u9891\u6587\u4EF6","err.saveDrive":"\u5B58\u7F51\u76D8\u5931\u8D25","msg.processing":"\u6B63\u5728\u5BFC\u51FA\u4E2D\u2026","msg.exportingHint":"\u8BF7\u7A0D\u5019\uFF0C\u5BFC\u51FA\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FD4\u56DE\u7ED3\u679C\u3002","msg.done":"\u5B8C\u6210 \u2713","msg.loading":"\u7D20\u6750\u52A0\u8F7D\u4E2D\u2026","msg.exported":"\u5DF2\u5BFC\u51FA\uFF1A","msg.saving":"\u5B58\u7F51\u76D8\u4E2D\u2026","msg.saved":"\u5DF2\u5B58\u5230\u7F51\u76D8 \u2713","lbl.ratioSection":"\u753B\u9762\u6BD4\u4F8B(\u88C1\u526A,\u4E0D\u53D8\u5F62)","lbl.dragToReposition":"\u2194 \u62D6\u52A8\u9884\u89C8\u53EF\u8C03\u6574\u88C1\u526A\u4F4D\u7F6E","lbl.sizeSection":"\u5BFC\u51FA\u5C3A\u5BF8(\u50CF\u7D20;\u6BD4\u4F8B\u4E0D\u7B26\u65F6 cover \u5C45\u4E2D\u88C1\u526A)","lbl.currentOut":"\u5F53\u524D\u8F93\u51FA","lbl.zoomSize":"\u5927\u5C0F","lbl.noScale":"(\u672A\u7F29\u653E)","lbl.coverNote":"\xB7 \u6BD4\u4F8B\u4E0D\u4E00\u81F4\u65F6\u5C45\u4E2D\u88C1\u526A(cover),\u4E0D\u53D8\u5F62","lbl.audioTrackHint":"\u266A \u97F3\u9891\u8F68(\u53F3\u4FA7 \uFF0B \u6DFB\u52A0\u97F3\u4E50,\u4E0E\u539F\u58F0\u6DF7\u97F3)","lbl.volume":"\u97F3\u91CF","lbl.volNote":"(\u9884\u89C8\u6700\u5927 100%,\u5BFC\u51FA\u6309\u8BBE\u5B9A\u503C)","lbl.music":"\u97F3\u4E50","kbd.fit":"\u21E7 F","poster.title":"\u9009\u62E9\u5C01\u9762\u5E27","panel.title":"\u5A92\u4F53\u7F16\u8F91\u5668","panel.subtitle":"\u4E0A\u4F20\u56FE\u7247 / \u89C6\u9891\uFF0C\u88C1\u526A \xB7 \u6EE4\u955C \xB7 \u6587\u5B57 \xB7 \u5BFC\u51FA","panel.pick":"\u70B9\u51FB\u9009\u62E9\u56FE\u7247\u6216\u89C6\u9891","panel.pickHint":"\u56FE\u7247\u7528 Filerobot \xB7 \u89C6\u9891\u53EF\u88C1\u526A/\u9759\u97F3/\u5C01\u9762"},B={"tool.trim":"Trim","tool.crop":"Crop","tool.tune":"Tune","tool.filter":"Filters","tool.annotate":"Annotate","tool.sticker":"Stickers","tool.resize":"Ratio","tune.brightness":"Brightness","tune.contrast":"Contrast","tune.saturation":"Saturation","tune.gamma":"Gamma","overlay.select":"Select","overlay.pen":"Pen","overlay.eraser":"Eraser","overlay.line":"Line","overlay.arrow":"Arrow","overlay.rect":"Rect","overlay.ellipse":"Ellipse","overlay.text":"Text","overlay.color":"Color","overlay.width":"Width","overlay.copySelected":"Copy","overlay.delSelected":"Delete selected","overlay.editSelected":"Edit","overlay.pickImage":"Pick image","overlay.hint":"Tap emoji/image to add \u2192 drag to place, drag the purple corner handle to scale","overlay.textPlaceholder":"Type text, Enter to confirm","filter.none":"Original","filter.bw":"B&W","filter.sepia":"Sepia","filter.warm":"Warm","filter.cool":"Cool","filter.vivid":"Vivid","ratio.orig":"Original","ratio.free":"Free ratio","ratio.9:16":"Portrait 9:16","ratio.16:9":"Landscape 16:9","ratio.1:1":"Square 1:1","ratio.4:5":"Vertical 4:5","act.fit":"Fit","act.zoomFit":"Zoom to fit","act.zoomTo":"Zoom to {value}%","act.split":"Split","act.copy":"Copy","act.delete":"Delete","act.restore":"Reset","act.deleteMusic":"Remove music","act.cancel":"Cancel","act.exportPoster":"Export cover","act.exporting":"Exporting\u2026","act.poster":"\u{1F5BC} Cover","act.again":"Download again","act.saveDrive":"Save to drive","act.changeImage":"\u2190 Change image","act.changeVideo":"\u2190 Change file","crop.rotateLeft":"\u21BA Rotate left","crop.flipX":"\u21CB Flip horizontal","crop.flipY":"\u21F5 Flip vertical","crop.rotateLeftShort":"Rot","crop.flipXShort":"Flip","crop.flipYShort":"Flip","tip.close":"Close (change file)","tip.undo":"Undo","tip.redo":"Redo","tip.resetOpened":"Reset to opened file","tip.previewZoom":"Preview zoom","tip.previewZoomOut":"Zoom out preview","tip.previewZoomIn":"Zoom in preview","tip.previewZoomFit":"Fit preview","tip.previewPointer":"Pointer tool","tip.previewPan":"Hand tool: pan canvas","tip.poster":"Preview and pick a cover frame","tip.keepAudio":"Original audio on/off (mixed with music; preview follows)","tip.split":"Split the current clip at the playhead","tip.zoomOut":"Zoom out timeline (Ctrl+wheel)","tip.zoomIn":"Zoom in timeline (Ctrl+wheel)","tip.fit":"Fit to width","tip.addVideo":"Add video clip","tip.addAudio":"Add music (audio file, or a video with sound to extract its track; mixed with original)","tip.dupClip":"Duplicate clip (insert after)","tip.delClip":"Delete clip","tip.lockAspect":"Lock aspect ratio","tip.dblConfirm":"Double-click to confirm crop","err.notVideo":"Please choose a video file","err.maxVideo":"Up to {max} video sources","err.videoLoad":"Failed to load video, try another file","err.notAudio":"Choose an audio file (mp3/wav/m4a), or a video with sound (audio auto-extracted)","err.maxAudio":"Up to {max} audio sources","err.audioLoad":"Failed to load audio, try another file","err.processFailed":"Processing failed","err.posterFailed":"Failed to render cover","err.canvas":"Canvas unavailable","err.imageRead":"Failed to read image, try another","err.notImage":"Please choose an image file","err.fileType":"Only image or video files are supported","err.saveDrive":"Failed to save to drive","msg.processing":"Exporting\u2026","msg.exportingHint":"Please wait. The result will be returned automatically when export finishes.","msg.done":"Done \u2713","msg.loading":"Loading media\u2026","msg.exported":"Exported: ","msg.saving":"Saving\u2026","msg.saved":"Saved to drive \u2713","lbl.ratioSection":"Frame ratio (crop, no distortion)","lbl.dragToReposition":"\u2194 Drag the preview to reposition the crop","lbl.sizeSection":"Export size (px; cover center-crop when ratios differ)","lbl.currentOut":"Output","lbl.zoomSize":"Size","lbl.noScale":"(no scaling)","lbl.coverNote":"\xB7 center-cropped (cover) when ratios differ, no distortion","lbl.audioTrackHint":"\u266A Audio track (\uFF0B on the right to add music, mixed with original)","lbl.volume":"Volume","lbl.volNote":"(preview caps at 100%, export uses the set value)","lbl.music":"Music","kbd.fit":"\u21E7 F","poster.title":"Pick a cover frame","panel.title":"Media Editor","panel.subtitle":"Upload an image / video \u2014 crop \xB7 filters \xB7 text \xB7 export","panel.pick":"Click to choose an image or video","panel.pickHint":"Images via Filerobot \xB7 videos: trim/mute/cover"},D={"tool.trim":"Editar","tool.crop":"Recortar","tool.tune":"Ajustar color","tool.filter":"Filtros","tool.annotate":"Anotar","tool.sticker":"Stickers","tool.resize":"Proporci\xF3n","tune.brightness":"Brillo","tune.contrast":"Contraste","tune.saturation":"Saturaci\xF3n","tune.gamma":"Gamma","overlay.select":"Seleccionar","overlay.pen":"Pincel","overlay.eraser":"Borrador","overlay.line":"L\xEDnea","overlay.arrow":"Flecha","overlay.rect":"Rect\xE1ngulo","overlay.ellipse":"Elipse","overlay.text":"Texto","overlay.color":"Color","overlay.width":"Grosor","overlay.copySelected":"Copiar","overlay.delSelected":"Eliminar seleccionado","overlay.editSelected":"Editar","overlay.pickImage":"Elegir imagen","overlay.hint":"Toca un emoji/imagen para a\xF1adirlo \u2192 arrastra para colocarlo, arrastra el tirador morado para escalar","overlay.textPlaceholder":"Escribe texto, Enter para confirmar","filter.none":"Original","filter.bw":"Blanco y negro","filter.sepia":"Sepia","filter.warm":"C\xE1lido","filter.cool":"Fr\xEDo","filter.vivid":"Intenso","ratio.orig":"Original","ratio.free":"Libre","ratio.9:16":"Vertical 9:16","ratio.16:9":"Horizontal 16:9","ratio.1:1":"Cuadrado 1:1","ratio.4:5":"Vertical 4:5","act.fit":"Ajustar","act.zoomFit":"Ajustar a pantalla","act.zoomTo":"Zoom al {value}%","act.split":"Dividir","act.copy":"Copiar","act.delete":"Eliminar","act.restore":"Restablecer","act.deleteMusic":"Quitar m\xFAsica","act.cancel":"Cancelar","act.exportPoster":"Exportar portada","act.exporting":"Exportando\u2026","act.poster":"\u{1F5BC} Portada","act.again":"Descargar de nuevo","act.saveDrive":"Guardar en disco","act.changeImage":"\u2190 Cambiar imagen","act.changeVideo":"\u2190 Cambiar archivo","crop.rotateLeft":"\u21BA Girar a la izquierda","crop.flipX":"\u21CB Voltear horizontal","crop.flipY":"\u21F5 Voltear vertical","crop.rotateLeftShort":"Giro","crop.flipXShort":"Flip","crop.flipYShort":"Flip","tip.close":"Cerrar (cambiar archivo)","tip.undo":"Deshacer","tip.redo":"Rehacer","tip.resetOpened":"Restablecer al archivo abierto","tip.previewZoom":"Zoom de vista previa","tip.previewZoomOut":"Reducir vista previa","tip.previewZoomIn":"Ampliar vista previa","tip.previewZoomFit":"Ajustar vista previa","tip.previewPointer":"Herramienta de puntero","tip.previewPan":"Mano: desplazar lienzo","tip.poster":"Previsualizar y elegir portada","tip.keepAudio":"Activar/desactivar audio original (mezclado con m\xFAsica; la vista previa lo refleja)","tip.split":"Dividir el clip actual en el cursor","tip.zoomOut":"Reducir l\xEDnea de tiempo (Ctrl+rueda)","tip.zoomIn":"Ampliar l\xEDnea de tiempo (Ctrl+rueda)","tip.fit":"Ajustar al ancho","tip.addVideo":"A\xF1adir clip de v\xEDdeo","tip.addAudio":"A\xF1adir m\xFAsica (archivo de audio o v\xEDdeo con sonido para extraer la pista; se mezcla con el original)","tip.dupClip":"Duplicar clip (insertar despu\xE9s)","tip.delClip":"Eliminar clip","tip.lockAspect":"Bloquear proporci\xF3n","tip.dblConfirm":"Doble clic para confirmar recorte","err.notVideo":"Elige un archivo de v\xEDdeo","err.maxVideo":"M\xE1ximo {max} v\xEDdeos","err.videoLoad":"No se pudo cargar el v\xEDdeo, prueba con otro archivo","err.notAudio":"Elige un audio (mp3/wav/m4a) o un v\xEDdeo con sonido (se extrae autom\xE1ticamente)","err.maxAudio":"M\xE1ximo {max} audios","err.audioLoad":"No se pudo cargar el audio, prueba con otro archivo","err.processFailed":"Error de procesamiento","err.posterFailed":"No se pudo renderizar la portada","err.canvas":"Canvas no disponible","err.imageRead":"No se pudo leer la imagen, prueba con otra","err.notImage":"Elige un archivo de imagen","err.fileType":"Solo se admiten archivos de imagen o v\xEDdeo","err.saveDrive":"No se pudo guardar en disco","msg.processing":"Exportando\u2026","msg.exportingHint":"Espera un momento. El resultado se devolver\xE1 autom\xE1ticamente al finalizar.","msg.done":"Listo \u2713","msg.loading":"Cargando medios\u2026","msg.exported":"Exportado: ","msg.saving":"Guardando\u2026","msg.saved":"Guardado en disco \u2713","lbl.ratioSection":"Proporci\xF3n de imagen (recorte, sin deformar)","lbl.dragToReposition":"\u2194 Arrastra la vista previa para reposicionar el recorte","lbl.sizeSection":"Tama\xF1o de exportaci\xF3n (px; recorte cover centrado si la proporci\xF3n difiere)","lbl.currentOut":"Salida","lbl.zoomSize":"Tama\xF1o","lbl.noScale":"(sin escala)","lbl.coverNote":"\xB7 recorte centrado (cover) cuando la proporci\xF3n difiere, sin deformar","lbl.audioTrackHint":"\u266A Pista de audio (\uFF0B a la derecha para a\xF1adir m\xFAsica, mezclada con el original)","lbl.volume":"Volumen","lbl.volNote":"(la vista previa limita a 100%, la exportaci\xF3n usa el valor definido)","lbl.music":"M\xFAsica","kbd.fit":"\u21E7 F","poster.title":"Elegir portada","panel.title":"Editor multimedia","panel.subtitle":"Sube una imagen / v\xEDdeo \u2014 recorta \xB7 filtros \xB7 texto \xB7 exporta","panel.pick":"Haz clic para elegir una imagen o v\xEDdeo","panel.pickHint":"Im\xE1genes con Filerobot \xB7 v\xEDdeos: cortar/silenciar/portada"},A={\u7B80:"\u7C21",\u4F53:"\u9AD4",\u56FE:"\u5716",\u9891:"\u983B",\u89C6:"\u8996",\u8F91:"\u8F2F",\u8C03:"\u8ABF",\u6EE4:"\u6FFE",\u6807:"\u6A19",\u6CE8:"\u8A3B",\u8D34:"\u8CBC",\u9009:"\u9078",\u62E9:"\u64C7",\u7EBF:"\u7DDA",\u7BAD:"\u7BAD",\u5934:"\u982D",\u590D:"\u8907",\u5220:"\u522A",\u9664:"\u9664",\u7F16:"\u7DE8",\u8FB9:"\u908A",\u8F93:"\u8F38",\u5165:"\u5165",\u786E:"\u78BA",\u8BA4:"\u8A8D",\u9971:"\u98FD",\u5BF9:"\u5C0D",\u6696:"\u6696",\u9633:"\u967D",\u51B7:"\u51B7",\u7EB5:"\u7E31",\u6A2A:"\u6A6B",\u9002:"\u9069",\u5E94:"\u61C9",\u7F29:"\u7E2E",\u5B9E:"\u5BE6",\u9645:"\u969B",\u5BFC:"\u5C0E",\u51FA:"\u51FA",\u5C01:"\u5C01",\u9762:"\u9762",\u6362:"\u63DB",\u5F20:"\u5F35",\u9884:"\u9810",\u89C8:"\u89BD",\u52A8:"\u52D5",\u58F0:"\u8072",\u5F00:"\u958B",\u5173:"\u95DC",\u4E0E:"\u8207",\u4E50:"\u6A02",\u6DF7:"\u6DF7",\u5904:"\u8655",\u8F7D:"\u8F09",\u9519:"\u932F",\u8BEF:"\u8AA4",\u8BFB:"\u8B80",\u4EC5:"\u50C5",\u7EC8:"\u7D42",\u7A0D:"\u7A0D",\u5019:"\u5019",\u8FD4\u56DE:"\u8FD4\u56DE",\u5F53\u524D:"\u76EE\u524D",\u8F93\u51FA:"\u8F38\u51FA",\u753B:"\u756B",\u53D8:"\u8B8A",\u97F3\u9891:"\u97F3\u8A0A",\u97F3\u8F68:"\u97F3\u8ECC",\u6DFB\u52A0:"\u65B0\u589E",\u5220\u9664:"\u522A\u9664",\u4FDD\u5B58:"\u5132\u5B58",\u52A0\u8F7D:"\u8F09\u5165",\u7F51\u76D8:"\u7DB2\u76E4"},d=t=>{let u=t;for(const[o,e]of Object.entries(A).sort((i,a)=>a[0].length-i[0].length))u=u.replaceAll(o,e);return u},g=Object.fromEntries(Object.entries(c).map(([t,u])=>[t,d(u)])),n={zh:c,en:B,es:D,"zh-Hant":g};function x(t,u,o){let e=n[t]?.[u]??n.zh[u]??u;if(o)for(const[i,a]of Object.entries(o))e=e.replaceAll(`{${i}}`,String(a));return e}var l=[{platform:"tiktok",postType:"video",label:"TikTok Video",shortLabel:"TT\xB7Video",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"post",label:"Instagram Post",shortLabel:"IG\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"instagram",postType:"reels",label:"Instagram Reels",shortLabel:"IG\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"instagram",postType:"story",label:"Instagram Story",shortLabel:"IG\xB7Story",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"facebook",postType:"post",label:"Facebook Post",shortLabel:"FB\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"facebook",postType:"reels",label:"Facebook Reels",shortLabel:"FB\xB7Reels",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"youtube",postType:"video",label:"YouTube Video",shortLabel:"YT\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"youtube",postType:"shorts",label:"YouTube Shorts",shortLabel:"YT\xB7Shorts",ratio:"9:16",imageSize:"1440x2560",videoRatio:"9:16",videoResolution:"720p"},{platform:"pinterest",postType:"pin",label:"Pinterest Pin",shortLabel:"PIN",ratio:"2:3",imageSize:"1664x2496",videoRatio:"9:16",videoResolution:"720p"},{platform:"x",postType:"post",label:"X Post",shortLabel:"X\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"},{platform:"linkedin",postType:"post",label:"LinkedIn Post",shortLabel:"LI\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"linkedin",postType:"video",label:"LinkedIn Video",shortLabel:"LI\xB7Video",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"1080p"},{platform:"threads",postType:"post",label:"Threads Post",shortLabel:"TH\xB7Post",ratio:"1:1",imageSize:"2048x2048"},{platform:"telegram",postType:"post",label:"Telegram Post",shortLabel:"TG\xB7Post",ratio:"1:1",imageSize:"2048x2048",videoRatio:"9:16",videoResolution:"720p"},{platform:"reddit",postType:"post",label:"Reddit Post",shortLabel:"RD\xB7Post",ratio:"16:9",imageSize:"2560x1440",videoRatio:"16:9",videoResolution:"720p"}],C={"1:1":"\u65B9\u5F62 1:1","4:5":"\u7AD6\u56FE 4:5","3:4":"\u7AD6\u56FE 3:4","9:16":"\u7AD6\u5C4F 9:16","16:9":"\u6A2A\u5C4F 16:9","2:3":"\u7AD6\u56FE 2:3","1.91:1":"\u6A2A\u5E45 1.91:1"};function r(t){const[u,o]=t.split(":").map(Number);return!u||!o?1:u/o}function F(t){const u=new Set,o=[];for(const e of t)!e||u.has(e)||(u.add(e),o.push({ratio:e,value:r(e),label:C[e]??e}));return o}var f=F(["1:1","4:5","3:4","2:3","9:16","16:9","1.91:1"]),b=F(["9:16","16:9","1:1","4:5"]);function m(t=l){const u=new Set,o=[];for(const e of t){if(!e.videoRatio)continue;const i=`${e.platform}:${e.postType}:${e.videoRatio}`;if(u.has(i))continue;u.add(i);const a=e.label.split(" ").slice(0,-1).join(" ")||e.label;o.push({platform:e.platform,postType:e.postType,label:`${a} ${e.videoRatio}`,ratio:e.videoRatio,value:r(e.videoRatio)})}return o}var h=m();function E(t=l){const u=new Map;for(const o of t){const e=u.get(o.platform);(!e||e.postType!=="post"&&o.postType==="post")&&u.set(o.platform,o)}return Array.from(u.values()).map(o=>{const[e,i]=o.imageSize.split("x").map(Number),a=o.label.split(" ").slice(0,-1).join(" ")||o.label;return{platform:o.platform,label:`${a} ${o.ratio}`,ratio:o.ratio,value:r(o.ratio),w:e,h:i}})}var y=E();function S(t,u){return t>=1?{w:Math.round(u*t/2)*2,h:u}:{w:u,h:Math.round(u/t/2)*2}}function v(t=l){const u=new Set,o=[];for(const e of t){if(!e.videoRatio||!e.videoResolution)continue;const i=e.videoResolution==="1080p"?1080:720,{w:a,h:p}=S(r(e.videoRatio),i),s=`${a}x${p}`;u.has(s)||(u.add(s),o.push({label:`${e.shortLabel} ${a}\xD7${p}`,w:a,h:p}))}return o}var R=v();function T(t,u){if(t.isDuplicated)return{};if((t.rotation??0)!==0)return{};const o=u.adjustments?.rotation??0;return o?{rotation:-o}:{}}export{l as DEFAULT_PLATFORM_TARGETS,n as EDITOR_MESSAGES,y as IMAGE_PLATFORM_PRESETS,f as IMAGE_RATIO_PRESETS,h as VIDEO_PLATFORM_RATIO_PRESETS,b as VIDEO_RATIO_PRESETS,R as VIDEO_SIZE_PRESETS,E as buildImagePlatformPresets,m as buildVideoPlatformRatioPresets,v as buildVideoSizePresets,T as compensateAnnotationRotation,r as parseRatio,x as tEditor,d as toHant};
|
package/core/dist/engine.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var r=require("zod"),p={color:r.z.string().max(32),width:r.z.number().positive().max(200)},u={rotation:r.z.number().min(-180).max(180).optional()},A=r.z.discriminatedUnion("type",[r.z.object({type:r.z.literal("pen"),points:r.z.array(r.z.number()).min(4),...p,...u}),r.z.object({type:r.z.literal("line"),x1:r.z.number(),y1:r.z.number(),x2:r.z.number(),y2:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("arrow"),x1:r.z.number(),y1:r.z.number(),x2:r.z.number(),y2:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("rect"),x:r.z.number(),y:r.z.number(),w:r.z.number(),h:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("ellipse"),x:r.z.number(),y:r.z.number(),w:r.z.number(),h:r.z.number(),...p,...u}),r.z.object({type:r.z.literal("text"),x:r.z.number(),y:r.z.number(),text:r.z.string().max(500),color:r.z.string().max(32),fontSize:r.z.number().positive().max(512),...u}),r.z.object({type:r.z.literal("sticker"),x:r.z.number(),y:r.z.number(),w:r.z.number().positive(),h:r.z.number().positive(),emoji:r.z.string().max(16).optional(),src:r.z.string().optional(),...u})]),B=r.z.object({srcIdx:r.z.number().int().min(0).max(7),in:r.z.number().min(0),out:r.z.number().min(0)}),I=r.z.object({srcIdx:r.z.number().int().min(0).max(2),startAt:r.z.number().min(0),in:r.z.number().min(0),out:r.z.number().min(0),volume:r.z.number().min(0).max(2)}),w=r.z.object({type:r.z.enum(["none","fade","slide","wipe","flip","clockWipe","star","circle","rectangle"]).default("none"),duration:r.z.number().min(0).max(2).default(.4)}),E=r.z.object({clips:r.z.array(B).min(1).max(50),audioClips:r.z.array(I).max(8).default([]),canvas:r.z.object({w:r.z.number().int().min(2).max(4096),h:r.z.number().int().min(2).max(4096)}),crop:r.z.object({x:r.z.number().min(0),y:r.z.number().min(0),width:r.z.number().positive(),height:r.z.number().positive()}).optional(),scale:r.z.object({width:r.z.number().positive(),height:r.z.number().positive(),fit:r.z.enum(["contain","cover","force"])}).optional(),rotation:r.z.number().min(-180).max(180).default(0),flipX:r.z.boolean().default(!1),flipY:r.z.boolean().default(!1),filters:r.z.object({brightness:r.z.number().min(-1).max(1),contrast:r.z.number().min(-1).max(1),saturation:r.z.number().min(-1).max(1),gamma:r.z.number().min(-1).max(1).default(0)}).default({brightness:0,contrast:0,saturation:0,gamma:0}),filterPreset:r.z.string().max(32).optional(),overlays:r.z.array(A).max(200).optional(),transitions:r.z.array(w).max(49).default([]),keepAudio:r.z.boolean().default(!0),poster:r.z.object({time:r.z.number().min(0)}).optional()}).superRefine((t,e)=>{t.clips.forEach((i,n)=>{i.out<=i.in&&e.addIssue({code:r.z.ZodIssueCode.custom,message:`clips[${n}].out \u5FC5\u987B\u5927\u4E8E in`,path:["clips",n,"out"]})}),t.audioClips?.forEach((i,n)=>{i.out<=i.in&&e.addIssue({code:r.z.ZodIssueCode.custom,message:`audioClips[${n}].out \u5FC5\u987B\u5927\u4E8E in`,path:["audioClips",n,"out"]})}),(t.canvas.w%2!==0||t.canvas.h%2!==0)&&e.addIssue({code:r.z.ZodIssueCode.custom,message:"canvas \u5BBD\u9AD8\u5FC5\u987B\u4E3A\u5076\u6570",path:["canvas"]})});function m(){return{clips:[],audioClips:[],canvas:{w:2,h:2},rotation:0,flipX:!1,flipY:!1,filters:{brightness:0,contrast:0,saturation:0,gamma:0},transitions:[],keepAudio:!0}}var j=100;function d(t){return{past:[],present:t,future:[]}}function f(t,e){if(e===t.present)return t;const i=[...t.past,t.present];return i.length>j&&i.shift(),{past:i,present:e,future:[]}}function y(t,e){return e===t.present?t:{...t,present:e}}function z(t){return t.past.length>0}function b(t){return t.future.length>0}function P(t){return z(t)?{past:t.past.slice(0,-1),present:t.past[t.past.length-1],future:[t.present,...t.future]}:t}function D(t){if(!b(t))return t;const[e,...i]=t.future;return{past:[...t.past,t.present],present:e,future:i}}var l=.1;function v(t){return t.out-t.in}function c(t){return t.reduce((e,i)=>e+v(i),0)}function x(t,e){if(!t.length||e<0)return null;let i=0;for(let n=0;n<t.length;n++){const s=v(t[n]);if(e<i+s)return{idx:n,srcTime:t[n].in+(e-i)};i+=s}if(Math.abs(e-i)<1e-9||e<=i){const n=t.length-1;return{idx:n,srcTime:t[n].out}}return null}function V(t,e){const i=x(t,e);if(!i)return t;const n=t[i.idx];return i.srcTime<n.in+l||i.srcTime>n.out-l?t:[...t.slice(0,i.idx),{...n,out:i.srcTime},{...n,in:i.srcTime},...t.slice(i.idx+1)]}function O(t,e){return t.length<=1||!t[e]?t:t.filter((i,n)=>n!==e)}function F(t,e){const i=t[e];return i?[...t.slice(0,e+1),{...i},...t.slice(e+1)]:t}function T(t,e,i){if(e===i||!t[e]||i<0||i>=t.length)return t;const n=[...t],[s]=n.splice(e,1);return n.splice(i,0,s),n}function k(t,e,i,n,s){if(!t[e])return t;const a=t.map(h=>({...h}));return i==="in"?a[e].in=Math.min(Math.max(n,0),a[e].out-l):a[e].out=Math.max(Math.min(n,s),a[e].in+l),a}function M(t,e,i){const n=Math.max(Math.min(t.out,e),l),s=Math.min(Math.max(t.in,0),n-l),o=Math.min(Math.max(t.startAt,0),Math.max(0,i-l));return{...t,in:s,out:n,startAt:o}}function R(t,e=[]){const i=c(t),n=e.reduce((s,o)=>Math.max(s,o.startAt+(o.out-o.in)),0);return Math.max(i,n)}function g(t){return[...new Set(t.map(e=>e.srcIdx))].sort((e,i)=>e-i)}function X(t,e){const i=new Map(e.map((n,s)=>[n,s]));return t.map(n=>({...n,srcIdx:i.get(n.srcIdx)??0}))}function C(t){const e=Math.min(Math.max(Math.round(t),2),4096);return e%2===0?e:e-1}var S=t=>Math.min(Math.max(t,-180),180),Y=class{constructor(t=m()){this.videoSources=[],this.audioSources=[],this.listeners=new Set,this.transientBase=null,this.getSnapshot=()=>this.history.present,this.subscribe=e=>(this.listeners.add(e),()=>this.listeners.delete(e)),this.history=d(t)}getState(){return this.history.present}emit(){const t=this.history.present;for(const e of this.listeners)e(t)}canUndo(){return z(this.history)}canRedo(){return b(this.history)}undo(){this.transientBase=null,this.history=P(this.history),this.emit()}redo(){this.transientBase=null,this.history=D(this.history),this.emit()}applyMut(t,e=!1){if(e)this.transientBase===null&&(this.transientBase=this.history.present),this.history=y(this.history,t(this.transientBase));else{const i=this.transientBase??this.history.present,n=t(i),s=this.transientBase?{...this.history,present:this.transientBase}:this.history;this.history=f(s,n),this.transientBase=null}this.emit()}registerVideoSource(t){const e=this.videoSources.length;this.videoSources.push(t);const i={srcIdx:e,in:0,out:t.duration};return e===0||this.history.present.clips.length===0?(this.transientBase=null,this.history=d({...m(),clips:[i],canvas:{w:C(t.width),h:C(t.height)},poster:{time:Math.min(1,t.duration/2)}}),this.emit()):this.applyMut(n=>({...n,clips:[...n.clips,i]})),e}registerAudioSource(t){const e=this.audioSources.length;return this.audioSources.push(t),this.applyMut(i=>{const n=M({srcIdx:e,startAt:0,in:0,out:t.duration,volume:1},t.duration,c(i.clips));return{...i,audioClips:[...i.audioClips,n]}}),e}getVideoSource(t){return this.videoSources[t]}getAudioSource(t){return this.audioSources[t]}addClipFromSource(t){const e=this.videoSources[t];e&&this.applyMut(i=>({...i,clips:[...i.clips,{srcIdx:t,in:0,out:e.duration}]}))}splitAtPlayhead(t){this.applyMut(e=>({...e,clips:V(e.clips,t)}))}removeClip(t){this.applyMut(e=>({...e,clips:O(e.clips,t)}))}duplicateClip(t){this.applyMut(e=>({...e,clips:F(e.clips,t)}))}reorderClips(t,e){this.applyMut(i=>({...i,clips:T(i.clips,t,e)}))}trimClip(t,e,i,n){this.applyMut(s=>{const o=s.clips[t];if(!o)return s;const a=this.videoSources[o.srcIdx]?.duration??o.out;return{...s,clips:k(s.clips,t,e,i,a)}},n?.transient)}moveAudioClip(t,e,i){this.applyMut(n=>this.patchAudio(n,t,s=>({...s,startAt:e})),i?.transient)}trimAudioClip(t,e,i,n){this.applyMut(s=>this.patchAudio(s,t,o=>{if(e==="in"){const a=i-o.in;return{...o,in:i,startAt:o.startAt+a}}return{...o,out:i}}),n?.transient)}setAudioVolume(t,e,i){this.applyMut(n=>this.patchAudio(n,t,s=>({...s,volume:e}),!1),i?.transient)}removeAudioClip(t){this.applyMut(e=>({...e,audioClips:e.audioClips.filter((i,n)=>n!==t)}))}patchAudio(t,e,i,n=!0){const s=t.audioClips[e];if(!s)return t;let o=i(s);if(n){const a=this.audioSources[s.srcIdx]?.duration??s.out;o=M(o,a,c(t.clips))}return{...t,audioClips:t.audioClips.map((a,h)=>h===e?o:a)}}setCrop(t,e){this.applyMut(i=>({...i,crop:t}),e?.transient)}clearCrop(){this.applyMut(t=>({...t,crop:void 0}))}setScale(t){this.applyMut(e=>({...e,scale:t}))}clearScale(){this.applyMut(t=>({...t,scale:void 0}))}setRotation(t,e){this.applyMut(i=>({...i,rotation:S(t)}),e?.transient)}rotateBy(t){this.applyMut(e=>{let i=e.rotation+t;return i>180&&(i-=360),i<-180&&(i+=360),{...e,rotation:S(i)}})}flipX(){this.applyMut(t=>({...t,flipX:!t.flipX}))}flipY(){this.applyMut(t=>({...t,flipY:!t.flipY}))}setFilter(t,e,i){this.applyMut(n=>({...n,filters:{...n.filters,[t]:e}}),i?.transient)}setFilters(t,e){this.applyMut(i=>({...i,filters:{...i.filters,...t}}),e?.transient)}setFilterPreset(t){this.applyMut(e=>({...e,filterPreset:t}))}addOverlay(t){this.applyMut(e=>({...e,overlays:[...e.overlays??[],t]}))}updateOverlay(t,e,i){this.applyMut(n=>{const s=n.overlays??[];return s[t]?{...n,overlays:s.map((o,a)=>a===t?{...o,...e}:o)}:n},i?.transient)}removeOverlay(t){this.applyMut(e=>({...e,overlays:(e.overlays??[]).filter((i,n)=>n!==t)}))}patch(t,e){e?.transient?(this.transientBase===null&&(this.transientBase=this.history.present),this.history=y(this.history,{...this.transientBase,...t}),this.emit()):this.commit(t)}commit(t){const e=t?{...this.history.present,...t}:this.history.present,i=this.transientBase;this.transientBase=null,this.history=f(i?{...this.history,present:i}:this.history,e),this.emit()}setKeepAudio(t){this.applyMut(e=>({...e,keepAudio:t}))}setPoster(t){this.applyMut(e=>({...e,poster:{time:Math.max(0,t)}}))}totalDuration(){return c(this.history.present.clips)}contentDuration(){const t=this.history.present;return R(t.clips,t.audioClips)}locate(t){return x(this.history.present.clips,t)}usedVideoSources(){return g(this.history.present.clips)}getExportPlan(){const t=this.history.present,e=g(t.clips),i=[...new Set(t.audioClips.map(s=>s.srcIdx))].sort((s,o)=>s-o),n=new Map(i.map((s,o)=>[s,o]));return{state:{...t,clips:X(t.clips,e),audioClips:t.audioClips.map(s=>({...s,srcIdx:n.get(s.srcIdx)??0}))},videoSrcOrder:e,audioSrcOrder:i}}validate(){return E.safeParse(this.getExportPlan().state)}reset(t=m()){this.transientBase=null,this.history=d(t),this.emit()}};exports.VideoEditorEngine=Y;
|
|
1
|
+
"use strict";var s=require("zod"),p={color:s.z.string().max(32),width:s.z.number().positive().max(200)},u={rotation:s.z.number().min(-180).max(180).optional()},A=s.z.discriminatedUnion("type",[s.z.object({type:s.z.literal("pen"),points:s.z.array(s.z.number()).min(4),...p,...u}),s.z.object({type:s.z.literal("line"),x1:s.z.number(),y1:s.z.number(),x2:s.z.number(),y2:s.z.number(),...p,...u}),s.z.object({type:s.z.literal("arrow"),x1:s.z.number(),y1:s.z.number(),x2:s.z.number(),y2:s.z.number(),...p,...u}),s.z.object({type:s.z.literal("rect"),x:s.z.number(),y:s.z.number(),w:s.z.number(),h:s.z.number(),...p,...u}),s.z.object({type:s.z.literal("ellipse"),x:s.z.number(),y:s.z.number(),w:s.z.number(),h:s.z.number(),...p,...u}),s.z.object({type:s.z.literal("text"),x:s.z.number(),y:s.z.number(),text:s.z.string().max(500),color:s.z.string().max(32),fontSize:s.z.number().positive().max(512),...u}),s.z.object({type:s.z.literal("sticker"),x:s.z.number(),y:s.z.number(),w:s.z.number().positive(),h:s.z.number().positive(),emoji:s.z.string().max(16).optional(),src:s.z.string().optional(),...u})]),B=s.z.object({srcIdx:s.z.number().int().min(0).max(7),in:s.z.number().min(0),out:s.z.number().min(0)}),I=s.z.object({srcIdx:s.z.number().int().min(0).max(2),startAt:s.z.number().min(0),in:s.z.number().min(0),out:s.z.number().min(0),volume:s.z.number().min(0).max(2)}),w=s.z.object({type:s.z.enum(["none","fade","slide","wipe","flip","clockWipe","star","circle","rectangle"]).default("none"),duration:s.z.number().min(0).max(2).default(.4)}),j=s.z.object({clips:s.z.array(B).min(1).max(50),audioClips:s.z.array(I).max(8).default([]),canvas:s.z.object({w:s.z.number().int().min(2).max(4096),h:s.z.number().int().min(2).max(4096)}),crop:s.z.object({x:s.z.number().min(0),y:s.z.number().min(0),width:s.z.number().positive(),height:s.z.number().positive()}).optional(),scale:s.z.object({width:s.z.number().positive(),height:s.z.number().positive(),fit:s.z.enum(["contain","cover","force"])}).optional(),rotation:s.z.number().min(-180).max(180).default(0),flipX:s.z.boolean().default(!1),flipY:s.z.boolean().default(!1),filters:s.z.object({brightness:s.z.number().min(-1).max(1),contrast:s.z.number().min(-1).max(1),saturation:s.z.number().min(-1).max(1),gamma:s.z.number().min(-1).max(1).default(0)}).default({brightness:0,contrast:0,saturation:0,gamma:0}),filterPreset:s.z.string().max(32).optional(),overlays:s.z.array(A).max(200).optional(),transitions:s.z.array(w).max(49).default([]),keepAudio:s.z.boolean().default(!0),poster:s.z.object({time:s.z.number().min(0)}).optional()}).superRefine((t,i)=>{t.clips.forEach((e,r)=>{e.out<=e.in&&i.addIssue({code:s.z.ZodIssueCode.custom,message:`clips[${r}].out \u5FC5\u987B\u5927\u4E8E in`,path:["clips",r,"out"]})}),t.audioClips?.forEach((e,r)=>{e.out<=e.in&&i.addIssue({code:s.z.ZodIssueCode.custom,message:`audioClips[${r}].out \u5FC5\u987B\u5927\u4E8E in`,path:["audioClips",r,"out"]})}),(t.canvas.w%2!==0||t.canvas.h%2!==0)&&i.addIssue({code:s.z.ZodIssueCode.custom,message:"canvas \u5BBD\u9AD8\u5FC5\u987B\u4E3A\u5076\u6570",path:["canvas"]})});function c(){return{clips:[],audioClips:[],canvas:{w:2,h:2},rotation:0,flipX:!1,flipY:!1,filters:{brightness:0,contrast:0,saturation:0,gamma:0},transitions:[],keepAudio:!0}}var E=100;function m(t){return{past:[],present:t,future:[]}}function d(t,i){if(i===t.present)return t;const e=[...t.past,t.present];return e.length>E&&e.shift(),{past:e,present:i,future:[]}}function y(t,i){return i===t.present?t:{...t,present:i}}function z(t){return t.past.length>0}function f(t){return t.future.length>0}function P(t){return z(t)?{past:t.past.slice(0,-1),present:t.past[t.past.length-1],future:[t.present,...t.future]}:t}function F(t){if(!f(t))return t;const[i,...e]=t.future;return{past:[...t.past,t.present],present:i,future:e}}var l=.1;function b(t){return t.out-t.in}function h(t){return t.reduce((i,e)=>i+b(e),0)}function x(t,i){if(!t.length||i<0)return null;let e=0;for(let r=0;r<t.length;r++){const n=b(t[r]);if(i<e+n)return{idx:r,srcTime:t[r].in+(i-e)};e+=n}if(Math.abs(i-e)<1e-9||i<=e){const r=t.length-1;return{idx:r,srcTime:t[r].out}}return null}function T(t,i){const e=x(t,i);if(!e)return t;const r=t[e.idx];return e.srcTime<r.in+l||e.srcTime>r.out-l?t:[...t.slice(0,e.idx),{...r,out:e.srcTime},{...r,in:e.srcTime},...t.slice(e.idx+1)]}function k(t,i){return t.length<=1||!t[i]?t:t.filter((e,r)=>r!==i)}function O(t,i){const e=t[i];return e?[...t.slice(0,i+1),{...e},...t.slice(i+1)]:t}function V(t,i,e){if(i===e||!t[i]||e<0||e>=t.length)return t;const r=[...t],[n]=r.splice(i,1);return r.splice(e,0,n),r}function X(t,i,e,r,n){if(!t[i])return t;const a=t.map(o=>({...o}));return e==="in"?a[i].in=Math.min(Math.max(r,0),a[i].out-l):a[i].out=Math.max(Math.min(r,n),a[i].in+l),a}function M(t,i,e){const r=Math.max(Math.min(t.out,i),l),n=Math.min(Math.max(t.in,0),r-l),a=Math.min(Math.max(t.startAt,0),Math.max(0,e-l));return{...t,in:n,out:r,startAt:a}}function Y(t,i=[]){const e=h(t),r=i.reduce((n,a)=>Math.max(n,a.startAt+(a.out-a.in)),0);return Math.max(e,r)}function v(t){return[...new Set(t.map(i=>i.srcIdx))].sort((i,e)=>i-e)}function D(t,i){const e=new Map(i.map((r,n)=>[r,n]));return t.map(r=>({...r,srcIdx:e.get(r.srcIdx)??0}))}function g(t){const i=Math.min(Math.max(Math.round(t),2),4096);return i%2===0?i:i-1}var C=t=>Math.min(Math.max(t,-180),180),R=class{constructor(t=c()){this.videoSources=[],this.audioSources=[],this.listeners=new Set,this.transientBase=null,this.getSnapshot=()=>this.history.present,this.subscribe=i=>(this.listeners.add(i),()=>this.listeners.delete(i)),this.history=m(t)}getState(){return this.history.present}emit(){const t=this.history.present;for(const i of this.listeners)i(t)}canUndo(){return z(this.history)}canRedo(){return f(this.history)}undo(){this.transientBase=null,this.history=P(this.history),this.emit()}redo(){this.transientBase=null,this.history=F(this.history),this.emit()}applyMut(t,i=!1){if(i)this.transientBase===null&&(this.transientBase=this.history.present),this.history=y(this.history,t(this.transientBase));else{const e=this.transientBase??this.history.present,r=t(e),n=this.transientBase?{...this.history,present:this.transientBase}:this.history;this.history=d(n,r),this.transientBase=null}this.emit()}registerVideoSource(t){const i=this.videoSources.length;this.videoSources.push(t);const e={srcIdx:i,in:0,out:t.duration};return i===0||this.history.present.clips.length===0?(this.transientBase=null,this.history=m({...c(),clips:[e],canvas:{w:g(t.width),h:g(t.height)},poster:{time:Math.min(1,t.duration/2)}}),this.emit()):this.applyMut(r=>({...r,clips:[...r.clips,e]})),i}registerAudioSource(t){const i=this.audioSources.length;return this.audioSources.push(t),this.applyMut(e=>{const r=M({srcIdx:i,startAt:0,in:0,out:t.duration,volume:1},t.duration,h(e.clips));return{...e,audioClips:[...e.audioClips,r]}}),i}getVideoSource(t){return this.videoSources[t]}getAudioSource(t){return this.audioSources[t]}addClipFromSource(t){const i=this.videoSources[t];i&&this.applyMut(e=>({...e,clips:[...e.clips,{srcIdx:t,in:0,out:i.duration}]}))}splitAtPlayhead(t){this.applyMut(i=>({...i,clips:T(i.clips,t)}))}removeClip(t){this.applyMut(i=>({...i,clips:k(i.clips,t)}))}duplicateClip(t){this.applyMut(i=>({...i,clips:O(i.clips,t)}))}reorderClips(t,i){this.applyMut(e=>({...e,clips:V(e.clips,t,i)}))}trimClip(t,i,e,r){this.applyMut(n=>{const a=n.clips[t];if(!a)return n;const o=this.videoSources[a.srcIdx]?.duration??a.out;return{...n,clips:X(n.clips,t,i,e,o)}},r?.transient)}moveAudioClip(t,i,e){this.applyMut(r=>this.patchAudio(r,t,n=>({...n,startAt:i})),e?.transient)}trimAudioClip(t,i,e,r){this.applyMut(n=>this.patchAudio(n,t,a=>{if(i==="in"){const o=e-a.in;return{...a,in:e,startAt:a.startAt+o}}return{...a,out:e}}),r?.transient)}setAudioVolume(t,i,e){this.applyMut(r=>this.patchAudio(r,t,n=>({...n,volume:i}),!1),e?.transient)}removeAudioClip(t){this.applyMut(i=>({...i,audioClips:i.audioClips.filter((e,r)=>r!==t)}))}patchAudio(t,i,e,r=!0){const n=t.audioClips[i];if(!n)return t;let a=e(n);if(r){const o=this.audioSources[n.srcIdx]?.duration??n.out;a=M(a,o,h(t.clips))}return{...t,audioClips:t.audioClips.map((o,S)=>S===i?a:o)}}setCrop(t,i){this.applyMut(e=>({...e,crop:t}),i?.transient)}clearCrop(){this.applyMut(t=>({...t,crop:void 0}))}setScale(t){this.applyMut(i=>({...i,scale:t}))}clearScale(){this.applyMut(t=>({...t,scale:void 0}))}setRotation(t,i){this.applyMut(e=>({...e,rotation:C(t)}),i?.transient)}rotateBy(t){this.applyMut(i=>{let e=i.rotation+t;return e>180&&(e-=360),e<-180&&(e+=360),{...i,rotation:C(e)}})}flipX(){this.applyMut(t=>({...t,flipX:!t.flipX}))}flipY(){this.applyMut(t=>({...t,flipY:!t.flipY}))}setFilter(t,i,e){this.applyMut(r=>({...r,filters:{...r.filters,[t]:i}}),e?.transient)}setFilters(t,i){this.applyMut(e=>({...e,filters:{...e.filters,...t}}),i?.transient)}setFilterPreset(t){this.applyMut(i=>({...i,filterPreset:t}))}addOverlay(t){this.applyMut(i=>({...i,overlays:[...i.overlays??[],t]}))}updateOverlay(t,i,e){this.applyMut(r=>{const n=r.overlays??[];return n[t]?{...r,overlays:n.map((a,o)=>o===t?{...a,...i}:a)}:r},e?.transient)}removeOverlay(t){this.applyMut(i=>({...i,overlays:(i.overlays??[]).filter((e,r)=>r!==t)}))}patch(t,i){i?.transient?(this.transientBase===null&&(this.transientBase=this.history.present),this.history=y(this.history,{...this.transientBase,...t}),this.emit()):this.commit(t)}commit(t){const i=t?{...this.history.present,...t}:this.history.present,e=this.transientBase;this.transientBase=null,this.history=d(e?{...this.history,present:e}:this.history,i),this.emit()}setKeepAudio(t){this.applyMut(i=>({...i,keepAudio:t}))}setPoster(t){this.applyMut(i=>({...i,poster:{time:Math.max(0,t)}}))}totalDuration(){return h(this.history.present.clips)}contentDuration(){const t=this.history.present;return Y(t.clips,t.audioClips)}locate(t){return x(this.history.present.clips,t)}usedVideoSources(){return v(this.history.present.clips)}getExportPlan(){const t=this.history.present,i=v(t.clips),e=[...new Set(t.audioClips.map(n=>n.srcIdx))].sort((n,a)=>n-a),r=new Map(e.map((n,a)=>[n,a]));return{state:{...t,clips:D(t.clips,i),audioClips:t.audioClips.map(n=>({...n,srcIdx:r.get(n.srcIdx)??0}))},videoSrcOrder:i,audioSrcOrder:e}}validate(){return j.safeParse(this.getExportPlan().state)}reset(t=c()){this.transientBase=null,this.history=m(t),this.emit()}};exports.VideoEditorEngine=R;
|
package/core/dist/engine.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHistory as
|
|
1
|
+
import{createHistory as p,defaultVideoEditState as h,canUndo as S,canRedo as v,undo as C,redo as f,replacePresent as c,pushHistory as l,clampAudioClip as d,totalDuration as u,splitAtOutput as A,removeClip as B,duplicateClip as g,reorderClips as x,trimClipEdge as I,contentDuration as P,locateOutput as V,usedVideoSrcIndices as y,remapSrcIndices as E,VideoEditState as O}from"./chunk-MGKYVYOH.js";function m(t){const s=Math.min(Math.max(Math.round(t),2),4096);return s%2===0?s:s-1}var M=t=>Math.min(Math.max(t,-180),180),w=class{constructor(t=h()){this.videoSources=[],this.audioSources=[],this.listeners=new Set,this.transientBase=null,this.getSnapshot=()=>this.history.present,this.subscribe=s=>(this.listeners.add(s),()=>this.listeners.delete(s)),this.history=p(t)}getState(){return this.history.present}emit(){const t=this.history.present;for(const s of this.listeners)s(t)}canUndo(){return S(this.history)}canRedo(){return v(this.history)}undo(){this.transientBase=null,this.history=C(this.history),this.emit()}redo(){this.transientBase=null,this.history=f(this.history),this.emit()}applyMut(t,s=!1){if(s)this.transientBase===null&&(this.transientBase=this.history.present),this.history=c(this.history,t(this.transientBase));else{const i=this.transientBase??this.history.present,r=t(i),e=this.transientBase?{...this.history,present:this.transientBase}:this.history;this.history=l(e,r),this.transientBase=null}this.emit()}registerVideoSource(t){const s=this.videoSources.length;this.videoSources.push(t);const i={srcIdx:s,in:0,out:t.duration};return s===0||this.history.present.clips.length===0?(this.transientBase=null,this.history=p({...h(),clips:[i],canvas:{w:m(t.width),h:m(t.height)},poster:{time:Math.min(1,t.duration/2)}}),this.emit()):this.applyMut(r=>({...r,clips:[...r.clips,i]})),s}registerAudioSource(t){const s=this.audioSources.length;return this.audioSources.push(t),this.applyMut(i=>{const r=new Set((i.audioClips??[]).map((o,n)=>Number.isInteger(o?.track)&&o.track>=0?o.track:n));let e=0;for(;r.has(e);)e+=1;const a=d({srcIdx:s,track:e,startAt:0,in:0,out:t.duration,volume:1},t.duration,u(i.clips));return{...i,audioClips:[...i.audioClips,a]}}),s}getVideoSource(t){return this.videoSources[t]}getAudioSource(t){return this.audioSources[t]}addClipFromSource(t){const s=this.videoSources[t];s&&this.applyMut(i=>({...i,clips:[...i.clips,{srcIdx:t,in:0,out:s.duration}]}))}splitAtPlayhead(t){this.applyMut(s=>({...s,clips:A(s.clips,t)}))}removeClip(t){this.applyMut(s=>({...s,clips:B(s.clips,t)}))}duplicateClip(t){this.applyMut(s=>({...s,clips:g(s.clips,t)}))}reorderClips(t,s){this.applyMut(i=>({...i,clips:x(i.clips,t,s)}))}trimClip(t,s,i,r){this.applyMut(e=>{const a=e.clips[t];if(!a)return e;const o=this.videoSources[a.srcIdx]?.duration??a.out;return{...e,clips:I(e.clips,t,s,i,o)}},r?.transient)}moveAudioClip(t,s,i){this.applyMut(r=>this.patchAudio(r,t,e=>({...e,startAt:s})),i?.transient)}trimAudioClip(t,s,i,r){this.applyMut(e=>this.patchAudio(e,t,a=>{if(s==="in"){const o=i-a.in;return{...a,in:i,startAt:a.startAt+o}}return{...a,out:i}}),r?.transient)}setAudioVolume(t,s,i){this.applyMut(r=>this.patchAudio(r,t,e=>({...e,volume:s}),!1),i?.transient)}removeAudioClip(t){this.applyMut(s=>({...s,audioClips:s.audioClips.filter((i,r)=>r!==t)}))}patchAudio(t,s,i,r=!0){const e=t.audioClips[s];if(!e)return t;let a=i(e);if(r){const o=this.audioSources[e.srcIdx]?.duration??e.out;a=d(a,o,u(t.clips))}return{...t,audioClips:t.audioClips.map((o,n)=>n===s?a:o)}}setCrop(t,s){this.applyMut(i=>({...i,crop:t}),s?.transient)}clearCrop(){this.applyMut(t=>({...t,crop:void 0}))}setScale(t){this.applyMut(s=>({...s,scale:t}))}clearScale(){this.applyMut(t=>({...t,scale:void 0}))}setRotation(t,s){this.applyMut(i=>({...i,rotation:M(t)}),s?.transient)}rotateBy(t){this.applyMut(s=>{let i=s.rotation+t;return i>180&&(i-=360),i<-180&&(i+=360),{...s,rotation:M(i)}})}flipX(){this.applyMut(t=>({...t,flipX:!t.flipX}))}flipY(){this.applyMut(t=>({...t,flipY:!t.flipY}))}setFilter(t,s,i){this.applyMut(r=>({...r,filters:{...r.filters,[t]:s}}),i?.transient)}setFilters(t,s){this.applyMut(i=>({...i,filters:{...i.filters,...t}}),s?.transient)}setFilterPreset(t){this.applyMut(s=>({...s,filterPreset:t}))}addOverlay(t){this.applyMut(s=>({...s,overlays:[...s.overlays??[],t]}))}updateOverlay(t,s,i){this.applyMut(r=>{const e=r.overlays??[];return e[t]?{...r,overlays:e.map((a,o)=>o===t?{...a,...s}:a)}:r},i?.transient)}removeOverlay(t){this.applyMut(s=>({...s,overlays:(s.overlays??[]).filter((i,r)=>r!==t)}))}patch(t,s){s?.transient?(this.transientBase===null&&(this.transientBase=this.history.present),this.history=c(this.history,{...this.transientBase,...t}),this.emit()):this.commit(t)}commit(t){const s=t?{...this.history.present,...t}:this.history.present,i=this.transientBase;this.transientBase=null,this.history=i?l({...this.history,present:i},s):l(this.history,s),this.emit()}setKeepAudio(t){this.applyMut(s=>({...s,keepAudio:t}))}setPoster(t){this.applyMut(s=>({...s,poster:{time:Math.max(0,t)}}))}totalDuration(){return u(this.history.present.clips)}contentDuration(){const t=this.history.present;return P(t.clips,t.audioClips,t.overlays)}locate(t){return V(this.history.present.clips,t)}usedVideoSources(){return y(this.history.present.clips)}getExportPlan(){const t=this.history.present,s=y(t.clips),i=[...new Set(t.audioClips.map(e=>e.srcIdx))].sort((e,a)=>e-a),r=new Map(i.map((e,a)=>[e,a]));return{state:{...t,clips:E(t.clips,s),audioClips:t.audioClips.map(e=>({...e,srcIdx:r.get(e.srcIdx)??0}))},videoSrcOrder:s,audioSrcOrder:i}}validate(){return O.safeParse(this.getExportPlan().state)}reset(t=h()){this.transientBase=null,this.history=p(t),this.emit()}};export{w as VideoEditorEngine};
|