GList * prepend_song_with_artist_and_title_to_mobj_list(const gchar *artist, const gchar *title, GList *list, struct con_win *cwin) { PraghaMusicobject *mobj = NULL; gint location_id = 0; if(pragha_mobj_list_already_has_title_of_artist(list, title, artist) || pragha_playlist_already_has_title_of_artist(cwin->cplaylist, title, artist)) return list; const gchar *sql = "SELECT TRACK.title, ARTIST.name, LOCATION.id " "FROM TRACK, ARTIST, LOCATION " "WHERE ARTIST.id = TRACK.artist AND LOCATION.id = TRACK.location " "AND TRACK.title = ? COLLATE NOCASE " "AND ARTIST.name = ? COLLATE NOCASE " "ORDER BY RANDOM() LIMIT 1;"; PraghaPreparedStatement *statement = pragha_database_create_statement (cwin->cdbase, sql); pragha_prepared_statement_bind_string (statement, 1, title); pragha_prepared_statement_bind_string (statement, 2, artist); if (pragha_prepared_statement_step (statement)) { location_id = pragha_prepared_statement_get_int (statement, 2); mobj = new_musicobject_from_db (cwin->cdbase, location_id); list = g_list_prepend (list, mobj); } pragha_prepared_statement_free (statement); return list; }
void pragha_database_add_radio_track (PraghaDatabase *database, gint radio_id, const gchar *uri) { const gchar *sql = "INSERT INTO RADIO_TRACKS (uri, radio) VALUES (?, ?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, uri); pragha_prepared_statement_bind_int (statement, 2, radio_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); }
void pragha_database_add_playlist_track (PraghaDatabase *database, gint playlist_id, const gchar *file) { const gchar *sql = "INSERT INTO PLAYLIST_TRACKS (file, playlist) VALUES (?, ?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, file); pragha_prepared_statement_bind_int (statement, 2, playlist_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); }
gint pragha_database_add_new_playlist (PraghaDatabase *database, const gchar *playlist) { const gchar *sql = "INSERT INTO PLAYLIST (name) VALUES (?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, playlist); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); return pragha_database_find_playlist (database, playlist); }
gint pragha_database_add_new_album (PraghaDatabase *database, const gchar *album) { const gchar *sql = "INSERT INTO ALBUM (name) VALUES (?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, album); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); return pragha_database_find_album (database, album); }
gint pragha_database_add_new_genre (PraghaDatabase *database, const gchar *genre) { const gchar *sql = "INSERT INTO GENRE (name) VALUES (?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, genre); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); return pragha_database_find_genre (database, genre); }
gint pragha_database_add_new_mime_type (PraghaDatabase *database, const gchar *mime_type) { const gchar *sql = "INSERT INTO MIME_TYPE (name) VALUES (?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, mime_type); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); return pragha_database_find_mime_type (database, mime_type); }
gint pragha_database_add_new_location (PraghaDatabase *database, const gchar *location) { const gchar *sql = "INSERT INTO LOCATION (name) VALUES (?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, location); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); return pragha_database_find_location (database, location); }
gint pragha_database_add_new_radio (PraghaDatabase *database, const gchar *radio) { const gchar *sql = "INSERT INTO RADIO (name) VALUES (?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, radio); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); return pragha_database_find_radio (database, radio); }
gint pragha_database_find_playlist (PraghaDatabase *database, const gchar *playlist) { gint playlist_id = 0; const gchar *sql = "SELECT id FROM PLAYLIST WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, playlist); if (pragha_prepared_statement_step (statement)) playlist_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return playlist_id; }
gint pragha_database_find_genre (PraghaDatabase *database, const gchar *genre) { gint genre_id = 0; const gchar *sql = "SELECT id FROM GENRE WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, genre); if (pragha_prepared_statement_step (statement)) genre_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return genre_id; }
gint pragha_database_find_mime_type (PraghaDatabase *database, const gchar *mime_type) { gint mime_type_id = 0; const gchar *sql = "SELECT id FROM MIME_TYPE WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, mime_type); if (pragha_prepared_statement_step (statement)) mime_type_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return mime_type_id; }
gint pragha_database_find_radio (PraghaDatabase *database, const gchar *radio) { gint radio_id = 0; const gchar *sql = "SELECT id FROM RADIO WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, radio); if (pragha_prepared_statement_step (statement)) radio_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return radio_id; }
gint pragha_database_find_album (PraghaDatabase *database, const gchar *album) { gint album_id = 0; const gchar *sql = "SELECT id FROM ALBUM WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, album); if (pragha_prepared_statement_step (statement)) album_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return album_id; }
gint pragha_database_find_location (PraghaDatabase *database, const gchar *location) { gint location_id = 0; const gchar *sql = "SELECT id FROM LOCATION WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, location); if (pragha_prepared_statement_step (statement)) location_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return location_id; }
gint pragha_database_find_comment (PraghaDatabase *database, const gchar *comment) { gint comment_id = 0; const gchar *sql = "SELECT id FROM COMMENT WHERE name = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, comment); if (pragha_prepared_statement_step (statement)) comment_id = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return comment_id; }
static void pragha_database_add_new_track (PraghaDatabase *database, gint location_id, gint mime_type_id, gint artist_id, gint album_id, gint genre_id, gint year_id, gint comment_id, guint track_no, gint length, gint channels, gint bitrate, gint samplerate, const gchar *title) { const gchar *sql = "INSERT INTO TRACK (" "location, " "file_type, " "track_no, " "artist, " "album, " "genre, " "year, " "comment, " "bitrate, " "samplerate, " "length, " "channels, " "title) " "VALUES " "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, location_id); pragha_prepared_statement_bind_int (statement, 2, mime_type_id); pragha_prepared_statement_bind_int (statement, 3, track_no); pragha_prepared_statement_bind_int (statement, 4, artist_id); pragha_prepared_statement_bind_int (statement, 5, album_id); pragha_prepared_statement_bind_int (statement, 6, genre_id); pragha_prepared_statement_bind_int (statement, 7, year_id); pragha_prepared_statement_bind_int (statement, 8, comment_id); pragha_prepared_statement_bind_int (statement, 9, bitrate); pragha_prepared_statement_bind_int (statement, 10, samplerate); pragha_prepared_statement_bind_int (statement, 11, length); pragha_prepared_statement_bind_int (statement, 12, channels); pragha_prepared_statement_bind_string (statement, 13, title); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); }
gint pragha_database_get_playlist_count (PraghaDatabase *database) { gint n_playlists = 0; const gchar *sql = "SELECT COUNT() FROM PLAYLIST WHERE name != ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, SAVE_PLAYLIST_STATE); if (pragha_prepared_statement_step (statement)) n_playlists = pragha_prepared_statement_get_int (statement, 0); pragha_prepared_statement_free (statement); return n_playlists; }
void pragha_database_delete_dir (PraghaDatabase *database, const gchar *dir_name) { const gchar *sql; PraghaPreparedStatement *statement; gchar *mask = g_strconcat (dir_name, "%", NULL); /* Delete all tracks under the given dir */ sql = "DELETE FROM TRACK WHERE location IN (SELECT id FROM LOCATION WHERE NAME LIKE ?)"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, mask); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); /* Delete the location entries */ sql = "DELETE FROM LOCATION WHERE name LIKE ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, mask); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); /* Delete all entries from PLAYLIST_TRACKS which match given dir */ sql = "DELETE FROM PLAYLIST_TRACKS WHERE file LIKE ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, mask); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); /* Now flush unused artists, albums, genres, years */ pragha_database_flush_stale_entries (database); g_free (mask); }
void pragha_database_update_radio_name (PraghaDatabase *database, const gchar *old_name, const gchar *new_name) { gint radio_id = pragha_database_find_radio (database, old_name); if (!radio_id) return; const gchar *sql = "UPDATE RADIO SET name = ? WHERE id = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, new_name); pragha_prepared_statement_bind_int (statement, 2, radio_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); }
void pragha_database_update_playlist_name (PraghaDatabase *database, const gchar *old_name, const gchar *new_name) { gint playlist_id = pragha_database_find_playlist (database, old_name); if (!playlist_id) return; const gchar *sql = "UPDATE PLAYLIST SET name = ? WHERE id = ?"; PraghaPreparedStatement *statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, new_name); pragha_prepared_statement_bind_int (statement, 2, playlist_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); }
void pragha_scanner_update_library(PraghaScanner *scanner) { PraghaPreferences *preferences; PraghaDatabase *database; PraghaPreparedStatement *statement; PraghaMusicobject *mobj = NULL; gchar *mask = NULL, *last_scan_time = NULL; const gchar *sql = NULL; guint location_id; GSList *list; if(scanner->update_timeout) return; preferences = pragha_preferences_get(); /* Get last time that update the library and folders to analyze */ last_scan_time = pragha_preferences_get_string(preferences, GROUP_LIBRARY, KEY_LIBRARY_LAST_SCANNED); if (last_scan_time) { if (!g_time_val_from_iso8601(last_scan_time, &scanner->last_update)) g_warning("Unable to convert last rescan time"); g_free(last_scan_time); } scanner->folder_list = pragha_preferences_get_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_DIR); scanner->folder_scanned = pragha_preferences_get_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_SCANNED); g_object_unref(G_OBJECT(preferences)); /* Update the gui */ scanner->update_timeout = g_timeout_add_seconds(1, (GSourceFunc)pragha_scanner_update_progress, scanner); pragha_preferences_set_show_status_bar (preferences, TRUE); gtk_widget_show_all(scanner->hbox); /* Append the files from database that no changed. */ database = pragha_database_get(); for(list = scanner->folder_scanned ; list != NULL; list = list->next) { if(is_present_str_list(list->data, scanner->folder_list)) { sql = "SELECT id FROM LOCATION WHERE name LIKE ?"; statement = pragha_database_create_statement (database, sql); mask = g_strconcat (list->data, "%", NULL); pragha_prepared_statement_bind_string (statement, 1, mask); while (pragha_prepared_statement_step (statement)) { location_id = pragha_prepared_statement_get_int (statement, 0); mobj = new_musicobject_from_db(database, location_id); if (G_LIKELY(mobj)) { g_hash_table_insert(scanner->tracks_table, g_strdup(pragha_musicobject_get_file(mobj)), mobj); } pragha_process_gtk_events (); } pragha_prepared_statement_free (statement); g_free(mask); } } g_object_unref(database); /* Launch threads */ scanner->no_files_thread = g_thread_new("Count no files", pragha_scanner_count_no_files_worker, scanner); scanner->worker_thread = pragha_async_launch_full(pragha_scanner_update_worker, pragha_scanner_worker_finished, scanner); }
static void pragha_database_update_track (PraghaDatabase *database, gint location_id, gint changed, gint track_no, const gchar *title, gint artist_id, gint album_id, gint genre_id, gint year_id, gint comment_id) { const gchar *sql; PraghaPreparedStatement *statement; if (changed & TAG_TNO_CHANGED) { sql = "UPDATE TRACK SET track_no = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, track_no); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } if (changed & TAG_TITLE_CHANGED) { sql = "UPDATE TRACK SET title = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_string (statement, 1, title); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } if (changed & TAG_ARTIST_CHANGED) { sql = "UPDATE TRACK SET artist = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, artist_id); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } if (changed & TAG_ALBUM_CHANGED) { sql = "UPDATE TRACK SET album = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, album_id); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } if (changed & TAG_GENRE_CHANGED) { sql = "UPDATE TRACK SET genre = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, genre_id); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } if (changed & TAG_YEAR_CHANGED) { sql = "UPDATE TRACK SET year = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, year_id); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } if (changed & TAG_COMMENT_CHANGED) { sql = "UPDATE TRACK SET comment = ? WHERE LOCATION = ?"; statement = pragha_database_create_statement (database, sql); pragha_prepared_statement_bind_int (statement, 1, comment_id); pragha_prepared_statement_bind_int (statement, 2, location_id); pragha_prepared_statement_step (statement); pragha_prepared_statement_free (statement); } }