11/*
22 * SPDX-License-Identifier: LGPL-3.0-or-later
3- * SPDX-FileCopyrightText: 2021-2022 elementary, Inc. (https://elementary.io)
3+ * SPDX-FileCopyrightText: 2021-2026 elementary, Inc. (https://elementary.io)
44 */
55
66public class Music.PlaybackManager : Object {
@@ -14,6 +14,7 @@ public class Music.PlaybackManager : Object {
1414 }
1515 public int64 playback_position { get ; private set ; }
1616 public signal void invalids_found (int count );
17+ public signal void duplicates_found (int count );
1718
1819 private static GLib . Once<PlaybackManager > instance;
1920 public static unowned PlaybackManager get_default () {
@@ -104,10 +105,26 @@ public class Music.PlaybackManager : Object {
104105 // Files[] must not contain any null entries
105106 public void queue_files (File [] files ) {
106107 int invalids = 0 ;
108+ int duplicates = 0 ;
109+ int added_tracks = 0 ;
107110 foreach (unowned var file in files) {
108111 if (file. query_exists () && " audio" in ContentType . guess (file. get_uri (), null , null )) {
109- var audio_object = new AudioObject (file. get_uri ());
110- queue_liststore. append (audio_object);
112+ uint pos = 0 ;
113+ bool found = false ;
114+ Object ? item = queue_liststore. get_item (pos++ );
115+ while (item != null && ! found) {
116+ if (((AudioObject )item). uri == file. get_uri ()) {
117+ found = true ;
118+ }
119+
120+ item = queue_liststore. get_item (pos++ );
121+ }
122+ if (! found) {
123+ queue_liststore. append (new AudioObject (file. get_uri ()));
124+ added_tracks++ ;
125+ } else {
126+ duplicates++ ;
127+ }
111128 } else {
112129 invalids++ ;
113130 continue ;
@@ -117,6 +134,9 @@ public class Music.PlaybackManager : Object {
117134 if (invalids > 0 ) {
118135 invalids_found (invalids);
119136 }
137+ if (duplicates > 0 ) {
138+ duplicates_found (duplicates);
139+ }
120140
121141 if (current_audio == null ) {
122142 var audio_object = (AudioObject ) queue_liststore. get_object (0 );
@@ -126,7 +146,6 @@ public class Music.PlaybackManager : Object {
126146 } else {
127147 // Don't notify on app startup or if the app is focused
128148 var application = (Gtk . Application ) GLib . Application . get_default ();
129- var added_tracks = files. length - invalids;
130149 if (
131150 ! application. get_active_window (). is_active &&
132151 added_tracks > 0
0 commit comments