textflowkit 0.1.3__tar.gz → 0.1.4__tar.gz
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.
- {textflowkit-0.1.3 → textflowkit-0.1.4}/PKG-INFO +33 -30
- {textflowkit-0.1.3 → textflowkit-0.1.4}/README.md +32 -29
- {textflowkit-0.1.3 → textflowkit-0.1.4}/SECURITY.md +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/adapters.md +3 -3
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/index.html +6 -7
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/install.md +7 -2
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/release-checklist.md +13 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/roadmap.md +17 -0
- textflowkit-0.1.4/docs/site-deployment.md +34 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/pyproject.toml +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/__init__.py +1 -1
- {textflowkit-0.1.3 → textflowkit-0.1.4}/.gitattributes +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/.github/dependabot.yml +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/.github/workflows/ci.yml +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/.gitignore +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/.pre-commit-config.yaml +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/CONTRIBUTING.md +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/LEGAL.md +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/LICENSE +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/.nojekyll +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/docs/sources.md +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/scripts/smoke_installed_wheel.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/scripts/smoke_live_youtube.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/adapters/__init__.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/adapters/http_server.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/adapters/mcp_server.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/cli.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/__init__.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/batch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/bind.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/cancel.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/checkpoint.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/diarize.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/engine.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/executor.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/jobs.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/model.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/paths.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/pipeline.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/retrieval.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/runner.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/service.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/sqlite_store.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/submission.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/timeutil.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/core/translate.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/__init__.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/docx.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/fonts/NotoSans.ttf +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/fonts/NotoSansArabic.ttf +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/fonts/NotoSansSC.ttf +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/fonts/OFL-NotoSans.txt +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/fonts/OFL-NotoSansSC.txt +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/fonts/README.md +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/markdown.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/pdf.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/srt.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/txt.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/render/vtt.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/sources/__init__.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/sources/acquire.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/sources/detect.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/src/textflowkit/sources/scratch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/__init__.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/ollama_stub.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_acquire.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_adapters.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_batch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_bind.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_checkpoint.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_cli.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_cli_resume_batch.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_diarize.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_engine_cache.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_executor.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_export.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_jobs.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_landing_page.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_live_smoke_script.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_model.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_paths.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_pipeline_integrity.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_release_boundaries.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_render.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_retrieval.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_service_profile.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_sources.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_stdio_protocol.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_submission.py +0 -0
- {textflowkit-0.1.3 → textflowkit-0.1.4}/tests/test_translate.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: textflowkit
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: Cross-platform media transcription toolkit: URL or file in, timestamped transcripts and subtitle files out.
|
|
5
5
|
Project-URL: Homepage, https://github.com/scottconverse/textflowkit
|
|
6
6
|
Project-URL: Issues, https://github.com/scottconverse/textflowkit/issues
|
|
@@ -50,9 +50,14 @@ Description-Content-Type: text/markdown
|
|
|
50
50
|
|
|
51
51
|
Cross-platform media transcription toolkit. **One core, one CLI, thin adapters.**
|
|
52
52
|
|
|
53
|
-
[Project landing page](https://
|
|
53
|
+
[Project landing page](https://www.textflowkit.org/) ·
|
|
54
|
+
[PyPI package](https://pypi.org/project/textflowkit/) ·
|
|
54
55
|
[GitHub releases](https://github.com/scottconverse/textflowkit/releases)
|
|
55
56
|
|
|
57
|
+
The [static site deployment](https://github.com/scottconverse/textflowkit/blob/main/docs/site-deployment.md) is hosted on Cloudflare
|
|
58
|
+
Pages. GitHub remains the source and CI host; the website does not run the
|
|
59
|
+
transcription engine.
|
|
60
|
+
|
|
56
61
|
Paste a URL or point at a file; get timestamped transcripts and subtitle files back.
|
|
57
62
|
Built as a reusable primitive for developers — designed to sit under multiple
|
|
58
63
|
products, AI harnesses, and agents.
|
|
@@ -63,12 +68,12 @@ products, AI harnesses, and agents.
|
|
|
63
68
|
>
|
|
64
69
|
> **This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND**, express or
|
|
65
70
|
> implied, including but not limited to the warranties of MERCHANTABILITY, FITNESS
|
|
66
|
-
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](LICENSE) (Apache-2.0,
|
|
71
|
+
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE) (Apache-2.0,
|
|
67
72
|
> §7–8) for the full disclaimer and limitation of liability.
|
|
68
73
|
>
|
|
69
74
|
> **You are responsible for what you transcribe.** textflowkit can fetch media from
|
|
70
75
|
> third-party platforms. Copyright, terms-of-service, and privacy obligations for any
|
|
71
|
-
> media you choose to process are **yours alone**. See [LEGAL.md](LEGAL.md).
|
|
76
|
+
> media you choose to process are **yours alone**. See [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md).
|
|
72
77
|
|
|
73
78
|
---
|
|
74
79
|
|
|
@@ -112,39 +117,37 @@ YouTube · TikTok · Facebook · Instagram · Vimeo · Twitch · Bilibili · Rum
|
|
|
112
117
|
Kick · Zoom · Medal · Loom · Dropbox — plus **direct media URLs and local files**.
|
|
113
118
|
|
|
114
119
|
All 13 are recognised through `yt-dlp`; only YouTube has an opt-in, maintained
|
|
115
|
-
[live end-to-end smoke](docs/release-checklist.md). It is run on a Windows
|
|
120
|
+
[live end-to-end smoke](https://github.com/scottconverse/textflowkit/blob/main/docs/release-checklist.md). It is run on a Windows
|
|
116
121
|
maintainer machine before a release, not on GitHub-hosted runners or every pull
|
|
117
122
|
request. Local files have also been transcribed live. The other
|
|
118
123
|
12 are not release-verified end to end, and some sources require cookies or
|
|
119
|
-
change their access rules frequently. See [docs/sources.md](docs/sources.md).
|
|
124
|
+
change their access rules frequently. See [docs/sources.md](https://github.com/scottconverse/textflowkit/blob/main/docs/sources.md).
|
|
120
125
|
|
|
121
126
|
## Install
|
|
122
127
|
|
|
123
128
|
Requires **Python ≥ 3.10** and **ffmpeg** on `PATH`.
|
|
124
129
|
|
|
125
130
|
```bash
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
pip install -e .
|
|
131
|
+
python -m pip install textflowkit
|
|
132
|
+
textflowkit doctor
|
|
129
133
|
```
|
|
130
134
|
|
|
131
|
-
|
|
135
|
+
For MCP or the JSON HTTP adapter, install the matching extra:
|
|
132
136
|
|
|
133
137
|
```bash
|
|
134
|
-
pip install
|
|
138
|
+
python -m pip install 'textflowkit[mcp]' # MCP server
|
|
139
|
+
python -m pip install 'textflowkit[http]' # JSON HTTP API
|
|
135
140
|
```
|
|
136
141
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
Optional extras:
|
|
142
|
+
**AMD ROCm on native Windows:** do not use the generic command in an environment
|
|
143
|
+
with a working ROCm PyTorch install. Ordinary dependency resolution can replace
|
|
144
|
+
that torch build. Follow the [ROCm install notes](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
|
|
145
|
+
to preserve it.
|
|
142
146
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
```
|
|
147
|
+
The same version's wheel and source archive are also on the
|
|
148
|
+
[GitHub release page](https://github.com/scottconverse/textflowkit/releases/latest).
|
|
149
|
+
The release lists their SHA-256 hashes. For editable source development, see
|
|
150
|
+
[CONTRIBUTING.md](https://github.com/scottconverse/textflowkit/blob/main/CONTRIBUTING.md).
|
|
148
151
|
|
|
149
152
|
## Usage
|
|
150
153
|
|
|
@@ -187,7 +190,7 @@ textflowkit export ./transcript.json --format vtt
|
|
|
187
190
|
## Use as an MCP server
|
|
188
191
|
|
|
189
192
|
```bash
|
|
190
|
-
pip install
|
|
193
|
+
python -m pip install 'textflowkit[mcp]'
|
|
191
194
|
textflowkit-mcp # stdio
|
|
192
195
|
textflowkit-mcp --transport http --port 8766 # Streamable HTTP
|
|
193
196
|
```
|
|
@@ -214,12 +217,12 @@ These checks are not end-to-end transcription runs driven by each harness:
|
|
|
214
217
|
There is also a protocol test that launches the server as a real subprocess and
|
|
215
218
|
speaks newline-delimited JSON-RPC over stdio, so the entry point, framing, and
|
|
216
219
|
version negotiation are covered on every CI run (`tests/test_stdio_protocol.py`).
|
|
217
|
-
See [docs/adapters.md](docs/adapters.md) for per-harness configuration.
|
|
220
|
+
See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md) for per-harness configuration.
|
|
218
221
|
|
|
219
222
|
## Use as an HTTP API
|
|
220
223
|
|
|
221
224
|
```bash
|
|
222
|
-
pip install
|
|
225
|
+
python -m pip install 'textflowkit[http]'
|
|
223
226
|
textflowkit-http --port 8767
|
|
224
227
|
```
|
|
225
228
|
|
|
@@ -227,7 +230,7 @@ Submit a job, poll it, fetch the transcript. Developer mode is unauthenticated
|
|
|
227
230
|
and defaults to localhost. The opt-in JSON HTTP production profile requires a
|
|
228
231
|
Bearer token, explicit roots, durable SQLite jobs, and request/rate/media/output
|
|
229
232
|
limits; URL input additionally requires an SSRF-filtering egress proxy. See
|
|
230
|
-
[adapter deployment details](docs/adapters.md#developer-mode-and-production-profile).
|
|
233
|
+
[adapter deployment details](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md#developer-mode-and-production-profile).
|
|
231
234
|
|
|
232
235
|
## Durable, bounded, cancellable
|
|
233
236
|
|
|
@@ -237,7 +240,7 @@ TEXTFLOWKIT_MAX_CONCURRENCY=1 # default; Whisper saturates a GPU alone
|
|
|
237
240
|
```
|
|
238
241
|
|
|
239
242
|
`cancel_job` stops a queued job immediately, or a running job at its next stage
|
|
240
|
-
boundary. See [docs/adapters.md](docs/adapters.md).
|
|
243
|
+
boundary. See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md).
|
|
241
244
|
|
|
242
245
|
## Long jobs never block
|
|
243
246
|
|
|
@@ -248,19 +251,19 @@ web frontend share the job contract without blocking a request.
|
|
|
248
251
|
|
|
249
252
|
## Status
|
|
250
253
|
|
|
251
|
-
**v0.1.
|
|
254
|
+
**v0.1.4 release.** Core, CLI, MCP, and HTTP have automated
|
|
252
255
|
coverage; Windows-native ROCm and a dated local Windows YouTube run were verified.
|
|
253
256
|
The GitHub-hosted YouTube attempt was blocked by a bot challenge, so hosted
|
|
254
257
|
live transcription is not verified.
|
|
255
258
|
This does not imply that all 13 platforms or every harness workflow has been
|
|
256
|
-
tested end to end. See [docs/roadmap.md](docs/roadmap.md).
|
|
259
|
+
tested end to end. See [docs/roadmap.md](https://github.com/scottconverse/textflowkit/blob/main/docs/roadmap.md).
|
|
257
260
|
|
|
258
261
|
## License
|
|
259
262
|
|
|
260
|
-
Apache-2.0 — see [LICENSE](LICENSE). Includes an explicit patent grant and a
|
|
263
|
+
Apache-2.0 — see [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE). Includes an explicit patent grant and a
|
|
261
264
|
limitation of liability.
|
|
262
265
|
|
|
263
266
|
## Contributing
|
|
264
267
|
|
|
265
|
-
Issues and PRs welcome. Please read [LEGAL.md](LEGAL.md) before adding a source
|
|
268
|
+
Issues and PRs welcome. Please read [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md) before adding a source
|
|
266
269
|
adapter.
|
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Cross-platform media transcription toolkit. **One core, one CLI, thin adapters.**
|
|
4
4
|
|
|
5
|
-
[Project landing page](https://
|
|
5
|
+
[Project landing page](https://www.textflowkit.org/) ·
|
|
6
|
+
[PyPI package](https://pypi.org/project/textflowkit/) ·
|
|
6
7
|
[GitHub releases](https://github.com/scottconverse/textflowkit/releases)
|
|
7
8
|
|
|
9
|
+
The [static site deployment](https://github.com/scottconverse/textflowkit/blob/main/docs/site-deployment.md) is hosted on Cloudflare
|
|
10
|
+
Pages. GitHub remains the source and CI host; the website does not run the
|
|
11
|
+
transcription engine.
|
|
12
|
+
|
|
8
13
|
Paste a URL or point at a file; get timestamped transcripts and subtitle files back.
|
|
9
14
|
Built as a reusable primitive for developers — designed to sit under multiple
|
|
10
15
|
products, AI harnesses, and agents.
|
|
@@ -15,12 +20,12 @@ products, AI harnesses, and agents.
|
|
|
15
20
|
>
|
|
16
21
|
> **This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND**, express or
|
|
17
22
|
> implied, including but not limited to the warranties of MERCHANTABILITY, FITNESS
|
|
18
|
-
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](LICENSE) (Apache-2.0,
|
|
23
|
+
> FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE) (Apache-2.0,
|
|
19
24
|
> §7–8) for the full disclaimer and limitation of liability.
|
|
20
25
|
>
|
|
21
26
|
> **You are responsible for what you transcribe.** textflowkit can fetch media from
|
|
22
27
|
> third-party platforms. Copyright, terms-of-service, and privacy obligations for any
|
|
23
|
-
> media you choose to process are **yours alone**. See [LEGAL.md](LEGAL.md).
|
|
28
|
+
> media you choose to process are **yours alone**. See [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md).
|
|
24
29
|
|
|
25
30
|
---
|
|
26
31
|
|
|
@@ -64,39 +69,37 @@ YouTube · TikTok · Facebook · Instagram · Vimeo · Twitch · Bilibili · Rum
|
|
|
64
69
|
Kick · Zoom · Medal · Loom · Dropbox — plus **direct media URLs and local files**.
|
|
65
70
|
|
|
66
71
|
All 13 are recognised through `yt-dlp`; only YouTube has an opt-in, maintained
|
|
67
|
-
[live end-to-end smoke](docs/release-checklist.md). It is run on a Windows
|
|
72
|
+
[live end-to-end smoke](https://github.com/scottconverse/textflowkit/blob/main/docs/release-checklist.md). It is run on a Windows
|
|
68
73
|
maintainer machine before a release, not on GitHub-hosted runners or every pull
|
|
69
74
|
request. Local files have also been transcribed live. The other
|
|
70
75
|
12 are not release-verified end to end, and some sources require cookies or
|
|
71
|
-
change their access rules frequently. See [docs/sources.md](docs/sources.md).
|
|
76
|
+
change their access rules frequently. See [docs/sources.md](https://github.com/scottconverse/textflowkit/blob/main/docs/sources.md).
|
|
72
77
|
|
|
73
78
|
## Install
|
|
74
79
|
|
|
75
80
|
Requires **Python ≥ 3.10** and **ffmpeg** on `PATH`.
|
|
76
81
|
|
|
77
82
|
```bash
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
pip install -e .
|
|
83
|
+
python -m pip install textflowkit
|
|
84
|
+
textflowkit doctor
|
|
81
85
|
```
|
|
82
86
|
|
|
83
|
-
|
|
87
|
+
For MCP or the JSON HTTP adapter, install the matching extra:
|
|
84
88
|
|
|
85
89
|
```bash
|
|
86
|
-
pip install
|
|
90
|
+
python -m pip install 'textflowkit[mcp]' # MCP server
|
|
91
|
+
python -m pip install 'textflowkit[http]' # JSON HTTP API
|
|
87
92
|
```
|
|
88
93
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
Optional extras:
|
|
94
|
+
**AMD ROCm on native Windows:** do not use the generic command in an environment
|
|
95
|
+
with a working ROCm PyTorch install. Ordinary dependency resolution can replace
|
|
96
|
+
that torch build. Follow the [ROCm install notes](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
|
|
97
|
+
to preserve it.
|
|
94
98
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
```
|
|
99
|
+
The same version's wheel and source archive are also on the
|
|
100
|
+
[GitHub release page](https://github.com/scottconverse/textflowkit/releases/latest).
|
|
101
|
+
The release lists their SHA-256 hashes. For editable source development, see
|
|
102
|
+
[CONTRIBUTING.md](https://github.com/scottconverse/textflowkit/blob/main/CONTRIBUTING.md).
|
|
100
103
|
|
|
101
104
|
## Usage
|
|
102
105
|
|
|
@@ -139,7 +142,7 @@ textflowkit export ./transcript.json --format vtt
|
|
|
139
142
|
## Use as an MCP server
|
|
140
143
|
|
|
141
144
|
```bash
|
|
142
|
-
pip install
|
|
145
|
+
python -m pip install 'textflowkit[mcp]'
|
|
143
146
|
textflowkit-mcp # stdio
|
|
144
147
|
textflowkit-mcp --transport http --port 8766 # Streamable HTTP
|
|
145
148
|
```
|
|
@@ -166,12 +169,12 @@ These checks are not end-to-end transcription runs driven by each harness:
|
|
|
166
169
|
There is also a protocol test that launches the server as a real subprocess and
|
|
167
170
|
speaks newline-delimited JSON-RPC over stdio, so the entry point, framing, and
|
|
168
171
|
version negotiation are covered on every CI run (`tests/test_stdio_protocol.py`).
|
|
169
|
-
See [docs/adapters.md](docs/adapters.md) for per-harness configuration.
|
|
172
|
+
See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md) for per-harness configuration.
|
|
170
173
|
|
|
171
174
|
## Use as an HTTP API
|
|
172
175
|
|
|
173
176
|
```bash
|
|
174
|
-
pip install
|
|
177
|
+
python -m pip install 'textflowkit[http]'
|
|
175
178
|
textflowkit-http --port 8767
|
|
176
179
|
```
|
|
177
180
|
|
|
@@ -179,7 +182,7 @@ Submit a job, poll it, fetch the transcript. Developer mode is unauthenticated
|
|
|
179
182
|
and defaults to localhost. The opt-in JSON HTTP production profile requires a
|
|
180
183
|
Bearer token, explicit roots, durable SQLite jobs, and request/rate/media/output
|
|
181
184
|
limits; URL input additionally requires an SSRF-filtering egress proxy. See
|
|
182
|
-
[adapter deployment details](docs/adapters.md#developer-mode-and-production-profile).
|
|
185
|
+
[adapter deployment details](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md#developer-mode-and-production-profile).
|
|
183
186
|
|
|
184
187
|
## Durable, bounded, cancellable
|
|
185
188
|
|
|
@@ -189,7 +192,7 @@ TEXTFLOWKIT_MAX_CONCURRENCY=1 # default; Whisper saturates a GPU alone
|
|
|
189
192
|
```
|
|
190
193
|
|
|
191
194
|
`cancel_job` stops a queued job immediately, or a running job at its next stage
|
|
192
|
-
boundary. See [docs/adapters.md](docs/adapters.md).
|
|
195
|
+
boundary. See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md).
|
|
193
196
|
|
|
194
197
|
## Long jobs never block
|
|
195
198
|
|
|
@@ -200,19 +203,19 @@ web frontend share the job contract without blocking a request.
|
|
|
200
203
|
|
|
201
204
|
## Status
|
|
202
205
|
|
|
203
|
-
**v0.1.
|
|
206
|
+
**v0.1.4 release.** Core, CLI, MCP, and HTTP have automated
|
|
204
207
|
coverage; Windows-native ROCm and a dated local Windows YouTube run were verified.
|
|
205
208
|
The GitHub-hosted YouTube attempt was blocked by a bot challenge, so hosted
|
|
206
209
|
live transcription is not verified.
|
|
207
210
|
This does not imply that all 13 platforms or every harness workflow has been
|
|
208
|
-
tested end to end. See [docs/roadmap.md](docs/roadmap.md).
|
|
211
|
+
tested end to end. See [docs/roadmap.md](https://github.com/scottconverse/textflowkit/blob/main/docs/roadmap.md).
|
|
209
212
|
|
|
210
213
|
## License
|
|
211
214
|
|
|
212
|
-
Apache-2.0 — see [LICENSE](LICENSE). Includes an explicit patent grant and a
|
|
215
|
+
Apache-2.0 — see [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE). Includes an explicit patent grant and a
|
|
213
216
|
limitation of liability.
|
|
214
217
|
|
|
215
218
|
## Contributing
|
|
216
219
|
|
|
217
|
-
Issues and PRs welcome. Please read [LEGAL.md](LEGAL.md) before adding a source
|
|
220
|
+
Issues and PRs welcome. Please read [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md) before adding a source
|
|
218
221
|
adapter.
|
|
@@ -13,7 +13,7 @@ you expected.
|
|
|
13
13
|
|
|
14
14
|
| Version | Security-fix policy |
|
|
15
15
|
|---|---|
|
|
16
|
-
| Latest published release tag (
|
|
16
|
+
| Latest published release tag (see [GitHub releases](https://github.com/scottconverse/textflowkit/releases)) | Receives fixes through the next patch release |
|
|
17
17
|
| Earlier release tags, including earlier `0.1.x` tags | No backports |
|
|
18
18
|
| Unreleased `main` commits | Development only; not a supported release |
|
|
19
19
|
|
|
@@ -78,7 +78,7 @@ targeting an existing entry and fails with `patch: entry "<id>" not found`.
|
|
|
78
78
|
## MCP (for AI harnesses)
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
pip install
|
|
81
|
+
python -m pip install 'textflowkit[mcp]'
|
|
82
82
|
textflowkit-mcp # stdio (default)
|
|
83
83
|
textflowkit-mcp --transport http --host 127.0.0.1 --port 8766
|
|
84
84
|
```
|
|
@@ -123,7 +123,7 @@ OpenCode (`opencode.json`):
|
|
|
123
123
|
## HTTP (for software products and web frontends)
|
|
124
124
|
|
|
125
125
|
```bash
|
|
126
|
-
pip install
|
|
126
|
+
python -m pip install 'textflowkit[http]'
|
|
127
127
|
textflowkit-http --host 127.0.0.1 --port 8767
|
|
128
128
|
```
|
|
129
129
|
|
|
@@ -254,7 +254,7 @@ Binary formats cannot be returned inline, and asking for one that way returns a
|
|
|
254
254
|
clear message rather than failing deeper down.
|
|
255
255
|
|
|
256
256
|
```bash
|
|
257
|
-
pip install
|
|
257
|
+
python -m pip install 'textflowkit[export]' # python-docx + reportlab
|
|
258
258
|
curl -X POST "http://127.0.0.1:8767/jobs/$ID/export?formats=docx&formats=pdf"
|
|
259
259
|
```
|
|
260
260
|
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<meta property="og:type" content="website">
|
|
9
9
|
<meta property="og:title" content="TextFlowKit — media in, useful text out">
|
|
10
10
|
<meta property="og:description" content="An open-source transcription toolkit with one core and three ways in: CLI, MCP, and HTTP.">
|
|
11
|
-
<meta property="og:url" content="https://
|
|
12
|
-
<link rel="canonical" href="https://
|
|
11
|
+
<meta property="og:url" content="https://www.textflowkit.org/">
|
|
12
|
+
<link rel="canonical" href="https://www.textflowkit.org/">
|
|
13
13
|
<title>TextFlowKit — media in, useful text out</title>
|
|
14
14
|
<style>
|
|
15
15
|
:root {
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
<p class="lead">Transcribe video and audio into timestamped, searchable text. One shared core for your command line, AI harness, and application.</p>
|
|
190
190
|
<div class="actions">
|
|
191
191
|
<a class="button primary" href="#install">Get started <span aria-hidden="true"> →</span></a>
|
|
192
|
-
<a class="button secondary" href="https://
|
|
192
|
+
<a class="button secondary" href="https://pypi.org/project/textflowkit/">Install from PyPI <span aria-hidden="true"> ↗</span></a>
|
|
193
193
|
</div>
|
|
194
194
|
<p class="micro">Self-hosted toolkit · Native Windows, macOS, Linux · No account required</p>
|
|
195
195
|
</div>
|
|
@@ -265,7 +265,7 @@
|
|
|
265
265
|
<div>
|
|
266
266
|
<span class="kicker">Start building</span>
|
|
267
267
|
<h2 id="install-title">Bring your own media. Keep your workflow.</h2>
|
|
268
|
-
<p>Python 3.10+ and ffmpeg are the starting point.
|
|
268
|
+
<p>Python 3.10+ and ffmpeg are the starting point. Install from PyPI; the repository has GPU-specific notes, integration examples, and releases.</p>
|
|
269
269
|
<ul>
|
|
270
270
|
<li>Run locally on Windows without WSL, or on macOS and Linux.</li>
|
|
271
271
|
<li>Use durable SQLite jobs and bounded concurrency when you need them.</li>
|
|
@@ -274,9 +274,7 @@
|
|
|
274
274
|
<a class="button secondary" href="https://github.com/scottconverse/textflowkit/blob/main/docs/install.md">Read install guide ↗</a>
|
|
275
275
|
</div>
|
|
276
276
|
<div>
|
|
277
|
-
<pre class="codebox"><span class="prompt">$</span>
|
|
278
|
-
<span class="prompt">$</span> cd textflowkit
|
|
279
|
-
<span class="prompt">$</span> python -m pip install -e ".[mcp,http]"
|
|
277
|
+
<pre class="codebox"><span class="prompt">$</span> python -m pip install 'textflowkit[mcp,http]'
|
|
280
278
|
<span class="prompt">$</span> textflowkit doctor</pre>
|
|
281
279
|
<p class="note">For a GPU-specific or Windows-native ROCm setup, follow the <a href="https://github.com/scottconverse/textflowkit/blob/main/docs/install.md">install guide</a> instead of using this generic CPU-oriented quickstart.</p>
|
|
282
280
|
</div>
|
|
@@ -296,6 +294,7 @@
|
|
|
296
294
|
<div class="footer-links" aria-label="Project links">
|
|
297
295
|
<a href="https://github.com/scottconverse/textflowkit">Repository</a>
|
|
298
296
|
<a href="https://github.com/scottconverse/textflowkit/releases/latest">Releases</a>
|
|
297
|
+
<a href="https://pypi.org/project/textflowkit/">PyPI</a>
|
|
299
298
|
<a href="https://github.com/scottconverse/textflowkit/issues">Issues</a>
|
|
300
299
|
<a href="https://github.com/scottconverse/textflowkit/blob/main/LICENSE">License</a>
|
|
301
300
|
</div>
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
- **ffmpeg** on `PATH` (ffprobe comes with it)
|
|
7
7
|
- **yt-dlp** — installed as a dependency
|
|
8
8
|
|
|
9
|
+
For a standard CPU or NVIDIA environment, install from
|
|
10
|
+
[PyPI](https://pypi.org/project/textflowkit/) with
|
|
11
|
+
`python -m pip install textflowkit`. For an existing AMD ROCm environment,
|
|
12
|
+
follow the instructions below instead of allowing pip to replace your torch.
|
|
13
|
+
|
|
9
14
|
## AMD GPU support (ROCm) — no WSL required
|
|
10
15
|
|
|
11
16
|
textflowkit runs natively on Windows. On AMD hardware, GPU acceleration comes from a
|
|
@@ -28,9 +33,10 @@ distribution for the target architecture.
|
|
|
28
33
|
will happily replace a working ROCm torch with a stock PyPI CPU wheel, silently
|
|
29
34
|
disabling GPU acceleration.
|
|
30
35
|
|
|
31
|
-
Install the engine **without** letting
|
|
36
|
+
Install textflowkit and the engine **without** letting either resolve torch:
|
|
32
37
|
|
|
33
38
|
```bash
|
|
39
|
+
pip install textflowkit --no-deps
|
|
34
40
|
pip install openai-whisper yt-dlp --no-deps
|
|
35
41
|
pip install tiktoken more-itertools tqdm numba
|
|
36
42
|
```
|
|
@@ -230,4 +236,3 @@ how many segments were labelled. If the backend or token is missing, the run
|
|
|
230
236
|
With no GPU, the engine selects CPU automatically. Pass `--device cpu` to force it.
|
|
231
237
|
CPU transcription is dramatically slower; prefer a smaller `--model`.
|
|
232
238
|
|
|
233
|
-
|
|
@@ -48,3 +48,16 @@ neither result verifies the other 12 recognized sites.
|
|
|
48
48
|
|
|
49
49
|
The script deletes its temporary media and transcript after producing the
|
|
50
50
|
receipt. It does not upload cookies, media, or transcripts to GitHub.
|
|
51
|
+
|
|
52
|
+
## PyPI publication
|
|
53
|
+
|
|
54
|
+
If this release is also published to PyPI, upload the **same** verified wheel
|
|
55
|
+
and source archive as the GitHub release. Check package metadata before upload,
|
|
56
|
+
then compare both PyPI SHA-256 digests with the GitHub release assets. Finally,
|
|
57
|
+
install that exact version from the public PyPI index in a clean environment
|
|
58
|
+
and smoke the CLI entry point. An install with `--no-deps` proves distribution
|
|
59
|
+
and entry-point wiring only; it does not prove a full transcription run.
|
|
60
|
+
|
|
61
|
+
Never place an API token in this repository, a CI log, or a shell command line.
|
|
62
|
+
An upload is a separate public release action; passing CI alone does not
|
|
63
|
+
authorize it.
|
|
@@ -57,6 +57,23 @@
|
|
|
57
57
|
- [x] Correct the default input/output path-confinement documentation
|
|
58
58
|
- [x] Update pinned CI checkout and Python setup actions and verify the combined matrix
|
|
59
59
|
|
|
60
|
+
## Website hosting
|
|
61
|
+
|
|
62
|
+
- [x] Move the static landing page to Cloudflare Pages Free, connected to the
|
|
63
|
+
GitHub `main` branch with `docs/` as the site root
|
|
64
|
+
- [x] Serve `www.textflowkit.org` over HTTPS and redirect the apex domain to it
|
|
65
|
+
|
|
66
|
+
See [site deployment](site-deployment.md) for the hosting configuration. This
|
|
67
|
+
static page is documentation and a product landing page, not a hosted
|
|
68
|
+
transcription service.
|
|
69
|
+
|
|
70
|
+
## Package distribution
|
|
71
|
+
|
|
72
|
+
- [x] Publish the verified v0.1.3 wheel and source archive on PyPI
|
|
73
|
+
- [x] Prepare v0.1.4 with a PyPI-first package description and install guide
|
|
74
|
+
- [x] Make PyPI the default developer install path while keeping GitHub
|
|
75
|
+
releases and the native-Windows ROCm dependency instructions
|
|
76
|
+
|
|
60
77
|
The 13 listed media platforms are recognised through `yt-dlp`; **only YouTube**
|
|
61
78
|
has an opt-in [live URL transcription release gate](release-checklist.md), not
|
|
62
79
|
a deterministic pull-request job. The release gate runs locally on Windows,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Static website deployment
|
|
2
|
+
|
|
3
|
+
The [TextFlowKit landing page](https://www.textflowkit.org/) is the static
|
|
4
|
+
`docs/index.html` file. It does **not** run the CLI, MCP server, HTTP adapter,
|
|
5
|
+
or speech models. A public transcription service is a separate, future
|
|
6
|
+
deployment with its own security and capacity design.
|
|
7
|
+
|
|
8
|
+
## Cloudflare Pages configuration
|
|
9
|
+
|
|
10
|
+
- Plan: Cloudflare Pages Free.
|
|
11
|
+
- Project: `textflowkit`.
|
|
12
|
+
- Source: GitHub repository `scottconverse/textflowkit`, production branch
|
|
13
|
+
`main`. The Cloudflare Workers and Pages GitHub App is scoped to this
|
|
14
|
+
repository only.
|
|
15
|
+
- Root directory: `docs`.
|
|
16
|
+
- Build command: `exit 0` (the page is already static HTML).
|
|
17
|
+
- Build output directory: `.` (relative to `docs`).
|
|
18
|
+
- Environment variable: `SKIP_DEPENDENCY_INSTALL=1`. This prevents Pages
|
|
19
|
+
from trying to install the repository's Python transcription dependencies.
|
|
20
|
+
- Pages preview address: <https://textflowkit.pages.dev/>.
|
|
21
|
+
- Custom domains: `www.textflowkit.org` and `textflowkit.org`. Cloudflare DNS
|
|
22
|
+
has proxied CNAMEs for both to `textflowkit.pages.dev`.
|
|
23
|
+
- Canonical URL: `https://www.textflowkit.org/`. A Cloudflare Single Redirect
|
|
24
|
+
named `Canonical apex to www` sends HTTPS apex requests there with status
|
|
25
|
+
301, preserving path and query string. Cloudflare's HTTP-to-HTTPS redirect
|
|
26
|
+
handles HTTP requests before this rule.
|
|
27
|
+
|
|
28
|
+
Merging a change to `main` under `docs/` triggers a new Pages deployment.
|
|
29
|
+
Check the Pages deployment status and verify the public site over HTTPS after
|
|
30
|
+
each website change. GitHub CI remains the deterministic code/test gate;
|
|
31
|
+
Cloudflare Pages is only the static website host.
|
|
32
|
+
|
|
33
|
+
The former GitHub Pages `docs/CNAME` file is intentionally absent. Do not
|
|
34
|
+
recreate it: domain routing now lives in Cloudflare, not GitHub Pages.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "textflowkit"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.4"
|
|
8
8
|
description = "Cross-platform media transcription toolkit: URL or file in, timestamped transcripts and subtitle files out."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|