Python client for searching and downloading anime subtitles from AnimeSub.info
Project description
animesubinfo
Python client for searching and downloading anime subtitles from AnimeSub.info.
Installation
pip install animesubinfo
Or with uv:
uv add animesubinfo
Quick Start
All main functions, types, and exceptions can be imported directly from animesubinfo:
from animesubinfo import (
search,
find_best_subtitles,
download_subtitles,
download_and_extract_subtitle,
ExtractedSubtitle,
SortBy,
TitleType,
Subtitles,
SecurityError,
SessionDataError,
)
Search for subtitles
import asyncio
from animesubinfo import search, SortBy, TitleType
async def main():
# Simple search
async for subtitle in search("Naruto"):
print(f"{subtitle.original_title} - Episode {subtitle.episode}")
print(f" Author: {subtitle.author}")
print(f" Downloads: {subtitle.downloaded_times}")
print()
# Advanced search with filters
async for subtitle in search(
"Attack on Titan",
sort_by=SortBy.DOWNLOADS,
title_type=TitleType.ENGLISH,
page_limit=2
):
print(f"{subtitle.english_title} - Episode {subtitle.episode}")
asyncio.run(main())
Find best match for your file
import asyncio
from animesubinfo import find_best_subtitles
async def main():
# Automatically finds the best subtitle match
filename = "[HorribleSubs] Attack on Titan - 12 [BD 1080p].mkv"
subtitle = await find_best_subtitles(filename)
if subtitle:
print(f"Best match: {subtitle.original_title}")
print(f"Episode: {subtitle.episode}")
print(f"Author: {subtitle.author}")
print(f"Fitness score: {subtitle.calculate_fitness(filename)}")
asyncio.run(main())
Download subtitles
import asyncio
from animesubinfo import find_best_subtitles, download_subtitles, SecurityError, SessionDataError
async def main():
filename = "[HorribleSubs] Attack on Titan - 12 [BD 1080p].mkv"
# Find best match
subtitle = await find_best_subtitles(filename)
if subtitle:
try:
# Download the subtitle file
async with download_subtitles(subtitle.id) as download:
print(f"Downloading: {download.filename}")
print(f"Size: {download.content_length} bytes")
# Save to disk
with open(download.filename, 'wb') as f:
async for chunk in download.content:
f.write(chunk)
print("Download complete!")
except SessionDataError as e:
print(f"Failed to get session data: {e}")
except SecurityError as e:
print(f"Security error: {e}")
print(f"Debug info - sh: {e.sh}, cookie: {e.cookie}")
asyncio.run(main())
Download and extract subtitle automatically
import asyncio
from animesubinfo import find_best_subtitles, download_and_extract_subtitle
async def main():
filename = "[HorribleSubs] Attack on Titan - 12 [BD 1080p].mkv"
# Find best match
subtitle = await find_best_subtitles(filename)
if subtitle:
# Download ZIP and extract the best matching file
extracted = await download_and_extract_subtitle(filename, subtitle.id)
print(f"Extracted: {extracted.filename}")
print(f"Size: {len(extracted.content)} bytes")
# Save to disk
with open(extracted.filename, 'wb') as f:
f.write(extracted.content)
print("Subtitle saved!")
asyncio.run(main())
This function automatically:
- Downloads the subtitle ZIP archive
- Extracts it in memory (no temp files)
- Selects the best matching file based on episode number and metadata
- Falls back to the first file if no matches are found
API Reference
search(phrase, *, sort_by=None, title_type=None, page_limit=None, semaphore=None)
Search for subtitles on AnimeSub.info.
Parameters:
phrase(str): Search querysort_by(SortBy, optional): Sort order (FITNESS, DOWNLOADS, ADDED_DATE, etc.)title_type(TitleType, optional): Search in ORIGINAL, ENGLISH, or ALTERNATIVE titlespage_limit(int, optional): Maximum number of pages to fetchsemaphore(asyncio.Semaphore, optional): Semaphore for limiting concurrent requests (default: 3 concurrent)
Yields:
Subtitles: Individual subtitle results
find_best_subtitles(filename_or_dict, *, normalizer=None, semaphore=None)
Find the best matching subtitles for an anime file.
Parameters:
filename_or_dict(str | dict): Anime filename or anitopy-parsed dictnormalizer(callable, optional): Custom normalization functionsemaphore(asyncio.Semaphore, optional): Semaphore for limiting concurrent requests (default: 3 concurrent)
Returns:
Subtitles | None: Best matching subtitle or None if not found
download_subtitles(subtitle_id)
Download subtitles as a ZIP file (async context manager).
Parameters:
subtitle_id(int): The ID of the subtitle to download
Yields:
DownloadResult: Named tuple withfilename,content(async iterable), andcontent_length
Raises:
SessionDataError: If session data cannot be obtained for the subtitleSecurityError: If AnimeSub.info returns a security error (HTML instead of ZIP). This typically happens when session tokens are invalid or expired. The exception includesshandcookieattributes for debugging.
download_and_extract_subtitle(filename_or_dict, subtitle_id, *, normalizer=None)
Download subtitle ZIP and automatically extract the best matching file.
Parameters:
filename_or_dict(str | dict): Target filename or anitopy-parsed dict to match againstsubtitle_id(int): The ID of the subtitle to downloadnormalizer(callable, optional): Custom normalization function
Returns:
ExtractedSubtitle: Named tuple withfilename(str) andcontent(bytes)
Raises:
SessionDataError: If session data cannot be obtainedSecurityError: If AnimeSub.info returns a security errorValueError: Only if the archive is completely empty
Behavior:
- For single-file archives: Returns that file
- For multi-file archives: Calculates fitness score based on:
- Episode number (must match)
- Subtitle extension preference (.srt, .ass, .ssa, .sub, .vtt)
- File metadata (checksum, source, release group, resolution, video terms)
- If no files match (all scores are 0): Returns the first file in the archive
- Extracts in memory without creating temporary files
Exception Handling
SessionDataError
Raised when session data (sh token and cookie) cannot be obtained for a subtitle.
Attributes:
subtitle_id(int): The ID of the subtitle that failed
SecurityError
Raised when AnimeSub.info returns a security error ("błąd zabezpieczeń"). This happens when the server returns HTML instead of a ZIP file, typically due to invalid or expired session tokens.
Attributes:
subtitle_id(int): The ID of the subtitle that failedsh(str): The sh token that was used (for debugging)cookie(str): The cookie value that was used (for debugging)
Development
Setup
# Install uv if not already installed
curl -LsSf https://astral.sh/uv/install.sh | sh
# Sync dependencies (from workspace root)
cd ../..
uv sync --all-packages
# Run tests for this package
uv run --package animesubinfo pytest
Running tests
uv run --package animesubinfo pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file animesubinfo-0.2.0.tar.gz.
File metadata
- Download URL: animesubinfo-0.2.0.tar.gz
- Upload date:
- Size: 16.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c93d8d9bc6572a6ea42ed17dfab9b855efdfbd0f1c01995025e87fd4b83990f
|
|
| MD5 |
3a84dd88ca1f1811d22c9d65427dce03
|
|
| BLAKE2b-256 |
89a3b38a41e767deff49ca083b2f1ee5413672b8f7f0003ae3e7e70207e12bd3
|
File details
Details for the file animesubinfo-0.2.0-py3-none-any.whl.
File metadata
- Download URL: animesubinfo-0.2.0-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20b123d9a3d69688ffb34d220e67e57fa49dbaebd4d65d25a6db814b8248e79d
|
|
| MD5 |
a423ec33e2a9fa0c6b24bf15f5c2a37a
|
|
| BLAKE2b-256 |
195870ec0046f0e287e0b3d363df37679645a4014fa139e281aadc42ff062844
|