filter movies by resolution
This commit is contained in:
parent
0ec9a41bff
commit
984aff3242
@ -1,4 +1,5 @@
|
|||||||
## 0.2.2 (2017-03-22)
|
## 0.2.2 (2017-03-22)
|
||||||
|
- ability to filter movies by resolution
|
||||||
- ability to save movies seperately
|
- ability to save movies seperately
|
||||||
- default value for storage config (fixes #6)
|
- default value for storage config (fixes #6)
|
||||||
- ability to skip movie and game content
|
- ability to skip movie and game content
|
||||||
|
18
README.md
18
README.md
@ -46,11 +46,16 @@ A bare configuration with default values before first use:
|
|||||||
- *data*: A map, data url => hash
|
- *data*: A map, data url => hash
|
||||||
- *extras*: A map, extra url => hash
|
- *extras*: A map, extra url => hash
|
||||||
- *osFilters*: An array of operating systems. If it is not empty, game data is limited to the ones in the list.
|
- *osFilters*: An array of operating systems. If it is not empty, game data is limited to the ones in the list.
|
||||||
Valid values are `linux`, `mac` and `windows`
|
|
||||||
- *languageFilters*: An array of languages. If it is not empty, game data is limited to the ones in the list.
|
- *languageFilters*: An array of languages. If it is not empty, game data is limited to the ones in the list.
|
||||||
|
- *resolutionFilters*: An array of resolutions. If it is not empty, movie data is limited to the ones in the list.
|
||||||
- *skipMovies*: Whether to skip movie content
|
- *skipMovies*: Whether to skip movie content
|
||||||
- *skipGames*: Whether to skip game content
|
- *skipGames*: Whether to skip game content
|
||||||
|
|
||||||
|
Valid values for *osFilter*:
|
||||||
|
- `linux`
|
||||||
|
- `mac`
|
||||||
|
- `windows`
|
||||||
|
|
||||||
An incomplete list of languages on gog:
|
An incomplete list of languages on gog:
|
||||||
- `english`
|
- `english`
|
||||||
- `český`
|
- `český`
|
||||||
@ -63,6 +68,13 @@ An incomplete list of languages on gog:
|
|||||||
- `русский`
|
- `русский`
|
||||||
- `中文`
|
- `中文`
|
||||||
|
|
||||||
|
An incomplete list of resolutions on gog:
|
||||||
|
- `DVD`
|
||||||
|
- `576p`
|
||||||
|
- `720p`
|
||||||
|
- `1080p`
|
||||||
|
- `4k`
|
||||||
|
|
||||||
You should have no need of changing `content`, `data` or `extras`, as these are
|
You should have no need of changing `content`, `data` or `extras`, as these are
|
||||||
used to determine whether specific content is up to date.
|
used to determine whether specific content is up to date.
|
||||||
|
|
||||||
@ -71,7 +83,8 @@ used to determine whether specific content is up to date.
|
|||||||
If you want to see the information log while running set `RUST_LOG=info`.
|
If you want to see the information log while running set `RUST_LOG=info`.
|
||||||
|
|
||||||
```
|
```
|
||||||
LAGS] [OPTIONS]
|
USAGE:
|
||||||
|
gog-sync [FLAGS] [OPTIONS]
|
||||||
|
|
||||||
FLAGS:
|
FLAGS:
|
||||||
-h, --help Prints help information
|
-h, --help Prints help information
|
||||||
@ -85,6 +98,7 @@ OPTIONS:
|
|||||||
-m, --movie-storage <FOLDER> Sets the download folder for movies (defaults to the working directory).
|
-m, --movie-storage <FOLDER> Sets the download folder for movies (defaults to the working directory).
|
||||||
-o, --os <FILTER> Only sync files for this comma seperated list of operating systems.
|
-o, --os <FILTER> Only sync files for this comma seperated list of operating systems.
|
||||||
Valid values are 'linux', 'mac' and 'windows'.
|
Valid values are 'linux', 'mac' and 'windows'.
|
||||||
|
-r, --resolution <FILTER> Only sync movies for this comma seperated list of resolutions.
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
34
src/gog.rs
34
src/gog.rs
@ -125,6 +125,7 @@ impl<'a> Gog<'a> {
|
|||||||
storage_path_movies: &str,
|
storage_path_movies: &str,
|
||||||
os_filters: &Vec<String>,
|
os_filters: &Vec<String>,
|
||||||
language_filters: &Vec<String>,
|
language_filters: &Vec<String>,
|
||||||
|
resolution_filters: &Vec<String>,
|
||||||
skip_movies: bool,
|
skip_movies: bool,
|
||||||
skip_games: bool)
|
skip_games: bool)
|
||||||
-> Result<(), GogError> {
|
-> Result<(), GogError> {
|
||||||
@ -142,6 +143,7 @@ impl<'a> Gog<'a> {
|
|||||||
extras: HashMap::new(),
|
extras: HashMap::new(),
|
||||||
os_filters: os_filters.clone(),
|
os_filters: os_filters.clone(),
|
||||||
language_filters: language_filters.clone(),
|
language_filters: language_filters.clone(),
|
||||||
|
resolution_filters: resolution_filters.clone(),
|
||||||
skip_movies: skip_movies,
|
skip_movies: skip_movies,
|
||||||
skip_games: skip_games,
|
skip_games: skip_games,
|
||||||
}
|
}
|
||||||
@ -156,7 +158,10 @@ impl<'a> Gog<'a> {
|
|||||||
None => u64::min_value(),
|
None => u64::min_value(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let content = match self.get_content(content_id, &os_filters, &language_filters) {
|
let content = match self.get_content(content_id,
|
||||||
|
&os_filters,
|
||||||
|
&language_filters,
|
||||||
|
&resolution_filters) {
|
||||||
Ok(value) => value,
|
Ok(value) => value,
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
error!("{}: {}", &content_id, error);
|
error!("{}: {}", &content_id, error);
|
||||||
@ -329,7 +334,8 @@ impl<'a> Gog<'a> {
|
|||||||
fn get_content(&mut self,
|
fn get_content(&mut self,
|
||||||
content_id: u64,
|
content_id: u64,
|
||||||
os_filters: &Vec<String>,
|
os_filters: &Vec<String>,
|
||||||
language_filters: &Vec<String>)
|
language_filters: &Vec<String>,
|
||||||
|
resolution_filters: &Vec<String>)
|
||||||
-> Result<Content, GogError> {
|
-> Result<Content, GogError> {
|
||||||
let content_uri = self.content_uri(content_id);
|
let content_uri = self.content_uri(content_id);
|
||||||
debug!("looking for information at {}...", &content_uri);
|
debug!("looking for information at {}...", &content_uri);
|
||||||
@ -392,11 +398,31 @@ impl<'a> Gog<'a> {
|
|||||||
for real_download in real_downloads.as_array() {
|
for real_download in real_downloads.as_array() {
|
||||||
for download in real_download {
|
for download in real_download {
|
||||||
if !download.is_object() ||
|
if !download.is_object() ||
|
||||||
!download.as_object().unwrap().contains_key("manualUrl") {
|
!download.as_object().unwrap().contains_key("manualUrl") ||
|
||||||
error!("Skipping an installer for {}", content.title);
|
!download.as_object().unwrap().contains_key("name") {
|
||||||
|
error!("Skipping data for {}", content.title);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let name: &str = download["name"].as_str().unwrap();
|
||||||
|
|
||||||
|
|
||||||
|
if content.is_movie && !resolution_filters.is_empty() {
|
||||||
|
let mut found_resolution = false;
|
||||||
|
for resolution_filter in resolution_filters {
|
||||||
|
let filter = format!("({})", resolution_filter);
|
||||||
|
if name.ends_with(&filter) {
|
||||||
|
found_resolution = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found_resolution {
|
||||||
|
info!("Skipping {}: not a suitable resolution.", name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let data = Data {
|
let data = Data {
|
||||||
manual_url: String::from(download["manualUrl"]
|
manual_url: String::from(download["manualUrl"]
|
||||||
.as_str()
|
.as_str()
|
||||||
|
29
src/main.rs
29
src/main.rs
@ -1,21 +1,4 @@
|
|||||||
//! Synchronizes a [GOG](https://www.gog.com/) library with a local folder.
|
//! Synchronizes a [GOG](https://www.gog.com/) library with a local folder.
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
//! USAGE:
|
|
||||||
//! gog-sync [OPTIONS]
|
|
||||||
//!
|
|
||||||
//! FLAGS:
|
|
||||||
//! -h, --help Prints help information
|
|
||||||
//! -V, --version Prints version information
|
|
||||||
//!
|
|
||||||
//! OPTIONS:
|
|
||||||
//! -l, --language <FILTER> Only sync files for this comma seperated list of languages.
|
|
||||||
//! -o, --os <FILTER> Only sync files for this comma seperated list of operating systems.
|
|
||||||
//! Valid values are linux, mac and windows.
|
|
||||||
//! -s, --storage <FOLDER> Sets the download folder (defaults to the working directory).
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! An incomplete list of languages on gog: `english, český, deutsch, español, français, italiano, magyar, polski, русский, 中文`
|
|
||||||
|
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
@ -73,6 +56,12 @@ fn main() {
|
|||||||
.value_name("FILTER")
|
.value_name("FILTER")
|
||||||
.help("Only sync files for this comma seperated list of languages.")
|
.help("Only sync files for this comma seperated list of languages.")
|
||||||
.takes_value(true))
|
.takes_value(true))
|
||||||
|
.arg(Arg::with_name("resolution")
|
||||||
|
.short("r")
|
||||||
|
.long("resolution")
|
||||||
|
.value_name("FILTER")
|
||||||
|
.help("Only sync movies for this comma seperated list of resolutions.")
|
||||||
|
.takes_value(true))
|
||||||
.arg(Arg::with_name("skip-movies")
|
.arg(Arg::with_name("skip-movies")
|
||||||
.short("f")
|
.short("f")
|
||||||
.long("skip-movies")
|
.long("skip-movies")
|
||||||
@ -111,6 +100,11 @@ fn main() {
|
|||||||
None => config.language_filters,
|
None => config.language_filters,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let resolution_filters: Vec<String> = match matches.value_of("resolution") {
|
||||||
|
Some(value) => value.split(',').map(String::from).collect(),
|
||||||
|
None => config.resolution_filters,
|
||||||
|
};
|
||||||
|
|
||||||
let skip_movies = if matches.is_present("skip-movies") {
|
let skip_movies = if matches.is_present("skip-movies") {
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
@ -130,6 +124,7 @@ fn main() {
|
|||||||
download_folder_movies,
|
download_folder_movies,
|
||||||
&os_filters,
|
&os_filters,
|
||||||
&language_filters,
|
&language_filters,
|
||||||
|
&resolution_filters,
|
||||||
skip_movies,
|
skip_movies,
|
||||||
skip_games)
|
skip_games)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -46,6 +46,8 @@ pub struct Config {
|
|||||||
pub os_filters: Vec<String>,
|
pub os_filters: Vec<String>,
|
||||||
#[serde(default = "default_list")]
|
#[serde(default = "default_list")]
|
||||||
pub language_filters: Vec<String>,
|
pub language_filters: Vec<String>,
|
||||||
|
#[serde(default = "default_list")]
|
||||||
|
pub resolution_filters: Vec<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub skip_movies: bool,
|
pub skip_movies: bool,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -70,6 +72,7 @@ impl Config {
|
|||||||
extras: HashMap::new(),
|
extras: HashMap::new(),
|
||||||
os_filters: Vec::new(),
|
os_filters: Vec::new(),
|
||||||
language_filters: Vec::new(),
|
language_filters: Vec::new(),
|
||||||
|
resolution_filters: Vec::new(),
|
||||||
skip_movies: false,
|
skip_movies: false,
|
||||||
skip_games: false,
|
skip_games: false,
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user