textflowkit 0.1.3__tar.gz → 0.1.5__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.
Files changed (94) hide show
  1. {textflowkit-0.1.3 → textflowkit-0.1.5}/.gitattributes +22 -22
  2. {textflowkit-0.1.3 → textflowkit-0.1.5}/.github/workflows/ci.yml +4 -2
  3. textflowkit-0.1.5/.github/workflows/publish-pypi.yml +114 -0
  4. {textflowkit-0.1.3 → textflowkit-0.1.5}/.gitignore +1 -1
  5. {textflowkit-0.1.3 → textflowkit-0.1.5}/.pre-commit-config.yaml +1 -1
  6. {textflowkit-0.1.3 → textflowkit-0.1.5}/CONTRIBUTING.md +4 -1
  7. {textflowkit-0.1.3 → textflowkit-0.1.5}/LEGAL.md +1 -1
  8. {textflowkit-0.1.3 → textflowkit-0.1.5}/LICENSE +1 -1
  9. {textflowkit-0.1.3 → textflowkit-0.1.5}/PKG-INFO +78 -29
  10. {textflowkit-0.1.3 → textflowkit-0.1.5}/README.md +71 -27
  11. {textflowkit-0.1.3 → textflowkit-0.1.5}/SECURITY.md +1 -1
  12. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/adapters.md +13 -4
  13. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/index.html +6 -7
  14. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/install.md +10 -4
  15. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/release-checklist.md +36 -0
  16. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/roadmap.md +28 -0
  17. textflowkit-0.1.5/docs/site-deployment.md +34 -0
  18. {textflowkit-0.1.3 → textflowkit-0.1.5}/pyproject.toml +10 -3
  19. {textflowkit-0.1.3 → textflowkit-0.1.5}/scripts/smoke_installed_wheel.py +34 -3
  20. textflowkit-0.1.5/src/textflowkit/__init__.py +8 -0
  21. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/adapters/__init__.py +1 -1
  22. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/adapters/http_server.py +5 -4
  23. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/adapters/mcp_server.py +6 -2
  24. textflowkit-0.1.5/src/textflowkit/assets/README.md +8 -0
  25. textflowkit-0.1.5/src/textflowkit/assets/selftest-speech.wav +0 -0
  26. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/cli.py +19 -26
  27. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/__init__.py +1 -1
  28. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/cancel.py +19 -19
  29. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/engine.py +12 -4
  30. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/model.py +34 -7
  31. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/pipeline.py +13 -1
  32. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/submission.py +3 -1
  33. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/timeutil.py +2 -2
  34. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/__init__.py +15 -0
  35. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/docx.py +71 -71
  36. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/markdown.py +1 -1
  37. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/pdf.py +9 -5
  38. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/srt.py +1 -1
  39. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/txt.py +1 -1
  40. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/render/vtt.py +1 -1
  41. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/__init__.py +1 -1
  42. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/detect.py +200 -200
  43. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/ollama_stub.py +110 -110
  44. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_adapters.py +57 -0
  45. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_batch.py +1 -1
  46. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_engine_cache.py +21 -0
  47. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_export.py +11 -0
  48. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_jobs.py +1 -1
  49. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_model.py +11 -2
  50. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_pipeline_integrity.py +48 -3
  51. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_release_boundaries.py +17 -0
  52. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_render.py +99 -99
  53. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_sources.py +2 -2
  54. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_stdio_protocol.py +213 -213
  55. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_submission.py +26 -0
  56. textflowkit-0.1.3/src/textflowkit/__init__.py +0 -8
  57. textflowkit-0.1.3/src/textflowkit/render/fonts/NotoSans.ttf +0 -0
  58. textflowkit-0.1.3/src/textflowkit/render/fonts/NotoSansArabic.ttf +0 -0
  59. textflowkit-0.1.3/src/textflowkit/render/fonts/NotoSansSC.ttf +0 -0
  60. textflowkit-0.1.3/src/textflowkit/render/fonts/OFL-NotoSans.txt +0 -94
  61. textflowkit-0.1.3/src/textflowkit/render/fonts/OFL-NotoSansSC.txt +0 -93
  62. textflowkit-0.1.3/src/textflowkit/render/fonts/README.md +0 -19
  63. {textflowkit-0.1.3 → textflowkit-0.1.5}/.github/dependabot.yml +0 -0
  64. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/.nojekyll +0 -0
  65. {textflowkit-0.1.3 → textflowkit-0.1.5}/docs/sources.md +0 -0
  66. {textflowkit-0.1.3 → textflowkit-0.1.5}/scripts/smoke_live_youtube.py +0 -0
  67. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/batch.py +0 -0
  68. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/bind.py +0 -0
  69. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/checkpoint.py +0 -0
  70. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/diarize.py +0 -0
  71. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/executor.py +0 -0
  72. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/jobs.py +0 -0
  73. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/paths.py +0 -0
  74. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/retrieval.py +0 -0
  75. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/runner.py +0 -0
  76. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/service.py +0 -0
  77. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/sqlite_store.py +0 -0
  78. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/core/translate.py +0 -0
  79. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/acquire.py +0 -0
  80. {textflowkit-0.1.3 → textflowkit-0.1.5}/src/textflowkit/sources/scratch.py +0 -0
  81. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/__init__.py +0 -0
  82. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_acquire.py +0 -0
  83. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_bind.py +0 -0
  84. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_checkpoint.py +0 -0
  85. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_cli.py +0 -0
  86. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_cli_resume_batch.py +0 -0
  87. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_diarize.py +0 -0
  88. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_executor.py +0 -0
  89. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_landing_page.py +0 -0
  90. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_live_smoke_script.py +0 -0
  91. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_paths.py +0 -0
  92. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_retrieval.py +0 -0
  93. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_service_profile.py +0 -0
  94. {textflowkit-0.1.3 → textflowkit-0.1.5}/tests/test_translate.py +0 -0
@@ -1,22 +1,22 @@
1
- # Normalise line endings so a build is the same on every platform.
2
- #
3
- # Without this, core.autocrlf rewrites text files on Windows checkout, so a
4
- # wheel built from a Windows clone differs byte-for-byte from one built on
5
- # Linux - same code, different bytes - and a published hash cannot be
6
- # reproduced. Text is stored as LF in the repository and in every build.
7
- * text=auto eol=lf
8
-
9
- # Binary assets must never be rewritten.
10
- *.png binary
11
- *.jpg binary
12
- *.jpeg binary
13
- *.gif binary
14
- *.ico binary
15
- *.pdf binary
16
- *.docx binary
17
- *.whl binary
18
- *.gz binary
19
-
20
- # Windows-only scripts keep CRLF.
21
- *.bat text eol=crlf
22
- *.cmd text eol=crlf
1
+ # Normalise line endings so a build is the same on every platform.
2
+ #
3
+ # Without this, core.autocrlf rewrites text files on Windows checkout, so a
4
+ # wheel built from a Windows clone differs byte-for-byte from one built on
5
+ # Linux - same code, different bytes - and a published hash cannot be
6
+ # reproduced. Text is stored as LF in the repository and in every build.
7
+ * text=auto eol=lf
8
+
9
+ # Binary assets must never be rewritten.
10
+ *.png binary
11
+ *.jpg binary
12
+ *.jpeg binary
13
+ *.gif binary
14
+ *.ico binary
15
+ *.pdf binary
16
+ *.docx binary
17
+ *.whl binary
18
+ *.gz binary
19
+
20
+ # Windows-only scripts keep CRLF.
21
+ *.bat text eol=crlf
22
+ *.cmd text eol=crlf
@@ -57,7 +57,8 @@ jobs:
57
57
  shell: bash
58
58
  run: |
59
59
  python -m pip install --upgrade pip
60
- python -m pip install -e ".[dev,mcp,http]"
60
+ python -m pip install ./packages/textflowkit-fonts
61
+ python -m pip install -e ".[dev,mcp,http,export]"
61
62
 
62
63
  - name: Show ffmpeg version
63
64
  shell: bash
@@ -84,6 +85,7 @@ jobs:
84
85
  run: |
85
86
  python -m pip install "setuptools>=83" "build>=1.2"
86
87
  python -m build --wheel
88
+ python -m build --wheel --outdir dist packages/textflowkit-fonts
87
89
  - name: Smoke all three installed entry points
88
90
  shell: bash
89
- run: python scripts/smoke_installed_wheel.py dist/*.whl
91
+ run: python scripts/smoke_installed_wheel.py dist/textflowkit-*.whl dist/textflowkit_fonts-*.whl
@@ -0,0 +1,114 @@
1
+ name: Publish PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ['v*']
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ if: github.repository == 'scottconverse/textflowkit'
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
16
+ with:
17
+ persist-credentials: false
18
+ fetch-depth: 0
19
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
20
+ with:
21
+ python-version: '3.12'
22
+ - run: python -m pip install packaging
23
+ - name: Verify release tag and package versions
24
+ env:
25
+ RELEASE_TAG: ${{ github.ref_name }}
26
+ run: |
27
+ python - <<'PY'
28
+ import os, tomllib
29
+ from pathlib import Path
30
+ from packaging.version import Version
31
+
32
+ tag = os.environ['RELEASE_TAG']
33
+ if not tag.startswith('v'):
34
+ raise SystemExit('Release tag must start with v')
35
+ version = str(Version(tag[1:]))
36
+ if tag != 'v' + version:
37
+ raise SystemExit('Release tag is not a normalized final version')
38
+ if Version(version).is_prerelease or Version(version).is_devrelease:
39
+ raise SystemExit('PyPI release must be a final version')
40
+ for file in (Path('pyproject.toml'), Path('packages/textflowkit-fonts/pyproject.toml')):
41
+ declared = tomllib.loads(file.read_text(encoding='utf-8'))['project']['version']
42
+ if declared != version:
43
+ raise SystemExit(f'{file}: {declared} != {version}')
44
+ PY
45
+ git merge-base --is-ancestor "$GITHUB_SHA" origin/main || {
46
+ echo 'Release tag is not merged into main' >&2
47
+ exit 1
48
+ }
49
+ - name: Build distributions
50
+ run: |
51
+ python -m pip install --upgrade build packaging
52
+ python -m build --sdist --wheel --outdir dist/main .
53
+ python -m build --sdist --wheel --outdir dist/fonts packages/textflowkit-fonts
54
+ python -m pip install twine
55
+ python -m twine check dist/main/* dist/fonts/*
56
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
57
+ with:
58
+ name: distributions
59
+ path: dist/
60
+ if-no-files-found: error
61
+
62
+ publish-fonts:
63
+ needs: build
64
+ runs-on: ubuntu-latest
65
+ environment: pypi
66
+ permissions:
67
+ id-token: write
68
+ steps:
69
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
70
+ with:
71
+ name: distributions
72
+ path: dist/
73
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
74
+ with:
75
+ packages-dir: dist/fonts/
76
+
77
+ publish-main:
78
+ needs: publish-fonts
79
+ runs-on: ubuntu-latest
80
+ environment: pypi
81
+ permissions:
82
+ id-token: write
83
+ steps:
84
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
85
+ with:
86
+ name: distributions
87
+ path: dist/
88
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
89
+ with:
90
+ packages-dir: dist/main/
91
+
92
+ publish-github-release:
93
+ needs: publish-main
94
+ runs-on: ubuntu-latest
95
+ permissions:
96
+ contents: write
97
+ steps:
98
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
99
+ with:
100
+ name: distributions
101
+ path: dist/
102
+ - name: Create draft with the exact PyPI distributions
103
+ env:
104
+ GH_TOKEN: ${{ github.token }}
105
+ RELEASE_TAG: ${{ github.ref_name }}
106
+ run: |
107
+ gh release create "$RELEASE_TAG" dist/main/* dist/fonts/* \
108
+ --repo "$GITHUB_REPOSITORY" --verify-tag --draft \
109
+ --title "$RELEASE_TAG" --generate-notes
110
+ - name: Publish complete GitHub release
111
+ env:
112
+ GH_TOKEN: ${{ github.token }}
113
+ RELEASE_TAG: ${{ github.ref_name }}
114
+ run: gh release edit "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" --draft=false
@@ -17,6 +17,7 @@ work/
17
17
  out/
18
18
  outputs/
19
19
  *.wav
20
+ !src/textflowkit/assets/selftest-speech.wav
20
21
  *.mp3
21
22
  *.m4a
22
23
  *.mp4
@@ -34,4 +35,3 @@ Thumbs.db
34
35
  .vscode/
35
36
  .idea/
36
37
  board/
37
-
@@ -15,4 +15,4 @@ repos:
15
15
  - id: check-yaml
16
16
  - id: check-toml
17
17
  - id: check-added-large-files
18
- args: [--maxkb=1024]
18
+ args: [--maxkb=1024]
@@ -13,7 +13,8 @@ cd textflowkit
13
13
  python -m venv .venv
14
14
  # Windows: .venv\Scripts\activate
15
15
  # POSIX: source .venv/bin/activate
16
- pip install -e ".[dev,mcp,http]"
16
+ pip install ./packages/textflowkit-fonts # local optional PDF font companion
17
+ pip install -e ".[dev,mcp,http,export]"
17
18
  ```
18
19
 
19
20
  ## Test and lint — the commands CI runs
@@ -60,6 +61,8 @@ mark it so it can be skipped in CI.
60
61
  - Add a test for a bug fix. If you cannot, say why in the PR description.
61
62
  - Run `ruff check .` and `python -m pytest` before opening the PR.
62
63
  - Do not commit media files, transcripts, or scratch output. `work/` is gitignored.
64
+ The bundled `src/textflowkit/assets/selftest-speech.wav` is an intentional,
65
+ small synthetic speech fixture; do not replace it with private recordings.
63
66
 
64
67
  ## Evidence language
65
68
 
@@ -41,4 +41,4 @@ outside the intended use of this project.
41
41
 
42
42
  "textflowkit" is an independent open-source project. It is not affiliated with,
43
43
  endorsed by, or connected to any other product or organisation using a similar
44
- name.
44
+ name.
@@ -200,4 +200,4 @@
200
200
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
201
  See the License for the specific language governing permissions and
202
202
  limitations under the License.
203
-
203
+
@@ -1,9 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: textflowkit
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: Cross-platform media transcription toolkit: URL or file in, timestamped transcripts and subtitle files out.
5
- Project-URL: Homepage, https://github.com/scottconverse/textflowkit
5
+ Project-URL: Homepage, https://www.textflowkit.org/
6
6
  Project-URL: Issues, https://github.com/scottconverse/textflowkit/issues
7
+ Project-URL: Source, https://github.com/scottconverse/textflowkit
8
+ Project-URL: Documentation, https://github.com/scottconverse/textflowkit/tree/main/docs
9
+ Project-URL: Changelog, https://github.com/scottconverse/textflowkit/releases
7
10
  License-Expression: Apache-2.0
8
11
  License-File: LICENSE
9
12
  Keywords: speech-to-text,srt,subtitles,transcription,vtt,whisper,yt-dlp
@@ -27,6 +30,7 @@ Requires-Dist: pyannote-audio>=4.0; extra == 'all'
27
30
  Requires-Dist: pydantic>=2.7; extra == 'all'
28
31
  Requires-Dist: python-docx>=1.1; extra == 'all'
29
32
  Requires-Dist: reportlab>=4.0; extra == 'all'
33
+ Requires-Dist: textflowkit-fonts<0.2,>=0.1.5; extra == 'all'
30
34
  Requires-Dist: uvicorn>=0.30; extra == 'all'
31
35
  Provides-Extra: dev
32
36
  Requires-Dist: pypdf>=5; extra == 'dev'
@@ -38,6 +42,7 @@ Requires-Dist: pyannote-audio>=4.0; extra == 'diarize'
38
42
  Provides-Extra: export
39
43
  Requires-Dist: python-docx>=1.1; extra == 'export'
40
44
  Requires-Dist: reportlab>=4.0; extra == 'export'
45
+ Requires-Dist: textflowkit-fonts<0.2,>=0.1.5; extra == 'export'
41
46
  Provides-Extra: http
42
47
  Requires-Dist: fastapi>=0.115; extra == 'http'
43
48
  Requires-Dist: pydantic>=2.7; extra == 'http'
@@ -50,9 +55,14 @@ Description-Content-Type: text/markdown
50
55
 
51
56
  Cross-platform media transcription toolkit. **One core, one CLI, thin adapters.**
52
57
 
53
- [Project landing page](https://scottconverse.github.io/textflowkit/) ·
58
+ [Project landing page](https://www.textflowkit.org/) ·
59
+ [PyPI package](https://pypi.org/project/textflowkit/) ·
54
60
  [GitHub releases](https://github.com/scottconverse/textflowkit/releases)
55
61
 
62
+ The [static site deployment](https://github.com/scottconverse/textflowkit/blob/main/docs/site-deployment.md) is hosted on Cloudflare
63
+ Pages. GitHub remains the source and CI host; the website does not run the
64
+ transcription engine.
65
+
56
66
  Paste a URL or point at a file; get timestamped transcripts and subtitle files back.
57
67
  Built as a reusable primitive for developers — designed to sit under multiple
58
68
  products, AI harnesses, and agents.
@@ -63,12 +73,12 @@ products, AI harnesses, and agents.
63
73
  >
64
74
  > **This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND**, express or
65
75
  > implied, including but not limited to the warranties of MERCHANTABILITY, FITNESS
66
- > FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](LICENSE) (Apache-2.0,
76
+ > FOR A PARTICULAR PURPOSE, and NONINFRINGEMENT. See [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE) (Apache-2.0,
67
77
  > §7–8) for the full disclaimer and limitation of liability.
68
78
  >
69
79
  > **You are responsible for what you transcribe.** textflowkit can fetch media from
70
80
  > 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).
81
+ > media you choose to process are **yours alone**. See [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md).
72
82
 
73
83
  ---
74
84
 
@@ -112,40 +122,79 @@ YouTube · TikTok · Facebook · Instagram · Vimeo · Twitch · Bilibili · Rum
112
122
  Kick · Zoom · Medal · Loom · Dropbox — plus **direct media URLs and local files**.
113
123
 
114
124
  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
125
+ [live end-to-end smoke](https://github.com/scottconverse/textflowkit/blob/main/docs/release-checklist.md). It is run on a Windows
116
126
  maintainer machine before a release, not on GitHub-hosted runners or every pull
117
127
  request. Local files have also been transcribed live. The other
118
128
  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).
129
+ change their access rules frequently. See [docs/sources.md](https://github.com/scottconverse/textflowkit/blob/main/docs/sources.md).
120
130
 
121
131
  ## Install
122
132
 
123
133
  Requires **Python ≥ 3.10** and **ffmpeg** on `PATH`.
124
134
 
125
135
  ```bash
126
- git clone https://github.com/scottconverse/textflowkit
127
- cd textflowkit
128
- pip install -e .
136
+ python -m pip install textflowkit
137
+ textflowkit doctor
129
138
  ```
130
139
 
131
- Or install the built wheel from the release page:
140
+ For MCP or the JSON HTTP adapter, install the matching extra:
132
141
 
133
142
  ```bash
134
- pip install https://github.com/scottconverse/textflowkit/releases/download/v0.1.3/textflowkit-0.1.3-py3-none-any.whl
143
+ python -m pip install 'textflowkit[mcp]' # MCP server
144
+ python -m pip install 'textflowkit[http]' # JSON HTTP API
135
145
  ```
136
146
 
137
- Not published to PyPI; the repository and its releases are the distribution path.
138
- The release page lists each artifact's SHA-256. (Those values are deliberately
139
- kept out of this file: the README is bundled into the wheel as its description,
140
- so a hash written here would change the artifact it describes.)
141
- Optional extras:
147
+ PDF/DOCX export is optional. The default wheel stays small; the `export` extra
148
+ installs `textflowkit-fonts` for offline multilingual PDF rendering:
142
149
 
143
150
  ```bash
144
- pip install -e ".[mcp]" # MCP server adapter
145
- pip install -e ".[http]" # HTTP API adapter
146
- pip install -e ".[dev]" # tests + linter
151
+ python -m pip install 'textflowkit[export]'
152
+ ```
153
+
154
+ ## Python API
155
+
156
+ The same pipeline used by the CLI and adapters is available to Python callers:
157
+
158
+ ```python
159
+ from textflowkit import transcribe
160
+
161
+ result = transcribe(
162
+ "meeting.mp4", # also accepts supported URLs
163
+ model="small",
164
+ formats=["json", "srt", "txt"],
165
+ output_dir="transcripts", # omit to return the transcript without writing files
166
+ )
167
+ print(result.transcript.text)
168
+ print(result.transcript.duration) # full media duration in seconds
169
+ print(result.outputs) # pathlib.Path objects for written files
170
+ for segment in result.transcript.segments:
171
+ print(segment.start, segment.end, segment.speaker, segment.text)
172
+ for word in segment.words:
173
+ print(" ", word.start, word.end, word.text)
147
174
  ```
148
175
 
176
+ `transcribe()` returns `TranscribeResult` with a canonical `Transcript` and
177
+ written output paths. `Transcript.to_dict()` / `.to_json()` preserve segment and
178
+ word timing; older transcript JSON without `words` remains readable. Pass
179
+ `input_root=` to confine local input paths for untrusted callers. See
180
+ [the install guide](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
181
+ for ffmpeg and Windows ROCm setup.
182
+
183
+ MCP and HTTP transcript reads omit word timings by default to keep responses
184
+ small; set `include_words=true` on a JSON read to receive them. Saved files,
185
+ Python results, and durable job records still retain the source-language words,
186
+ including when segment text has been translated.
187
+
188
+ **AMD ROCm on native Windows:** do not use the generic command in an environment
189
+ with a working ROCm PyTorch install. Ordinary dependency resolution can replace
190
+ that torch build. Follow the [ROCm install notes](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
191
+ to preserve it.
192
+
193
+ The same version's wheel and source archive are also on the
194
+ [GitHub release page](https://github.com/scottconverse/textflowkit/releases/latest).
195
+ The release lists their SHA-256 hashes. For editable source development, see
196
+ [CONTRIBUTING.md](https://github.com/scottconverse/textflowkit/blob/main/CONTRIBUTING.md).
197
+
149
198
  ## Usage
150
199
 
151
200
  ```bash
@@ -187,7 +236,7 @@ textflowkit export ./transcript.json --format vtt
187
236
  ## Use as an MCP server
188
237
 
189
238
  ```bash
190
- pip install -e ".[mcp]"
239
+ python -m pip install 'textflowkit[mcp]'
191
240
  textflowkit-mcp # stdio
192
241
  textflowkit-mcp --transport http --port 8766 # Streamable HTTP
193
242
  ```
@@ -214,12 +263,12 @@ These checks are not end-to-end transcription runs driven by each harness:
214
263
  There is also a protocol test that launches the server as a real subprocess and
215
264
  speaks newline-delimited JSON-RPC over stdio, so the entry point, framing, and
216
265
  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.
266
+ See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md) for per-harness configuration.
218
267
 
219
268
  ## Use as an HTTP API
220
269
 
221
270
  ```bash
222
- pip install -e ".[http]"
271
+ python -m pip install 'textflowkit[http]'
223
272
  textflowkit-http --port 8767
224
273
  ```
225
274
 
@@ -227,7 +276,7 @@ Submit a job, poll it, fetch the transcript. Developer mode is unauthenticated
227
276
  and defaults to localhost. The opt-in JSON HTTP production profile requires a
228
277
  Bearer token, explicit roots, durable SQLite jobs, and request/rate/media/output
229
278
  limits; URL input additionally requires an SSRF-filtering egress proxy. See
230
- [adapter deployment details](docs/adapters.md#developer-mode-and-production-profile).
279
+ [adapter deployment details](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md#developer-mode-and-production-profile).
231
280
 
232
281
  ## Durable, bounded, cancellable
233
282
 
@@ -237,7 +286,7 @@ TEXTFLOWKIT_MAX_CONCURRENCY=1 # default; Whisper saturates a GPU alone
237
286
  ```
238
287
 
239
288
  `cancel_job` stops a queued job immediately, or a running job at its next stage
240
- boundary. See [docs/adapters.md](docs/adapters.md).
289
+ boundary. See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md).
241
290
 
242
291
  ## Long jobs never block
243
292
 
@@ -248,19 +297,19 @@ web frontend share the job contract without blocking a request.
248
297
 
249
298
  ## Status
250
299
 
251
- **v0.1.3 release.** Core, CLI, MCP, and HTTP have automated
300
+ **v0.1.4 release.** Core, CLI, MCP, and HTTP have automated
252
301
  coverage; Windows-native ROCm and a dated local Windows YouTube run were verified.
253
302
  The GitHub-hosted YouTube attempt was blocked by a bot challenge, so hosted
254
303
  live transcription is not verified.
255
304
  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).
305
+ tested end to end. See [docs/roadmap.md](https://github.com/scottconverse/textflowkit/blob/main/docs/roadmap.md).
257
306
 
258
307
  ## License
259
308
 
260
- Apache-2.0 — see [LICENSE](LICENSE). Includes an explicit patent grant and a
309
+ Apache-2.0 — see [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE). Includes an explicit patent grant and a
261
310
  limitation of liability.
262
311
 
263
312
  ## Contributing
264
313
 
265
- Issues and PRs welcome. Please read [LEGAL.md](LEGAL.md) before adding a source
314
+ Issues and PRs welcome. Please read [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md) before adding a source
266
315
  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://scottconverse.github.io/textflowkit/) ·
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,40 +69,79 @@ 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
- git clone https://github.com/scottconverse/textflowkit
79
- cd textflowkit
80
- pip install -e .
83
+ python -m pip install textflowkit
84
+ textflowkit doctor
81
85
  ```
82
86
 
83
- Or install the built wheel from the release page:
87
+ For MCP or the JSON HTTP adapter, install the matching extra:
84
88
 
85
89
  ```bash
86
- pip install https://github.com/scottconverse/textflowkit/releases/download/v0.1.3/textflowkit-0.1.3-py3-none-any.whl
90
+ python -m pip install 'textflowkit[mcp]' # MCP server
91
+ python -m pip install 'textflowkit[http]' # JSON HTTP API
87
92
  ```
88
93
 
89
- Not published to PyPI; the repository and its releases are the distribution path.
90
- The release page lists each artifact's SHA-256. (Those values are deliberately
91
- kept out of this file: the README is bundled into the wheel as its description,
92
- so a hash written here would change the artifact it describes.)
93
- Optional extras:
94
+ PDF/DOCX export is optional. The default wheel stays small; the `export` extra
95
+ installs `textflowkit-fonts` for offline multilingual PDF rendering:
94
96
 
95
97
  ```bash
96
- pip install -e ".[mcp]" # MCP server adapter
97
- pip install -e ".[http]" # HTTP API adapter
98
- pip install -e ".[dev]" # tests + linter
98
+ python -m pip install 'textflowkit[export]'
99
+ ```
100
+
101
+ ## Python API
102
+
103
+ The same pipeline used by the CLI and adapters is available to Python callers:
104
+
105
+ ```python
106
+ from textflowkit import transcribe
107
+
108
+ result = transcribe(
109
+ "meeting.mp4", # also accepts supported URLs
110
+ model="small",
111
+ formats=["json", "srt", "txt"],
112
+ output_dir="transcripts", # omit to return the transcript without writing files
113
+ )
114
+ print(result.transcript.text)
115
+ print(result.transcript.duration) # full media duration in seconds
116
+ print(result.outputs) # pathlib.Path objects for written files
117
+ for segment in result.transcript.segments:
118
+ print(segment.start, segment.end, segment.speaker, segment.text)
119
+ for word in segment.words:
120
+ print(" ", word.start, word.end, word.text)
99
121
  ```
100
122
 
123
+ `transcribe()` returns `TranscribeResult` with a canonical `Transcript` and
124
+ written output paths. `Transcript.to_dict()` / `.to_json()` preserve segment and
125
+ word timing; older transcript JSON without `words` remains readable. Pass
126
+ `input_root=` to confine local input paths for untrusted callers. See
127
+ [the install guide](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
128
+ for ffmpeg and Windows ROCm setup.
129
+
130
+ MCP and HTTP transcript reads omit word timings by default to keep responses
131
+ small; set `include_words=true` on a JSON read to receive them. Saved files,
132
+ Python results, and durable job records still retain the source-language words,
133
+ including when segment text has been translated.
134
+
135
+ **AMD ROCm on native Windows:** do not use the generic command in an environment
136
+ with a working ROCm PyTorch install. Ordinary dependency resolution can replace
137
+ that torch build. Follow the [ROCm install notes](https://github.com/scottconverse/textflowkit/blob/main/docs/install.md)
138
+ to preserve it.
139
+
140
+ The same version's wheel and source archive are also on the
141
+ [GitHub release page](https://github.com/scottconverse/textflowkit/releases/latest).
142
+ The release lists their SHA-256 hashes. For editable source development, see
143
+ [CONTRIBUTING.md](https://github.com/scottconverse/textflowkit/blob/main/CONTRIBUTING.md).
144
+
101
145
  ## Usage
102
146
 
103
147
  ```bash
@@ -139,7 +183,7 @@ textflowkit export ./transcript.json --format vtt
139
183
  ## Use as an MCP server
140
184
 
141
185
  ```bash
142
- pip install -e ".[mcp]"
186
+ python -m pip install 'textflowkit[mcp]'
143
187
  textflowkit-mcp # stdio
144
188
  textflowkit-mcp --transport http --port 8766 # Streamable HTTP
145
189
  ```
@@ -166,12 +210,12 @@ These checks are not end-to-end transcription runs driven by each harness:
166
210
  There is also a protocol test that launches the server as a real subprocess and
167
211
  speaks newline-delimited JSON-RPC over stdio, so the entry point, framing, and
168
212
  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.
213
+ See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md) for per-harness configuration.
170
214
 
171
215
  ## Use as an HTTP API
172
216
 
173
217
  ```bash
174
- pip install -e ".[http]"
218
+ python -m pip install 'textflowkit[http]'
175
219
  textflowkit-http --port 8767
176
220
  ```
177
221
 
@@ -179,7 +223,7 @@ Submit a job, poll it, fetch the transcript. Developer mode is unauthenticated
179
223
  and defaults to localhost. The opt-in JSON HTTP production profile requires a
180
224
  Bearer token, explicit roots, durable SQLite jobs, and request/rate/media/output
181
225
  limits; URL input additionally requires an SSRF-filtering egress proxy. See
182
- [adapter deployment details](docs/adapters.md#developer-mode-and-production-profile).
226
+ [adapter deployment details](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md#developer-mode-and-production-profile).
183
227
 
184
228
  ## Durable, bounded, cancellable
185
229
 
@@ -189,7 +233,7 @@ TEXTFLOWKIT_MAX_CONCURRENCY=1 # default; Whisper saturates a GPU alone
189
233
  ```
190
234
 
191
235
  `cancel_job` stops a queued job immediately, or a running job at its next stage
192
- boundary. See [docs/adapters.md](docs/adapters.md).
236
+ boundary. See [docs/adapters.md](https://github.com/scottconverse/textflowkit/blob/main/docs/adapters.md).
193
237
 
194
238
  ## Long jobs never block
195
239
 
@@ -200,19 +244,19 @@ web frontend share the job contract without blocking a request.
200
244
 
201
245
  ## Status
202
246
 
203
- **v0.1.3 release.** Core, CLI, MCP, and HTTP have automated
247
+ **v0.1.4 release.** Core, CLI, MCP, and HTTP have automated
204
248
  coverage; Windows-native ROCm and a dated local Windows YouTube run were verified.
205
249
  The GitHub-hosted YouTube attempt was blocked by a bot challenge, so hosted
206
250
  live transcription is not verified.
207
251
  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).
252
+ tested end to end. See [docs/roadmap.md](https://github.com/scottconverse/textflowkit/blob/main/docs/roadmap.md).
209
253
 
210
254
  ## License
211
255
 
212
- Apache-2.0 — see [LICENSE](LICENSE). Includes an explicit patent grant and a
256
+ Apache-2.0 — see [LICENSE](https://github.com/scottconverse/textflowkit/blob/main/LICENSE). Includes an explicit patent grant and a
213
257
  limitation of liability.
214
258
 
215
259
  ## Contributing
216
260
 
217
- Issues and PRs welcome. Please read [LEGAL.md](LEGAL.md) before adding a source
261
+ Issues and PRs welcome. Please read [LEGAL.md](https://github.com/scottconverse/textflowkit/blob/main/LEGAL.md) before adding a source
218
262
  adapter.
@@ -13,7 +13,7 @@ you expected.
13
13
 
14
14
  | Version | Security-fix policy |
15
15
  |---|---|
16
- | Latest published release tag (currently `v0.1.3`) | Receives fixes through the next patch release |
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