@@ -183,8 +183,8 @@ pub fn get_automatic_next_songs(
183
183
184
184
#[ derive( Serialize , Type ) ]
185
185
struct SearchResults {
186
- artists : Vec < String > ,
187
- albums : Vec < String > ,
186
+ artists : Option < Vec < String > > ,
187
+ albums : Option < Vec < String > > ,
188
188
songs : Vec < String > ,
189
189
}
190
190
@@ -196,13 +196,25 @@ struct EditSongInput {
196
196
artist : String ,
197
197
}
198
198
199
+ #[ derive( Deserialize , Type ) ]
200
+ enum SearchMode {
201
+ Library ,
202
+ Songs ,
203
+ }
204
+
205
+ #[ derive( Deserialize , Type ) ]
206
+ struct SearchInput {
207
+ query : String ,
208
+ mode : SearchMode ,
209
+ }
210
+
199
211
pub fn get_router ( ) -> RouterBuilder < Context > {
200
212
Router :: < Context > :: new ( )
201
213
. query ( "get" , |t| {
202
214
t ( |ctx, _input : ( ) | ctx. library . lock ( ) . unwrap ( ) . clone ( ) )
203
215
} )
204
216
. query ( "search" , |t| {
205
- t ( |ctx, query : String | {
217
+ t ( |ctx, input : SearchInput | {
206
218
let library = ctx. library . lock ( ) . unwrap ( ) ;
207
219
let fuse = Fuse {
208
220
location : 0 ,
@@ -214,26 +226,61 @@ pub fn get_router() -> RouterBuilder<Context> {
214
226
} ;
215
227
let artists: Vec < String > = fuse
216
228
. search_text_in_iterable (
217
- & query,
229
+ & input . query ,
218
230
library. artists . iter ( ) . map ( |( _, artist) | & artist. name ) ,
219
231
)
220
232
. iter ( )
221
233
. map ( |a| library. artists . iter ( ) . nth ( a. index ) . unwrap ( ) . 0 . to_string ( ) )
222
234
. collect ( ) ;
223
235
let albums: Vec < String > = fuse
224
- . search_text_in_iterable ( & query, library. albums . iter ( ) . map ( |( _, album) | & album. name ) )
236
+ . search_text_in_iterable (
237
+ & input. query ,
238
+ library. albums . iter ( ) . map ( |( _, album) | & album. name ) ,
239
+ )
225
240
. iter ( )
226
241
. map ( |a| library. albums . iter ( ) . nth ( a. index ) . unwrap ( ) . 0 . to_string ( ) )
227
242
. collect ( ) ;
228
- let songs: Vec < String > = fuse
229
- . search_text_in_iterable ( & query, library. songs . iter ( ) . map ( |( _, song) | & song. title ) )
243
+ let mut songs: Vec < String > = fuse
244
+ . search_text_in_iterable (
245
+ & input. query ,
246
+ library. songs . iter ( ) . map ( |( _, song) | & song. title ) ,
247
+ )
230
248
. iter ( )
231
249
. map ( |a| library. songs . iter ( ) . nth ( a. index ) . unwrap ( ) . 0 . to_string ( ) )
232
250
. collect ( ) ;
233
- SearchResults {
234
- artists,
235
- albums,
236
- songs,
251
+ match input. mode {
252
+ SearchMode :: Library => SearchResults {
253
+ artists : Some ( artists) ,
254
+ albums : Some ( albums) ,
255
+ songs : songs,
256
+ } ,
257
+ SearchMode :: Songs => {
258
+ songs. extend (
259
+ library
260
+ . songs
261
+ . iter ( )
262
+ . filter_map ( |( song_id, song) | {
263
+ if songs. contains ( song_id) {
264
+ return Some ( song_id) ;
265
+ }
266
+ if albums. contains ( & song. album ) {
267
+ return Some ( song_id) ;
268
+ }
269
+ let album = library. albums . get ( & song. album ) . unwrap ( ) ;
270
+ if artists. contains ( & album. artist ) {
271
+ return Some ( song_id) ;
272
+ }
273
+ return None ;
274
+ } )
275
+ . cloned ( )
276
+ . collect :: < Vec < String > > ( ) ,
277
+ ) ;
278
+ SearchResults {
279
+ artists : None ,
280
+ albums : None ,
281
+ songs,
282
+ }
283
+ }
237
284
}
238
285
} )
239
286
} )
0 commit comments