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 在 视频
每月 68 下载次数
在 tvrank-cli 中使用
110KB
2K SLoC
TVrank
:用于对电影和剧集进行排名的Rust库和命令行工具
TVrank
是一个用Rust编写的库和命令行工具,用于查询和排名电影和剧集信息。它可以用于查询单个标题或扫描媒体目录。
目前,TVrank
仅支持IMDB的TSV数据包,它将自动下载、缓存并定期更新。还需要更多工作才能支持并缓存实时查询服务,如TMDB和TVDB。
内存数据库速度合理,其磁盘持久化缓存格式效率较高。
该库的文档严重不足,但有一个如何使用它的示例。
目前,TVrank
的命令行工具运行良好且足够快,例如,可以使用类似!imdb TITLE
的命令在DuckDuckGo中搜索标题。如果您仍然想查看标题的IMDB页面,TVrank
将打印出每个搜索结果的直接链接,以便从终端直接访问。
请注意,TVrank
依赖于flate2
crate对IMDB TSV数据包进行解压缩。flate2
在调试模式下构建时非常慢,因此建议始终以发布模式运行TVrank
,除非有充分的理由不这样做。默认情况下,发布模式会启用调试信息以便在开发期间方便使用。
用法
有关如何使用库的信息,请参见下文。
TVrank
命令行界面提供几种通过子命令访问的模式。
search "KEYWORDS...""
通过关键词进行搜索。search "KEYWORDS... (YYYY)""
在特定年份内通过关键词进行搜索。search "TITLE (YYYY)"" --exact
在特定年份内搜索精确的标题。search "TITLE"" --exact
搜索精确的标题(《-e` 也可以表示精确)。scan-movies
和scan-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
您可以将输出格式更改为 json
或 yaml
。
$ tvrank search "the great gatsby" --output json
批量查询
TVrank
可以递归扫描目录并打印出它找到的标题信息。这是通过使用 scan-movies
和 scan-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
)下,遵循 TITLE
或 TITLE (YYYY)
格式。可以使用 TITLE (YYYY)
格式轻松区分同名系列。示例
series
├── ...
├── House of Cards (1990)
├── Killing Eve
├── Kingdom (2019)
├── ...
批量查询中的歧义处理
有时仅从原始/主标题和发布年份无法区分标题,这是由于在同一年发布的多部电影或系列使用相同的精确标题所致。
为了解决这个问题,TVrank
支持在相应的标题目录下显式提供标题信息文件(称为 tvrank.json
)。这些文件在执行 scan-movies
和 scan-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