Skip to content

Commit e81e4cb

Browse files
author
Victor
authored
Merge pull request #1 from CompuIves/2020
Update bot naar 2020
2 parents f3a46f0 + 2b23c0c commit e81e4cb

File tree

9 files changed

+266
-205
lines changed

9 files changed

+266
-205
lines changed

Cargo.toml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ edition = "2018"
99
[dependencies]
1010
serde_json = "1.0"
1111
serde = { version = "1.0", features = ["derive"] }
12-
serenity = {version = "0.7", features = ["cache", "framework", "standard_framework", "voice", "http", "rustls_backend"] }
12+
serenity = { version = "0.9", features = [
13+
"cache",
14+
"framework",
15+
"standard_framework",
16+
"voice",
17+
"http",
18+
"rustls_backend",
19+
] }
1320
dotenv = "0.15.0"
14-
reqwest = { version = "0.10.0-alpha.2", features = ["blocking"] }
21+
reqwest = { version = "0.10" }
1522
chrono = "0.4"
23+
tokio = { version = "0.2", features = ["time", "macros"] }

rustfmt.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
unstable_features = true
2+
merge_imports = true
3+
use_field_init_shorthand = true
4+
reorder_impl_items = true
5+
newline_style = "Unix"

src/2019.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/2020.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

src/api.rs

Lines changed: 58 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
use serde::{Deserialize, Deserializer, de};
21
use crate::error::ErrorKind;
2+
use serde::{de, Deserialize, Deserializer};
33
use serde_json::Value;
4-
use chrono::{DateTime, Utc};
5-
use std::str::FromStr;
64

75
#[derive(Debug, Deserialize, Clone)]
86
pub struct Song {
@@ -18,98 +16,95 @@ pub struct Song {
1816
#[serde(rename = "pos")]
1917
pub position: Option<u64>,
2018

19+
#[serde(rename = "prv")]
20+
pub prev_position: Option<u64>,
21+
2122
#[serde(rename = "url")]
22-
pub url: String
23+
pub url: String,
2324

25+
#[serde(rename = "img")]
26+
pub image: Option<String>,
2427
}
2528

2629
#[derive(Debug, Clone)]
2730
pub struct SongList {
28-
songs: Vec<Song>
31+
songs: Vec<Song>,
2932
}
3033

3134
#[derive(Debug, Clone)]
3235
pub struct NowOnAir {
3336
pub song: Song,
3437
pub img_url: Option<String>,
35-
pub end_time: DateTime<Utc>
3638
}
3739

38-
fn to_u64<'de, D>(deserializer: D) -> Result<u64, D::Error> where D: Deserializer<'de> {
40+
fn to_u64<'de, D>(deserializer: D) -> Result<u64, D::Error>
41+
where
42+
D: Deserializer<'de>,
43+
{
3944
let s: String = Deserialize::deserialize(deserializer)?;
4045
s.parse().map_err(de::Error::custom)
4146
}
4247

4348
impl Song {
44-
pub fn get_description(&self) -> Result<String, ErrorKind> {
45-
let url = format!("https://www.nporadio2.nl/?option=com_ajax&plugin=Trackdata&format=json&songid={}", self.id);
46-
let body = reqwest::blocking::get(&url)
49+
pub async fn get_description(&self) -> Result<String, ErrorKind> {
50+
let url = format!(
51+
"https://www.nporadio2.nl/?option=com_ajax&plugin=Trackdata&format=json&songid={}",
52+
self.id
53+
);
54+
let body = reqwest::get(&url)
55+
.await
4756
.map_err(ErrorKind::RequestError)?
4857
.text()
58+
.await
4959
.map_err(ErrorKind::RequestError)?;
5060

51-
let desc_unparsed = &serde_json::from_str::<Value>(&body).map_err(ErrorKind::JsonError)?["data"][0]["description"];
61+
let desc_unparsed = &serde_json::from_str::<Value>(&body).map_err(ErrorKind::JsonError)?
62+
["data"][0]["description"];
5263
if let Value::String(desc) = desc_unparsed {
5364
Ok(desc.to_owned())
5465
} else {
5566
Err(ErrorKind::GenericError)
5667
}
5768
}
5869

59-
pub fn get_last_year_position(&self) -> Result<u64, ErrorKind> {
60-
let url = format!("https://www.nporadio2.nl/?option=com_ajax&plugin=Trackdata&format=json&songid={}", self.id);
61-
let body = reqwest::blocking::get(&url)
62-
.map_err(ErrorKind::RequestError)?
63-
.text()
64-
.map_err(ErrorKind::RequestError)?;
65-
66-
let positions_unparsed = &serde_json::from_str::<Value>(&body).map_err(ErrorKind::JsonError)?["data"][0]["positions"];
67-
if let Value::Array(positions) = positions_unparsed {
68-
let year = positions.iter().find(|v| v["year"] == "2018").ok_or(ErrorKind::GenericError)?;
69-
let position = year["position"].as_str().ok_or(ErrorKind::GenericError)?.parse().map_err(|_| ErrorKind::GenericError)?;
70-
Ok(position)
71-
} else {
72-
Err(ErrorKind::GenericError)
73-
}
70+
pub fn get_last_year_position(&self) -> Option<u64> {
71+
self.prev_position
7472
}
7573
}
7674

7775
impl SongList {
7876
pub fn new() -> Result<SongList, ErrorKind> {
79-
let body = include_str!("2019.json");
77+
let body = include_str!("2020.json");
8078

81-
let unparsed_songs = &serde_json::from_str::<Value>(&body).map_err(ErrorKind::JsonError)?["data"][0];
82-
let songs: Vec<_> = serde_json::from_value(unparsed_songs.to_owned()).map_err(ErrorKind::JsonError)?;
79+
let unparsed_songs =
80+
&serde_json::from_str::<Value>(&body).map_err(ErrorKind::JsonError)?["data"][0];
81+
let songs: Vec<_> =
82+
serde_json::from_value(unparsed_songs.to_owned()).map_err(ErrorKind::JsonError)?;
8383

8484
println!("Successfully parsed {} songs!", &songs.len());
8585

86-
Ok(SongList {
87-
songs
88-
})
86+
Ok(SongList { songs })
8987
}
9088

91-
pub fn get_now_on_air(&self) -> Result<NowOnAir, ErrorKind> {
92-
93-
let body = reqwest::blocking::get("https://radiobox2.omroep.nl/data/radiobox2/nowonair/2.json")
94-
.map_err(ErrorKind::RequestError)?
95-
.text()
96-
.map_err(ErrorKind::RequestError)?;
89+
pub fn get_song(&self, position: usize) -> Option<&Song> {
90+
self.songs.get(position)
91+
}
9792

98-
let parsed_json = serde_json::from_str::<Value>(&body).map_err( ErrorKind::JsonError)?;
93+
pub async fn get_now_on_air(&self) -> Result<NowOnAir, ErrorKind> {
94+
let body =
95+
reqwest::get("https://www.nporadio2.nl/?option=com_ajax&plugin=nowplaying&format=json&channel=nporadio2").await
96+
.map_err(ErrorKind::RequestError)?
97+
.text().await
98+
.map_err(ErrorKind::RequestError)?;
9999

100-
let end_time_unparsed = &parsed_json["results"][0]["stopdatetime"];
101-
let end_time = if let Value::String(end_time_str) = end_time_unparsed {
102-
DateTime::from_str(end_time_str).map_err(|_e| ErrorKind::GenericError)?
103-
} else {
104-
return Err(ErrorKind::GenericError);
105-
};
100+
let parsed_json = serde_json::from_str::<Value>(&body).map_err(ErrorKind::JsonError)?;
106101

107-
let id_unparsed = &parsed_json["results"][0]["songfile"]["songversion"]["id"];
108-
if let Value::Number(id) = id_unparsed {
109-
if let Some(id_unwrapped) = id.as_u64() {
102+
let id_unparsed = &parsed_json["data"][0]["id"];
103+
if let Value::String(id) = id_unparsed {
104+
if let Ok(id_unwrapped) = id.parse::<u64>() {
110105
let song_option = self.songs.iter().find(|s| s.id == id_unwrapped);
111106
if let Some(song) = song_option {
112-
let img_url_unparsed = &parsed_json["results"][0]["songfile"]["songversion"]["image"][0]["url_ssl"];
107+
let img_url_unparsed = &parsed_json["data"][0]["image"];
113108
let img_url = if let Value::String(img) = img_url_unparsed {
114109
Some(img.to_string())
115110
} else {
@@ -119,42 +114,42 @@ impl SongList {
119114
return Ok(NowOnAir {
120115
song: song.clone(),
121116
img_url,
122-
end_time
123-
})
117+
});
124118
}
125119
}
126120
}
127121

128-
let artist_val = &parsed_json["results"][0]["songfile"]["artist"];
129-
let title_val = &parsed_json["results"][0]["songfile"]["title"];
122+
let artist_val = &parsed_json["data"][0]["artist"];
123+
let title_val = &parsed_json["data"][0]["title"];
130124

131125
if let Value::String(artist) = artist_val {
132126
if let Value::String(title) = title_val {
133-
let song = self.songs.iter().find(|s| {
134-
s.artist == *artist && s.title == *title
135-
});
127+
let song = self
128+
.songs
129+
.iter()
130+
.find(|s| s.artist == *artist && s.title == *title);
136131

137132
return match song {
138133
Some(song_some) => Ok(NowOnAir {
139134
song: song_some.to_owned(),
140-
img_url: None,
141-
end_time
135+
img_url: song_some.image.clone(),
142136
}),
143137
None => Ok(NowOnAir {
144138
song: Song {
145139
id: 0,
146140
title: title.to_string(),
147141
artist: artist.to_string(),
148142
position: None,
149-
url: "".to_string()
143+
url: "".to_string(),
144+
image: None,
145+
prev_position: None,
150146
},
151147
img_url: None,
152-
end_time
153-
})
154-
}
148+
}),
149+
};
155150
}
156151
}
157152

158153
Err(ErrorKind::GenericError)
159154
}
160-
}
155+
}

0 commit comments

Comments
 (0)