void run() { bool ok = false; RemoteFile *rf = new RemoteFile(m_dlInfo->m_url, false, false, 0); ok = rf->SaveAs(m_dlInfo->m_privData); delete rf; if (!ok) m_dlInfo->m_errorCode = QNetworkReply::UnknownNetworkError; m_parent->downloadFinished(m_dlInfo); }
bool AlbumArt::draw(QPainter *p, const QColor &back) { if (needsUpdate()) { QImage art; QString imageFilename = gPlayer->getCurrentMetadata()->getAlbumArtFile(m_currImageType); if (imageFilename.startsWith("myth://")) { RemoteFile *rf = new RemoteFile(imageFilename, false, false, 0); QByteArray data; bool ret = rf->SaveAs(data); delete rf; if (ret) art.loadFromData(data); } else if (!imageFilename.isEmpty()) art.load(imageFilename); if (art.isNull()) { m_cursize = m_size; m_image = QImage(); } else { m_image = art.scaled(m_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); } } if (m_image.isNull()) { drawWarning(p, back, m_size, QObject::tr("?"), 100); return true; } // Paint the image p->fillRect(0, 0, m_size.width(), m_size.height(), back); p->drawImage((m_size.width() - m_image.width()) / 2, (m_size.height() - m_image.height()) / 2, m_image); // Store our new size m_cursize = m_size; return true; }
void MetadataImageDownload::run() { RunProlog(); // Always handle thumbnails first, they're higher priority. ThumbnailData *thumb; while ((thumb = moreThumbs()) != NULL) { QString sFilename = getDownloadFilename(thumb->title, thumb->url); bool exists = QFile::exists(sFilename); if (!exists && !thumb->url.isEmpty()) { if (!GetMythDownloadManager()->download(thumb->url, sFilename)) { LOG(VB_GENERAL, LOG_ERR, QString("MetadataImageDownload: failed to download thumbnail from: %1") .arg(thumb->url)); delete thumb; continue; } } // inform parent we have thumbnail ready for it if (QFile::exists(sFilename) && m_parent) { LOG(VB_GENERAL, LOG_DEBUG, QString("Threaded Image Thumbnail Download: %1") .arg(sFilename)); thumb->url = sFilename; QCoreApplication::postEvent(m_parent, new ThumbnailDLEvent(thumb)); } else delete thumb; } MetadataLookup *lookup; while ((lookup = moreDownloads()) != NULL) { DownloadMap downloads = lookup->GetDownloads(); DownloadMap downloaded; for (DownloadMap::iterator i = downloads.begin(); i != downloads.end(); ++i) { VideoArtworkType type = i.key(); ArtworkInfo info = i.value(); QString filename = getDownloadFilename( type, lookup, info.url ); if (lookup->GetHost().isEmpty()) { QString path = getLocalWritePath(lookup->GetType(), type); QDir dirPath(path); if (!dirPath.exists()) if (!dirPath.mkpath(path)) { LOG(VB_GENERAL, LOG_ERR, QString("Metadata Image Download: Unable to create " "path %1, aborting download.").arg(path)); QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); continue; } QString finalfile = path + "/" + filename; QString oldurl = info.url; info.url = finalfile; if (!QFile::exists(finalfile) || lookup->GetAllowOverwrites()) { QFile dest_file(finalfile); if (dest_file.exists()) { QFileInfo fi(finalfile); GetMythUI()->RemoveFromCacheByFile(fi.fileName()); dest_file.remove(); } LOG(VB_GENERAL, LOG_INFO, QString("Metadata Image Download: %1 ->%2") .arg(oldurl).arg(finalfile)); QByteArray *download = new QByteArray(); GetMythDownloadManager()->download(oldurl, download); QImage testImage; bool didLoad = testImage.loadFromData(*download); if (!didLoad) { LOG(VB_GENERAL, LOG_ERR, QString("Tried to write %1, but it appears to be " "an HTML redirect (filesize %2).") .arg(oldurl).arg(download->size())); delete download; download = NULL; QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); continue; } if (dest_file.open(QIODevice::WriteOnly)) { off_t size = dest_file.write(*download, download->size()); if (size != download->size()) { LOG(VB_GENERAL, LOG_ERR, QString("Image Download: Error Writing Image " "to file: %1").arg(finalfile)); QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); } else downloaded.insert(type, info); } delete download; } else downloaded.insert(type, info); } else { QString path = getStorageGroupURL(type, lookup->GetHost()); QString finalfile = path + filename; QString oldurl = info.url; info.url = finalfile; bool exists = false; bool onMaster = false; QString resolvedFN; if ((lookup->GetHost().toLower() == gCoreContext->GetHostName().toLower()) || (gCoreContext->IsThisHost(lookup->GetHost()))) { StorageGroup sg; resolvedFN = sg.FindFile(filename); exists = QFile::exists(resolvedFN); if (!exists) { resolvedFN = getLocalStorageGroupPath(type, lookup->GetHost()) + "/" + filename; } onMaster = true; } else exists = RemoteFile::Exists(finalfile); if (!exists || lookup->GetAllowOverwrites()) { if (exists && !onMaster) { QFileInfo fi(finalfile); GetMythUI()->RemoveFromCacheByFile(fi.fileName()); RemoteFile::DeleteFile(finalfile); } else if (exists) QFile::remove(resolvedFN); LOG(VB_GENERAL, LOG_INFO, QString("Metadata Image Download: %1 -> %2") .arg(oldurl).arg(finalfile)); QByteArray *download = new QByteArray(); GetMythDownloadManager()->download(oldurl, download); QImage testImage; bool didLoad = testImage.loadFromData(*download); if (!didLoad) { LOG(VB_GENERAL, LOG_ERR, QString("Tried to write %1, but it appears to be " "an HTML redirect or corrupt file " "(filesize %2).") .arg(oldurl).arg(download->size())); delete download; download = NULL; QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); continue; } if (!onMaster) { RemoteFile *outFile = new RemoteFile(finalfile, true); if (!outFile->isOpen()) { LOG(VB_GENERAL, LOG_ERR, QString("Image Download: Failed to open " "remote file (%1) for write. Does " "Storage Group Exist?") .arg(finalfile)); delete outFile; outFile = NULL; QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); } else { off_t written = outFile->Write(*download, download->size()); if (written != download->size()) { LOG(VB_GENERAL, LOG_ERR, QString("Image Download: Error Writing Image " "to file: %1").arg(finalfile)); QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); } else downloaded.insert(type, info); delete outFile; outFile = NULL; } } else { QFile dest_file(resolvedFN); if (dest_file.open(QIODevice::WriteOnly)) { off_t size = dest_file.write(*download, download->size()); if (size != download->size()) { LOG(VB_GENERAL, LOG_ERR, QString("Image Download: Error Writing Image " "to file: %1").arg(finalfile)); QCoreApplication::postEvent(m_parent, new ImageDLFailureEvent(lookup)); } else downloaded.insert(type, info); } } delete download; } else downloaded.insert(type, info); } } lookup->SetDownloads(downloaded); QCoreApplication::postEvent(m_parent, new ImageDLEvent(lookup)); } RunEpilog(); }
QPixmap *MythUIHelper::LoadScalePixmap(QString filename, bool fromcache) { LOG(VB_GUI | VB_FILE, LOG_INFO, LOC + QString("LoadScalePixmap(%1)").arg(filename)); if (filename.isEmpty()) return NULL; if (!FindThemeFile(filename) && (!filename.startsWith("myth:"))) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("LoadScalePixmap(%1)") .arg(filename) + "Unable to find image file"); return NULL; } QPixmap *ret = NULL; QImage tmpimage; int width, height; float wmult, hmult; GetScreenSettings(width, wmult, height, hmult); if (filename.startsWith("myth://")) { RemoteFile *rf = new RemoteFile(filename, false, false, 0); QByteArray data; bool loaded = rf->SaveAs(data); delete rf; if (loaded) { tmpimage.loadFromData(data); } else { LOG(VB_GENERAL, LOG_ERR, LOC + QString("LoadScalePixmap(%1): failed to load remote image") .arg(filename)); } } else { tmpimage.load(filename); } if (width != d->m_baseWidth || height != d->m_baseHeight) { if (tmpimage.isNull()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("LoadScalePixmap(%1) failed to load image") .arg(filename)); return NULL; } QImage tmp2 = tmpimage.scaled((int)(tmpimage.width() * wmult), (int)(tmpimage.height() * hmult), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); ret = new QPixmap(QPixmap::fromImage(tmp2)); } else { ret = new QPixmap(QPixmap::fromImage(tmpimage)); if (!ret->width() || !ret->height()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("LoadScalePixmap(%1) invalid image dimensions") .arg(filename)); delete ret; return NULL; } } return ret; }
MetadataLookupList MetadataDownload::readNFO(QString NFOpath, MetadataLookup* lookup) { MetadataLookupList list; LOG(VB_GENERAL, LOG_INFO, QString("Matching NFO file found. Parsing %1 for metadata...") .arg(NFOpath)); if (lookup->GetType() == kMetadataVideo) { QByteArray nforaw; QDomElement item; if (NFOpath.startsWith("myth://")) { RemoteFile *rf = new RemoteFile(NFOpath); if (rf && rf->Open()) { bool loaded = rf->SaveAs(nforaw); if (loaded) { QDomDocument doc; if (doc.setContent(nforaw, true)) { lookup->SetStep(kLookupData); item = doc.documentElement(); } else LOG(VB_GENERAL, LOG_ERR, QString("PIRATE ERROR: Invalid NFO file found.")); } rf->Close(); } delete rf; rf = NULL; } else { QFile file(NFOpath); if (file.open(QIODevice::ReadOnly)) { nforaw = file.readAll(); QDomDocument doc; if (doc.setContent(nforaw, true)) { lookup->SetStep(kLookupData); item = doc.documentElement(); } else LOG(VB_GENERAL, LOG_ERR, QString("PIRATE ERROR: Invalid NFO file found.")); file.close(); } } MetadataLookup *tmp = ParseMetadataMovieNFO(item, lookup); list.append(tmp); } return list; }
MetadataLookupList MetadataDownload::readMXML(QString MXMLpath, MetadataLookup* lookup, bool passseas) { MetadataLookupList list; LOG(VB_GENERAL, LOG_INFO, QString("Matching MXML file found. Parsing %1 for metadata...") .arg(MXMLpath)); if (lookup->GetType() == kMetadataVideo) { QByteArray mxmlraw; QDomElement item; if (MXMLpath.startsWith("myth://")) { RemoteFile *rf = new RemoteFile(MXMLpath); if (rf && rf->Open()) { bool loaded = rf->SaveAs(mxmlraw); if (loaded) { QDomDocument doc; if (doc.setContent(mxmlraw, true)) { lookup->SetStep(kLookupData); QDomElement root = doc.documentElement(); item = root.firstChildElement("item"); } else LOG(VB_GENERAL, LOG_ERR, QString("Corrupt or invalid MXML file.")); } rf->Close(); } delete rf; rf = NULL; } else { QFile file(MXMLpath); if (file.open(QIODevice::ReadOnly)) { mxmlraw = file.readAll(); QDomDocument doc; if (doc.setContent(mxmlraw, true)) { lookup->SetStep(kLookupData); QDomElement root = doc.documentElement(); item = root.firstChildElement("item"); } else LOG(VB_GENERAL, LOG_ERR, QString("Corrupt or invalid MXML file.")); file.close(); } } MetadataLookup *tmp = ParseMetadataItem(item, lookup, passseas); list.append(tmp); } return list; }
bool PreviewGenerator::RemotePreviewRun(void) { QStringList strlist = "QUERY_GENPIXMAP"; programInfo.ToStringList(strlist); strlist.push_back(timeInSeconds ? "s" : "f"); encodeLongLong(strlist, captureTime); if (outFileName.isEmpty()) { strlist.push_back("<EMPTY>"); } else { QFileInfo fi(outFileName); strlist.push_back(fi.fileName()); } strlist.push_back(QString::number(outSize.width())); strlist.push_back(QString::number(outSize.height())); bool ok = false; if (createSockets) { if (!RemotePreviewSetup()) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to open sockets."); return false; } if (serverSock) { serverSock->writeStringList(strlist); ok = serverSock->readStringList(strlist, false); } RemotePreviewTeardown(); } else { ok = gContext->SendReceiveStringList(strlist); } if (!ok || strlist.empty() || (strlist[0] != "OK")) { if (!ok) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Remote Preview failed due to communications error."); } else if (strlist.size() > 1) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Remote Preview failed, reason given: " <<strlist[1]); } else { VERBOSE(VB_IMPORTANT, LOC_ERR + "Remote Preview failed due to an uknown error."); } return false; } if (outFileName.isEmpty()) return true; // find file, copy/move to output file name & location... QString url = QString::null; QString fn = QFileInfo(outFileName).fileName(); QByteArray data; ok = false; QStringList fileNames; fileNames.push_back(CreateAccessibleFilename(programInfo.pathname, fn)); fileNames.push_back(CreateAccessibleFilename(programInfo.pathname, "")); QStringList::const_iterator it = fileNames.begin(); for ( ; it != fileNames.end() && (!ok || data.isEmpty()); ++it) { data.resize(0); url = *it; RemoteFile *rf = new RemoteFile(url, false, 0); ok = rf->SaveAs(data); delete rf; } if (ok && data.size()) { QFile file(outFileName); ok = file.open(IO_Raw|IO_WriteOnly); if (!ok) { VERBOSE(VB_IMPORTANT, QString("Failed to open: '%1'") .arg(outFileName)); } off_t offset = 0; size_t remaining = (ok) ? data.size() : 0; uint failure_cnt = 0; while ((remaining > 0) && (failure_cnt < 5)) { ssize_t written = file.writeBlock(data.data() + offset, remaining); if (written < 0) { failure_cnt++; usleep(50000); continue; } failure_cnt = 0; offset += written; remaining -= written; } if (ok && !remaining) { VERBOSE(VB_PLAYBACK, QString("Saved: '%1'") .arg(outFileName)); } } return ok && data.size(); }
void MetadataImageDownload::run() { // Always handle thumbnails first, they're higher priority. ThumbnailData *thumb; while ((thumb = moreThumbs()) != NULL) { QString sFilename = getDownloadFilename(thumb->title, thumb->url); bool exists = QFile::exists(sFilename); if (!exists && !thumb->url.isEmpty()) GetMythDownloadManager()->download(thumb->url, sFilename); // inform parent we have thumbnail ready for it if (QFile::exists(sFilename) && m_parent) { VERBOSE(VB_GENERAL|VB_EXTRA, QString("Threaded Image Thumbnail Download: %1") .arg(sFilename)); thumb->url = sFilename; QCoreApplication::postEvent(m_parent, new ThumbnailDLEvent(thumb)); } else delete thumb; } MetadataLookup *lookup; while ((lookup = moreDownloads()) != NULL) { DownloadMap downloads = lookup->GetDownloads(); DownloadMap downloaded; for (DownloadMap::iterator i = downloads.begin(); i != downloads.end(); ++i) { ArtworkType type = i.key(); ArtworkInfo info = i.value(); QString filename = getDownloadFilename( type, lookup, info.url ); if (lookup->GetHost().isEmpty()) { QString path = getLocalWritePath(lookup->GetType(), type); QDir dirPath(path); if (!dirPath.exists()) if (!dirPath.mkpath(path)) { VERBOSE(VB_GENERAL, QString("Metadata Image Download: Unable to create " "path %1, aborting download.").arg(path)); continue; } QString finalfile = path + "/" + filename; QString oldurl = info.url; info.url = finalfile; if (!QFile::exists(finalfile) || lookup->GetAllowOverwrites()) { QFile dest_file(finalfile); if (dest_file.exists()) { QFileInfo fi(finalfile); GetMythUI()->RemoveFromCacheByFile(fi.fileName()); dest_file.remove(); } VERBOSE(VB_GENERAL, QString("Metadata Image Download: %1 ->%2") .arg(oldurl).arg(finalfile)); QByteArray *download = new QByteArray(); GetMythDownloadManager()->download(oldurl, download); QImage testImage; bool didLoad = testImage.loadFromData(*download); if (!didLoad) { VERBOSE(VB_IMPORTANT,QString("Tried to write %1, " "but it appears to be an HTML redirect " "(filesize %2).") .arg(oldurl).arg(download->size())); delete download; download = NULL; continue; } if (dest_file.open(QIODevice::WriteOnly)) { off_t size = dest_file.write(*download, download->size()); if (size != download->size()) { VERBOSE(VB_IMPORTANT, QString("Image Download: Error Writing Image " "to file: %1").arg(finalfile)); } else downloaded.insert(type, info); } delete download; } else downloaded.insert(type, info); } else { QString path = getStorageGroupURL(type, lookup->GetHost()); QString finalfile = path + filename; QString oldurl = info.url; info.url = finalfile; if (!RemoteFile::Exists(finalfile) || lookup->GetAllowOverwrites()) { if (RemoteFile::Exists(finalfile)) { QFileInfo fi(finalfile); GetMythUI()->RemoveFromCacheByFile(fi.fileName()); RemoteFile::DeleteFile(finalfile); } VERBOSE(VB_GENERAL, QString("Metadata Image Download: %1 -> %2") .arg(oldurl).arg(finalfile)); QByteArray *download = new QByteArray(); GetMythDownloadManager()->download(oldurl, download); QImage testImage; bool didLoad = testImage.loadFromData(*download); if (!didLoad) { VERBOSE(VB_IMPORTANT,QString("Tried to write %1, " "but it appears to be an HTML redirect " "or corrupt file (filesize %2).") .arg(oldurl).arg(download->size())); delete download; download = NULL; continue; } RemoteFile *outFile = new RemoteFile(finalfile, true); if (!outFile->isOpen()) { VERBOSE(VB_IMPORTANT, QString("Image Download: Failed to open " "remote file (%1) for write. Does " "Storage Group Exist?") .arg(finalfile)); delete outFile; outFile = NULL; } else { off_t written = outFile->Write(*download, download->size()); if (written != download->size()) { VERBOSE(VB_IMPORTANT, QString("Image Download: Error Writing Image " "to file: %1").arg(finalfile)); } else downloaded.insert(type, info); delete outFile; outFile = NULL; } delete download; } else downloaded.insert(type, info); } } lookup->SetDownloads(downloaded); QCoreApplication::postEvent(m_parent, new ImageDLEvent(lookup)); } }
bool PixmapChannel::CacheChannelIcon(void) { if (icon.isEmpty()) return false; m_localIcon = icon; // Is icon local? if (QFile(icon).exists()) return true; QString localDirStr = QString("%1/channels").arg(GetConfDir()); QDir localDir(localDirStr); if (!localDir.exists() && !localDir.mkdir(localDirStr)) { VERBOSE(VB_IMPORTANT, QString("Icons directory is missing and could " "not be created: %1").arg(localDirStr)); icon.clear(); return false; } // Has it been saved to the local cache? m_localIcon = QString("%1/%2").arg(localDirStr) .arg(QFileInfo(icon).fileName()); if (QFile(m_localIcon).exists()) return true; // Get address of master backed QString url = gCoreContext->GetMasterHostPrefix(); if (url.length() < 1) { icon.clear(); return false; } url.append(icon); QUrl qurl = url; if (qurl.host().isEmpty()) { icon.clear(); return false; } RemoteFile *rf = new RemoteFile(url, false, false, 0); QByteArray data; bool ret = rf->SaveAs(data); delete rf; if (ret && data.size()) { QImage image; image.loadFromData(data); //if (image.loadFromData(data) && image.width() > 0 if (image.save(m_localIcon)) { VERBOSE(VB_GENERAL, QString("Caching channel icon %1").arg(m_localIcon)); return true; } else VERBOSE(VB_GENERAL, QString("Failed to save to %1").arg(m_localIcon)); } // if we get here then the icon is set in the db but couldn't be found // anywhere so maybe we should remove it from the DB? icon.clear(); return false; }