static DB_playItem_t * insert_disc (ddb_playlist_t *plt, DB_playItem_t *after, const char *path, const track_t single_track, CdIo_t* cdio) { struct cddb_thread_params *p = calloc(1, sizeof(struct cddb_thread_params)); if (!p) { return NULL; } p->disc = create_disc(cdio); if (!p->disc) { cleanup_thread_params(p); return NULL; } const track_t tracks = single_track ? 1 : cddb_disc_get_track_count(p->disc); p->items = calloc(tracks+1, sizeof(*p->items)); if (!p->items) { cleanup_thread_params(p); return NULL; } const unsigned long discid = cddb_disc_get_discid(p->disc); DB_playItem_t *inserted = NULL; const track_t first_track = single_track ? single_track : cdio_get_first_track_num(cdio); track_t item_count = 0; for (track_t i = 0; i < tracks; i++) { if (cdio_get_track_format(cdio, first_track+i) == TRACK_FORMAT_AUDIO) { trace("inserting track %d from %s\n", first_track+i, path); inserted = insert_track(plt, after, path, first_track+i, cdio, discid); p->items[item_count++] = inserted; after = inserted; } } intptr_t tid = 0; if (item_count) { const int got_cdtext = read_disc_cdtext(cdio, p->items, tracks); const int prefer_cdtext = deadbeef->conf_get_int("cdda.prefer_cdtext", DEFAULT_PREFER_CDTEXT); const int enable_cddb = deadbeef->conf_get_int("cdda.freedb.enable", DEFAULT_USE_CDDB); if (!(got_cdtext && prefer_cdtext) && enable_cddb) { trace("cdda: querying freedb...\n"); tid = deadbeef->thread_start(cddb_thread, p); if (tid) { deadbeef->thread_detach(tid); } } } if (!tid) { cleanup_thread_params(p); } return inserted; }
void Syncer::worker(time_t curr_time) { auto clone_db = make_db_clone(utils::str::to_string(std::this_thread::get_id())); try { clone_db->open(); } catch (const DatabaseException &exc) { this->update(std::make_exception_ptr(exc)); return; } bool running = true; QString buffer; while (running) { QString path; try { path = storage->get_next(); Track track(path); QString hash = track.get_hash(); auto where = utils::sql::prepare_where<std::string>(cfg::db::row::hash, utils::sql::chars::equal, utils::str::make_dquote_s(hash).toStdString()); auto hash_count = clone_db->select_count(cfg::db::table::files, cfg::db::row::id, where); if (hash_count > 0) { clone_db->renew_value(cfg::db::table::files, cfg::db::row::timestamp, std::to_string(curr_time), where); this->update({path.toStdString(), std::move(track)}); continue; } buffer = (track.get_genre().size() > 0)? track.get_genre() : cfg::db::row::unknown; size_t genre_id = clone_db->get_id(cfg::db::table::genres, cfg::db::row::name, buffer.toStdString()); buffer = (track.get_author().size() > 0)? track.get_author() : cfg::db::row::unknown; size_t author_id = clone_db->get_id(cfg::db::table::authors, cfg::db::row::name, buffer.toStdString()); buffer = (track.get_album().size() > 0)? track.get_album() : cfg::db::row::unknown; size_t album_id = clone_db->get_id(cfg::db::table::albums, cfg::db::row::name, buffer.toStdString()); buffer = (track.get_type().size() > 0)? track.get_type() : cfg::db::row::unknown; size_t type_id = clone_db->get_id(cfg::db::table::formats, cfg::db::row::name, buffer.toStdString()); auto query = insert_track(track, genre_id, author_id, album_id, type_id, curr_time); clone_db->execute(query.toStdString()); this->update({path.toStdString(), std::move(track)}); } catch (const FileStorage::Container::Terminated &exc) { this->update(std::make_exception_ptr(exc)); running = false; } catch (const DatabaseException &exc) { this->update(std::make_exception_ptr(exc)); //running = false; } catch (...) { this->update(std::current_exception()); } } }