Exemple #1
0
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;
}
Exemple #2
0
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());
        }
    }
}