void ImportMusicDialog::startScan() { MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busy = new MythUIBusyDialog(QObject::tr("Searching for music files"), popupStack, "scanbusydialog"); if (busy->Create()) { popupStack->AddScreen(busy, false); } else { delete busy; busy = NULL; } FileScannerThread *scanner = new FileScannerThread(this); scanner->start(); while (!scanner->isFinished()) { usleep(500); qApp->processEvents(); } delete scanner; m_currentTrack = 0; fillWidgets(); if (busy) busy->Close(); }
/// reload music after a scan, rip or import void MusicData::reloadMusic(void) { if (!all_music || !all_playlists) return; MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); QString message = QObject::tr("Rebuilding music tree"); MythUIBusyDialog *busy = new MythUIBusyDialog(message, popupStack, "musicscanbusydialog"); if (busy->Create()) popupStack->AddScreen(busy, false); else busy = NULL; all_music->startLoading(); while (!all_music->doneLoading()) { qApp->processEvents(); usleep(50000); } all_playlists->postLoad(); if (busy) busy->Close(); }
void RecordingSelector::Init(void) { QString message = tr("Retrieving Recording List. Please Wait..."); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(message, popupStack, "recordingselectorbusydialog"); if (busyPopup->Create()) popupStack->AddScreen(busyPopup, false); else { delete busyPopup; busyPopup = false; } GetRecordingListThread *thread = new GetRecordingListThread(this); while (thread->isRunning()) { qApp->processEvents(); usleep(100); } if (!m_recordingList || m_recordingList->size() == 0) { ShowOkPopup(tr("Either you don't have any recordings or " "no recordings are available locally!")); if (busyPopup) busyPopup->Close(); Close(); return; } updateCategorySelector(); updateSelectedList(); updateRecordingList(); if (busyPopup) busyPopup->Close(); }
void ImportFile::Init(void) { QString message = tr("Retrieving Recording List. Please Wait..."); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(message, popupStack, "getrecordingbusydialog"); if (busyPopup->Create()) popupStack->AddScreen(busyPopup, false); else { delete busyPopup; busyPopup = NULL; } GetImportRecordingListThread *thread = new GetImportRecordingListThread(this); while (thread->isRunning()) { qApp->processEvents(); usleep(2000); } if (m_recordingList.empty()) { ShowOkPopup(tr("Failed to get recording list!")); if (busyPopup) busyPopup->Close(); Close(); return; } updateCategorySelector(); updateSelectedList(); updateRecordingList(); if (busyPopup) busyPopup->Close(); }
void ImportFile::recordFile(void) { MythUIButtonListItem *item = m_recordingButtonList->GetItemCurrent(); if (!item) return; ImportItem *i = item->GetData().value<ImportItem *>(); if (!i) return; if (!doPlayFile(i, false)) return; QString message = tr("Getting List Of Recording.\nPlease Wait..."); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(message, popupStack, "recordingbusydialog"); if (busyPopup->Create()) popupStack->AddScreen(busyPopup, false); else { delete busyPopup; busyPopup = NULL; } GetImportRecordingThread *thread = new GetImportRecordingThread(this); while (thread->isRunning()) { qApp->processEvents(); usleep(2000); } if (busyPopup) busyPopup->Close(); }
void GameHandler::processGames(GameHandler *handler) { QString thequery; int maxcount = 0; MSqlQuery query(MSqlQuery::InitCon()); if ((!handler->SystemRomPath().isEmpty()) && (handler->GameType() != "PC")) { QDir d(handler->SystemRomPath()); if (d.exists()) maxcount = buildFileCount(handler->SystemRomPath(),handler); else { LOG(VB_GENERAL, LOG_ERR, LOC + QString("ROM Path does not exist: %1") .arg(handler->SystemRomPath())); return; } } else maxcount = 100; if (handler->GameType() == "PC") { MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); QString message = QObject::tr("Scanning for %1 games...") .arg(handler->SystemName()); MythUIBusyDialog *busyDialog = new MythUIBusyDialog(message, popupStack, "gamescanbusy"); if (busyDialog->Create()) popupStack->AddScreen(busyDialog, false); else { delete busyDialog; busyDialog = NULL; } m_GameMap[handler->SystemCmdLine()] = GameScan(handler->SystemCmdLine(), handler->SystemCmdLine(), inFileSystem, handler->SystemName(), handler->SystemCmdLine().left(handler->SystemCmdLine().lastIndexOf(QRegExp("/")))); if (busyDialog) busyDialog->Close(); LOG(VB_GENERAL, LOG_INFO, LOC + QString("PC Game %1").arg(handler->SystemName())); } else { QString message = QObject::tr("Scanning for %1 games...") .arg(handler->SystemName()); CreateProgress(message); if (m_progressDlg) m_progressDlg->SetTotal(maxcount); int filecount = 0; buildFileList(handler->SystemRomPath(), handler, &filecount); if (m_progressDlg) { m_progressDlg->Close(); m_progressDlg = NULL; } } VerifyGameDB(handler); // If we still have some games in the list then update the database if (!m_GameMap.empty()) { InitMetaDataMap(handler->GameType()); UpdateGameDB(handler); romDB.clear(); handler->setRebuild(true); } else handler->setRebuild(false); }
/*! * \brief Scan a directory recursively for music and albumart. * Inserts, updates and removes any files any files found in the * database. * * \param directory Directory to scan * * \returns Nothing. */ void FileScanner::SearchDir(QString &directory) { m_startdir = directory; MusicLoadedMap music_files; MusicLoadedMap::Iterator iter; MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); QString message = QObject::tr("Searching for music files"); MythUIBusyDialog *busy = new MythUIBusyDialog(message, popupStack, "musicscanbusydialog"); if (busy->Create()) popupStack->AddScreen(busy, false); else busy = NULL; BuildFileList(m_startdir, music_files, 0); if (busy) busy->Close(); ScanMusic(music_files); ScanArtwork(music_files); message = QObject::tr("Updating music database"); MythUIProgressDialog *file_checking = new MythUIProgressDialog(message, popupStack, "scalingprogressdialog"); if (file_checking->Create()) { popupStack->AddScreen(file_checking, false); file_checking->SetTotal(music_files.size()); } else { delete file_checking; file_checking = NULL; } /* This can be optimised quite a bit by consolidating all commands via a lot of refactoring. 1) group all files of the same decoder type, and don't create/delete a Decoder pr. AddFileToDB. Or make Decoders be singletons, it should be a fairly simple change. 2) RemoveFileFromDB should group the remove into one big SQL. 3) UpdateFileInDB, same as 1. */ uint counter = 0; for (iter = music_files.begin(); iter != music_files.end(); iter++) { if (*iter == kFileSystem) AddFileToDB(iter.key()); else if (*iter == kDatabase) RemoveFileFromDB(iter.key ()); else if (*iter == kNeedUpdate) UpdateFileInDB(iter.key()); if (file_checking) { file_checking->SetProgress(++counter); qApp->processEvents(); } } if (file_checking) file_checking->Close(); // Cleanup orphaned entries from the database cleanDB(); }
static void loadMusic() { // only do this once if (gMusicData->initialized) return; MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); QString message = QObject::tr("Loading Music. Please wait ..."); MythUIBusyDialog *busy = new MythUIBusyDialog(message, popupStack, "musicscanbusydialog"); if (busy->Create()) popupStack->AddScreen(busy, false); else busy = NULL; srand(time(NULL)); CheckFreeDBServerFile(); MSqlQuery count_query(MSqlQuery::InitCon()); bool musicdata_exists = false; if (count_query.exec("SELECT COUNT(*) FROM music_songs;")) { if(count_query.next() && 0 != count_query.value(0).toInt()) { musicdata_exists = true; } } // Load all available info about songs (once!) QString startdir = gCoreContext->GetSetting("MusicLocation"); startdir = QDir::cleanPath(startdir); if (!startdir.endsWith("/")) startdir += "/"; Metadata::SetStartdir(startdir); Decoder::SetLocationFormatUseTags(); // Only search music files if a directory was specified & there // is no data in the database yet (first run). Otherwise, user // can choose "Setup" option from the menu to force it. if (!startdir.isEmpty() && !musicdata_exists) { FileScanner *fscan = new FileScanner(); fscan->SearchDir(startdir); delete fscan; } QString paths = gCoreContext->GetSetting("TreeLevels"); // Set the various track formatting modes Metadata::setArtistAndTrackFormats(); AllMusic *all_music = new AllMusic(paths, startdir); // Load all playlists into RAM (once!) PlaylistContainer *all_playlists = new PlaylistContainer( all_music, gCoreContext->GetHostName()); gMusicData->paths = paths; gMusicData->startdir = startdir; gMusicData->all_playlists = all_playlists; gMusicData->all_music = all_music; gMusicData->initialized = true; while (!gMusicData->all_playlists->doneLoading() || !gMusicData->all_music->doneLoading()) { qApp->processEvents(); usleep(50000); } gMusicData->all_playlists->postLoad(); gPlayer->constructPlaylist(); if (busy) busy->Close(); }
bool SourceManager::findScripts() { QString path = GetShareDir() + "mythweather/scripts/"; QDir dir(path); dir.setFilter(QDir::Executable | QDir::Files | QDir::Dirs); if (!dir.exists()) { LOG(VB_GENERAL, LOG_ERR, "MythWeather: Scripts directory not found"); return false; } QString busymessage = tr("Searching for scripts"); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("weather stack"); if (popupStack == nullptr) popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(busymessage, popupStack, "mythweatherbusydialog"); if (busyPopup->Create()) { popupStack->AddScreen(busyPopup, false); } else { delete busyPopup; busyPopup = nullptr; } qApp->processEvents(); recurseDirs(dir); // run through and see if any scripts have been deleted MSqlQuery db(MSqlQuery::InitCon()); db.prepare("SELECT sourceid, path FROM weathersourcesettings " "WHERE hostname = :HOST;"); db.bindValue(":HOST", gCoreContext->GetHostName()); if (!db.exec()) MythDB::DBError("SourceManager::findScripts - select", db); QStringList toRemove; while (db.next()) { QFileInfo fi(db.value(1).toString()); if (!fi.isExecutable()) { toRemove << db.value(0).toString(); LOG(VB_GENERAL, LOG_ERR, QString("'%1' no longer exists") .arg(fi.absoluteFilePath())); } } db.prepare("DELETE FROM weathersourcesettings WHERE sourceid = :ID;"); for (int i = 0; i < toRemove.count(); ++i) { db.bindValue(":ID", toRemove[i]); if (!db.exec()) { // MythDB::DBError("Deleting weather source settings", db); } } if (busyPopup) { busyPopup->Close(); busyPopup = nullptr; } return m_scripts.count() > 0; }
void MythBurn::updateArchiveList(void) { QString message = tr("Retrieving File Information. Please Wait..."); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(message, popupStack, "mythburnbusydialog"); if (busyPopup->Create()) popupStack->AddScreen(busyPopup, false); else { delete busyPopup; busyPopup = NULL; } qApp->processEvents(); m_archiveButtonList->Reset(); if (m_archiveList.size() == 0) { m_nofilesText->Show(); } else { ArchiveItem *a; for (int x = 0; x < m_archiveList.size(); x++) { qApp->processEvents(); a = m_archiveList.at(x); // get duration of this file if (a->duration == 0) getFileDetails(a); // get default encoding profile if needed if (a->encoderProfile == NULL) a->encoderProfile = getDefaultProfile(a); recalcItemSize(a); MythUIButtonListItem* item = new MythUIButtonListItem(m_archiveButtonList, a->title); item->SetData(qVariantFromValue(a)); item->SetText(a->subtitle, "subtitle"); item->SetText(a->startDate + " " + a->startTime, "date"); item->SetText(formatSize(a->newsize / 1024, 2), "size"); if (a->hasCutlist) { if (a->useCutlist) { item->SetText(tr("Using Cutlist"), "cutlist"); item->DisplayState("using", "cutliststatus"); } else { item->SetText(tr("Not Using Cutlist"), "cutlist"); item->DisplayState("notusing", "cutliststatus"); } } else { item->SetText(tr("No Cut List"), "cutlist"); item->DisplayState("none", "cutliststatus"); } item->SetText(tr("Encoder: ") + a->encoderProfile->name, "profile"); } m_nofilesText->Hide(); m_archiveButtonList->SetItemCurrent( m_archiveButtonList->GetItemFirst()); } updateSizeBar(); if (busyPopup) busyPopup->Close(); }
void IconView::HandleImport(void) { QFileInfo path; QDir importdir; // Makes import directory samba/windows friendly (no colon) QString idirname = m_currDir + "/" + MythDate::current().toString("yyyy-MM-dd_hh-mm-ss"); importdir.mkdir(idirname); importdir.setPath(idirname); for (QStringList::const_iterator it = m_paths.begin(); it != m_paths.end(); ++it) { path.setFile(*it); if (path.isDir() && path.isReadable()) { ImportFromDir(*it, importdir.absolutePath()); } else if (path.isFile() && path.isExecutable()) { if (m_allowImportScripts) { QString cmd = *it + " " + importdir.absolutePath(); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busy = new MythUIBusyDialog(tr("Importing images from camera. Please wait..."), popupStack, "importbusydialog"); if (busy->Create()) { popupStack->AddScreen(busy, false); } else { delete busy; busy = NULL; } ImportThread *import = new ImportThread(cmd); import->start(); while (!import->isFinished()) { usleep(500); qApp->processEvents(); } delete import; if (busy) busy->Close(); } else { ShowOkPopup(tr("Found an import script (%1) but running them has been disabled in the settings!") .arg(*it)); importdir.rmdir(importdir.absolutePath()); return; } } else { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Could not read or execute %1").arg(*it)); ShowOkPopup(tr("Could not read or execute %1").arg(*it)); } } importdir.setFilter(QDir::Files | QDir::Readable | QDir::NoDotAndDotDot); importdir.refresh(); if (importdir.count() == 0) { ShowOkPopup(tr("Nothing found to import")); importdir.rmdir(importdir.absolutePath()); return; } else ShowOkPopup(tr("Found %n image(s)", "", importdir.count())); LoadDirectory(m_currDir); }
void GrabberSettings::Load(void) { QString busymessage = tr("Searching for data sources..."); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(busymessage, popupStack, "grabberbusydialog"); if (busyPopup->Create()) { popupStack->AddScreen(busyPopup, false); } else { delete busyPopup; busyPopup = NULL; } QDir TVScriptPath = QString("%1metadata/Television/").arg(GetShareDir()); QStringList TVScripts = TVScriptPath.entryList(QDir::Files); QDir MovieScriptPath = QString("%1metadata/Movie/").arg(GetShareDir()); QStringList MovieScripts = MovieScriptPath.entryList(QDir::Files); QDir GameScriptPath = QString("%1metadata/Game/").arg(GetShareDir()); QStringList GameScripts = GameScriptPath.entryList(QDir::Files); if (MovieScripts.count()) { for (QStringList::const_iterator i = MovieScripts.begin(); i != MovieScripts.end(); i++) { QString commandline = QString("%1/%2") .arg(MovieScriptPath.path()).arg(*i); MythSystem grabber(commandline, QStringList() << "-v", kMSRunShell | kMSStdOut | kMSBuffered); grabber.Run(); grabber.Wait(); QByteArray result = grabber.ReadAll(); if (!result.isEmpty()) { QDomDocument doc; doc.setContent(result, true); QDomElement root = doc.documentElement(); if (!root.isNull()) { MetaGrabberScript *script = ParseGrabberVersion(root); if (!script->GetName().isEmpty()) m_movieGrabberList.append(script); } } } } if (TVScripts.count()) { for (QStringList::const_iterator i = TVScripts.end() - 1; i != TVScripts.begin() - 1; --i) { QString commandline = QString("%1/%2") .arg(TVScriptPath.path()).arg(*i); MythSystem grabber(commandline, QStringList() << "-v", kMSRunShell | kMSStdOut | kMSBuffered); grabber.Run(); grabber.Wait(); QByteArray result = grabber.ReadAll(); if (!result.isEmpty()) { QDomDocument doc; doc.setContent(result, true); QDomElement root = doc.documentElement(); if (!root.isNull()) { MetaGrabberScript *script = ParseGrabberVersion(root); if (!script->GetName().isEmpty()) m_tvGrabberList.append(script); } } } } if (GameScripts.count()) { for (QStringList::const_iterator i = GameScripts.end() - 1; i != GameScripts.begin() - 1; --i) { QString commandline = QString("%1/%2") .arg(GameScriptPath.path()).arg(*i); MythSystem grabber(commandline, QStringList() << "-v", kMSRunShell | kMSStdOut | kMSBuffered); grabber.Run(); grabber.Wait(); QByteArray result = grabber.ReadAll(); if (!result.isEmpty()) { QDomDocument doc; doc.setContent(result, true); QDomElement root = doc.documentElement(); if (!root.isNull()) { MetaGrabberScript *script = ParseGrabberVersion(root); if (!script->GetName().isEmpty()) m_gameGrabberList.append(script); } } } } if (busyPopup) { busyPopup->Close(); busyPopup = NULL; } }
void LocationDialog::doSearch() { QString busymessage = tr("Searching..."); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythUIBusyDialog *busyPopup = new MythUIBusyDialog(busymessage, popupStack, "mythweatherbusydialog"); if (busyPopup->Create()) { popupStack->AddScreen(busyPopup, false); } else { delete busyPopup; busyPopup = NULL; } QMap<ScriptInfo *, QStringList> result_cache; int numresults = 0; clearResults(); QString searchingresults = tr("Searching... Results: %1"); m_resultsText->SetText(searchingresults.arg(0)); qApp->processEvents(); QList<ScriptInfo *> sources; // if a screen makes it this far, theres at least one source for it m_sourceManager->findPossibleSources(m_types, sources); QString search = m_locationEdit->GetText(); ScriptInfo *si; for (int x = 0; x < sources.size(); x++) { si = sources.at(x); if (!result_cache.contains(si)) { QStringList results = m_sourceManager->getLocationList(si, search); result_cache[si] = results; numresults += results.size(); m_resultsText->SetText(searchingresults.arg(numresults)); qApp->processEvents(); } } QMap<ScriptInfo *, QStringList>::iterator it; for (it = result_cache.begin(); it != result_cache.end(); ++it) { si = it.key(); QStringList results = it.value(); QString name = si->name; QStringList::iterator rit; for (rit = results.begin(); rit != results.end(); ++rit) { QStringList tmp = (*rit).split("::"); if (tmp.size() < 2) { LOG(VB_GENERAL, LOG_WARNING, QString("Invalid line in Location Search reponse " "from %1: %2") .arg(name).arg(*rit)); continue; } QString resultstring = QString("%1 (%2)").arg(tmp[1]).arg(name); MythUIButtonListItem *item = new MythUIButtonListItem(m_locationList, resultstring); ResultListInfo *ri = new ResultListInfo; ri->idstr = tmp[0]; ri->src = si; item->SetData(qVariantFromValue(ri)); qApp->processEvents(); } } if (busyPopup) { busyPopup->Close(); busyPopup = NULL; } m_resultsText->SetText(tr("Search Complete. Results: %1").arg(numresults)); if (numresults) SetFocusWidget(m_locationList); }