From 844b3f733ec30eff41c3b3d48c74561d7b11da8e Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 3 Feb 2025 20:13:23 +0000 Subject: [PATCH] Use Playlist subdirectory Target /Playlists, display and browse sub directories and playlists within --- lua/main_menu.lua | 1 + lua/playlist_browser.lua | 48 +++++++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/lua/main_menu.lua b/lua/main_menu.lua index 80d5b599..c8edf766 100644 --- a/lua/main_menu.lua +++ b/lua/main_menu.lua @@ -135,6 +135,7 @@ return widgets.MenuScreen:new { playlist_btn:onClicked(function() backstack.push(require("playlist_browser"):new { title = "Playlists", + iterator = filesystem.iterator("/Playlists") }) end) playlist_btn:add_style(styles.list_item) diff --git a/lua/playlist_browser.lua b/lua/playlist_browser.lua index d29899ad..4824b581 100644 --- a/lua/playlist_browser.lua +++ b/lua/playlist_browser.lua @@ -13,6 +13,7 @@ local theme = require("theme") local playback = require("playback") local queue = require("queue") local table_iterator = require("table_iterator") +local img = require("images") return screen:new { @@ -59,28 +60,49 @@ return screen:new { } end - local playlists = {} - -- Find playlists - local fs_iter = filesystem.iterator("") - for item in fs_iter do + local is_playlist = function(item) + return item:filepath():match("%.playlist$") + or item:filepath():match("%.m3u8?$") + end + + local get_icon_func = function(item) + if item:is_directory() then + return img.files + else + return img.enqueue + end + end + + local playlists_and_dirs = {}; + for item in self.iterator do if - item:filepath():match("%.playlist$") or - item:filepath():match("%.m3u8?$") then - table.insert(playlists, item) + is_playlist(item) or + item:is_directory() then + table.insert(playlists_and_dirs, item) end end - widgets.InfiniteList(self.root, table_iterator:create(playlists), { + widgets.InfiniteList(self.root, table_iterator:create(playlists_and_dirs), { focus_first_item = true, + get_icon = get_icon_func, callback = function(item) return function() - queue.open_playlist(item:filepath()) - playback.playing:set(true) - backstack.push(playing:new()) + if item:is_directory() then + backstack.push( + require("playlist_browser"):new { + title = self.title, + iterator = filesystem.iterator(item:filepath()), + breadcrumb = item:filepath() + }) + elseif + is_playlist(item) then + -- TODO: playlist viewer + queue.open_playlist(item:filepath()) + playback.playing:set(true) + backstack.push(playing:new()) + end end end }) end } - -