1- use serde:: { Deserialize , Deserializer , de} ;
21use crate :: error:: ErrorKind ;
2+ use serde:: { de, Deserialize , Deserializer } ;
33use serde_json:: Value ;
4- use chrono:: { DateTime , Utc } ;
5- use std:: str:: FromStr ;
64
75#[ derive( Debug , Deserialize , Clone ) ]
86pub 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 ) ]
2730pub struct SongList {
28- songs : Vec < Song >
31+ songs : Vec < Song > ,
2932}
3033
3134#[ derive( Debug , Clone ) ]
3235pub 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
4348impl 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
7775impl 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