make do without tauri and test vid

s 0f44589 ws that starts to work
s 6df44a1 first video
s dacb6cd click to time
s 7831ae4 remove tauri
s 2d18c9b concurrently and frontmatter
s dc43284 add new video and test
s 0dd03af fix for youtube format and markdown compat
s c30fa38 remove placeholder mds
s d8f1a54 remove images from git
This commit is contained in:
polv committed 2026-02-01 18:41:23 +07:00
1 parent fc58e68ad7
commit 00033e0341
38 files changed
+4897 -6257

No files matched your search

+2
View File
@@ -0,0 +1,2 @@
**/*.png
**/*.jpg
+12 -37
View File
@@ -10,16 +10,15 @@ export default defineConfig({
// https://vitepress.dev/reference/default-theme-config // https://vitepress.dev/reference/default-theme-config
nav: [ nav: [
{ text: 'Home', link: '/' }, { text: 'Home', link: '/' },
{ text: 'Examples', link: '/markdown-examples' }
], ],
sidebar: [ sidebar: [
{ {
text: 'Examples', text: 'Preview',
items: [ // items: [
{ text: 'Markdown Examples', link: '/markdown-examples' }, // { text: 'Markdown Examples', link: '/markdown-examples' },
{ text: 'Runtime API Examples', link: '/api-examples' } // { text: 'Runtime API Examples', link: '/api-examples' }
] // ]
} }
], ],
@@ -29,38 +28,14 @@ export default defineConfig({
}, },
vite: { vite: {
clearScreen: false, clearScreen: false,
server: { server: {
// make sure this port matches the devUrl port in tauri.conf.json file proxy: {
port: 5173, '/socket': {
// Tauri expects a fixed port, fail if that port is not available target: 'ws://localhost:8080',
strictPort: true, ws: true,
// if the host Tauri is expecting is set, use it rewriteWsOrigin: true,
host: TAURI_HOST || false, }
hmr: TAURI_HOST
? {
protocol: 'ws',
host: TAURI_HOST,
port: 1421,
}
: undefined,
watch: {
// tell vite to ignore watching `src-tauri`
ignored: ['**/src-tauri/**'],
}, },
}, },
// Env variables starting with the item of `envPrefix` will be exposed in tauri's source code through `import.meta.env`.
envPrefix: ['VITE_', 'TAURI_ENV_*'],
build: {
// Tauri uses Chromium on Windows and WebKit on macOS and Linux
target:
process.env.TAURI_ENV_PLATFORM == 'windows'
? 'chrome105'
: 'safari13',
// don't minify for debug builds
minify: !process.env.TAURI_ENV_DEBUG ? 'esbuild' : false,
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_ENV_DEBUG,
},
} }
}) })
+82 -44
View File
@@ -1,69 +1,107 @@
<template> <template>
<form @submit="onSubmit"> <form @submit="onSubmit">
<input type="text" v-model="q"> <input type="text" v-model="q" />
<button type="submit">Submit</button> <button type="submit">Submit</button>
<video controls ref="video" :src="videoSrc" @loadeddata="onVideoLoad" @seeked="onSeeked"></video> <video
</form> v-if="videoSrc"
controls
ref="video"
:src="videoSrc"
@loadeddata="onVideoLoad"
></video>
</form>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, useTemplateRef } from 'vue' import { ref, useTemplateRef } from "vue";
import { invoke } from "@tauri-apps/api/core";
import { listen } from '@tauri-apps/api/event';
const q = ref('') const q = ref("");
const videoSrc = ref('') const videoSrc = ref("");
const videoEl = useTemplateRef('video') const videoEl = useTemplateRef("video");
function onSubmit(ev: SubmitEvent) { function onSubmit(ev: SubmitEvent) {
ev.preventDefault() ev.preventDefault();
if (!q.value) return;
if (!q.value) return videoSrc.value = "/" + q.value;
videoSrc.value = '/' + q.value
}
interface SeekQEvent {
t: number
} }
function onVideoLoad() { function onVideoLoad() {
invoke('download_q', { q: q.value.replace(/\.[a-z0-9]+$/, '') }) const ws = new WebSocket("ws://localhost:8080");
listen<SeekQEvent>('seek_q', (ev) => { const vid = videoEl.value!;
videoEl.value!.currentTime = ev.payload.t;
}) const q_value = q.value;
ws.onmessage = (ev) => {
const { name, ts } = JSON.parse(ev.data);
switch (name) {
case "seek_q_ts": (async () => {
for (const t of ts) {
const b = await new Promise<Blob | null>((resolve) => {
vid.onseeked = () => {
const v = videoEl.value!;
let c = document.createElement("canvas");
c.height = v.videoHeight || parseInt(v.style.height);
c.width = v.videoWidth || parseInt(v.style.width);
const ctx = c.getContext("2d")!;
ctx.drawImage(v, 0, 0);
ws.send(
JSON.stringify({
name: "timed_q",
q: q_value,
t,
}),
);
c.toBlob((b) => resolve(b));
}
if (typeof t === 'string'){
const [min, sec] = t.split('_');
vid.currentTime = parseInt(min) * 60 + parseInt(sec) + 1;
} else {
vid.currentTime = t;
}
})
if (b) ws.send(b);
vid.onseeked = null;
}
ws.send(JSON.stringify({ name: 'done', q: q_value }));
})(); break;
}
};
ws.onopen = async () => {
ws.send(
JSON.stringify({
name: "download_q",
q: q_value,
duration: vid.duration,
}),
);
};
ws.onclose = () => {
};
} }
function onSeeked() {
const v = videoEl.value!
let c = document.createElement('canvas');
c.height = v.videoHeight || parseInt(v.style.height);
c.width = v.videoWidth || parseInt(v.style.width);
const ctx = c.getContext('2d')!;
ctx.drawImage(v, 0, 0);
invoke('timed_q', { q: q.value.replace(/\.[a-z0-9]+$/, ''), t: videoEl.value!.currentTime, data: c.toDataURL('image/png') })
}
</script> </script>
<style scoped> <style scoped>
form { form {
margin: 0.5em 0; margin: 0.5em 0;
} }
form * { form * {
border: 1px solid gray; border: 1px solid gray;
} }
button { button {
margin-left: 0.5em; margin-left: 0.5em;
cursor: pointer; cursor: pointer;
padding: 0 0.5em; padding: 0 0.5em;
border-radius: 5px; border-radius: 5px;
} }
</style>
</style>
@@ -0,0 +1,50 @@
<template>
<Teleport to="body">
<video v-if="videoURL" controls :src="videoURL" ref="video">
Hello
</video>
</Teleport>
</template>
<script setup lang="ts">
import { useData } from 'vitepress'
import { computed, useTemplateRef, watch } from 'vue'
const { frontmatter } = useData<{ video?: string }>()
const videoURL = computed(() => frontmatter.value?.video)
const videoEl = useTemplateRef("video");
function setImgClick(){
const v = videoEl.value;
if (!v) {
return;
}
document.querySelectorAll('img').forEach((img) => {
const [, min, sec] = /^(\d+)\:(\d+)$/.exec(img.alt) || []
const t = min && sec ? parseInt(min) * 60 + parseInt(sec) : null
if (!t) return;
img.onclick = () => {
v.currentTime = t
}
})
}
watch(videoURL, () => {
setImgClick()
})
setTimeout(() => setImgClick(), 500)
</script>
<style scoped>
video {
width: 750px;
overflow: visible;
position: fixed;
bottom: 10px;
left: 10px;
z-index: 100;
}
</style>
+8
View File
@@ -1,9 +1,17 @@
import type { Theme } from "vitepress"; import type { Theme } from "vitepress";
import DefaultTheme from "vitepress/theme"; import DefaultTheme from "vitepress/theme";
import { h } from 'vue'
import Downloader from "./components/Downloader.vue"; import Downloader from "./components/Downloader.vue";
import Video from './components/Video.vue'
export default { export default {
extends: DefaultTheme, extends: DefaultTheme,
Layout() {
return h(DefaultTheme.Layout, null, {
'sidebar-nav-after': () => h(Video)
})
},
enhanceApp({ app }) { enhanceApp({ app }) {
// register your custom global components // register your custom global components
app.component("Downloader", Downloader); app.component("Downloader", Downloader);
@@ -0,0 +1,948 @@
---
interval: 2
video: '/15萬緬甸人在台灣的背後,是一段顛沛流離的故事 [n0qycF8rvVU].mp4'
---
![0:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_02.png)
![0:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_04.png)
![0:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_06.png)
![0:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_08.png)
![0:10](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_10.png)
![0:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_12.png)
![0:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_14.png)
![0:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_16.png)
![0:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_18.png)
![0:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_20.png)
![0:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_22.png)
![0:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_24.png)
![0:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_26.png)
![0:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_28.png)
![0:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_30.png)
![0:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_32.png)
![0:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_34.png)
![0:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_36.png)
![0:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_38.png)
![0:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_40.png)
![0:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_42.png)
![0:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_44.png)
![0:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_46.png)
![0:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_48.png)
![0:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_50.png)
![0:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_54.png)
![0:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_56.png)
![0:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/0_58.png)
![1:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_00.png)
![1:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_02.png)
![1:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_04.png)
![1:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_06.png)
![1:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_14.png)
![1:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_16.png)
![1:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_18.png)
![1:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_20.png)
![1:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_22.png)
![1:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_24.png)
![1:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_28.png)
![1:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_30.png)
![1:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_32.png)
![1:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_34.png)
![1:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_36.png)
![1:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_40.png)
![1:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_42.png)
![1:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_44.png)
![1:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_46.png)
![1:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_48.png)
![1:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_50.png)
![1:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_52.png)
![1:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_54.png)
![1:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/1_58.png)
![2:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_00.png)
![2:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_02.png)
![2:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_04.png)
![2:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_06.png)
![2:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_12.png)
![2:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_14.png)
![2:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_16.png)
![2:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_18.png)
![2:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_20.png)
![2:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_22.png)
![2:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_26.png)
![2:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_28.png)
![2:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_30.png)
![2:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_32.png)
![2:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_34.png)
![2:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_36.png)
![2:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_38.png)
![2:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_42.png)
![2:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_44.png)
![2:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_46.png)
![2:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_48.png)
![2:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_50.png)
![2:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_52.png)
![2:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_56.png)
![2:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/2_58.png)
![3:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_00.png)
![3:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_02.png)
![3:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_04.png)
![3:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_06.png)
![3:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_08.png)
![3:10](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_10.png)
![3:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_12.png)
![3:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_14.png)
![3:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_16.png)
![3:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_18.png)
![3:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_20.png)
![3:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_22.png)
![3:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_24.png)
![3:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_26.png)
![3:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_28.png)
![3:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_30.png)
![3:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_32.png)
![3:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_36.png)
![3:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_38.png)
![3:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_40.png)
![3:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_42.png)
![3:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_44.png)
![3:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_48.png)
![3:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_50.png)
![3:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_52.png)
![3:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_54.png)
![3:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_56.png)
![3:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/3_58.png)
![4:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_00.png)
![4:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_02.png)
![4:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_04.png)
![4:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_06.png)
![4:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_08.png)
![4:10](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_10.png)
![4:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_12.png)
![4:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_14.png)
![4:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_16.png)
![4:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_18.png)
![4:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_22.png)
![4:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_24.png)
![4:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_26.png)
![4:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_32.png)
![4:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_34.png)
![4:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_38.png)
![4:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_40.png)
![4:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_44.png)
![4:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_46.png)
![4:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_48.png)
![4:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_52.png)
![4:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_54.png)
![4:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_56.png)
![4:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/4_58.png)
![5:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_00.png)
![5:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_02.png)
![5:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_04.png)
![5:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_06.png)
![5:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_08.png)
![5:10](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_10.png)
![5:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_12.png)
![5:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_16.png)
![5:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_18.png)
![5:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_20.png)
![5:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_22.png)
![5:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_24.png)
![5:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_26.png)
![5:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_28.png)
![5:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_30.png)
![5:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_32.png)
![5:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_34.png)
![5:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_36.png)
![5:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_38.png)
![5:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_40.png)
![5:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_42.png)
![5:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_44.png)
![5:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_48.png)
![5:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_50.png)
![5:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_52.png)
![5:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_54.png)
![5:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_56.png)
![5:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/5_58.png)
![6:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_00.png)
![6:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_02.png)
![6:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_04.png)
![6:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_06.png)
![6:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_08.png)
![6:10](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_10.png)
![6:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_12.png)
![6:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_14.png)
![6:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_16.png)
![6:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_20.png)
![6:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_22.png)
![6:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_24.png)
![6:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_26.png)
![6:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_28.png)
![6:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_30.png)
![6:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_32.png)
![6:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_34.png)
![6:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_36.png)
![6:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_38.png)
![6:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_40.png)
![6:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_42.png)
![6:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_44.png)
![6:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_46.png)
![6:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_48.png)
![6:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_50.png)
![6:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_52.png)
![6:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_54.png)
![6:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_56.png)
![6:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/6_58.png)
![7:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_02.png)
![7:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_04.png)
![7:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_06.png)
![7:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_08.png)
![7:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_12.png)
![7:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_14.png)
![7:16](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_16.png)
![7:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_18.png)
![7:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_20.png)
![7:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_22.png)
![7:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_24.png)
![7:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_26.png)
![7:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_28.png)
![7:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_30.png)
![7:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_32.png)
![7:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_34.png)
![7:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_36.png)
![7:38](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_38.png)
![7:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_40.png)
![7:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_42.png)
![7:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_44.png)
![7:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_46.png)
![7:48](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_48.png)
![7:50](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_50.png)
![7:52](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_52.png)
![7:54](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_54.png)
![7:56](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_56.png)
![7:58](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/7_58.png)
![8:00](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_00.png)
![8:02](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_02.png)
![8:04](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_04.png)
![8:06](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_06.png)
![8:08](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_08.png)
![8:10](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_10.png)
![8:12](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_12.png)
![8:14](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_14.png)
![8:18](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_18.png)
![8:20](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_20.png)
![8:22](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_22.png)
![8:24](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_24.png)
![8:26](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_26.png)
![8:28](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_28.png)
![8:30](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_30.png)
![8:32](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_32.png)
![8:34](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_34.png)
![8:36](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_36.png)
![8:40](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_40.png)
![8:42](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_42.png)
![8:44](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_44.png)
![8:46](./15萬緬甸人在台灣的背後,是一段顛沛流離的故事/8_46.png)
-49
View File
@@ -1,49 +0,0 @@
---
outline: deep
---
# Runtime API Examples
This page demonstrates usage of some of the runtime APIs provided by VitePress.
The main `useData()` API can be used to access site, theme, and page data for the current page. It works in both `.md` and `.vue` files:
```md
<script setup>
import { useData } from 'vitepress'
const { theme, page, frontmatter } = useData()
</script>
## Results
### Theme Data
<pre>{{ theme }}</pre>
### Page Data
<pre>{{ page }}</pre>
### Page Frontmatter
<pre>{{ frontmatter }}</pre>
```
<script setup>
import { useData } from 'vitepress'
const { site, theme, page, frontmatter } = useData()
</script>
## Results
### Theme Data
<pre>{{ theme }}</pre>
### Page Data
<pre>{{ page }}</pre>
### Page Frontmatter
<pre>{{ frontmatter }}</pre>
## More
Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata).
+4 -16
View File
@@ -5,22 +5,10 @@ layout: home
hero: hero:
name: "yt2press" name: "yt2press"
text: "video to vitepress" text: "video to vitepress"
tagline: My great project tagline
actions:
- theme: brand
text: Markdown Examples
link: /markdown-examples
- theme: alt
text: API Examples
link: /api-examples
features:
- title: Feature A
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
- title: Feature B
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
- title: Feature C
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
--- ---
<Downloader /> <Downloader />
- [【剥茧The Truth Within】EP02](/qVVhBGT0K7Y)
- [15萬緬甸人在台灣的背後,是一段顛沛流離的故事](/15萬緬甸人在台灣的背後,是一段顛沛流離的故事)
- [美国突袭委内瑞拉,真的是为了抢那点劣质石油吗?](/美国突袭委内瑞拉,真的是为了抢那点劣质石油吗?)
-85
View File
@@ -1,85 +0,0 @@
# Markdown Extension Examples
This page demonstrates some of the built-in markdown extensions provided by VitePress.
## Syntax Highlighting
VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting:
**Input**
````md
```js{4}
export default {
data () {
return {
msg: 'Highlighted!'
}
}
}
```
````
**Output**
```js{4}
export default {
data () {
return {
msg: 'Highlighted!'
}
}
}
```
## Custom Containers
**Input**
```md
::: info
This is an info box.
:::
::: tip
This is a tip.
:::
::: warning
This is a warning.
:::
::: danger
This is a dangerous warning.
:::
::: details
This is a details block.
:::
```
**Output**
::: info
This is an info box.
:::
::: tip
This is a tip.
:::
::: warning
This is a warning.
:::
::: danger
This is a dangerous warning.
:::
::: details
This is a details block.
:::
## More
Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).
+873 -290
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+13 -10
View File
@@ -1,22 +1,25 @@
{ {
"name": "yt2press", "name": "yt2press",
"version": "1.0.0", "version": "1.0.0",
"main": "index.js", "main": "server.js",
"type": "module",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2", "gray-matter": "^4.0.3",
"@tauri-apps/plugin-opener": "^2"
},
"devDependencies": {
"@tauri-apps/cli": "^2.9.6",
"@types/node": "^20.19.30",
"vite": "^7.3.1", "vite": "^7.3.1",
"vitepress": "2.0.0-alpha.15", "vitepress": "2.0.0-alpha.15",
"vue": "^3.5.27" "vue": "^3.5.27",
"ws": "^8.19.0"
},
"devDependencies": {
"@types/node": "^20.19.30",
"@types/ws": "^8.18.1",
"concurrently": "^9.2.1"
}, },
"scripts": { "scripts": {
"start": "tauri dev", "dev": "concurrently 'pnpm:dev:*'",
"dev": "vitepress dev docs", "dev:server": "node server.js",
"dev:vite": "vitepress dev docs",
"build": "vitepress build docs", "build": "vitepress build docs",
"preview": "vitepress preview docs" "preview": "vitepress preview docs"
} }
+300 -143
View File
@@ -8,19 +8,9 @@ importers:
.: .:
dependencies: dependencies:
'@tauri-apps/api': gray-matter:
specifier: ^2 specifier: ^4.0.3
version: 2.9.1 version: 4.0.3
'@tauri-apps/plugin-opener':
specifier: ^2
version: 2.5.3
devDependencies:
'@tauri-apps/cli':
specifier: ^2.9.6
version: 2.9.6
'@types/node':
specifier: ^20.19.30
version: 20.19.30
vite: vite:
specifier: ^7.3.1 specifier: ^7.3.1
version: 7.3.1(@types/node@20.19.30) version: 7.3.1(@types/node@20.19.30)
@@ -30,6 +20,19 @@ importers:
vue: vue:
specifier: ^3.5.27 specifier: ^3.5.27
version: 3.5.27 version: 3.5.27
ws:
specifier: ^8.19.0
version: 8.19.0
devDependencies:
'@types/node':
specifier: ^20.19.30
version: 20.19.30
'@types/ws':
specifier: ^8.18.1
version: 8.18.1
concurrently:
specifier: ^9.2.1
version: 9.2.1
packages: packages:
@@ -507,83 +510,6 @@ packages:
'@standard-schema/spec@1.1.0': '@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
'@tauri-apps/api@2.9.1':
resolution: {integrity: sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==}
'@tauri-apps/cli-darwin-arm64@2.9.6':
resolution: {integrity: sha512-gf5no6N9FCk1qMrti4lfwP77JHP5haASZgVbBgpZG7BUepB3fhiLCXGUK8LvuOjP36HivXewjg72LTnPDScnQQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@tauri-apps/cli-darwin-x64@2.9.6':
resolution: {integrity: sha512-oWh74WmqbERwwrwcueJyY6HYhgCksUc6NT7WKeXyrlY/FPmNgdyQAgcLuTSkhRFuQ6zh4Np1HZpOqCTpeZBDcw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@tauri-apps/cli-linux-arm-gnueabihf@2.9.6':
resolution: {integrity: sha512-/zde3bFroFsNXOHN204DC2qUxAcAanUjVXXSdEGmhwMUZeAQalNj5cz2Qli2elsRjKN/hVbZOJj0gQ5zaYUjSg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@tauri-apps/cli-linux-arm64-gnu@2.9.6':
resolution: {integrity: sha512-pvbljdhp9VOo4RnID5ywSxgBs7qiylTPlK56cTk7InR3kYSTJKYMqv/4Q/4rGo/mG8cVppesKIeBMH42fw6wjg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tauri-apps/cli-linux-arm64-musl@2.9.6':
resolution: {integrity: sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tauri-apps/cli-linux-riscv64-gnu@2.9.6':
resolution: {integrity: sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
'@tauri-apps/cli-linux-x64-gnu@2.9.6':
resolution: {integrity: sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tauri-apps/cli-linux-x64-musl@2.9.6':
resolution: {integrity: sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tauri-apps/cli-win32-arm64-msvc@2.9.6':
resolution: {integrity: sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@tauri-apps/cli-win32-ia32-msvc@2.9.6':
resolution: {integrity: sha512-S4pT0yAJgFX8QRCyKA1iKjZ9Q/oPjCZf66A/VlG5Yw54Nnr88J1uBpmenINbXxzyhduWrIXBaUbEY1K80ZbpMg==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
'@tauri-apps/cli-win32-x64-msvc@2.9.6':
resolution: {integrity: sha512-ldWuWSSkWbKOPjQMJoYVj9wLHcOniv7diyI5UAJ4XsBdtaFB0pKHQsqw/ItUma0VXGC7vB4E9fZjivmxur60aw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@tauri-apps/cli@2.9.6':
resolution: {integrity: sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw==}
engines: {node: '>= 10'}
hasBin: true
'@tauri-apps/plugin-opener@2.5.3':
resolution: {integrity: sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==}
'@types/estree@1.0.8': '@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@@ -611,6 +537,9 @@ packages:
'@types/web-bluetooth@0.0.21': '@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
'@types/ws@8.18.1':
resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
'@ungap/structured-clone@1.3.0': '@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@@ -728,21 +657,52 @@ packages:
resolution: {integrity: sha512-n/NdPglzmkcNYZfIT3Fo8pnDR/lKiK1kZ1Yaa315UoLyHymADhWw15+bzN5gBxrCA8KyeNu0JJD6mLtTov43lQ==} resolution: {integrity: sha512-n/NdPglzmkcNYZfIT3Fo8pnDR/lKiK1kZ1Yaa315UoLyHymADhWw15+bzN5gBxrCA8KyeNu0JJD6mLtTov43lQ==}
engines: {node: '>= 14.0.0'} engines: {node: '>= 14.0.0'}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
birpc@2.9.0: birpc@2.9.0:
resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
ccount@2.0.1: ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
character-entities-html4@2.1.0: character-entities-html4@2.1.0:
resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
character-entities-legacy@3.0.0: character-entities-legacy@3.0.0:
resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
comma-separated-tokens@2.0.3: comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
concurrently@9.2.1:
resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==}
engines: {node: '>=18'}
hasBin: true
copy-anything@4.0.5: copy-anything@4.0.5:
resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -757,6 +717,9 @@ packages:
devlop@1.1.0: devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
entities@7.0.0: entities@7.0.0:
resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
@@ -766,6 +729,15 @@ packages:
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
estree-walker@2.0.2: estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
@@ -773,6 +745,10 @@ packages:
resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
extend-shallow@2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
fdir@6.5.0: fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@@ -790,6 +766,18 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin] os: [darwin]
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
gray-matter@4.0.3:
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
engines: {node: '>=6.0'}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
hast-util-to-html@9.0.5: hast-util-to-html@9.0.5:
resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
@@ -805,13 +793,29 @@ packages:
html-void-elements@3.0.0: html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
is-extendable@0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-what@5.5.0: is-what@5.5.0:
resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
engines: {node: '>=18'} engines: {node: '>=18'}
js-yaml@3.14.2:
resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
hasBin: true
json-schema@0.4.0: json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
magic-string@0.30.21: magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
@@ -888,6 +892,10 @@ packages:
regex@6.1.0: regex@6.1.0:
resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
rfdc@1.4.1: rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
@@ -896,9 +904,20 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
search-insights@2.17.3: search-insights@2.17.3:
resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==}
section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
shell-quote@1.8.3:
resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
engines: {node: '>= 0.4'}
shiki@3.21.0: shiki@3.21.0:
resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==}
@@ -913,13 +932,36 @@ packages:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
stringify-entities@4.0.4: stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
strip-bom-string@1.0.0:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
engines: {node: '>=0.10.0'}
superjson@2.2.6: superjson@2.2.6:
resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
engines: {node: '>=16'} engines: {node: '>=16'}
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
swr@2.3.8: swr@2.3.8:
resolution: {integrity: sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==} resolution: {integrity: sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==}
peerDependencies: peerDependencies:
@@ -936,9 +978,16 @@ packages:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
trim-lines@3.0.1: trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
undici-types@6.21.0: undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
@@ -1031,6 +1080,34 @@ packages:
typescript: typescript:
optional: true optional: true
wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
ws@8.19.0:
resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: '>=5.0.2'
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
zod@4.3.5: zod@4.3.5:
resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==}
@@ -1424,59 +1501,6 @@ snapshots:
'@standard-schema/spec@1.1.0': {} '@standard-schema/spec@1.1.0': {}
'@tauri-apps/api@2.9.1': {}
'@tauri-apps/cli-darwin-arm64@2.9.6':
optional: true
'@tauri-apps/cli-darwin-x64@2.9.6':
optional: true
'@tauri-apps/cli-linux-arm-gnueabihf@2.9.6':
optional: true
'@tauri-apps/cli-linux-arm64-gnu@2.9.6':
optional: true
'@tauri-apps/cli-linux-arm64-musl@2.9.6':
optional: true
'@tauri-apps/cli-linux-riscv64-gnu@2.9.6':
optional: true
'@tauri-apps/cli-linux-x64-gnu@2.9.6':
optional: true
'@tauri-apps/cli-linux-x64-musl@2.9.6':
optional: true
'@tauri-apps/cli-win32-arm64-msvc@2.9.6':
optional: true
'@tauri-apps/cli-win32-ia32-msvc@2.9.6':
optional: true
'@tauri-apps/cli-win32-x64-msvc@2.9.6':
optional: true
'@tauri-apps/cli@2.9.6':
optionalDependencies:
'@tauri-apps/cli-darwin-arm64': 2.9.6
'@tauri-apps/cli-darwin-x64': 2.9.6
'@tauri-apps/cli-linux-arm-gnueabihf': 2.9.6
'@tauri-apps/cli-linux-arm64-gnu': 2.9.6
'@tauri-apps/cli-linux-arm64-musl': 2.9.6
'@tauri-apps/cli-linux-riscv64-gnu': 2.9.6
'@tauri-apps/cli-linux-x64-gnu': 2.9.6
'@tauri-apps/cli-linux-x64-musl': 2.9.6
'@tauri-apps/cli-win32-arm64-msvc': 2.9.6
'@tauri-apps/cli-win32-ia32-msvc': 2.9.6
'@tauri-apps/cli-win32-x64-msvc': 2.9.6
'@tauri-apps/plugin-opener@2.5.3':
dependencies:
'@tauri-apps/api': 2.9.1
'@types/estree@1.0.8': {} '@types/estree@1.0.8': {}
'@types/hast@3.0.4': '@types/hast@3.0.4':
@@ -1504,6 +1528,10 @@ snapshots:
'@types/web-bluetooth@0.0.21': {} '@types/web-bluetooth@0.0.21': {}
'@types/ws@8.18.1':
dependencies:
'@types/node': 20.19.30
'@ungap/structured-clone@1.3.0': {} '@ungap/structured-clone@1.3.0': {}
'@vercel/oidc@3.1.0': {} '@vercel/oidc@3.1.0': {}
@@ -1632,16 +1660,52 @@ snapshots:
'@algolia/requester-fetch': 5.46.3 '@algolia/requester-fetch': 5.46.3
'@algolia/requester-node-http': 5.46.3 '@algolia/requester-node-http': 5.46.3
ansi-regex@5.0.1: {}
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
birpc@2.9.0: {} birpc@2.9.0: {}
ccount@2.0.1: {} ccount@2.0.1: {}
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
character-entities-html4@2.1.0: {} character-entities-html4@2.1.0: {}
character-entities-legacy@3.0.0: {} character-entities-legacy@3.0.0: {}
cliui@8.0.1:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
color-name@1.1.4: {}
comma-separated-tokens@2.0.3: {} comma-separated-tokens@2.0.3: {}
concurrently@9.2.1:
dependencies:
chalk: 4.1.2
rxjs: 7.8.2
shell-quote: 1.8.3
supports-color: 8.1.1
tree-kill: 1.2.2
yargs: 17.7.2
copy-anything@4.0.5: copy-anything@4.0.5:
dependencies: dependencies:
is-what: 5.5.0 is-what: 5.5.0
@@ -1654,6 +1718,8 @@ snapshots:
dependencies: dependencies:
dequal: 2.0.3 dequal: 2.0.3
emoji-regex@8.0.0: {}
entities@7.0.0: {} entities@7.0.0: {}
esbuild@0.27.2: esbuild@0.27.2:
@@ -1685,10 +1751,18 @@ snapshots:
'@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-ia32': 0.27.2
'@esbuild/win32-x64': 0.27.2 '@esbuild/win32-x64': 0.27.2
escalade@3.2.0: {}
esprima@4.0.1: {}
estree-walker@2.0.2: {} estree-walker@2.0.2: {}
eventsource-parser@3.0.6: {} eventsource-parser@3.0.6: {}
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
fdir@6.5.0(picomatch@4.0.3): fdir@6.5.0(picomatch@4.0.3):
optionalDependencies: optionalDependencies:
picomatch: 4.0.3 picomatch: 4.0.3
@@ -1700,6 +1774,17 @@ snapshots:
fsevents@2.3.3: fsevents@2.3.3:
optional: true optional: true
get-caller-file@2.0.5: {}
gray-matter@4.0.3:
dependencies:
js-yaml: 3.14.2
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
has-flag@4.0.0: {}
hast-util-to-html@9.0.5: hast-util-to-html@9.0.5:
dependencies: dependencies:
'@types/hast': 3.0.4 '@types/hast': 3.0.4
@@ -1724,10 +1809,21 @@ snapshots:
html-void-elements@3.0.0: {} html-void-elements@3.0.0: {}
is-extendable@0.1.1: {}
is-fullwidth-code-point@3.0.0: {}
is-what@5.5.0: {} is-what@5.5.0: {}
js-yaml@3.14.2:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
json-schema@0.4.0: {} json-schema@0.4.0: {}
kind-of@6.0.3: {}
magic-string@0.30.21: magic-string@0.30.21:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/sourcemap-codec': 1.5.5
@@ -1805,6 +1901,8 @@ snapshots:
dependencies: dependencies:
regex-utilities: 2.3.0 regex-utilities: 2.3.0
require-directory@2.1.1: {}
rfdc@1.4.1: {} rfdc@1.4.1: {}
rollup@4.55.2: rollup@4.55.2:
@@ -1838,8 +1936,19 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.55.2 '@rollup/rollup-win32-x64-msvc': 4.55.2
fsevents: 2.3.3 fsevents: 2.3.3
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
search-insights@2.17.3: {} search-insights@2.17.3: {}
section-matter@1.0.0:
dependencies:
extend-shallow: 2.0.1
kind-of: 6.0.3
shell-quote@1.8.3: {}
shiki@3.21.0: shiki@3.21.0:
dependencies: dependencies:
'@shikijs/core': 3.21.0 '@shikijs/core': 3.21.0
@@ -1857,15 +1966,37 @@ snapshots:
speakingurl@14.0.1: {} speakingurl@14.0.1: {}
sprintf-js@1.0.3: {}
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
stringify-entities@4.0.4: stringify-entities@4.0.4:
dependencies: dependencies:
character-entities-html4: 2.1.0 character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0 character-entities-legacy: 3.0.0
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
strip-bom-string@1.0.0: {}
superjson@2.2.6: superjson@2.2.6:
dependencies: dependencies:
copy-anything: 4.0.5 copy-anything: 4.0.5
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
supports-color@8.1.1:
dependencies:
has-flag: 4.0.0
swr@2.3.8(react@19.2.3): swr@2.3.8(react@19.2.3):
dependencies: dependencies:
dequal: 2.0.3 dequal: 2.0.3
@@ -1881,8 +2012,12 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3 picomatch: 4.0.3
tree-kill@1.2.2: {}
trim-lines@3.0.1: {} trim-lines@3.0.1: {}
tslib@2.8.1: {}
undici-types@6.21.0: {} undici-types@6.21.0: {}
unist-util-is@6.0.1: unist-util-is@6.0.1:
@@ -1994,6 +2129,28 @@ snapshots:
'@vue/server-renderer': 3.5.27(vue@3.5.27) '@vue/server-renderer': 3.5.27(vue@3.5.27)
'@vue/shared': 3.5.27 '@vue/shared': 3.5.27
wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
ws@8.19.0: {}
y18n@5.0.8: {}
yargs-parser@21.1.1: {}
yargs@17.7.2:
dependencies:
cliui: 8.0.1
escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
zod@4.3.5: {} zod@4.3.5: {}
zwitch@2.0.4: {} zwitch@2.0.4: {}
+92
View File
@@ -0,0 +1,92 @@
// @ts-check
import { WebSocketServer } from 'ws';
import { readFileSync, mkdirSync, writeFileSync } from "fs";
import { join as joinPath } from 'path'
import matter from 'gray-matter';
const PORT = 8080
const wss = new WebSocketServer({ port: PORT });
console.log(`WebSocket server running on ws://localhost:${PORT}`);
wss.on('connection', (ws) => {
console.log('New client connected');
let filename = ''
const ROOT_DIR = 'docs';
ws.on('message', (message, isBinary) => {
if (message instanceof Buffer && isBinary) {
writeFileSync(joinPath(ROOT_DIR, filename), message);
return;
}
const { name, ...payload } = JSON.parse(message.toString('utf-8'));
switch (name) {
case 'download_q': {
const { q, duration } = payload;
console.log(`Start ${q}`)
const q_stem = q.replace(/\.[a-z0-9]+$/, "").replace(/\[.+?\]/g, '').trim();
try {
mkdirSync(joinPath(ROOT_DIR, q_stem));
} catch (e) {}
let isChanged = false;
const ts = [];
let { data, content } = matter(readFileSync(joinPath(ROOT_DIR, `${q_stem}.md`), 'utf-8'));
data.video = '/' + q;
const interval = data.interval;
if (typeof interval === 'number') {
for (let t = 0; t < duration; t += interval) {
const min = Math.floor(t / 60)
const sec = Math.floor(t - min * 60)
content += `\n${min}:${sec.toString().padStart(2, '0')}\n`;
}
}
const re = /^(?<min>\d{1,2}):(?<sec>\d{2})\s*$/;
const lines = content.split('\n')
content = ''
for (const line of lines) {
const m = re.exec(line);
if (m?.groups) {
const { min, sec } = m.groups;
const t = `${min}_${sec}`;
ts.push(t);
content += `\n![${line}](./${q_stem}/${t}.png)\n\n`;
isChanged = true;
} else {
content += `${line}\n`;
}
}
if (isChanged){
writeFileSync(joinPath(ROOT_DIR, `${q_stem}.md`), matter.stringify(content, data));
ws.send(JSON.stringify({ name: "seek_q_ts", q, ts }));
}
} break;
case 'timed_q' : {
const { q, t } = payload;
const q_stem = q.replace(/\.[a-z0-9]+$/, "").replace(/\[.+?\]/g, '').trim();
filename = t ? joinPath(q_stem, `${t}.png`) : '';
} break;
case 'done' : {
const { q } = payload
console.log(`Done ${q}`)
} break;
}
});
ws.on('close', () => {
console.log('Client disconnected');
});
});
-4
View File
@@ -1,4 +0,0 @@
# Generated by Cargo
# will have compiled files and executables
/target/
/gen/schemas
-5455
View File
File diff suppressed because it is too large. Load diff
-26
View File
@@ -1,26 +0,0 @@
[package]
name = "app"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
license = ""
repository = ""
edition = "2024"
rust-version = "1.90.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "app_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]
tauri-build = { version = "2.5.3", features = [] }
[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
log = "0.4"
tauri = { version = "2.9.5", features = [] }
tauri-plugin-log = "2"
tauri-plugin-opener = "2"
-3
View File
@@ -1,3 +0,0 @@
fn main() {
tauri_build::build()
}
-11
View File
@@ -1,11 +0,0 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "enables the default permissions",
"windows": [
"main"
],
"permissions": [
"core:default"
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

-41
View File
@@ -1,41 +0,0 @@
use tauri::Listener;
use serde::Deserialize;
#[tauri::command]
fn download_q(q: String) {
println!("Download q! {q}");
}
#[tauri::command]
fn timed_q(q: String, t: f32, current_time: f32, data: String) {
println!("Timed q! {q} {t} {current_time} {}", &data[..10]);
}
#[derive(Deserialize, Debug)]
struct SeekQEvent {
t: f32,
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![download_q, timed_q])
.setup(|app| {
app.listen("seek_q", |event| {
if let Ok(payload) = serde_json::from_str::<SeekQEvent>(&event.payload()) {
println!("downloading {}", payload.t);
}
});
if cfg!(debug_assertions) {
app.handle().plugin(
tauri_plugin_log::Builder::default()
.level(log::LevelFilter::Info)
.build(),
)?;
}
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
-6
View File
@@ -1,6 +0,0 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
app_lib::run();
}
-37
View File
@@ -1,37 +0,0 @@
{
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
"productName": "yt2press",
"version": "0.1.0",
"identifier": "com.tauri.dev",
"build": {
"frontendDist": "../docs/dist",
"devUrl": "http://localhost:5173",
"beforeDevCommand": "pnpm dev",
"beforeBuildCommand": "pnpm build"
},
"app": {
"windows": [
{
"title": "yt2press",
"width": 800,
"height": 600,
"resizable": true,
"fullscreen": false
}
],
"security": {
"csp": null
}
},
"bundle": {
"active": true,
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
}
}