@tikagent/video-editor-cli 0.0.0-stage → 1.5.0-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +82 -0
- package/THIRD-PARTY-NOTICES.md +21 -0
- package/dist/bin/tik-video-editor-cli.js +2 -0
- package/dist/lib/asr.js +1 -0
- package/dist/lib/audio.js +1 -0
- package/dist/lib/auth.js +1 -0
- package/dist/lib/browser-zip.js +1 -0
- package/dist/lib/browser.js +1 -0
- package/dist/lib/cli.js +1 -0
- package/dist/lib/doctor.js +1 -0
- package/dist/lib/download.js +1 -0
- package/dist/lib/export-progress.js +1 -0
- package/dist/lib/import-video.js +1 -0
- package/dist/lib/local.js +1 -0
- package/dist/lib/media.js +1 -0
- package/dist/lib/operation.js +1 -0
- package/dist/lib/otlp.js +1 -0
- package/dist/lib/preset.js +1 -0
- package/dist/lib/processes.js +1 -0
- package/dist/lib/self.js +1 -0
- package/dist/lib/service-urls.js +1 -0
- package/dist/lib/storage.js +1 -0
- package/dist/lib/telemetry.js +1 -0
- package/dist/runtime/LICENSE +21 -0
- package/dist/runtime/analyze.js +1 -0
- package/dist/runtime/app.js +1 -0
- package/dist/runtime/cli/lib/browser-zip.js +1 -0
- package/dist/runtime/cli/lib/browser.js +1 -0
- package/dist/runtime/cli/lib/otlp.js +1 -0
- package/dist/runtime/cli/lib/processes.js +1 -0
- package/dist/runtime/cli/lib/telemetry.js +1 -0
- package/dist/runtime/export-audio.js +1 -0
- package/dist/runtime/export-cache.js +1 -0
- package/dist/runtime/export-encoder.js +1 -0
- package/dist/runtime/export-save.js +1 -0
- package/dist/runtime/export-worker.js +1 -0
- package/dist/runtime/favicon.svg +14 -0
- package/dist/runtime/i18n.js +1 -0
- package/dist/runtime/icons/favicon-32.png +0 -0
- package/dist/runtime/icons/tik-logo.png +0 -0
- package/dist/runtime/index.html +320 -0
- package/dist/runtime/library/README.md +12 -0
- package/dist/runtime/library/elements/bokeh-drift.svg +19 -0
- package/dist/runtime/library/elements/light-leak-cool.svg +16 -0
- package/dist/runtime/library/elements/light-leak-warm.svg +22 -0
- package/dist/runtime/library/elements/vhs-scanlines.svg +18 -0
- package/dist/runtime/library/elements/vignette-frame.svg +14 -0
- package/dist/runtime/library/fonts//351/230/277/351/207/214/345/267/264/345/267/264/346/231/256/346/203/240/344/275/223-/344/270/255/351/273/221.woff2 +0 -0
- package/dist/runtime/library/fonts//351/230/277/351/207/214/345/267/264/345/267/264/346/231/256/346/203/240/344/275/223-/345/270/270/350/247/204.woff2 +0 -0
- package/dist/runtime/library/fonts//351/230/277/351/207/214/345/267/264/345/267/264/346/231/256/346/203/240/344/275/223-/347/262/227/344/275/223.woff2 +0 -0
- package/dist/runtime/library/sfx/README.md +13 -0
- package/dist/runtime/library/svg/arrow-bounce.svg +18 -0
- package/dist/runtime/library/svg/arrow-scribble.svg +13 -0
- package/dist/runtime/library/svg/burst-lines.svg +30 -0
- package/dist/runtime/library/svg/checkmark-success.svg +19 -0
- package/dist/runtime/library/svg/confetti-burst.svg +23 -0
- package/dist/runtime/library/svg/countdown-ring.svg +92 -0
- package/dist/runtime/library/svg/equalizer.svg +18 -0
- package/dist/runtime/library/svg/glow-orbs.svg +29 -0
- package/dist/runtime/library/svg/heart-pop.svg +26 -0
- package/dist/runtime/library/svg/loading-dots.svg +16 -0
- package/dist/runtime/library/svg/location-pin.svg +25 -0
- package/dist/runtime/library/svg/lower-third.svg +17 -0
- package/dist/runtime/library/svg/new-badge.svg +18 -0
- package/dist/runtime/library/svg/progress-bar.svg +16 -0
- package/dist/runtime/library/svg/radial-pulse.svg +19 -0
- package/dist/runtime/library/svg/rating-stars.svg +25 -0
- package/dist/runtime/library/svg/rec-indicator.svg +41 -0
- package/dist/runtime/library/svg/sparkles.svg +17 -0
- package/dist/runtime/library/svg/speech-bubble.svg +23 -0
- package/dist/runtime/library/svg/subscribe-bell.svg +29 -0
- package/dist/runtime/library/svg/subscribe-pill.svg +22 -0
- package/dist/runtime/library/svg/swipe-up.svg +46 -0
- package/dist/runtime/library/svg/underline-swoosh.svg +15 -0
- package/dist/runtime/manifest.json +40 -0
- package/dist/runtime/meter-worklet.js +1 -0
- package/dist/runtime/optimized-encoder-worker.js +1 -0
- package/dist/runtime/optimized-export.js +1 -0
- package/dist/runtime/paths.js +1 -0
- package/dist/runtime/project-store.js +1 -0
- package/dist/runtime/ruler-worker.js +1 -0
- package/dist/runtime/server.js +1 -0
- package/dist/runtime/style.css +2126 -0
- package/dist/runtime/timeline.js +1 -0
- package/dist/runtime/waveform.js +1 -0
- package/package.json +36 -4
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(t){const r=function(){"use strict";const t=1e-9,r=t=>"audio"===t.kind?"audio":"video",i=t=>t.start+t.duration,e=(r,e)=>r.start<i(e)-t&&e.start<i(r)-t,s=t=>"string"==typeof t&&/^[VA][1-9]\d*$/.test(t)&&Number.isSafeInteger(+t.slice(1)),n=t=>"A"===t[0]?"audio":"video";function a(t,r){const i="audio"===r?"A":"V",e=t.reduce((t,i)=>i.kind===r?Math.max(t,+i.id.slice(1)):t,0)+1;if(!Number.isSafeInteger(e))throw new Error("Track identifier exhausted");return i+e}function o(t,r,i){t.tracks||=[];const e={id:a(t.tracks,r),kind:r};let s=t.tracks.findIndex(t=>t.id===i);return s<0&&(s="video"===r?t.tracks.findIndex(t=>"audio"===t.kind):t.tracks.length),s<0&&(s=t.tracks.length),t.tracks.splice(s,0,e),e.id}return{EPS:t,kindOf:r,overlaps:e,normalize:function(a){if(!a||!Array.isArray(a.clips))return a;const d=[],c=new Set;if(void 0!==a.tracks&&!Array.isArray(a.tracks))throw new Error("tracks must be an array");for(const t of a.tracks||[]){if(!t||!s(t.id)||t.kind!==n(t.id)||c.has(t.id))throw new Error("Invalid or duplicate track");if(null!=t.name&&"string"!=typeof t.name)throw new Error("Track name must be a string");c.add(t.id);const r={id:t.id,kind:t.kind};"string"==typeof t.name&&t.name.trim()&&(r.name=t.name.trim()),d.push(r)}const l=new Set;for(const t of a.clips){if(!s(t.track)||n(t.track)!==r(t))throw new Error(`Invalid track for clip ${t.id||"?"}`);if(!Number.isFinite(t.start)||t.start<0||!Number.isFinite(t.duration)||t.duration<=0)throw new Error(`Invalid timing for clip ${t.id||"?"}`);c.has(t.track)||l.add(t.track)}for(const t of a.disabledTracks||[])s(t)&&!c.has(t)&&l.add(t);const f=[...l].sort((t,r)=>t[0]===r[0]?"V"===t[0]?+r.slice(1)-+t.slice(1):+t.slice(1)-+r.slice(1):"V"===t[0]?-1:1);for(const t of f){const r=n(t);let i=d.findIndex(i=>"video"===r&&("audio"===i.kind||+i.id.slice(1)<+t.slice(1)));i<0&&(i=d.length),d.splice(i,0,{id:t,kind:r}),c.add(t)}if(d.some((t,r)=>"video"===t.kind&&d.slice(0,r).some(t=>"audio"===t.kind)))throw new Error("Video tracks must precede audio tracks");a.tracks=d;const k=new Set(a.disabledTracks||[]),u=new Map;for(const t of a.clips)u.has(t.track)||u.set(t.track,[]),u.get(t.track).push(t);for(const r of[...d]){const s=(u.get(r.id)||[]).sort((t,r)=>t.start-r.start);let n=[];const d=[r.id];for(const c of s){n=n.filter(r=>i(r.clip)>c.start+t);let s=0;for(const t of n)e(c,t.clip)&&(s=Math.max(s,t.level+1));for(;d.length<=s;){const t=o(a,r.kind,"video"===r.kind?d[d.length-1]:void 0);d.push(t),k.has(r.id)&&k.add(t)}c.track=d[s],n.push({clip:c,level:s})}}return(void 0!==a.disabledTracks||k.size)&&(a.disabledTracks=[...k].filter(t=>c.has(t)||d.some(r=>r.id===t))),a},insertTrack:o,firstGap:function(r,e,s,n,a=new Set){let o=Math.max(0,s);const d=r.filter(t=>t.track===e&&!a.has(t.id)).sort((t,r)=>t.start-r.start);for(const r of d){if(o+n<=r.start+t)break;o<i(r)-t&&(o=i(r))}return o},freeTrack:function(t,r,i,s,n,a=new Set){const d=r=>!t.clips.some(t=>t.track===r&&!a.has(t.id)&&e(t,{start:i,duration:s}));if(t.tracks.some(t=>t.id===n&&t.kind===r)&&d(n))return n;const c=t.tracks.find(i=>i.kind===r&&!(t.disabledTracks||[]).includes(i.id)&&d(i.id));return c?c.id:o(t,r)}}}();"object"==typeof module&&module.exports?module.exports=r:t.FableCutTimeline=r}("object"==typeof globalThis?globalThis:this);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("node:fs").promises,r=require("node:path"),s=require("node:crypto"),{spawn:t}=require("node:child_process"),{localMedia:a,command:o}=require("./export-cache");function i(e,r){return Object.assign(new Error(e),{status:r})}async function n(e){const r=JSON.parse(await o("ffprobe",["-v","error","-select_streams","a:0","-show_entries","stream=channels","-of","json",e])),s=r.streams?.[0]?.channels;if(!Number.isInteger(s)||s<1)throw i("source has no audio stream",422);return s}module.exports={Waveforms:class{constructor({libraryDir:e}){this.libraryDir=e,this.jobs=new Map,this.queue=Promise.resolve()}async channels(e,r){return n(await a(e,this.libraryDir,r))}async peaks(o,c){const u=await a(o,this.libraryDir,c),l=await e.stat(u),f=s.createHash("sha256").update(`1|${u}|${l.size}|${l.mtimeMs}`).digest("hex"),h=r.join(o.analysisDir,"waveforms",f+".json");try{return JSON.parse(await e.readFile(h,"utf8"))}catch{}if(!this.jobs.has(h)){const s=this.queue.then(async()=>{const s=await function(e,r){return new Promise((s,a)=>{const o=t("ffmpeg",["-v","error","-nostdin","-i",e,"-map","0:a:0","-af","aresample=8000:async=1:first_pts=0","-f","s16le","-acodec","pcm_s16le","-"],{stdio:["ignore","pipe","pipe"],windowsHide:!0}),n=2*r,c=Array.from({length:r},()=>[]),u=new Array(r).fill(0);let l,f=Buffer.alloc(0),h=0,m="";const d=()=>{for(let e=0;e<r;e++)c[e].push(Math.min(255,Math.round(u[e]/32768*255))),u[e]=0},p=setTimeout(()=>{l=new Error("ffmpeg waveform timed out"),o.kill("SIGKILL")},6e5);o.stdout.on("data",e=>{const s=f.length?Buffer.concat([f,e]):e,t=s.length-s.length%n;for(let e=0;e<t;e+=n){for(let t=0;t<r;t++){const r=Math.abs(s.readInt16LE(e+2*t));r>u[t]&&(u[t]=r)}++h%160==0&&d()}f=Buffer.from(s.subarray(t))}),o.stderr.on("data",e=>{m=(m+e).slice(-4e3)}),o.on("error",e=>{l=e}),o.on("close",e=>(clearTimeout(p),l||0!==e?a(l||new Error(m||"ffmpeg waveform failed")):h?(h%160&&d(),void s({version:1,peaksPerSecond:50,duration:h/8e3,channels:r,peaks:c.map(e=>Buffer.from(Uint8Array.from(e)).toString("base64"))})):a(i("source has no decodable audio",422))))})}(u,await n(u));await e.mkdir(r.dirname(h),{recursive:!0});const a=`${h}.${process.pid}.tmp`;return await e.writeFile(a,JSON.stringify(s)),await e.rename(a,h),s}).finally(()=>this.jobs.delete(h));this.queue=s.catch(()=>{}),this.jobs.set(h,s)}return this.jobs.get(h)}},PEAKS_PER_SECOND:50,SAMPLE_RATE:8e3};
|
package/package.json
CHANGED
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tikagent/video-editor-cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.5.0-preview.2",
|
|
4
|
+
"description": "Local video editing, on-demand preview, and headless",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"type": "commonjs",
|
|
7
|
+
"bin": {
|
|
8
|
+
"tik-video-editor-cli": "dist/bin/tik-video-editor-cli.js"
|
|
9
|
+
},
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"registry": "https://registry.npmjs.org/",
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/",
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"THIRD-PARTY-NOTICES.md"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"next": "node scripts/next-version.js",
|
|
21
|
+
"sync-runtime": "node scripts/pack-runtime.js",
|
|
22
|
+
"build": "node scripts/build-package.js",
|
|
23
|
+
"prepare": "node -e \"const fs=require('node:fs');const {execFileSync}=require('node:child_process');if(fs.existsSync('lib/cli.js')){execFileSync(process.execPath,['scripts/build-package.js'],{stdio:'inherit'})}else{for(const file of ['dist/bin/tik-video-editor-cli.js','dist/runtime/server.js']){if(!fs.existsSync(file)){console.error('Incomplete CLI distribution: '+file);process.exit(1)}}}\""
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=18"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"tik",
|
|
30
|
+
"video-editor",
|
|
31
|
+
"cli",
|
|
32
|
+
"headless-export"
|
|
33
|
+
],
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"javascript-obfuscator": "5.8.1",
|
|
36
|
+
"terser": "5.51.2"
|
|
37
|
+
}
|
|
38
|
+
}
|
package/README.md
DELETED