Skip to content

Commit 19b4cd4

Browse files
authored
Merge branch 'main' into playlist-object
2 parents 3cd1dc0 + 7294b92 commit 19b4cd4

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

src/PlaybackManager.vala

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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

66
public 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

src/Views/QueueView.vala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* SPDX-License-Identifier: LGPL-3.0-or-later
3-
* SPDX-FileCopyrightText: 2025 elementary, Inc. (https://elementary.io)
3+
* SPDX-FileCopyrightText: 2025-2026 elementary, Inc. (https://elementary.io)
44
*/
55

66
public class Music.QueueView : Granite.Bin {
@@ -169,6 +169,14 @@ public class Music.QueueView : Granite.Bin {
169169
error_toast.send_notification ();
170170
});
171171

172+
playback_manager.duplicates_found.connect ((count) => {
173+
error_toast.title = ngettext (
174+
"%d file was already in the queue and was not re-added",
175+
"%d files were already in the queue and were not re-added",
176+
count).printf (count);
177+
error_toast.send_notification ();
178+
});
179+
172180
repeat_button.clicked.connect (() => {
173181
var enum_step = settings.get_enum ("repeat-mode");
174182
if (enum_step < 2) {

0 commit comments

Comments
 (0)