class RBOX_MUSIC_MANAGER
Rhythmbox music manager
note
description: "Rhythmbox music manager"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2023-07-27 8:28:40 GMT (Thursday 27th July 2023)"
revision: "36"
class
RBOX_MUSIC_MANAGER
inherit
EL_APPLICATION_COMMAND
EL_MODULE_LOG
EL_MODULE_NAMING
EL_MODULE_PYXIS
EL_MODULE_USER_INPUT
EL_MODULE_URI
RHYTHMBOX_CONSTANTS
create
make
feature {EL_COMMAND_CLIENT} -- Initialization
make (a_task_path: FILE_PATH)
do
task_path := a_task_path
create dir_path
set_task
end
feature -- Access
Description: STRING = "Manage Rhythmbox Music Collection"
task: RBOX_MANAGEMENT_TASK
task_name: ZSTRING
do
Result := Naming.class_as_snake_lower (task, 0, 1)
if Result.starts_with_general ("export") then
Result := Name_template #$ [Result, task_path.parent.base]
end
end
feature -- Basic operations
execute
--
do
log.enter ("execute")
from until user_quit loop
if is_rhythmbox_open then
lio.put_line ("ERROR: Rhythmbox application is open. Exit and try again.")
elseif attached {DEFAULT_TASK} task then
lio.put_line ("ERROR")
lio.put_labeled_string ("Task not found", task_name)
lio.put_new_line
elseif task.has_error then
lio.put_labeled_string ("ERROR", task.error_message)
lio.put_new_line
else
apply_task
end
ask_user_for_task
end
log.exit
end
feature -- Status query
is_rhythmbox_open: BOOLEAN
local
rhythmbox: DETECT_RHYTHMBOX_COMMAND
do
create rhythmbox.make
rhythmbox.execute
Result := rhythmbox.is_launched
end
user_quit: BOOLEAN
feature {NONE} -- Implementation
apply_task
local
database: RBOX_DATABASE
do
if not shared_database.is_created then
create database.make (Rhythmbox_db_path, task.music_dir)
end
lio.put_labeled_string ("Executing", task_name)
lio.put_new_line
task.apply
end
ask_user_for_task
local
done: BOOLEAN
do
from until done loop
task_path := User_input.file_path ("Drag and drop a task")
if task_path.base ~ Quit then
done := True; user_quit := True
elseif task_path.exists then
set_task
done := True
end
lio.put_new_line
end
end
set_task
do
if attached {ZSTRING} task_path.to_string as str
and then URI.is_http (str) and then str.has_substring ("you")
then
create {IMPORT_YOUTUBE_M4A_TASK} task.make (str)
else
task := Task_factory.instance_from_pyxis (agent {RBOX_MANAGEMENT_TASK}.make (task_path))
end
end
shared_database: EL_SINGLETON [RBOX_DATABASE]
do
create Result
end
feature {NONE} -- Internal attributes
dir_path: DIR_PATH
task_path: FILE_PATH
-- path to task config file
feature {NONE} -- Constants
Name_template: ZSTRING
once
Result := "%S (%S)"
end
Quit: ZSTRING
once
Result := "quit"
end
Task_factory: EL_BUILDER_OBJECT_FACTORY [RBOX_MANAGEMENT_TASK,
DEFAULT_TASK, -- Must be first
ADD_ALBUM_ART_TASK,
ARCHIVE_SONGS_TASK,
COLLATE_SONGS_TASK,
DELETE_COMMENTS_TASK,
DISPLAY_INCOMPLETE_ID3_INFO_TASK,
DISPLAY_MUSIC_BRAINZ_INFO_TASK,
EXPORT_MUSIC_TO_DEVICE_TASK,
EXPORT_PLAYLISTS_TO_DEVICE_TASK,
IMPORT_NEW_MP3_TASK,
IMPORT_VIDEOS_TASK,
IMPORT_M3U_PLAYLISTS_TASK,
LIST_VOLUMES_TASK,
NORMALIZE_COMMENTS_TASK,
PRINT_COMMENTS_TASK,
PUBLISH_DJ_EVENTS_TASK,
REMOVE_ALL_UFIDS_TASK,
REMOVE_UNKNOWN_ALBUM_PICTURES_TASK,
REPLACE_CORTINA_SET_TASK,
REPLACE_SONGS_TASK,
RESTORE_PLAYLISTS_TASK,
UPDATE_COMMENTS_WITH_ALBUM_ARTISTS_TASK,
UPDATE_DJ_PLAYLISTS_TASK
]
once
create Result.make (agent Naming.class_as_snake_lower (?, 0, 1))
Result.set_make_default (agent {RBOX_MANAGEMENT_TASK}.make_default)
end
end