GList * pragha_dnd_library_get_mobj_list (GtkSelectionData *data, PraghaDatabase *cdbase) { gint n = 0, location_id = 0; gchar *name = NULL, *uri, **uris; PraghaMusicobject *mobj = NULL; GList *list = NULL; CDEBUG(DBG_VERBOSE, "Dnd: Library"); uris = g_uri_list_extract_uris ((const gchar *) gtk_selection_data_get_data (data)); if (!uris) { g_warning("No selections to process in DnD"); return list; } /* Dnd from the library, so will read everything from database. */ pragha_database_begin_transaction (cdbase); /* Get the mobjs from the path of the library. */ for (n = 0; uris[n] != NULL; n++) { uri = uris[n]; if (g_str_has_prefix(uri, "Location:/")) { location_id = atoi(uri + strlen("Location:/")); mobj = new_musicobject_from_db (cdbase, location_id); if (G_LIKELY(mobj)) list = g_list_prepend(list, mobj); } else if(g_str_has_prefix(uri, "Playlist:/")) { name = uri + strlen("Playlist:/"); list = add_playlist_to_mobj_list (cdbase, name, list); } else if(g_str_has_prefix(uri, "Radio:/")) { name = uri + strlen("Radio:/"); list = add_radio_to_mobj_list (cdbase, name, list); } } pragha_database_commit_transaction (cdbase); g_strfreev(uris); return g_list_reverse (list); }
static gboolean pragha_scanner_worker_finished (gpointer data) { GtkWidget *msg_dialog; gchar *last_scan_time = NULL; PraghaPreferences *preferences; PraghaDatabase *database; GSList *list; PraghaScanner *scanner = data; /* Stop updates */ g_source_remove(scanner->update_timeout); /* Ensure that the other thread has finished */ g_thread_join (scanner->no_files_thread); /* If not cancelled, update database and show a dialog */ if(!g_cancellable_is_cancelled (scanner->cancellable)) { /* Hide the scanner and show the dialog */ gtk_widget_hide(scanner->hbox); msg_dialog = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(scanner->hbox))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", _("Library scan complete")); g_signal_connect(G_OBJECT(msg_dialog), "response", G_CALLBACK(pragha_scanner_finished_dialog_response_cb), scanner); g_signal_connect(G_OBJECT(msg_dialog), "delete-event", G_CALLBACK(pragha_scanner_finished_dialog_delete), scanner); gtk_widget_show_all(msg_dialog); /* Save new database and update the library view */ set_watch_cursor(msg_dialog); set_watch_cursor(scanner->hbox); database = pragha_database_get(); pragha_database_begin_transaction (database); pragha_database_flush (database); g_hash_table_foreach (scanner->tracks_table, pragha_scanner_add_track_db, database); /* Import playlist detected. */ for (list = scanner->playlists ; list != NULL; list = list->next) pragha_scanner_import_playlist(database, list->data); pragha_database_commit_transaction (database); pragha_database_change_tracks_done (database); g_object_unref(database); remove_watch_cursor(scanner->hbox); remove_watch_cursor(msg_dialog); /* Save finished time and folders scanned. */ g_get_current_time(&scanner->last_update); last_scan_time = g_time_val_to_iso8601(&scanner->last_update); preferences = pragha_preferences_get(); pragha_preferences_set_string(preferences, GROUP_LIBRARY, KEY_LIBRARY_LAST_SCANNED, last_scan_time); g_free(last_scan_time); pragha_preferences_set_filename_list(preferences, GROUP_LIBRARY, KEY_LIBRARY_SCANNED, scanner->folder_list); g_object_unref(G_OBJECT(preferences)); } else { gtk_widget_hide(scanner->hbox); } gtk_progress_bar_set_text(GTK_PROGRESS_BAR(scanner->progress_bar), NULL); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(scanner->progress_bar), 0.0); /* Clean memory */ g_hash_table_remove_all(scanner->tracks_table); free_str_list(scanner->folder_list); scanner->folder_list = NULL; free_str_list(scanner->folder_scanned); scanner->folder_scanned = NULL; free_str_list(scanner->playlists); scanner->playlists = NULL; scanner->no_files = 0; scanner->files_scanned = 0; g_cancellable_reset (scanner->cancellable); scanner->update_timeout = 0; return FALSE; }
void pragha_database_update_local_files_change_tag (PraghaDatabase *database, GArray *loc_arr, gint changed, PraghaMusicobject *mobj) { gint track_no = 0, artist_id = 0, album_id = 0, genre_id = 0, year_id = 0, comment_id = 0; guint i = 0, elem = 0; if (!changed) return; if (!loc_arr) return; CDEBUG (DBG_VERBOSE, "Tags Changed: 0x%x", changed); if (changed & TAG_TNO_CHANGED) { track_no = pragha_musicobject_get_track_no (mobj); } if (changed & TAG_TITLE_CHANGED) { } if (changed & TAG_ARTIST_CHANGED) { const gchar *artist = pragha_musicobject_get_artist (mobj); artist_id = pragha_database_find_artist (database, artist); if (!artist_id) artist_id = pragha_database_add_new_artist (database, artist); } if (changed & TAG_ALBUM_CHANGED) { const gchar *album = pragha_musicobject_get_album (mobj); album_id = pragha_database_find_album (database, album); if (!album_id) album_id = pragha_database_add_new_album (database, album); } if (changed & TAG_GENRE_CHANGED) { const gchar *genre = pragha_musicobject_get_genre (mobj); genre_id = pragha_database_find_genre (database, genre); if (!genre_id) genre_id = pragha_database_add_new_genre (database, genre); } if (changed & TAG_YEAR_CHANGED) { year_id = pragha_database_find_year (database, pragha_musicobject_get_year (mobj)); if (!year_id) year_id = pragha_database_add_new_year (database, pragha_musicobject_get_year (mobj)); } if (changed & TAG_COMMENT_CHANGED) { const gchar *comment = pragha_musicobject_get_comment (mobj); comment_id = pragha_database_find_comment (database, comment); if (!comment_id) comment_id = pragha_database_add_new_comment (database, comment); } pragha_database_begin_transaction (database); if (loc_arr) { elem = 0; for (i = 0; i < loc_arr->len; i++) { elem = g_array_index (loc_arr, gint, i); if (elem) { pragha_database_update_track (database, elem, changed, track_no, pragha_musicobject_get_title (mobj), artist_id, album_id, genre_id, year_id, comment_id); } } } pragha_database_commit_transaction (database); }