void CDRipperThread::run(void) { if (!m_tracks->size() > 0) return; Metadata *track = m_tracks->at(0)->metadata; QString tots; if (track->Compilation()) { tots = track->CompilationArtist() + " ~ " + track->Album(); } else { tots = track->Artist() + " ~ " + track->Album(); } QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kOverallTextEvent, tots)); QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kOverallProgressEvent, 0)); QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kTrackProgressEvent, 0)); QString textstatus; QString encodertype = gCoreContext->GetSetting("EncoderType"); bool mp3usevbr = gCoreContext->GetNumSetting("Mp3UseVBR", 0); m_totalSectors = 0; m_totalSectorsDone = 0; for (int trackno = 0; trackno < m_tracks->size(); trackno++) { m_totalSectors += getSectorCount(m_CDdevice, trackno + 1); } QApplication::postEvent(m_parent, new RipStatusEvent(RipStatusEvent::kOverallStartEvent, m_totalSectors)); if (LCD *lcd = LCD::Get()) { QString lcd_tots = QObject::tr("Importing ") + tots; QList<LCDTextItem> textItems; textItems.append(LCDTextItem(1, ALIGN_CENTERED, lcd_tots, "Generic", false)); lcd->switchToGeneric(textItems); } Metadata *titleTrack = NULL; QString outfile; std::auto_ptr<Encoder> encoder; for (int trackno = 0; trackno < m_tracks->size(); trackno++) { if (isCancelled()) break; QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kStatusTextEvent, QString("Track %1 of %2") .arg(trackno + 1).arg(m_tracks->size()))); QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kTrackProgressEvent, 0)); track = m_tracks->at(trackno)->metadata; if (track) { textstatus = track->Title(); QApplication::postEvent( m_parent, new RipStatusEvent( RipStatusEvent::kTrackTextEvent, textstatus)); QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kTrackProgressEvent, 0)); QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kTrackPercentEvent, 0)); // do we need to start a new file? if (m_tracks->at(trackno)->active) { titleTrack = track; titleTrack->setLength(m_tracks->at(trackno)->length); outfile = Ripper::filenameFromMetadata(track); if (m_quality < 3) { if (encodertype == "mp3") { outfile += ".mp3"; encoder.reset(new LameEncoder(outfile, m_quality, titleTrack, mp3usevbr)); } else // ogg { outfile += ".ogg"; encoder.reset(new VorbisEncoder(outfile, m_quality, titleTrack)); } } else { outfile += ".flac"; encoder.reset(new FlacEncoder(outfile, m_quality, titleTrack)); } if (!encoder->isValid()) { QApplication::postEvent( m_parent, new RipStatusEvent( RipStatusEvent::kEncoderErrorEvent, "Encoder failed to open file for writing")); VERBOSE(VB_IMPORTANT, "MythMusic: Encoder failed" " to open file for writing"); return; } } if (!encoder.get()) { // This should never happen. QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kEncoderErrorEvent, "Failed to create encoder")); VERBOSE(VB_IMPORTANT, QString("MythMusic: Error: No encoder, failing")); return; } ripTrack(m_CDdevice, encoder.get(), trackno + 1); if (isCancelled()) return; // save the metadata to the DB if (m_tracks->at(trackno)->active) { titleTrack->setFilename(outfile); titleTrack->dumpToDatabase(); } } } QString PostRipCDScript = gCoreContext->GetSetting("PostCDRipScript"); if (!PostRipCDScript.isEmpty()) myth_system(PostRipCDScript); QApplication::postEvent( m_parent, new RipStatusEvent(RipStatusEvent::kFinishedEvent, "")); }
/*! * \brief Insert file details into database. * If it is an audio file, read the metadata and insert * that information at the same time. * * If it is an image file, just insert the filename and * type. * * \param filename Full path to file. * * \returns Nothing. */ void FileScanner::AddFileToDB(const QString &filename) { QString extension = filename.section( '.', -1 ) ; QString directory = filename; directory.remove(0, m_startdir.length()); directory = directory.section( '/', 0, -2); QString nameFilter = gCoreContext->GetSetting("AlbumArtFilter", "*.png;*.jpg;*.jpeg;*.gif;*.bmp"); // If this file is an image, insert the details into the music_albumart table if (nameFilter.indexOf(extension.toLower()) > -1) { QString name = filename.section( '/', -1); MSqlQuery query(MSqlQuery::InitCon()); query.prepare("INSERT INTO music_albumart SET filename = :FILE, " "directory_id = :DIRID, imagetype = :TYPE;"); query.bindValue(":FILE", name); query.bindValue(":DIRID", m_directoryid[directory]); query.bindValue(":TYPE", AlbumArtImages::guessImageType(name)); if (!query.exec() || query.numRowsAffected() <= 0) { MythDB::DBError("music insert artwork", query); } return; } Decoder *decoder = Decoder::create(filename, NULL, NULL, true); if (decoder) { LOG(VB_FILE, LOG_INFO, QString("Reading metadata from %1").arg(filename)); Metadata *data = decoder->readMetadata(); if (data) { QString album_cache_string; // Set values from cache int did = m_directoryid[directory]; if (did > 0) data->setDirectoryId(did); int aid = m_artistid[data->Artist().toLower()]; if (aid > 0) { data->setArtistId(aid); // The album cache depends on the artist id album_cache_string = data->getArtistId() + "#" + data->Album().toLower(); if (m_albumid[album_cache_string] > 0) data->setAlbumId(m_albumid[album_cache_string]); } int gid = m_genreid[data->Genre().toLower()]; if (gid > 0) data->setGenreId(gid); // Commit track info to database data->dumpToDatabase(); // Update the cache m_artistid[data->Artist().toLower()] = data->getArtistId(); m_genreid[data->Genre().toLower()] = data->getGenreId(); album_cache_string = data->getArtistId() + "#" + data->Album().toLower(); m_albumid[album_cache_string] = data->getAlbumId(); // read any embedded images from the tag MetaIO *tagger = data->getTagger(); if (tagger && tagger->supportsEmbeddedImages()) { AlbumArtList artList = tagger->getAlbumArtList(data->Filename()); data->setEmbeddedAlbumArt(artList); data->getAlbumArtImages()->dumpToDatabase(); } delete data; } delete decoder; } }
void ImportMusicDialog::addPressed() { if (m_tracks->size() == 0) return; Metadata *meta = m_tracks->at(m_currentTrack)->metadata; // is the current track a new file? if (m_tracks->at(m_currentTrack)->isNewTune) { // get the save filename - this also creates the correct directory stucture QString saveFilename = Ripper::filenameFromMetadata(meta); // we need to manually copy the file extension QFileInfo fi(meta->Filename()); saveFilename += "." + fi.suffix(); // copy the file to the new location if (!copyFile(meta->Filename(), saveFilename)) { ShowOkPopup(tr("Copy Failed\nCould not copy file to: %1") .arg(saveFilename)); return; } meta->setFilename(saveFilename); // do we need to update the tags? if (m_tracks->at(m_currentTrack)->metadataHasChanged) { Decoder *decoder = Decoder::create(saveFilename, NULL, NULL, true); if (decoder) { decoder->commitMetadata(meta); delete decoder; } } // update the database meta->dumpToDatabase(); // read any embedded images from the tag MetaIO *tagger = meta->getTagger(); if (tagger && tagger->supportsEmbeddedImages()) { AlbumArtList artList = tagger->getAlbumArtList(meta->Filename()); meta->setEmbeddedAlbumArt(artList); meta->getAlbumArtImages()->dumpToDatabase(); } m_somethingWasImported = true; m_tracks->at(m_currentTrack)->isNewTune = Ripper::isNewTune( meta->Artist(), meta->Album(), meta->Title()); // update the UI fillWidgets(); } else ShowOkPopup(tr("This track is already in the database")); }