auto create markdown file from parser interface

This commit is contained in:
polv committed 2026-02-11 06:45:30 +07:00
1 parent f143f1e511
commit 8434cf78ed
8 files changed
+2446 -866

No files matched your search

+29 -30
View File
@@ -15,16 +15,37 @@ Download or place a video file in the `/docs/public` directory. Several options
Choose any method to download your video and save it to `/docs/public` directory.
### Step 2: Create a Markdown File
### Step 2: Start the Development Server
Create a markdown file in `/docs` directory. The filename should match the video filename with `[xxx]` removed and spaces replaced with underscores.
Run the following command in the project directory:
```bash
pnpm run dev
```
This starts the VitePress development server and WebSocket server for communication.
### Step 3: Use the Downloader Interface
1. Open the VitePress website in your browser
2. Enter your video filename in the textbox (e.g. `my video [abc123].mp4`, `presentation.webm`, `my-video [xyz].mpeg`)
3. Press Enter or click Submit
The app will:
- Load the markdown matching the submitted video filename.
- If it exists: process the video — extract screenshots for timestamps, insert images, and save the markdown.
- If it does not exist: create the markdown and exit. Edit the new file (add frontmatter or timestamps), then run the Downloader again.
#### Create/Edit the Markdown File
You may let the Downloader create the markdown file automatically, or create it yourself by placing a file in the `/docs` directory. The filename should match the video filename with any bracketed ID removed and spaces replaced with underscores, for example:
For example:
- Video file: `my video [abc123].mp4` → Markdown file: `my_video.md`
- Video file: `presentation.webm` → Markdown file: `presentation.md`
- Video file: `my-video [xyz].mpeg` → Markdown file: `my-video.md`
The markdown file content can be:
If the file is newly created by the Downloader, you will need to edit the markdown to provide the content or timestamps the app will use. After editing, run the Downloader again to regenerate screenshots and update image references.
The markdown file content can be one of the following:
**Option A: YAML Frontmatter (for auto-generating timestamps)**
@@ -58,28 +79,6 @@ Velit euismod blandit proin arcu magna.
Timestamps should be in `M:SS` or `MM:SS` format on their own line. They will be converted to timestamped screenshot references.
### Step 3: Start the Development Server
Run the following command in the project directory:
```bash
pnpm run dev
```
This starts the VitePress development server and WebSocket server for communication.
### Step 4: Use the Downloader Interface
1. Open the VitePress website in your browser
2. Enter your video filename in the textbox (e.g. `my video [abc123].mp4`, `presentation.webm`, `my-video [xyz].mpeg`)
3. Press Enter or click Submit
The app will:
- Load the video
- Extract screenshots at specified timestamps
- Replace timestamp lines with embedded screenshot images
- Save the updated markdown file
## Project Structure
```
@@ -100,7 +99,7 @@ group-similar.js # Script for deduplicating similar screenshots
## Dependencies
- Node.js and pnpm
- VitePress for web UI
- [VitePress](https://vitepress.dev) for web UI
- WebSocket for real-time communication between browser and server
- gray-matter for parsing YAML frontmatter
- [Sharp](https://github.com/lovell/sharp) for image processing (screenshot manipulation)
- `gray-matter` for parsing YAML frontmatter
- [`sharp`](https://github.com/lovell/sharp) for image processing (screenshot manipulation)
+2
View File
@@ -9,6 +9,8 @@ hero:
<Downloader />
- [什么是深圳?| WHAT IS SHENZHEN?【星球研究所】](/什么是深圳?|_WHAT_IS_SHENZHEN?【星球研究所】)
- [意大利为什么没有赶上现代化这趟二路汽车?](/意大利为什么没有赶上现代化这趟二路汽车?)
- [みんなうっかり間違える!?中国語 様態補語と程度補語の文法の注意点とは](/みんなうっかり間違える!?中国語_様態補語と程度補語の文法の注意点とは)
- [【剥茧The Truth Within】EP02](/qVVhBGT0K7Y)
- [15萬緬甸人在台灣的背後,是一段顛沛流離的故事](/15萬緬甸人在台灣的背後,是一段顛沛流離的故事)
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,786 @@
---
interval: 2
dedup: true
video: >-
/那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita: The Man Who Almost Became Thailand’s
Prime Minister [LQ5NuIjEFxE].mp4
---
![0:00](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_00.png)
![0:02](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_02.png)
![0:04](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_04.png)
![0:06](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_06.png)
![0:08](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_08.png)
![0:10](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_10.png)
![0:12](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_12.png)
![0:14](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_14.png)
![0:16](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_16.png)
![0:18](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_18.png)
![0:20](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_20.png)
![0:22](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_22.png)
![0:24](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_24.png)
![0:26](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_26.png)
![0:28](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_28.png)
![0:30](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_30.png)
![0:32](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_32.png)
![0:34](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_34.png)
![0:36](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_36.png)
![0:38](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_38.png)
![0:40](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_40.png)
![0:42](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_42.png)
![0:44](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_44.png)
![0:46](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_46.png)
![0:48](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_48.png)
![0:50](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_50.png)
![0:52](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_52.png)
![0:54](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_54.png)
![0:56](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_56.png)
<details>
<summary>0:56</summary>
![0:58](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/0_58.png)
</details>
<br/>
![1:00](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_00.png)
<details>
<summary>1:00</summary>
![1:02](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_02.png)
</details>
<br/>
![1:04](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_04.png)
![1:06](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_06.png)
![1:08](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_08.png)
![1:10](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_10.png)
![1:12](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_12.png)
![1:14](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_14.png)
![1:16](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_16.png)
![1:18](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_18.png)
![1:20](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_20.png)
![1:22](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_22.png)
![1:24](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_24.png)
![1:26](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_26.png)
![1:28](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_28.png)
![1:30](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_30.png)
![1:32](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_32.png)
![1:34](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_34.png)
![1:36](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_36.png)
![1:38](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_38.png)
![1:40](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_40.png)
![1:42](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_42.png)
![1:44](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_44.png)
![1:46](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_46.png)
![1:48](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_48.png)
![1:50](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_50.png)
![1:52](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_52.png)
<details>
<summary>1:52</summary>
![1:54](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_54.png)
</details>
<br/>
![1:56](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_56.png)
![1:58](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/1_58.png)
![2:00](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_00.png)
![2:02](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_02.png)
![2:04](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_04.png)
![2:06](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_06.png)
![2:08](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_08.png)
![2:10](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_10.png)
![2:12](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_12.png)
![2:14](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_14.png)
![2:16](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_16.png)
![2:18](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_18.png)
<details>
<summary>2:18</summary>
![2:20](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_20.png)
</details>
<br/>
![2:22](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_22.png)
![2:24](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_24.png)
![2:26](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_26.png)
![2:28](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_28.png)
![2:30](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_30.png)
![2:32](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_32.png)
![2:34](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_34.png)
![2:36](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_36.png)
![2:38](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_38.png)
![2:40](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_40.png)
![2:42](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_42.png)
![2:44](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_44.png)
<details>
<summary>2:44</summary>
![2:46](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_46.png)
</details>
<br/>
![2:48](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_48.png)
![2:50](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_50.png)
![2:52](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_52.png)
![2:54](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_54.png)
![2:56](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_56.png)
![2:58](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/2_58.png)
![3:00](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_00.png)
![3:02](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_02.png)
![3:04](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_04.png)
![3:06](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_06.png)
![3:08](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_08.png)
<details>
<summary>3:08</summary>
![3:10](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_10.png)
![3:12](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_12.png)
</details>
<br/>
![3:14](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_14.png)
![3:16](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_16.png)
![3:18](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_18.png)
![3:20](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_20.png)
![3:22](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_22.png)
![3:24](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_24.png)
![3:26](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_26.png)
![3:28](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_28.png)
![3:30](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_30.png)
![3:32](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_32.png)
![3:34](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_34.png)
![3:36](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_36.png)
![3:38](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_38.png)
![3:40](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_40.png)
![3:42](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_42.png)
![3:44](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_44.png)
![3:46](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_46.png)
![3:48](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_48.png)
![3:50](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_50.png)
![3:52](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_52.png)
![3:54](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_54.png)
![3:56](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_56.png)
![3:58](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/3_58.png)
![4:00](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_00.png)
![4:02](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_02.png)
![4:04](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_04.png)
![4:06](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_06.png)
![4:08](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_08.png)
<details>
<summary>4:08</summary>
![4:10](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_10.png)
![4:12](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_12.png)
![4:14](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_14.png)
![4:16](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_16.png)
![4:18](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_18.png)
</details>
<br/>
![4:20](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_20.png)
![4:22](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_22.png)
![4:24](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_24.png)
![4:26](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_26.png)
![4:28](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_28.png)
![4:30](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_30.png)
![4:32](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_32.png)
<details>
<summary>4:32</summary>
![4:34](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_34.png)
</details>
<br/>
![4:36](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_36.png)
<details>
<summary>4:36</summary>
![4:38](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_38.png)
</details>
<br/>
![4:40](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_40.png)
![4:42](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_42.png)
![4:44](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_44.png)
![4:46](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_46.png)
![4:48](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_48.png)
![4:50](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_50.png)
![4:52](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_52.png)
![4:54](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_54.png)
![4:56](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_56.png)
![4:58](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/4_58.png)
![5:00](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_00.png)
![5:02](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_02.png)
![5:04](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_04.png)
![5:06](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_06.png)
![5:08](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_08.png)
![5:10](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_10.png)
![5:12](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_12.png)
![5:14](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_14.png)
![5:16](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_16.png)
![5:18](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_18.png)
![5:20](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_20.png)
![5:22](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_22.png)
![5:24](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_24.png)
![5:26](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_26.png)
<details>
<summary>5:26</summary>
![5:28](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_28.png)
![5:30](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_30.png)
![5:32](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_32.png)
</details>
<br/>
![5:34](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_34.png)
<details>
<summary>5:34</summary>
![5:36](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_36.png)
![5:38](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_38.png)
</details>
<br/>
![5:40](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_40.png)
<details>
<summary>5:40</summary>
![5:42](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_42.png)
</details>
<br/>
![5:44](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_44.png)
<details>
<summary>5:44</summary>
![5:46](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_46.png)
</details>
<br/>
![5:48](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_48.png)
<details>
<summary>5:48</summary>
![5:50](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_50.png)
</details>
<br/>
![5:52](./那個幾乎成為泰國總理的男人皮塔:不是「政治金童」,而是「指定倖存者」|Pita:_The_Man_Who_Almost_Became_Thailand’s_Prime_Minister/5_52.png)
+1 -1
View File
@@ -13,7 +13,7 @@
"ws": "^8.19.0"
},
"devDependencies": {
"@types/node": "^20.19.30",
"@types/node": "24",
"@types/ws": "^8.18.1",
"concurrently": "^9.2.1"
},
+407 -819
View File
File diff suppressed because it is too large. Load diff
-2
View File
@@ -1,2 +0,0 @@
onlyBuiltDependencies:
- sharp
+26 -14
View File
@@ -33,9 +33,10 @@ wss.on("connection", (ws) => {
console.log(`Start ${q}`);
const md = loadMdFile(q);
const q_stem = make_q_stem(q);
try {
mkdirSync(joinPath(ROOT_DIR, md.q_stem));
mkdirSync(joinPath(ROOT_DIR, q_stem));
} catch (e) {}
let isChanged = false;
@@ -63,7 +64,7 @@ wss.on("connection", (ws) => {
const { min, sec } = m.groups;
const t = `${min}_${sec}`;
ts.push(t);
newContent += `\n![${line}](./${md.q_stem}/${t}.png)\n\n`;
newContent += `\n![${line}](./${q_stem}/${t}.png)\n\n`;
isChanged = true;
} else {
newContent += `${line}\n`;
@@ -80,10 +81,7 @@ wss.on("connection", (ws) => {
case "timed_q":
{
const { q, t } = payload;
const q_stem = q
.replace(/\.[a-z0-9]+$/, "")
.replace(/\[.+?\]/g, "")
.trim();
const q_stem = make_q_stem(q);
filename = t ? joinPath(q_stem, `${t}.png`) : "";
}
break;
@@ -92,7 +90,7 @@ wss.on("connection", (ws) => {
const { q } = payload;
const md = loadMdFile(q);
console.log(`Done timestamp ${q}`);
console.log(`Done basic parsing ${q}`);
const { dedup } = md.data;
if (dedup) {
@@ -104,7 +102,7 @@ wss.on("connection", (ws) => {
typeof dedup === "number" ? dedup : undefined,
).then((stats) => {
// Don't log a thing yet.
console.log(`Done duduping ${md.filename}`);
console.log(`Done deduping ${md.filename}`);
});
}
@@ -125,16 +123,30 @@ wss.on("connection", (ws) => {
* @returns
*/
function loadMdFile(q) {
const q_stem = q
.replace(/\.[a-z0-9]+$/, "")
.replace(/\[.+?\]/g, "")
.trim()
.replace(/\s+/g, "_");
const q_stem = make_q_stem(q);
try {
mkdirSync(joinPath(ROOT_DIR, q_stem));
} catch (e) {}
const filename = joinPath(ROOT_DIR, `${q_stem}.md`);
return { q_stem, filename, ...matter(readFileSync(filename, "utf-8")) };
try {
// create a blank md file if not exists
readFileSync(filename, { flag: "a" });
} catch (e) {}
return { filename, ...matter(readFileSync(filename, "utf-8")) };
}
/**
*
* @param {string} q
* @returns
*/
function make_q_stem(q) {
return q
.replace(/\.[a-z0-9]+$/, "")
.replace(/\[.+?\]/g, "")
.trim()
.replace(/\s+/g, "_");
}