diff --git a/.gitignore b/.gitignore index dc83d7d7c..89c0dbc9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *~ .flatpak-builder +.flatpak build diff --git a/data/music.desktop.in b/data/music.desktop.in index 4513ca5f3..5c59d6bd5 100644 --- a/data/music.desktop.in +++ b/data/music.desktop.in @@ -7,7 +7,7 @@ Exec=io.elementary.music %U Icon=io.elementary.music Terminal=false Categories=Audio;Music;Player;AudioVideo;GTK; -MimeType=x-content/audio-player;x-content/audio-cdda;application/ogg;application/x-extension-m4a;application/x-extension-mp4;application/x-flac;application/x-ogg;audio/3gpp;audio/aac;audio/ac3;audio/AMR;audio/AMR-WB;audio/basic;audio/flac;audio/midi;audio/mp2;audio/mp4;audio/mpeg;audio/ogg;audio/vnd.rn-realaudio;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-gsm;audio/x-it;audio/x-m4a;audio/x-matroska;audio/x-mod;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;audio/x-musepack;audio/x-opus+ogg;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-pn-wav;audio/x-pn-windows-acm;audio/x-realaudio;audio/x-real-audio;audio/x-sbc;audio/x-scpls;audio/x-speex;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-xm;audio/x-s3m; +MimeType=x-content/audio-player;x-content/audio-cdda;application/ogg;application/x-extension-m4a;application/x-extension-mp4;application/x-flac;application/x-ogg;audio/3gpp;audio/aac;audio/ac3;audio/AMR;audio/AMR-WB;audio/basic;audio/flac;audio/midi;audio/mp2;audio/mp4;audio/mpeg;audio/ogg;audio/vnd.rn-realaudio;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-gsm;audio/x-it;audio/x-m4a;audio/x-matroska;audio/x-mod;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;audio/x-musepack;audio/x-opus+ogg;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-pn-wav;audio/x-pn-windows-acm;audio/x-realaudio;audio/x-real-audio;audio/x-sbc;audio/x-scpls;audio/x-speex;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-xm;audio/x-s3m;inode/directory; StartupNotify=true Keywords=Noise;Audio;Player;MP3;Play;Playlist;Media;Songs; X-GNOME-UsesNotifications=true diff --git a/io.elementary.music.yml b/io.elementary.music.yml index bec3ea39d..b2b787393 100644 --- a/io.elementary.music.yml +++ b/io.elementary.music.yml @@ -9,6 +9,7 @@ finish-args: - '--socket=wayland' - '--socket=pulseaudio' - '--device=dri' + - '--filesystem=xdg-music:ro' modules: - name: music diff --git a/src/Application.vala b/src/Application.vala index 84ec0f8cb..1b3c4df39 100644 --- a/src/Application.vala +++ b/src/Application.vala @@ -103,12 +103,60 @@ public class Music.Application : Gtk.Application { settings.bind ("window-maximized", main_window, "maximized", SettingsBindFlags.SET); } + private File[] list_directory (string directory) { + Dir dir; + try { + dir = Dir.open (directory, 0); + } catch (FileError e) { + warning (e.message); + return {}; + } + + string? name = null; + File[] elements = {}; + + while ((name = dir.read_name ()) != null) { + var file_path = Path.build_filename (directory, name); + var file = File.new_for_path (file_path); + + elements += file; + } + + return elements; + } + + private File[] loop_through_files (File[] files) { + // All of these will be returned later in bulk + File[] elements = {}; + + foreach (var file in files) { + var file_path = file.get_path (); + + if (FileUtils.test (file_path, FileTest.IS_DIR)) { + var directory_elements = list_directory (file_path); + var directory_files = loop_through_files (directory_elements); + + foreach (var directory_file in directory_files) { + elements += directory_file; + } + + continue; + } + + elements += file; + } + + return elements; + } + protected override void open (File[] files, string hint) { if (active_window == null) { activate (); } - playback_manager.queue_files (files); + var files_to_play = loop_through_files (files); + debug ("Application: Number of files to play %u", files_to_play.length); + playback_manager.queue_files (files_to_play); } private void action_play_pause () { diff --git a/src/PlaybackManager.vala b/src/PlaybackManager.vala index 77338412d..abdc6bdfc 100644 --- a/src/PlaybackManager.vala +++ b/src/PlaybackManager.vala @@ -83,6 +83,7 @@ public class Music.PlaybackManager : Object { playbin.seek_simple (Gst.Format.TIME, Gst.SeekFlags.FLUSH, (int64)(percent * current_audio.duration)); } + // Files[] must not contain any null entries public void queue_files (File[] files) { discoverer.start (); int invalids = 0;