3个版本
0.8.5 | 2023年2月19日 |
---|---|
0.8.4 | 2022年4月26日 |
0.8.2 | 2022年4月25日 |
#421 in 视频
155KB
3K SLoC
TVrank
:一个用于对电影和电视剧进行排名的Rust库和命令行实用程序
TVrank
是一个用Rust编写的库和命令行实用程序,用于查询和排序电影和电视剧信息。它可以用于查询单个标题或扫描媒体目录。
目前,TVrank
仅支持IMDB的TSV存档,它自动下载、缓存并定期更新。需要更多的工作来支持并缓存实时查询服务,如TMDB和TVDB。
内存数据库速度合理,其磁盘持久缓存格式效率也相当合理。
该库的文档严重不足,但有一个如何使用它的示例。
目前,TVrank
的命令行实用程序运行良好且足够快,可以用作例如通过DuckDuckGo搜索标题,使用类似于!imdb TITLE
的方法。如果您仍然想查看标题的IMDB页面,TVrank
将为每个搜索结果打印出直接链接,以便从终端直接访问。
请注意,TVrank
依赖于flate2
crate对IMDB TSV存档进行解压缩。flate2
在调试模式下构建时非常慢,因此建议始终以发布模式运行TVrank
,除非有充分的理由不这样做。默认情况下,发布模式构建时启用调试信息,以方便开发时使用。
用法
有关如何使用库的信息,请参阅以下内容。
TVrank 命令行界面通过子命令使用,有几个模式可供访问。
- 使用
search "关键词..."
通过关键词搜索。 - 使用
search "关键词... (YYYY)"
在特定年份通过关键词搜索。 - 使用
search "标题 (YYYY)" --exact
在特定年份搜索精确标题。 - 使用
search "标题" --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)
├── ...
电影子目录应遵循 标题 (YYYY)
格式,其中 标题
与主要或原始电影标题匹配。
如果电影子目录不符合此格式,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
)下,遵循 标题
或 标题 (YYYY)
格式。可以使用 标题 (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
。命令行中 -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
crate 创建一个用于缓存的目录,然后创建数据库服务。传递给服务构造函数的闭包是进度更新的回调,并且是一个 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
目录下。
依赖项
约15-30MB
~473K SLoC