@@ -81,7 +81,6 @@ pub async fn get_mixes_groups(
81
81
Ok ( result)
82
82
}
83
83
84
- // Then implement CollectionQuery
85
84
#[ async_trait]
86
85
impl CollectionQuery for mixes:: Model {
87
86
fn collection_type ( ) -> CollectionQueryType {
@@ -748,7 +747,7 @@ pub async fn query_mix_media_files(
748
747
// Filter by playlist_ids if provided
749
748
add_subquery_filter ! (
750
749
or_condition,
751
- playlist_ids,
750
+ playlist_ids. clone ( ) ,
752
751
media_file_playlists:: Entity ,
753
752
media_file_playlists:: Column :: PlaylistId ,
754
753
media_file_playlists:: Column :: MediaFileId
@@ -1020,5 +1019,35 @@ pub async fn query_mix_media_files(
1020
1019
1021
1020
let sorted_files = sort_media_files ( media_files, & track_ids) ;
1022
1021
1022
+ let no_sorting = sort_track_number_asc. is_none ( )
1023
+ && sort_last_modified_asc. is_none ( )
1024
+ && sort_duration_asc. is_none ( )
1025
+ && sort_playedthrough_asc. is_none ( )
1026
+ && sort_skipped_asc. is_none ( ) ;
1027
+
1028
+ let sorted_files = if no_sorting && playlist_ids. len ( ) == 1 {
1029
+ let playlist_id = playlist_ids[ 0 ] ;
1030
+ let positions = media_file_playlists:: Entity :: find ( )
1031
+ . filter ( media_file_playlists:: Column :: PlaylistId . eq ( playlist_id) )
1032
+ . filter (
1033
+ media_file_playlists:: Column :: MediaFileId
1034
+ . is_in ( sorted_files. iter ( ) . map ( |f| f. id ) . collect :: < Vec < _ > > ( ) ) ,
1035
+ )
1036
+ . order_by ( media_file_playlists:: Column :: Position , Order :: Asc )
1037
+ . all ( main_db)
1038
+ . await ?;
1039
+
1040
+ let position_map: HashMap < i32 , i32 > = positions
1041
+ . into_iter ( )
1042
+ . map ( |p| ( p. media_file_id , p. position ) )
1043
+ . collect ( ) ;
1044
+
1045
+ let mut sorted_files = sorted_files;
1046
+ sorted_files. sort_by_key ( |file| position_map. get ( & file. id ) . cloned ( ) . unwrap_or ( i32:: MAX ) ) ;
1047
+ sorted_files
1048
+ } else {
1049
+ sorted_files
1050
+ } ;
1051
+
1023
1052
Ok ( sorted_files)
1024
1053
}
0 commit comments