Skip to content

Commit 81de63d

Browse files
committed
Merge branch 'playlist-object' of github.com:elementary/music into playlist-object
2 parents 9f9d008 + 19b4cd4 commit 81de63d

5 files changed

Lines changed: 40 additions & 10 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
uses: actions/checkout@v6
3434

3535
- name: Build
36-
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.6
36+
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.7
3737
with:
3838
bundle: Music.flatpak
3939
manifest-path: io.elementary.music.yml

.github/workflows/merge.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ jobs:
6060
uses: actions/checkout@v6
6161

6262
- name: Build
63-
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.6
63+
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.7
6464
with:
6565
bundle: music.flatpak
6666
manifest-path: io.elementary.music.yml
@@ -72,7 +72,7 @@ jobs:
7272
arch: ${{ matrix.configuration.arch }}
7373

7474
- name: Deploy
75-
uses: flatpak/flatpak-github-actions/flat-manager@v6.6
75+
uses: flatpak/flatpak-github-actions/flat-manager@v6.7
7676
with:
7777
repository: appcenter
7878
flat-manager-url: https://flatpak-api.elementary.io

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
uses: actions/checkout@v6
5353

5454
- name: Build
55-
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.6
55+
uses: flatpak/flatpak-github-actions/flatpak-builder@v6.7
5656
with:
5757
bundle: music.flatpak
5858
manifest-path: io.elementary.music.yml
@@ -64,7 +64,7 @@ jobs:
6464
arch: ${{ matrix.configuration.arch }}
6565

6666
- name: Deploy
67-
uses: flatpak/flatpak-github-actions/flat-manager@v6.6
67+
uses: flatpak/flatpak-github-actions/flat-manager@v6.7
6868
with:
6969
repository: appcenter
7070
flat-manager-url: https://flatpak-api.elementary.io

src/PlaybackManager.vala

Lines changed: 26 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,13 +14,15 @@ 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 () {
2021
return instance.once (() => { return new PlaybackManager (); });
2122
}
2223

2324
private dynamic Gst.Element playbin;
25+
private dynamic Gst.Element rgvolume;
2426
private uint progress_timer = 0;
2527
private Settings settings;
2628

@@ -47,6 +49,8 @@ public class Music.PlaybackManager : Object {
4749
queue_liststore = new ListStore (typeof (AudioObject));
4850

4951
playbin = Gst.ElementFactory.make ("playbin", "playbin");
52+
rgvolume = Gst.ElementFactory.make ("rgvolume", "replaygain");
53+
playbin.set_property ("audio-filter", rgvolume);
5054

5155
var bus = playbin.get_bus ();
5256
bus.add_watch (0, bus_callback);
@@ -101,10 +105,26 @@ public class Music.PlaybackManager : Object {
101105
// Files[] must not contain any null entries
102106
public void queue_files (File[] files) {
103107
int invalids = 0;
108+
int duplicates = 0;
109+
int added_tracks = 0;
104110
foreach (unowned var file in files) {
105111
if (file.query_exists () && "audio" in ContentType.guess (file.get_uri (), null, null)) {
106-
var audio_object = new AudioObject (file.get_uri ());
107-
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+
}
108128
} else {
109129
invalids++;
110130
continue;
@@ -114,6 +134,9 @@ public class Music.PlaybackManager : Object {
114134
if (invalids > 0) {
115135
invalids_found (invalids);
116136
}
137+
if (duplicates > 0) {
138+
duplicates_found (duplicates);
139+
}
117140

118141
if (current_audio == null) {
119142
var audio_object = (AudioObject) queue_liststore.get_object (0);
@@ -123,7 +146,6 @@ public class Music.PlaybackManager : Object {
123146
} else {
124147
// Don't notify on app startup or if the app is focused
125148
var application = (Gtk.Application) GLib.Application.get_default ();
126-
var added_tracks = files.length - invalids;
127149
if (
128150
!application.get_active_window ().is_active &&
129151
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)