# π¬ DuoSubs
[](https://github.com/CK-Explorer/DuoSubs/actions/workflows/ci.yml)
[](https://pypi.org/project/duosubs/)
[](https://pypi.org/project/duosubs/)
[](https://github.com/CK-Explorer/DuoSubs/blob/main/LICENSE)
[](http://mypy-lang.org/)
[](https://github.com/astral-sh/ruff)
[](https://codecov.io/gh/CK-Explorer/DuoSubs)
[](https://duosubs.readthedocs.io/en/latest/?badge=latest)
[](https://colab.research.google.com/github/CK-Explorer/DuoSubs/blob/main/notebook/DuoSubs-webui.ipynb)
[](https://huggingface.co/spaces/CK-Explorer/DuoSubs)
Merging subtitles using only the nearest timestamp often leads to incorrect pairings
β lines may end up out of sync, duplicated, or mismatched.
This Python tool uses **semantic similarity**
(via [Sentence Transformers](https://www.sbert.net/)) to align subtitle lines based on
**meaning** instead of timestamps β making it possible to pair subtitles across
**different languages**.
---
## β¨ Features
- π Aligns subtitle lines based on **meaning**, not timing
- π **Multilingual** support based on the **user** selected
[Sentence Transformer model](https://huggingface.co/models?library=sentence-transformers)
- π Flexible format support β works with **SRT**, **VTT**, **MPL2**, **TTML**, **ASS**,
**SSA** files
- π§© Easy-to-use **Python API** for integration
- π» **Command-line interface** with customizable options
- π **Web UI** β run locally or in the cloud via
[Google Colab](https://colab.research.google.com/github/CK-Explorer/DuoSubs/blob/main/notebook/DuoSubs-webui.ipynb)
or
[Hugging Face Spaces](https://huggingface.co/spaces/CK-Explorer/DuoSubs)
---
## βοΈ Cloud Deployment
You can launch the Web UI instantly without installing anything locally by running it in the cloud.
- [](https://colab.research.google.com/github/CK-Explorer/DuoSubs/blob/main/notebook/DuoSubs-webui.ipynb)
- [](https://huggingface.co/spaces/CK-Explorer/DuoSubs)
> [!NOTE]
> - Google Colab has a limited runtime allocation, especially when using the free instance.
> - On Hugging Face Spaces, only a few models are preloaded, and inference can be slower because it runs on CPU.
---
## π» Local Deployment
### π οΈ Installation
1. Install the correct version of PyTorch for your system by following the official
instructions: https://pytorch.org/get-started/locally
2. Install this repo via pip:
```bash
pip install duosubs
```
### π Usage
#### π Launch Web UI Locally
You can launch the web UI locally:
- via command line
```bash
duosubs launch-webui
```
- via Python API
```python
from duosubs import create_duosubs_gr_blocks
# Build the Web UI layout (Gradio Blocks)
webui = create_duosubs_gr_blocks()
# These commands work just like launching a regular Gradio app
webui.queue(default_concurrency_limit=None) # Allow unlimited concurrent requests
webui.launch(inbrowser=True) # Start the Web UI and open it in a browser tab
```
This starts the server, prints its url (e.g. http://127.0.0.1:7860), and then opens the Web UI
in a new browser tab.
If you want to launch it in other url (e.g. 0.0.0.0) and port (e.g 8000), you can run:
- via command line
```bash
duosubs launch-webui --host 0.0.0.0 --port 8000
```
- via Python API
```python
from duosubs import create_duosubs_gr_blocks
webui = create_duosubs_gr_blocks()
webui.queue(default_concurrency_limit=None)
webui.launch(
server_name = "0.0.0.0", # use different address
server_port = 8000, # use different port number
inbrowser=True
)
```
> [!WARNING]
> - The Web UI caches files during processing, and clears files older than 2 hours every 1 hour. Cached data may remain if the server stops unexpectedly.
> - Sometimes, older model may fail to be released after switching or closing sessions. If you run out of RAM or VRAM, simply restart the script.
To learn more about the launching options, please see the sections of
[Launch Web UI Command](https://duosubs.readthedocs.io/en/latest/cli_usage/launch_webui.html)
and [Web UI Launching](https://duosubs.readthedocs.io/en/latest/api_usage/web_ui_launching.html)
in the [documentation](https://duosubs.readthedocs.io/en/latest/).
#### π» Merge Subtitles
With the [demo files](https://github.com/CK-Explorer/DuoSubs/blob/main/demo/) provided, here are the simplest way to merge the subtitles:
- via command line
```bash
duosubs merge -p demo/primary_sub.srt -s demo/secondary_sub.srt
```
- via Python API
```python
from duosubs import MergeArgs, run_merge_pipeline
# Store all arguments
args = MergeArgs(
primary="demo/primary_sub.srt",
secondary="demo/secondary_sub.srt"
)
# Load, merge, and save subtitles.
run_merge_pipeline(args, print)
```
These codes will produce [primary_sub.zip](https://github.com/CK-Explorer/DuoSubs/blob/main/demo/primary_sub.zip), with the following structure:
```text
primary_sub.zip
βββ primary_sub_combined.ass # Merged subtitles
βββ primary_sub_primary.ass # Original primary subtitles
βββ primary_sub_secondary.ass # Time-shifted secondary subtitles
```
By default, the Sentence Transformer model used is
[LaBSE](https://huggingface.co/sentence-transformers/LaBSE).
If you want to experiment with different models, then pick one from
[π€ Hugging Face](https://huggingface.co/models?library=sentence-transformers)
or check out from the
[leaderboard](https://huggingface.co/spaces/mteb/leaderboard)
for top performing model.
For example, if the model chosen is
[Qwen/Qwen3-Embedding-0.6B](https://huggingface.co/Qwen/Qwen3-Embedding-0.6B),
you can run:
- via command line
```bash
duosubs merge -p demo/primary_sub.srt -s demo/secondary_sub.srt --model Qwen/Qwen3-Embedding-0.6B
```
- via Python API
```python
from duosubs import MergeArgs, run_merge_pipeline
# Store all arguments
args = MergeArgs(
primary="demo/primary_sub.srt",
secondary="demo/secondary_sub.srt",
model="Qwen/Qwen3-Embedding-0.6B"
)
# Load, merge, and save subtitles.
run_merge_pipeline(args, print)
```
> [!WARNING]
> - Some models may require significant RAM or GPU (VRAM) to run, and might not be compatible with all devices β especially larger models.
> - Also, please ensure the selected model supports your desired language for reliable results.
To learn more about merging options, please see the sections of
[Merge Command](https://duosubs.readthedocs.io/en/latest/cli_usage/merge.html)
and [Core Subtitle Merging](https://duosubs.readthedocs.io/en/latest/api_usage/core_subtitle_merging.html)
in the [documentation](https://duosubs.readthedocs.io/en/latest/).
---
## π Behind the Scenes
1. Parse subtitles and detect language.
2. Tokenize subtitle lines.
3. Extract and filter non-overlapping subtitles. *(Optional)*
4. Estimate tokenized subtitle pairings using DTW.
5. Refine alignment using a sliding window approach.
6. Combine aligned and non-overlapping subtitles.
7. Eliminate unnecessary newline within subtitle lines.
---
## π« Known Limitations
- The **accuracy** of the merging process **varies** on the
[model](https://huggingface.co/models?library=sentence-transformers) selected.
- Some models may produce **unreliable results** for **unsupported** or low-resource **languages**.
- Some sentence **fragments** from secondary subtitles may be **misaligned** to the
primary subtitles line due to the tokenization algorithm used.
- **Secondary** subtitles might **contain extra whitespace** as a result of token-level merging.
- The algorithm may **not** work reliably if the **timestamps** of some matching lines
**donβt overlap** at all.
> [!TIP]
> For the final known limitation, there are three possible ways to address it:
> 1. If **all** subtitle lines are completely **out of sync**, consider using another subtitle syncing tool first to align them, e.g.
>
> - [smacke/ffsubsync](https://github.com/smacke/ffsubsync)
> - [sc0ty/subsync](https://github.com/sc0ty/subsync)
> - [kaegi/alass](https://github.com/kaegi/alass)
>
> before using this tool with `ignore-non-overlap-filter` **disabled**.
>
> Alternatively, see points 2 and 3.
>
> 2. If both subtitle files are **known** to be **perfectly semantically aligned**, meaning:
>
> - **matching dialogue contents**
> - **no extra lines** like scene annotations or bonus Directorβs Cut stuff.
>
> Then, just **enable** the `ignore-non-overlap-filter` option in either
>
> - Web UI :
> - `Advanced Configurations` β `Alignment Behavior` β `Ignore Non-Overlap Filter`
> - CLI :
> - [`--ignore-non-overlap-filter`](https://duosubs.readthedocs.io/en/latest/cli_usage/merge.html#ignore-non-overlap-filter)
> - Python API :
> - [`duosubs.MergeArgs()`](https://duosubs.readthedocs.io/en/latest/api_references/core_subtitle_merging.html#duosubs.MergeArgs)
> - [`duosubs.Merger.merge_subtitle()`](https://duosubs.readthedocs.io/en/latest/api_references/core_subtitle_merging.html#duosubs.Merger.merge_subtitle)
>
> to skip the overlap check β the merge should go smoothly from there.
>
> 3. If the subtitle **timings** are **off** and the two subtitle files **donβt fully match in content**, the algorithm likely **wonβt** produce great results. Still, you can try running it with `ignore-non-overlap-filter` **enabled**.
---
## π Acknowledgements
This project wouldn't be possible without the incredible work of the open-source community.
Special thanks to:
- [sentence-transformers](https://github.com/UKPLab/sentence-transformers) β for the semantic
embedding backbone
- [Hugging Face](https://huggingface.co/) β for hosting models and making them easy to use
- [PyTorch](https://pytorch.org/) β for providing the deep learning framework
- [fastdtw](https://github.com/slaypni/fastdtw) β for aligning the subtitles
- [lingua-py](https://github.com/pemistahl/lingua-py) β for detecting the subtitles' language codes
- [pysubs2](https://github.com/tkarabela/pysubs2) β for subtitle file I/O utilities
- [charset_normalizer](https://github.com/jawah/charset_normalizer) β for identifying the file
encoding
- [typer](https://github.com/fastapi/typer) β for CLI application
- [tqdm](https://github.com/tqdm/tqdm) β for displaying progress bar
- [gradio](https://github.com/gradio-app/gradio) β for creating Web UI application
- [Tears of Steel](https://mango.blender.org/) β subtitles used for demo, testing and development
purposes. Created by the
[Blender Foundation](https://mango.blender.org/), licensed under
[CC BY 3.0](http://creativecommons.org/licenses/by/3.0/).
---
## π€ Contributing
Contributions are welcome! If you'd like to submit a pull request, please check out the
[contributing guidelines](https://github.com/CK-Explorer/DuoSubs/blob/main/CONTRIBUTING.md).
---
## π License
Apache-2.0 license - see the [LICENSE](https://github.com/CK-Explorer/DuoSubs/blob/main/LICENSE) file for details.
Raw data
{
"_id": null,
"home_page": null,
"name": "duosubs",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "subtitles, alignment, merging, sentence-transformers, sentence-similarity, bilingual, nlp",
"author": "CK-Explorer ",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/3e/4c/ff80ba52d724102dd226005129df7a3acf04eef62559cce39d4807cdc8f9/duosubs-1.0.1.tar.gz",
"platform": null,
"description": "# \ud83c\udfac DuoSubs\n\n[](https://github.com/CK-Explorer/DuoSubs/actions/workflows/ci.yml)\n[](https://pypi.org/project/duosubs/)\n[](https://pypi.org/project/duosubs/)\n[](https://github.com/CK-Explorer/DuoSubs/blob/main/LICENSE)\n[](http://mypy-lang.org/)\n[](https://github.com/astral-sh/ruff)\n[](https://codecov.io/gh/CK-Explorer/DuoSubs)\n[](https://duosubs.readthedocs.io/en/latest/?badge=latest)\n[](https://colab.research.google.com/github/CK-Explorer/DuoSubs/blob/main/notebook/DuoSubs-webui.ipynb)\n[](https://huggingface.co/spaces/CK-Explorer/DuoSubs)\n\nMerging subtitles using only the nearest timestamp often leads to incorrect pairings\n\u2014 lines may end up out of sync, duplicated, or mismatched.\n\nThis Python tool uses **semantic similarity** \n(via [Sentence Transformers](https://www.sbert.net/)) to align subtitle lines based on \n**meaning** instead of timestamps \u2014 making it possible to pair subtitles across \n**different languages**.\n\n---\n\n## \u2728 Features\n\n- \ud83d\udccc Aligns subtitle lines based on **meaning**, not timing\n- \ud83c\udf0d **Multilingual** support based on the **user** selected \n[Sentence Transformer model](https://huggingface.co/models?library=sentence-transformers)\n- \ud83d\udcc4 Flexible format support \u2014 works with **SRT**, **VTT**, **MPL2**, **TTML**, **ASS**, \n**SSA** files\n- \ud83e\udde9 Easy-to-use **Python API** for integration\n- \ud83d\udcbb **Command-line interface** with customizable options\n- \ud83c\udf10 **Web UI** \u2014 run locally or in the cloud via \n[Google Colab](https://colab.research.google.com/github/CK-Explorer/DuoSubs/blob/main/notebook/DuoSubs-webui.ipynb)\nor \n[Hugging Face Spaces](https://huggingface.co/spaces/CK-Explorer/DuoSubs)\n\n---\n\n## \u2601\ufe0f Cloud Deployment\n\nYou can launch the Web UI instantly without installing anything locally by running it in the cloud.\n\n- [](https://colab.research.google.com/github/CK-Explorer/DuoSubs/blob/main/notebook/DuoSubs-webui.ipynb)\n- [](https://huggingface.co/spaces/CK-Explorer/DuoSubs)\n\n> [!NOTE]\n> - Google Colab has a limited runtime allocation, especially when using the free instance.\n> - On Hugging Face Spaces, only a few models are preloaded, and inference can be slower because it runs on CPU.\n\n---\n\n## \ud83d\udcbb Local Deployment\n\n### \ud83d\udee0\ufe0f Installation\n\n1. Install the correct version of PyTorch for your system by following the official \ninstructions: https://pytorch.org/get-started/locally\n2. Install this repo via pip:\n ```bash\n pip install duosubs\n ```\n\n### \ud83d\ude80 Usage\n\n#### \ud83c\udf10 Launch Web UI Locally\n\nYou can launch the web UI locally:\n\n- via command line\n\n ```bash\n duosubs launch-webui\n ```\n\n- via Python API\n\n ```python\n from duosubs import create_duosubs_gr_blocks\n\n # Build the Web UI layout (Gradio Blocks)\n webui = create_duosubs_gr_blocks() \n\n # These commands work just like launching a regular Gradio app\n webui.queue(default_concurrency_limit=None) # Allow unlimited concurrent requests\n webui.launch(inbrowser=True) # Start the Web UI and open it in a browser tab\n ```\n\nThis starts the server, prints its url (e.g. http://127.0.0.1:7860), and then opens the Web UI\nin a new browser tab.\n\nIf you want to launch it in other url (e.g. 0.0.0.0) and port (e.g 8000), you can run:\n\n- via command line\n\n ```bash\n duosubs launch-webui --host 0.0.0.0 --port 8000\n ```\n\n- via Python API\n\n ```python\n from duosubs import create_duosubs_gr_blocks\n\n webui = create_duosubs_gr_blocks() \n\n webui.queue(default_concurrency_limit=None)\n webui.launch(\n server_name = \"0.0.0.0\", # use different address\n server_port = 8000, # use different port number\n inbrowser=True\n )\n ```\n\n> [!WARNING]\n> - The Web UI caches files during processing, and clears files older than 2 hours every 1 hour. Cached data may remain if the server stops unexpectedly.\n> - Sometimes, older model may fail to be released after switching or closing sessions. If you run out of RAM or VRAM, simply restart the script.\n\nTo learn more about the launching options, please see the sections of \n[Launch Web UI Command](https://duosubs.readthedocs.io/en/latest/cli_usage/launch_webui.html)\nand [Web UI Launching](https://duosubs.readthedocs.io/en/latest/api_usage/web_ui_launching.html)\nin the [documentation](https://duosubs.readthedocs.io/en/latest/).\n\n#### \ud83d\udcbb Merge Subtitles\n\nWith the [demo files](https://github.com/CK-Explorer/DuoSubs/blob/main/demo/) provided, here are the simplest way to merge the subtitles:\n\n- via command line\n\n ```bash\n duosubs merge -p demo/primary_sub.srt -s demo/secondary_sub.srt\n ```\n\n- via Python API\n\n ```python\n from duosubs import MergeArgs, run_merge_pipeline\n\n # Store all arguments\n args = MergeArgs(\n primary=\"demo/primary_sub.srt\",\n secondary=\"demo/secondary_sub.srt\"\n )\n\n # Load, merge, and save subtitles.\n run_merge_pipeline(args, print)\n ```\n\nThese codes will produce [primary_sub.zip](https://github.com/CK-Explorer/DuoSubs/blob/main/demo/primary_sub.zip), with the following structure:\n\n```text\nprimary_sub.zip\n\u251c\u2500\u2500 primary_sub_combined.ass # Merged subtitles\n\u251c\u2500\u2500 primary_sub_primary.ass # Original primary subtitles\n\u2514\u2500\u2500 primary_sub_secondary.ass # Time-shifted secondary subtitles\n```\n\nBy default, the Sentence Transformer model used is \n[LaBSE](https://huggingface.co/sentence-transformers/LaBSE).\n\nIf you want to experiment with different models, then pick one from\n[\ud83e\udd17 Hugging Face](https://huggingface.co/models?library=sentence-transformers) \nor check out from the\n[leaderboard](https://huggingface.co/spaces/mteb/leaderboard)\nfor top performing model.\n\nFor example, if the model chosen is \n[Qwen/Qwen3-Embedding-0.6B](https://huggingface.co/Qwen/Qwen3-Embedding-0.6B), \nyou can run:\n\n- via command line\n\n ```bash\n duosubs merge -p demo/primary_sub.srt -s demo/secondary_sub.srt --model Qwen/Qwen3-Embedding-0.6B\n ```\n\n- via Python API\n\n ```python\n from duosubs import MergeArgs, run_merge_pipeline\n\n # Store all arguments\n args = MergeArgs(\n primary=\"demo/primary_sub.srt\",\n secondary=\"demo/secondary_sub.srt\",\n model=\"Qwen/Qwen3-Embedding-0.6B\"\n )\n\n # Load, merge, and save subtitles.\n run_merge_pipeline(args, print)\n ```\n\n> [!WARNING]\n> - Some models may require significant RAM or GPU (VRAM) to run, and might not be compatible with all devices \u2014 especially larger models. \n> - Also, please ensure the selected model supports your desired language for reliable results.\n\nTo learn more about merging options, please see the sections of\n[Merge Command](https://duosubs.readthedocs.io/en/latest/cli_usage/merge.html)\nand [Core Subtitle Merging](https://duosubs.readthedocs.io/en/latest/api_usage/core_subtitle_merging.html)\nin the [documentation](https://duosubs.readthedocs.io/en/latest/).\n\n---\n\n## \ud83d\udcda Behind the Scenes\n\n1. Parse subtitles and detect language.\n2. Tokenize subtitle lines.\n3. Extract and filter non-overlapping subtitles. *(Optional)*\n4. Estimate tokenized subtitle pairings using DTW.\n5. Refine alignment using a sliding window approach.\n6. Combine aligned and non-overlapping subtitles.\n7. Eliminate unnecessary newline within subtitle lines.\n\n---\n\n## \ud83d\udeab Known Limitations\n\n- The **accuracy** of the merging process **varies** on the \n[model](https://huggingface.co/models?library=sentence-transformers) selected.\n- Some models may produce **unreliable results** for **unsupported** or low-resource **languages**.\n- Some sentence **fragments** from secondary subtitles may be **misaligned** to the \nprimary subtitles line due to the tokenization algorithm used.\n- **Secondary** subtitles might **contain extra whitespace** as a result of token-level merging.\n- The algorithm may **not** work reliably if the **timestamps** of some matching lines\n**don\u2019t overlap** at all.\n\n> [!TIP]\n> For the final known limitation, there are three possible ways to address it:\n> 1. If **all** subtitle lines are completely **out of sync**, consider using another subtitle syncing tool first to align them, e.g.\n>\n> - [smacke/ffsubsync](https://github.com/smacke/ffsubsync)\n> - [sc0ty/subsync](https://github.com/sc0ty/subsync)\n> - [kaegi/alass](https://github.com/kaegi/alass)\n>\n> before using this tool with `ignore-non-overlap-filter` **disabled**.\n>\n> Alternatively, see points 2 and 3.\n>\n> 2. If both subtitle files are **known** to be **perfectly semantically aligned**, meaning:\n>\n> - **matching dialogue contents**\n> - **no extra lines** like scene annotations or bonus Director\u2019s Cut stuff.\n>\n> Then, just **enable** the `ignore-non-overlap-filter` option in either\n>\n> - Web UI :\n> - `Advanced Configurations` \u2192 `Alignment Behavior` \u2192 `Ignore Non-Overlap Filter`\n> - CLI : \n> - [`--ignore-non-overlap-filter`](https://duosubs.readthedocs.io/en/latest/cli_usage/merge.html#ignore-non-overlap-filter)\n> - Python API :\n> - [`duosubs.MergeArgs()`](https://duosubs.readthedocs.io/en/latest/api_references/core_subtitle_merging.html#duosubs.MergeArgs)\n> - [`duosubs.Merger.merge_subtitle()`](https://duosubs.readthedocs.io/en/latest/api_references/core_subtitle_merging.html#duosubs.Merger.merge_subtitle)\n>\n> to skip the overlap check \u2014 the merge should go smoothly from there.\n>\n> 3. If the subtitle **timings** are **off** and the two subtitle files **don\u2019t fully match in content**, the algorithm likely **won\u2019t** produce great results. Still, you can try running it with `ignore-non-overlap-filter` **enabled**.\n\n---\n\n## \ud83d\ude4f Acknowledgements\n\nThis project wouldn't be possible without the incredible work of the open-source community. \nSpecial thanks to:\n\n- [sentence-transformers](https://github.com/UKPLab/sentence-transformers) \u2014 for the semantic \nembedding backbone\n- [Hugging Face](https://huggingface.co/) \u2014 for hosting models and making them easy to use\n- [PyTorch](https://pytorch.org/) \u2014 for providing the deep learning framework\n- [fastdtw](https://github.com/slaypni/fastdtw) \u2014 for aligning the subtitles\n- [lingua-py](https://github.com/pemistahl/lingua-py) \u2014 for detecting the subtitles' language codes\n- [pysubs2](https://github.com/tkarabela/pysubs2) \u2014 for subtitle file I/O utilities\n- [charset_normalizer](https://github.com/jawah/charset_normalizer) \u2014 for identifying the file \nencoding\n- [typer](https://github.com/fastapi/typer) \u2014 for CLI application\n- [tqdm](https://github.com/tqdm/tqdm) \u2014 for displaying progress bar\n- [gradio](https://github.com/gradio-app/gradio) \u2014 for creating Web UI application\n- [Tears of Steel](https://mango.blender.org/) \u2014 subtitles used for demo, testing and development \npurposes. Created by the \n[Blender Foundation](https://mango.blender.org/), licensed under \n[CC BY 3.0](http://creativecommons.org/licenses/by/3.0/).\n\n---\n\n## \ud83e\udd1d Contributing\n\nContributions are welcome! If you'd like to submit a pull request, please check out the\n [contributing guidelines](https://github.com/CK-Explorer/DuoSubs/blob/main/CONTRIBUTING.md).\n\n---\n\n## \ud83d\udd11 License\n\nApache-2.0 license - see the [LICENSE](https://github.com/CK-Explorer/DuoSubs/blob/main/LICENSE) file for details.\n",
"bugtrack_url": null,
"license": null,
"summary": "Semantic subtitle aligner and merger for bilingual subtitle syncing.",
"version": "1.0.1",
"project_urls": {
"Documentation": "https://duosubs.readthedocs.io/en/latest/",
"Homepage": "https://github.com/CK-Explorer/DuoSubs",
"Repository": "https://github.com/CK-Explorer/DuoSubs"
},
"split_keywords": [
"subtitles",
" alignment",
" merging",
" sentence-transformers",
" sentence-similarity",
" bilingual",
" nlp"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "99c796457cf070207e06af942c26926ab3f71754edb209eb4a58add403a16741",
"md5": "0a332576ba034b7cc834e5da37b39bc1",
"sha256": "698401c68ce643d25381f816a5f27af382b1e3013a61d6e6b569bbbfb8902ba0"
},
"downloads": -1,
"filename": "duosubs-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0a332576ba034b7cc834e5da37b39bc1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 50147,
"upload_time": "2025-08-14T09:25:08",
"upload_time_iso_8601": "2025-08-14T09:25:08.799727Z",
"url": "https://files.pythonhosted.org/packages/99/c7/96457cf070207e06af942c26926ab3f71754edb209eb4a58add403a16741/duosubs-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3e4cff80ba52d724102dd226005129df7a3acf04eef62559cce39d4807cdc8f9",
"md5": "cf036e8c068e02300f1daec3e7ef2041",
"sha256": "a2baed1303adc5e6e4304500445b201d9c872419243f85c0d0407cbe189b1b46"
},
"downloads": -1,
"filename": "duosubs-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "cf036e8c068e02300f1daec3e7ef2041",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 45914,
"upload_time": "2025-08-14T09:25:10",
"upload_time_iso_8601": "2025-08-14T09:25:10.320018Z",
"url": "https://files.pythonhosted.org/packages/3e/4c/ff80ba52d724102dd226005129df7a3acf04eef62559cce39d4807cdc8f9/duosubs-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-14 09:25:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "CK-Explorer",
"github_project": "DuoSubs",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "duosubs"
}