19次发布

0.8.5 2023年2月19日
0.8.4 2022年4月26日
0.7.8 2022年4月9日
0.7.4 2022年3月24日
0.2.0 2021年11月30日

#59视频

Download history 2/week @ 2024-03-14 62/week @ 2024-03-28 24/week @ 2024-04-04 97/week @ 2024-04-11 8/week @ 2024-04-18 3/week @ 2024-04-25 1/week @ 2024-05-23 2/week @ 2024-05-30

每月 68 下载次数
tvrank-cli 中使用

MIT 许可证

110KB
2K SLoC

TVrank:用于对电影和剧集进行排名的Rust库和命令行工具

License Release (latest SemVer) Crates.io CI
docs.rs Github Open Issues Github Closed Issues Github Open Pull Requests Github Closed Pull Requests Contributors

Github仓库

TVrank是一个用Rust编写的库和命令行工具,用于查询和排名电影和剧集信息。它可以用于查询单个标题或扫描媒体目录。

目前,TVrank仅支持IMDB的TSV数据包,它将自动下载、缓存并定期更新。还需要更多工作才能支持并缓存实时查询服务,如TMDBTVDB

内存数据库速度合理,其磁盘持久化缓存格式效率较高。

该库的文档严重不足,但有一个如何使用它的示例。

目前,TVrank的命令行工具运行良好且足够快,例如,可以使用类似!imdb TITLE的命令在DuckDuckGo中搜索标题。如果您仍然想查看标题的IMDB页面,TVrank将打印出每个搜索结果的直接链接,以便从终端直接访问。

请注意,TVrank依赖于flate2crate对IMDB TSV数据包进行解压缩。flate2在调试模式下构建时非常慢,因此建议始终以发布模式运行TVrank,除非有充分的理由不这样做。默认情况下,发布模式会启用调试信息以便在开发期间方便使用。

用法

有关如何使用库的信息,请参见下文。

TVrank 命令行界面提供几种通过子命令访问的模式。

  • search "KEYWORDS..."" 通过关键词进行搜索。
  • search "KEYWORDS... (YYYY)"" 在特定年份内通过关键词进行搜索。
  • search "TITLE (YYYY)"" --exact 在特定年份内搜索精确的标题。
  • search "TITLE"" --exact 搜索精确的标题(《-e` 也可以表示精确)。
  • scan-moviesscan-series 通过目录扫描进行批量查询。
  • mark 用标题信息文件(tvrank.json)标记目录。

示例

搜索特定标题

$ tvrank search "the great gatsby (2013)" -e

搜索2013年包含“the”,“great”和“gatsby”的所有标题

$ tvrank search "the great gatsby (2013)"

基于关键词搜索

$ tvrank search "the great gatsby"

基于精确标题搜索

$ tvrank search "the great gatsby" -e

查询系列目录

$ tvrank scan-series <SERIES_MEDIA_DIR>

默认情况下,TVrank 将按评分、年份和标题排序。要按年份、评分和标题排序,可以在任何子命令之前传递 --sort-by-year

$ tvrank --sort-by-year search "house of cards"

您还可以将电影和系列的输出限制为前N条记录。

$ tvrank search "the great gatsby" --top 2

您可以将输出格式更改为 jsonyaml

$ tvrank search "the great gatsby" --output json

批量查询

TVrank 可以递归扫描目录并打印出它找到的标题信息。这是通过使用 scan-moviesscan-series 子命令实现的。

电影批量查询

TVrank 预期电影目录位于顶级电影媒体目录(以下简称 movies)下,如下所示

movies
├── ...
├── 127 Hours (2010)
├── 12 Mighty Orphans (2021)
├── 12 Monkeys (1995)
├── 12 Years a Slave (2013)
├── 13 Hours The Secret Soldiers of Benghazi (2016)
├── ...

电影子目录预期遵循 TITLE (YYYY) 格式,其中 TITLE 匹配主标题或原始电影标题。

如果电影子目录不符合此格式,TVrank 将递归搜索以找到更多标题。以下是一个示例

movies
├── ...
├── The Naked Gun
│   ├── The Naked Gun (1988)
│   ├── The Naked Gun 2½ The Smell of Fear (1991)
│   └── The Naked Gun 33 1-3 The Final Insult (1994)
├── ...

系列批量查询

TVrank 也预期系列目录位于顶级系列媒体目录(以下简称 series)下,遵循 TITLETITLE (YYYY) 格式。可以使用 TITLE (YYYY) 格式轻松区分同名系列。示例

series
├── ...
├── House of Cards (1990)
├── Killing Eve
├── Kingdom (2019)
├── ...

批量查询中的歧义处理

有时仅从原始/主标题和发布年份无法区分标题,这是由于在同一年发布的多部电影或系列使用相同的精确标题所致。

为了解决这个问题,TVrank 支持在相应的标题目录下显式提供标题信息文件(称为 tvrank.json)。这些文件在执行 scan-moviesscan-series 子命令时会被检测到,并且使用标题的唯一ID进行精确识别。

tvrank.json 文件看起来如下所示

{
  "imdb": {
    "id": "ttXXXXXXXX"
  }
}

其中 "ttXXXXXXXX" 是在 IMDB ID 列表中显示的 IMDB 标题ID,或者作为标题的 IMDB URL 的一部分。

您可以通过使用 mark 子命令并传递标题的目录和您想要写入的ID来要求 TVrank 为您写入标题信息(tvrank.json)文件。

tvrank mark "movies/The Great Gatsby (2013)" tt1343092

这将生成一个名为 movies/The Great Gatsby (2013)/tvrank.json 的文件,包含以下信息

{
  "imdb": {
    "id": "tt1343092"
  }
}

如果已经存在 tvrank.json 文件,TVrank 将拒绝覆盖它。要强制覆盖,可以使用 --force 标志。

详细程度

要打印出应用程序正在执行更多详细信息,请在任何子命令之前使用 -v。命令行中 - 的多次出现将增加详细程度级别

$ tvrank -vvv --sort-by-year search "city of god"

以下选项可以在子命令之前或之后使用。后者比前者优先。

--verbose
--sort-by-year
--force-update
--top <N>
--color
--output [table|json|yaml]

要查找帮助,请查看 help 子命令

$ tvrank help
$ tvrank help search
$ tvrank help scan-series
$ tvrank help scan-movies

屏幕录像

请注意,屏幕录像略微过时。请使用上面描述的子命令而不是屏幕录像中显示的内容。

禁用颜色

默认情况下,TVrank 使用颜色显示一些内容。但是,它支持 NO_COLOR 环境变量。当设置了 NO_COLOR 时,TVrank 不会在其输出中使用颜色。这也可以通过在命令行中传递 --color 参数来覆盖。

NO_COLOR=1 tvrank search "the great gatsby"           # Without colors
NO_COLOR=1 tvrank search "the great gatsby" --color   # With colors

安装

建议使用 预构建版本

从源代码安装

从这个存储库的源代码安装 TVrank 需要 Cargo、Rust 编译器和工具链可用。一旦准备好了这些,并将存储库内容克隆,通过 cargo 简单构建和安装应该就足够了。

$ git clone https://github.com/fredmorcos/tvrank
$ cd tvrank
$ cargo install --path cli

从 Crates.io 安装

Crates.io 安装 TVrank 也需要 Cargo、Rust 编译器和工具链可用。一旦准备好了,使用 cargo 简单构建和安装应该就足够了。

$ cargo install tvrank-cli`

使用库

将依赖项添加到您的 Cargo.toml

[dependencies]
tvrank = "0.8"

或者,使用 cargo add

$ cargo add tvrank

包含 Imdb 类型

use tvrank::imdb::{Imdb, ImdbQuery};
use tvrank::utils::search::SearchString;

使用 tempfile 包创建缓存目录,然后创建数据库服务。传递给服务构造函数的闭包是进度更新的回调,并且是一个 FnMut,以便能够修改进度条对象等。

let cache_dir = tempfile::Builder::new().prefix("tvrank_").tempdir()?;
let imdb = Imdb::new(cache_dir.path(), false, |_, _| {})?;

之后,可以使用以下任一方式查询数据库:使用 imdb.by_id(...)imdb.by_title(...)imdb.by_title_and_year(...)imdb.by_keywords(...),并打印出一些关于结果的信息。

let title = "city of god";
let year = 2002;

println!("Matches for {} and {:?}:", title, year);

let search_string = SearchString::try_from(title)?;
for title in imdb.by_title_and_year(&search_string, year, ImdbQuery::Movies)? {
  let id = title.title_id();

  println!("ID: {}", id);
  println!("Primary name: {}", title.primary_title());
  if let Some(original_title) = title.original_title() {
    println!("Original name: {}", original_title);
  } else {
    println!("Original name: N/A");
  }

  if let Some((rating, votes)) = title.rating() {
    println!("Rating: {}/100 ({} votes)", rating, votes);
  } else {
    println!("Rating: N/A");
  }

  if let Some(runtime) = title.runtime() {
    println!("Runtime: {}", humantime::format_duration(runtime));
  } else {
    println!("Runtime: N/A");
  }

  println!("Genres: {}", title.genres());
  println!("--");
}

query.rs 目录下的示例(位于 lib/examples/query)中可以看到上述功能的完整实现。

依赖项

~10–24MB
~380K SLoC