added anime tracking

This commit is contained in:
Zastian Pretorius
2022-10-29 20:11:12 +01:00
parent abe79ba96f
commit ed0e3dd50f
4 changed files with 104 additions and 25 deletions

View File

@@ -1,6 +1,9 @@
use crate::open_video;
use crate::{anime_link, anime_names};
use crate::{get_anime_id, get_user_anime_progress, update_anime_progress};
use crate::{
get_an_progress, get_anime_id, get_user_anime_progress, update_anime_progress,
write_an_progress,
};
use crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode},
@@ -158,18 +161,28 @@ fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut app: App) -> io::Result<(
//if KeyCode::Enter => {
KeyCode::Enter => {
if ep_select == false {
app.progress = 0;
let selected = app.messages.state.selected();
app.title = app.messages.items[selected.unwrap()].clone();
let anime_info = get_anime_info(&app.title);
app.anime_id = get_anime_id(anime_info.0);
app.messages.items.clear();
app.progress =
get_user_anime_progress(app.anime_id, app.token.as_str());
app.messages.state.select(Some(app.progress as usize));
if app.token == "local" || app.anime_id == 0 {
app.progress = get_an_progress(&app.title) as i32;
app.messages.state.select(Some(app.progress as usize));
} else {
app.progress =
get_user_anime_progress(app.anime_id, app.token.as_str());
app.messages.state.select(Some(app.progress as usize));
}
if anime_info.1 == 1 {
let link = anime_link(&app.title, 1);
open_video((link.0, link.1));
update_anime_progress(app.anime_id, 1, app.token.as_str());
if app.token == "local" || app.anime_id == 0 {
write_an_progress(&app.title, &1);
} else {
update_anime_progress(app.anime_id, 1, app.token.as_str());
}
} else {
for ep in 1..anime_info.1 + 1 {
app.messages.push(format!("Episode {}", ep));
@@ -189,11 +202,15 @@ fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut app: App) -> io::Result<(
let link = anime_link(&app.title, app.ep);
open_video((link.0, link.1));
if app.ep > app.progress as u64 {
update_anime_progress(
app.anime_id,
app.ep as usize,
app.token.as_str(),
);
if app.token == "local" || app.anime_id == 0 {
write_an_progress(&app.title, &app.ep);
} else {
update_anime_progress(
app.anime_id,
app.ep as usize,
app.token.as_str(),
);
}
app.progress = app.ep as i32;
}
}

View File

@@ -17,10 +17,24 @@ pub fn get_token() -> String {
//read token from file
let token = fs::read_to_string(&token_path).unwrap();
if token.is_empty() {
println!("please go to the below link and copy and past the token below");
println!("https://anilist.co/api/v2/oauth/authorize?client_id=9121&response_type=token");
let token = string_input("token: ");
fs::write(&token_path, token).unwrap();
//ask user if they want to add a token or track locally
let input = string_input(
"would you want to link anilist(sellecting no will track anime localy)? (y/n)",
);
if input == "y" {
println!("please go to the below link and copy and past the token below");
println!(
"https://anilist.co/api/v2/oauth/authorize?client_id=9121&response_type=token"
);
let token = string_input("token: ");
fs::write(&token_path, token).unwrap();
} else if input == "n" {
let token = "local";
fs::write(&token_path, token).unwrap();
} else {
println!("invalid input");
std::process::exit(1);
}
}
let token = fs::read_to_string(&token_path).unwrap();
token
@@ -57,14 +71,20 @@ query ($id: Int, $search: Int) {
.text();
let regex = regex::Regex::new(r#"id":(.*?),"#).unwrap();
let resp: String = resp.as_ref().unwrap().to_string();
let id = regex
.captures(&resp)
.unwrap()
.get(1)
.unwrap()
.as_str()
.parse::<i32>()
.unwrap();
//if error let id = 0
let id = match regex.captures(&resp) {
Some(captures) => captures[1].parse::<i32>().unwrap(),
None => 0,
};
// let id = regex
// .captures(&resp)
// .unwrap()
// .get(1)
// .unwrap()
// .as_str()
// .parse::<i32>()
// .unwrap();
id
}
@@ -173,3 +193,45 @@ mutation ($mediaId: Int, $status: MediaListStatus, $progress: Int) {
.unwrap()
.text();
}
// local tracking
pub fn get_an_json() -> serde_json::Value {
let config_path = dirs::config_dir().unwrap().join("kami");
if !config_path.exists() {
fs::create_dir_all(&config_path).unwrap();
}
let json_path = config_path.join("an_progress.json");
if !json_path.exists() {
fs::File::create(&json_path).unwrap();
}
let json = fs::read_to_string(&json_path).unwrap();
let json: serde_json::Value = serde_json::from_str(&json).unwrap_or(serde_json::Value::Null);
json
}
pub fn write_an_progress(title: &str, progress: &u64) {
let config_path = dirs::config_dir().unwrap().join("kami");
let json_path = config_path.join("an_progress.json");
let json = fs::read_to_string(&json_path).unwrap();
let mut json: serde_json::Value =
serde_json::from_str(&json).unwrap_or(serde_json::Value::Null);
let mut title_json = serde_json::Map::new();
title_json.insert(
"progress".to_string(),
serde_json::Value::from(progress.clone()),
);
//insert title_json into json
if json[title].is_null() {
json[title] = serde_json::Value::from(title_json);
} else {
json[title]["progress"] = serde_json::Value::from(progress.clone());
}
let json = serde_json::to_string_pretty(&json).unwrap();
fs::write(&json_path, json).unwrap();
}
pub fn get_an_progress(title: &str) -> i32 {
let json = get_an_json();
let selected = json[title]["progress"].as_u64().unwrap_or(0);
selected as i32
}

View File

@@ -115,7 +115,7 @@ impl<'a> App {
pub fn ln_ui(chapter: u32) -> Result<(), Box<dyn Error>> {
// setup terminal
let _ = get_json();
let _ = get_ln_json();
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;

View File

@@ -2,7 +2,7 @@ use serde_json;
use std::fs;
//
//
pub fn get_json() -> serde_json::Value {
pub fn get_ln_json() -> serde_json::Value {
let config_path = dirs::config_dir().unwrap().join("kami");
if !config_path.exists() {
fs::create_dir_all(&config_path).unwrap();
@@ -43,7 +43,7 @@ pub fn write_ln_progress(title: &str, current_page: &u32, selected: &usize) {
}
pub fn get_ln_progress(title: &str) -> (u32, usize) {
let json = get_json();
let json = get_ln_json();
let current_page = json[title]["current_page"].as_u64().unwrap_or(1) as u32;
let selected = json[title]["selected"].as_u64().unwrap_or(0) as usize;
(current_page, selected)