#opensubtitles #subtitle #subtitle-finder

opensubs

Library to search subtitles from opensubtitles.org

1 unstable release

Uses new Rust 2024

new 0.1.0 Mar 10, 2026

#254 in Video

MIT license

48KB
841 lines

opensubs

Library to search subtitles from opensubtitles.org

Description

This crate provides a high-level, ergonomic API for searching and retrieving subtitles (only from movies) and related metadata from opensubtitles.org. It offers both asynchronous and blocking (synchronous) interfaces, with flexible filtering and ordering options. It uses a web scraper to build the api

Usage

Add this crate to your Cargo.toml:

[dependencies]
opensubs = "0.1.0"

Enable blocking feature if needed

[dependencies]
opensubs = { version = "0.1.0", features = ["blocking"] }

Async Example (default)

use opensubs::{Filters, Language, OrderBy, SearchBy};

#[tokio::main]
async fn main() -> opensubs::Result {
    // async search movie "holdovers", spanish subs, order by rating
    let results = opensubs::search(SearchBy::MovieAndFilter(
        "holdovers",
        Filters::default()
            .languages(&[Language::Spanish])
            .order_by(OrderBy::Rating)
            .build(),
    ))
    .await?;

    println!("Subtitles {results:#?}");

    Ok(())
}

Blocking Example (feature "blocking")

use opensubs::{Filters, Language, OrderBy, Response, SearchBy};

fn main() -> opensubs::Result {
    // blocking search movie "the godfather"
    // year 1972, french and german subs, order by rating
    let results = opensubs::blocking::search(SearchBy::MovieAndFilter(
        "the godfather",
        Filters::default()
            .year(1972)
            .languages(&[Language::French, Language::German])
            .order_by(OrderBy::Downloads)
            .build(),
    ))?;

    match results {
        Response::Movie(movies) => {
            // If results is Movie type, get the subtitles_link property 
            // and find subtitles for it
            if let Some(movie) = movies.first() {
                let subs = opensubs::blocking::search(SearchBy::Url(&movie.subtitles_link))?;
                println!("Subtitles {subs:#?}");
            }
        }
        // else print the subtitles
        _ => println!("Subtitles {results:#?}"),
    }

    Ok(())
}

Details

  • Searching subtitles from opensubtitles.org could return a list of movies or a list of subtitles of the movie searched (if the text and filter are more exactly). For that matter the Response is an enum.
  • Here are more examples

Features

  • Default async search. Blocking search available too
  • Search by url, movie name and/or filters (languages, page, ordering and year)
  • Obtain not only info and metadata but also a subtitle download link. Here is an example of download using wget

Docs

Find all the configuration options in the full documentation.


Donate

  • Bitcoin (QR) 1GqdJ63RDPE4eJKujHi166FAyigvHu5R7v
  • Paypal

Dependencies

~4–12MB
~210K SLoC