/* * Copyright 2016 (c) Anna Schumaker. */ #include #include #include static struct file sys_file = FILE_INIT("playlist.db", 0, 0); static struct queue sys_playlists[SYS_PL_NUM_PLAYLISTS]; static struct queue *pl_system_get_queue(const gchar *); static void __sys_pl_save() { if (!file_open(&sys_file, OPEN_WRITE)) return; file_writef(&sys_file, "%u\n 1 %s\n", 2, "Favorites"); queue_save_tracks(&sys_playlists[SYS_PL_FAVORITES], &sys_file); file_writef(&sys_file, "\n1 %s\n", "Banned"); queue_save_tracks(&sys_playlists[SYS_PL_HIDDEN], &sys_file); file_writef(&sys_file, "\n"); file_close(&sys_file); } static bool __sys_pl_load() { struct queue *queue; unsigned int i, n; gchar *name; if (!file_open(&sys_file, OPEN_READ)) return true; file_readf(&sys_file, "%u\n", &n); for (i = 0; i < n; i++) { file_readf(&sys_file, "%*u %m[^\n]\n", &name); queue = pl_system_get_queue(name); queue_load_tracks(queue, &sys_file); g_free(name); } file_close(&sys_file); return true; } static struct queue *pl_system_get_queue(const gchar *name) { if (string_match(name, "Favorites")) return &sys_playlists[SYS_PL_FAVORITES]; else if (string_match(name, "Hidden") || string_match(name, "Banned")) return &sys_playlists[SYS_PL_HIDDEN]; return NULL; } static bool pl_system_add_track(const gchar *name, struct track *track) { struct queue *queue = pl_system_get_queue(name); if (!queue) return false; if (queue_has(queue, track)) return false; queue_add(queue, track); __sys_pl_save(); return true; } static bool pl_system_remove_track(const gchar *name, struct track *track) { struct queue *queue = pl_system_get_queue(name); if (!queue) return false; if (!queue_remove_all(queue, track)) return false; __sys_pl_save(); return true; } struct playlist_type pl_system = { .pl_get_queue = pl_system_get_queue, .pl_add_track = pl_system_add_track, .pl_remove_track = pl_system_remove_track, }; void pl_system_init(struct queue_ops *ops) { unsigned int i; for (i = 0; i < SYS_PL_NUM_PLAYLISTS; i++) { queue_init(&sys_playlists[i], Q_ENABLED | Q_REPEAT, ops); queue_sort(&sys_playlists[i], COMPARE_ARTIST, true); queue_sort(&sys_playlists[i], COMPARE_YEAR, false); queue_sort(&sys_playlists[i], COMPARE_TRACK, false); } idle_schedule(IDLE_SYNC, __sys_pl_load, NULL); } void pl_system_deinit() { unsigned int i; for (i = 0; i < SYS_PL_NUM_PLAYLISTS; i++) queue_deinit(&sys_playlists[i]); }