00001 #include <algorithm>
00002
00003 #include <QImageReader>
00004 #include <QUrl>
00005
00006 #include <mythcontext.h>
00007 #include <mythdirs.h>
00008
00009 #include "mythmainwindow.h"
00010 #include "mythdialogbox.h"
00011 #include "mythuibuttonlist.h"
00012 #include "mythuitext.h"
00013 #include "mythuitextedit.h"
00014 #include "mythuibutton.h"
00015 #include "mythuicheckbox.h"
00016 #include "mythuispinbox.h"
00017 #include "mythuifilebrowser.h"
00018 #include "mythuiimageresults.h"
00019 #include "mythuihelper.h"
00020 #include "mythprogressdialog.h"
00021 #include "remoteutil.h"
00022 #include "globals.h"
00023 #include "dbaccess.h"
00024 #include "videometadatalistmanager.h"
00025 #include "videoutils.h"
00026
00027 #include "editvideometadata.h"
00028
00029 EditMetadataDialog::EditMetadataDialog(MythScreenStack *lparent,
00030 QString lname, VideoMetadata *source_metadata,
00031 const VideoMetadataListManager &cache) : MythScreenType(lparent, lname),
00032 m_origMetadata(source_metadata), m_titleEdit(0), m_subtitleEdit(0),
00033 m_taglineEdit(0), m_playerEdit(0), m_ratingEdit(0), m_directorEdit(0),
00034 m_inetrefEdit(0), m_homepageEdit(0), m_plotEdit(0), m_seasonSpin(0),
00035 m_episodeSpin(0), m_yearSpin(0), m_userRatingSpin(0), m_lengthSpin(0),
00036 m_categoryList(0), m_levelList(0), m_childList(0), m_browseCheck(0),
00037 m_watchedCheck(0), m_coverartButton(0), m_coverartText(0),
00038 m_screenshotButton(0), m_screenshotText(0), m_bannerButton(0),
00039 m_bannerText(0), m_fanartButton(0), m_fanartText(0),
00040 m_trailerButton(0), m_trailerText(0),
00041 m_netCoverartButton(0), m_netFanartButton(0), m_netBannerButton(0),
00042 m_netScreenshotButton(0), m_coverart(0), m_screenshot(0),
00043 m_banner(0), m_fanart(0),
00044 m_doneButton(0),
00045 cachedChildSelection(0),
00046 m_metaCache(cache), m_busyPopup(0)
00047 {
00048 m_query = new MetadataDownload(this);
00049 m_imageDownload = new MetadataImageDownload(this);
00050 m_workingMetadata = new VideoMetadata(*m_origMetadata);
00051
00052 m_popupStack = GetMythMainWindow()->GetStack("popup stack");
00053 }
00054
00055 EditMetadataDialog::~EditMetadataDialog()
00056 {
00057 delete m_workingMetadata;
00058 }
00059
00060 bool EditMetadataDialog::Create()
00061 {
00062 if (!LoadWindowFromXML("video-ui.xml", "edit_metadata", this))
00063 return false;
00064
00065 bool err = false;
00066 UIUtilE::Assign(this, m_titleEdit, "title_edit", &err);
00067 UIUtilE::Assign(this, m_subtitleEdit, "subtitle_edit", &err);
00068 UIUtilE::Assign(this, m_playerEdit, "player_edit", &err);
00069
00070 UIUtilE::Assign(this, m_seasonSpin, "season", &err);
00071 UIUtilE::Assign(this, m_episodeSpin, "episode", &err);
00072
00073
00074 UIUtilE::Assign(this, m_categoryList, "category_select", &err);
00075 UIUtilE::Assign(this, m_levelList, "level_select", &err);
00076 UIUtilE::Assign(this, m_childList, "child_select", &err);
00077
00078 UIUtilE::Assign(this, m_browseCheck, "browse_check", &err);
00079 UIUtilE::Assign(this, m_watchedCheck, "watched_check", &err);
00080
00081 UIUtilE::Assign(this, m_doneButton, "done_button", &err);
00082
00083 if (err)
00084 {
00085 LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'edit_metadata'");
00086 return false;
00087 }
00088
00089 UIUtilW::Assign(this, m_coverartText, "coverart_text");
00090 UIUtilW::Assign(this, m_screenshotText, "screenshot_text");
00091 UIUtilW::Assign(this, m_bannerText, "banner_text");
00092 UIUtilW::Assign(this, m_fanartText, "fanart_text");
00093 UIUtilW::Assign(this, m_trailerText, "trailer_text");
00094
00095 UIUtilW::Assign(this, m_coverartButton, "coverart_button");
00096 UIUtilW::Assign(this, m_bannerButton, "banner_button");
00097 UIUtilW::Assign(this, m_fanartButton, "fanart_button");
00098 UIUtilW::Assign(this, m_screenshotButton, "screenshot_button");
00099 UIUtilW::Assign(this, m_trailerButton, "trailer_button");
00100
00101 UIUtilW::Assign(this, m_netBannerButton, "net_banner_button");
00102 UIUtilW::Assign(this, m_netFanartButton, "net_fanart_button");
00103 UIUtilW::Assign(this, m_netScreenshotButton, "net_screenshot_button");
00104 UIUtilW::Assign(this, m_netCoverartButton, "net_coverart_button");
00105
00106 UIUtilW::Assign(this, m_taglineEdit, "tagline_edit");
00107 UIUtilW::Assign(this, m_ratingEdit, "rating_edit");
00108 UIUtilW::Assign(this, m_directorEdit, "director_edit");
00109 UIUtilW::Assign(this, m_inetrefEdit, "inetref_edit");
00110 UIUtilW::Assign(this, m_homepageEdit, "homepage_edit");
00111 UIUtilW::Assign(this, m_plotEdit, "description_edit");
00112 UIUtilW::Assign(this, m_yearSpin, "year_spin");
00113 UIUtilW::Assign(this, m_userRatingSpin, "userrating_spin");
00114 UIUtilW::Assign(this, m_lengthSpin, "length_spin");
00115
00116 UIUtilW::Assign(this, m_coverart, "coverart");
00117 UIUtilW::Assign(this, m_screenshot, "screenshot");
00118 UIUtilW::Assign(this, m_banner, "banner");
00119 UIUtilW::Assign(this, m_fanart, "fanart");
00120
00121 fillWidgets();
00122
00123 BuildFocusList();
00124
00125 connect(m_titleEdit, SIGNAL(valueChanged()), SLOT(SetTitle()));
00126 m_titleEdit->SetMaxLength(128);
00127 connect(m_subtitleEdit, SIGNAL(valueChanged()), SLOT(SetSubtitle()));
00128 m_subtitleEdit->SetMaxLength(0);
00129 connect(m_playerEdit, SIGNAL(valueChanged()), SLOT(SetPlayer()));
00130 if (m_taglineEdit)
00131 {
00132 connect(m_taglineEdit, SIGNAL(valueChanged()), SLOT(SetTagline()));
00133 m_taglineEdit->SetMaxLength(255);
00134 }
00135 if (m_ratingEdit)
00136 {
00137 connect(m_ratingEdit, SIGNAL(valueChanged()), SLOT(SetRating()));
00138 m_ratingEdit->SetMaxLength(128);
00139 }
00140 if (m_directorEdit)
00141 {
00142 connect(m_directorEdit, SIGNAL(valueChanged()), SLOT(SetDirector()));
00143 m_directorEdit->SetMaxLength(128);
00144 }
00145 if (m_inetrefEdit)
00146 connect(m_inetrefEdit, SIGNAL(valueChanged()), SLOT(SetInetRef()));
00147 if (m_homepageEdit)
00148 {
00149 connect(m_homepageEdit, SIGNAL(valueChanged()), SLOT(SetHomepage()));
00150 m_homepageEdit->SetMaxLength(0);
00151 }
00152 if (m_plotEdit)
00153 {
00154 connect(m_plotEdit, SIGNAL(valueChanged()), SLOT(SetPlot()));
00155 m_plotEdit->SetMaxLength(0);
00156 }
00157
00158 connect(m_seasonSpin, SIGNAL(LosingFocus()), SLOT(SetSeason()));
00159 connect(m_episodeSpin, SIGNAL(LosingFocus()), SLOT(SetEpisode()));
00160 if (m_yearSpin)
00161 connect(m_yearSpin, SIGNAL(LosingFocus()), SLOT(SetYear()));
00162 if (m_userRatingSpin)
00163 connect(m_userRatingSpin, SIGNAL(LosingFocus()), SLOT(SetUserRating()));
00164 if (m_lengthSpin)
00165 connect(m_lengthSpin, SIGNAL(LosingFocus()), SLOT(SetLength()));
00166
00167 connect(m_doneButton, SIGNAL(Clicked()), SLOT(SaveAndExit()));
00168
00169
00170 if (m_coverartButton)
00171 connect(m_coverartButton, SIGNAL(Clicked()), SLOT(FindCoverArt()));
00172 if (m_bannerButton)
00173 connect(m_bannerButton, SIGNAL(Clicked()), SLOT(FindBanner()));
00174 if (m_fanartButton)
00175 connect(m_fanartButton, SIGNAL(Clicked()), SLOT(FindFanart()));
00176 if (m_screenshotButton)
00177 connect(m_screenshotButton, SIGNAL(Clicked()), SLOT(FindScreenshot()));
00178
00179
00180 if (m_netCoverartButton)
00181 connect(m_netCoverartButton, SIGNAL(Clicked()), SLOT(FindNetCoverArt()));
00182 if (m_netBannerButton)
00183 connect(m_netBannerButton, SIGNAL(Clicked()), SLOT(FindNetBanner()));
00184 if (m_netFanartButton)
00185 connect(m_netFanartButton, SIGNAL(Clicked()), SLOT(FindNetFanart()));
00186 if (m_netScreenshotButton)
00187 connect(m_netScreenshotButton, SIGNAL(Clicked()), SLOT(FindNetScreenshot()));
00188
00189 if (m_trailerButton)
00190 connect(m_trailerButton, SIGNAL(Clicked()), SLOT(FindTrailer()));
00191
00192 connect(m_browseCheck, SIGNAL(valueChanged()), SLOT(ToggleBrowse()));
00193 connect(m_watchedCheck, SIGNAL(valueChanged()), SLOT(ToggleWatched()));
00194
00195 connect(m_childList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00196 SLOT(SetChild(MythUIButtonListItem*)));
00197 connect(m_levelList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00198 SLOT(SetLevel(MythUIButtonListItem*)));
00199 connect(m_categoryList, SIGNAL(itemSelected(MythUIButtonListItem*)),
00200 SLOT(SetCategory(MythUIButtonListItem*)));
00201 connect(m_categoryList, SIGNAL(itemClicked(MythUIButtonListItem*)),
00202 SLOT(NewCategoryPopup()));
00203
00204 return true;
00205 }
00206
00207 namespace
00208 {
00209 template <typename T>
00210 struct title_sort
00211 {
00212 bool operator()(const T &lhs, const T &rhs)
00213 {
00214 return QString::localeAwareCompare(lhs.second, rhs.second) < 0;
00215 }
00216 };
00217
00218 QStringList GetSupportedImageExtensionFilter()
00219 {
00220 QStringList ret;
00221
00222 QList<QByteArray> exts = QImageReader::supportedImageFormats();
00223 for (QList<QByteArray>::iterator p = exts.begin(); p != exts.end(); ++p)
00224 {
00225 ret.append(QString("*.").append(*p));
00226 }
00227
00228 return ret;
00229 }
00230
00231 void FindImagePopup(const QString &prefix, const QString &prefixAlt,
00232 QObject &inst, const QString &returnEvent)
00233 {
00234 QString fp;
00235
00236 if (prefix.startsWith("myth://"))
00237 fp = prefix;
00238 else
00239 fp = prefix.isEmpty() ? prefixAlt : prefix;
00240
00241 MythScreenStack *popupStack =
00242 GetMythMainWindow()->GetStack("popup stack");
00243
00244 MythUIFileBrowser *fb = new MythUIFileBrowser(popupStack, fp);
00245 fb->SetNameFilter(GetSupportedImageExtensionFilter());
00246 if (fb->Create())
00247 {
00248 fb->SetReturnEvent(&inst, returnEvent);
00249 popupStack->AddScreen(fb);
00250 }
00251 else
00252 delete fb;
00253 }
00254
00255 void FindVideoFilePopup(const QString &prefix, const QString &prefixAlt,
00256 QObject &inst, const QString &returnEvent)
00257 {
00258 QString fp;
00259
00260 if (prefix.startsWith("myth://"))
00261 fp = prefix;
00262 else
00263 fp = prefix.isEmpty() ? prefixAlt : prefix;
00264
00265 MythScreenStack *popupStack =
00266 GetMythMainWindow()->GetStack("popup stack");
00267 QStringList exts;
00268
00269 const FileAssociations::association_list fa_list =
00270 FileAssociations::getFileAssociation().getList();
00271 for (FileAssociations::association_list::const_iterator p =
00272 fa_list.begin(); p != fa_list.end(); ++p)
00273 {
00274 exts << QString("*.%1").arg(p->extension.toUpper());
00275 }
00276
00277 MythUIFileBrowser *fb = new MythUIFileBrowser(popupStack, fp);
00278 fb->SetNameFilter(exts);
00279 if (fb->Create())
00280 {
00281 fb->SetReturnEvent(&inst, returnEvent);
00282 popupStack->AddScreen(fb);
00283 }
00284 else
00285 delete fb;
00286 }
00287
00288 const QString CEID_COVERARTFILE = "coverartfile";
00289 const QString CEID_BANNERFILE = "bannerfile";
00290 const QString CEID_FANARTFILE = "fanartfile";
00291 const QString CEID_SCREENSHOTFILE = "screenshotfile";
00292 const QString CEID_TRAILERFILE = "trailerfile";
00293 const QString CEID_NEWCATEGORY = "newcategory";
00294 }
00295
00296 void EditMetadataDialog::createBusyDialog(QString title)
00297 {
00298 if (m_busyPopup)
00299 return;
00300
00301 QString message = title;
00302
00303 m_busyPopup = new MythUIBusyDialog(message, m_popupStack,
00304 "mythvideobusydialog");
00305
00306 if (m_busyPopup->Create())
00307 m_popupStack->AddScreen(m_busyPopup);
00308 }
00309
00310 void EditMetadataDialog::fillWidgets()
00311 {
00312 m_titleEdit->SetText(m_workingMetadata->GetTitle());
00313 m_subtitleEdit->SetText(m_workingMetadata->GetSubtitle());
00314
00315 m_seasonSpin->SetRange(0,9999,1,5);
00316 m_seasonSpin->SetValue(m_workingMetadata->GetSeason());
00317 m_episodeSpin->SetRange(0,999,1,10);
00318 m_episodeSpin->SetValue(m_workingMetadata->GetEpisode());
00319 if (m_yearSpin)
00320 {
00321 m_yearSpin->SetRange(0,9999,1,10);
00322 m_yearSpin->SetValue(m_workingMetadata->GetYear());
00323 }
00324 if (m_userRatingSpin)
00325 {
00326 m_userRatingSpin->SetRange(0,10,1,2);
00327 m_userRatingSpin->SetValue(m_workingMetadata->GetUserRating());
00328 }
00329 if (m_lengthSpin)
00330 {
00331 m_lengthSpin->SetRange(0,999,1,15);
00332 m_lengthSpin->SetValue(m_workingMetadata->GetLength());
00333 }
00334
00335 MythUIButtonListItem *button =
00336 new MythUIButtonListItem(m_categoryList, VIDEO_CATEGORY_UNKNOWN);
00337 const VideoCategory::entry_list &vcl =
00338 VideoCategory::GetCategory().getList();
00339 for (VideoCategory::entry_list::const_iterator p = vcl.begin();
00340 p != vcl.end(); ++p)
00341 {
00342 button = new MythUIButtonListItem(m_categoryList, p->second);
00343 button->SetData(p->first);
00344 }
00345 m_categoryList->SetValueByData(m_workingMetadata->GetCategoryID());
00346
00347 for (ParentalLevel i = ParentalLevel::plLowest;
00348 i <= ParentalLevel::plHigh && i.good(); ++i)
00349 {
00350 button = new MythUIButtonListItem(m_levelList,
00351 QString(tr("Level %1")).arg(i.GetLevel()));
00352 button->SetData(i.GetLevel());
00353 }
00354 m_levelList->SetValueByData(m_workingMetadata->GetShowLevel());
00355
00356
00357
00358
00359
00360
00361 button = new MythUIButtonListItem(m_childList,tr("None"));
00362
00363
00364
00365 typedef std::vector<std::pair<unsigned int, QString> > title_list;
00366 const VideoMetadataListManager::metadata_list &mdl = m_metaCache.getList();
00367 title_list tc;
00368 tc.reserve(mdl.size());
00369 for (VideoMetadataListManager::metadata_list::const_iterator p = mdl.begin();
00370 p != mdl.end(); ++p)
00371 {
00372 QString title;
00373 if ((*p)->GetSeason() > 0 || (*p)->GetEpisode() > 0)
00374 title = QString("%1 %2x%3").arg((*p)->GetTitle())
00375 .arg(QString::number((*p)->GetSeason()))
00376 .arg(QString::number((*p)->GetEpisode()));
00377 else
00378 title = (*p)->GetTitle();
00379 tc.push_back(std::make_pair((*p)->GetID(), title));
00380 }
00381 std::sort(tc.begin(), tc.end(), title_sort<title_list::value_type>());
00382
00383 for (title_list::const_iterator p = tc.begin(); p != tc.end(); ++p)
00384 {
00385 if (p->first != m_workingMetadata->GetID())
00386 {
00387 button = new MythUIButtonListItem(m_childList,p->second);
00388 button->SetData(p->first);
00389 }
00390 }
00391
00392 if (m_workingMetadata->GetChildID() > 0)
00393 {
00394 m_childList->SetValueByData(m_workingMetadata->GetChildID());
00395 cachedChildSelection = m_workingMetadata->GetChildID();
00396 }
00397
00398 if (m_workingMetadata->GetBrowse())
00399 m_browseCheck->SetCheckState(MythUIStateType::Full);
00400 if (m_workingMetadata->GetWatched())
00401 m_watchedCheck->SetCheckState(MythUIStateType::Full);
00402 if (m_coverartText)
00403 m_coverartText->SetText(m_workingMetadata->GetCoverFile());
00404 if (m_screenshotText)
00405 m_screenshotText->SetText(m_workingMetadata->GetScreenshot());
00406 if (m_bannerText)
00407 m_bannerText->SetText(m_workingMetadata->GetBanner());
00408 if (m_fanartText)
00409 m_fanartText->SetText(m_workingMetadata->GetFanart());
00410 if (m_trailerText)
00411 m_trailerText->SetText(m_workingMetadata->GetTrailer());
00412
00413 m_playerEdit->SetText(m_workingMetadata->GetPlayCommand());
00414 if (m_taglineEdit)
00415 m_taglineEdit->SetText(m_workingMetadata->GetTagline());
00416 if (m_ratingEdit)
00417 m_ratingEdit->SetText(m_workingMetadata->GetRating());
00418 if (m_directorEdit)
00419 m_directorEdit->SetText(m_workingMetadata->GetDirector());
00420 if (m_inetrefEdit)
00421 m_inetrefEdit->SetText(m_workingMetadata->GetInetRef());
00422 if (m_homepageEdit)
00423 m_homepageEdit->SetText(m_workingMetadata->GetHomepage());
00424 if (m_plotEdit)
00425 m_plotEdit->SetText(m_workingMetadata->GetPlot());
00426
00427 if (m_coverart)
00428 {
00429 if (!m_workingMetadata->GetHost().isEmpty() &&
00430 !m_workingMetadata->GetCoverFile().isEmpty() &&
00431 !m_workingMetadata->GetCoverFile().startsWith("/"))
00432 {
00433 m_coverart->SetFilename(generate_file_url("Coverart",
00434 m_workingMetadata->GetHost(),
00435 m_workingMetadata->GetCoverFile()));
00436 }
00437 else
00438 m_coverart->SetFilename(m_workingMetadata->GetCoverFile());
00439
00440 if (!m_workingMetadata->GetCoverFile().isEmpty())
00441 m_coverart->Load();
00442 }
00443 if (m_screenshot)
00444 {
00445 if (!m_workingMetadata->GetHost().isEmpty() &&
00446 !m_workingMetadata->GetScreenshot().isEmpty() &&
00447 !m_workingMetadata->GetScreenshot().startsWith("/"))
00448 {
00449 m_screenshot->SetFilename(generate_file_url("Screenshots",
00450 m_workingMetadata->GetHost(),
00451 m_workingMetadata->GetScreenshot()));
00452 }
00453 else
00454 m_screenshot->SetFilename(m_workingMetadata->GetScreenshot());
00455
00456 if (!m_workingMetadata->GetScreenshot().isEmpty())
00457 m_screenshot->Load();
00458 }
00459 if (m_banner)
00460 {
00461 if (!m_workingMetadata->GetHost().isEmpty() &&
00462 !m_workingMetadata->GetBanner().isEmpty() &&
00463 !m_workingMetadata->GetBanner().startsWith("/"))
00464 {
00465 m_banner->SetFilename(generate_file_url("Banners",
00466 m_workingMetadata->GetHost(),
00467 m_workingMetadata->GetBanner()));
00468 }
00469 else
00470 m_banner->SetFilename(m_workingMetadata->GetBanner());
00471
00472 if (!m_workingMetadata->GetBanner().isEmpty())
00473 m_banner->Load();
00474 }
00475 if (m_fanart)
00476 {
00477 if (!m_workingMetadata->GetHost().isEmpty() &&
00478 !m_workingMetadata->GetFanart().isEmpty() &&
00479 !m_workingMetadata->GetFanart().startsWith("/"))
00480 {
00481 m_fanart->SetFilename(generate_file_url("Fanart",
00482 m_workingMetadata->GetHost(),
00483 m_workingMetadata->GetFanart()));
00484 }
00485 else
00486 m_fanart->SetFilename(m_workingMetadata->GetFanart());
00487
00488 if (!m_workingMetadata->GetFanart().isEmpty())
00489 m_fanart->Load();
00490 }
00491 }
00492
00493 void EditMetadataDialog::NewCategoryPopup()
00494 {
00495 QString message = tr("Enter new category");
00496
00497 MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
00498
00499 MythTextInputDialog *categorydialog =
00500 new MythTextInputDialog(popupStack,message);
00501
00502 if (categorydialog->Create())
00503 {
00504 categorydialog->SetReturnEvent(this, CEID_NEWCATEGORY);
00505 popupStack->AddScreen(categorydialog);
00506 }
00507
00508 }
00509
00510 void EditMetadataDialog::AddCategory(QString category)
00511 {
00512 int id = VideoCategory::GetCategory().add(category);
00513 m_workingMetadata->SetCategoryID(id);
00514 new MythUIButtonListItem(m_categoryList, category, id);
00515 m_categoryList->SetValueByData(id);
00516 }
00517
00518 void EditMetadataDialog::SaveAndExit()
00519 {
00520 *m_origMetadata = *m_workingMetadata;
00521 m_origMetadata->UpdateDatabase();
00522
00523 emit Finished();
00524 Close();
00525 }
00526
00527 void EditMetadataDialog::SetTitle()
00528 {
00529 m_workingMetadata->SetTitle(m_titleEdit->GetText());
00530 }
00531
00532 void EditMetadataDialog::SetSubtitle()
00533 {
00534 m_workingMetadata->SetSubtitle(m_subtitleEdit->GetText());
00535 }
00536
00537 void EditMetadataDialog::SetCategory(MythUIButtonListItem *item)
00538 {
00539 m_workingMetadata->SetCategoryID(item->GetData().toInt());
00540 }
00541
00542 void EditMetadataDialog::SetRating()
00543 {
00544 m_workingMetadata->SetRating(m_ratingEdit->GetText());
00545 }
00546
00547 void EditMetadataDialog::SetTagline()
00548 {
00549 m_workingMetadata->SetTagline(m_taglineEdit->GetText());
00550 }
00551
00552 void EditMetadataDialog::SetDirector()
00553 {
00554 m_workingMetadata->SetDirector(m_directorEdit->GetText());
00555 }
00556
00557 void EditMetadataDialog::SetInetRef()
00558 {
00559 m_workingMetadata->SetInetRef(m_inetrefEdit->GetText());
00560 }
00561
00562 void EditMetadataDialog::SetHomepage()
00563 {
00564 m_workingMetadata->SetHomepage(m_homepageEdit->GetText());
00565 }
00566
00567 void EditMetadataDialog::SetPlot()
00568 {
00569 m_workingMetadata->SetPlot(m_plotEdit->GetText());
00570 }
00571
00572 void EditMetadataDialog::SetSeason()
00573 {
00574 m_workingMetadata->SetSeason(m_seasonSpin->GetIntValue());
00575 }
00576
00577 void EditMetadataDialog::SetEpisode()
00578 {
00579 m_workingMetadata->SetEpisode(m_episodeSpin->GetIntValue());
00580 }
00581
00582 void EditMetadataDialog::SetYear()
00583 {
00584 m_workingMetadata->SetYear(m_yearSpin->GetIntValue());
00585 }
00586
00587 void EditMetadataDialog::SetUserRating()
00588 {
00589 m_workingMetadata->SetUserRating(m_userRatingSpin->GetIntValue());
00590 }
00591
00592 void EditMetadataDialog::SetLength()
00593 {
00594 m_workingMetadata->SetLength(m_lengthSpin->GetIntValue());
00595 }
00596
00597 void EditMetadataDialog::SetPlayer()
00598 {
00599 m_workingMetadata->SetPlayCommand(m_playerEdit->GetText());
00600 }
00601
00602 void EditMetadataDialog::SetLevel(MythUIButtonListItem *item)
00603 {
00604 m_workingMetadata->
00605 SetShowLevel(ParentalLevel(item->GetData().toInt()).GetLevel());
00606 }
00607
00608 void EditMetadataDialog::SetChild(MythUIButtonListItem *item)
00609 {
00610 cachedChildSelection = item->GetData().toInt();
00611 m_workingMetadata->SetChildID(cachedChildSelection);
00612 }
00613
00614 void EditMetadataDialog::ToggleBrowse()
00615 {
00616 m_workingMetadata->
00617 SetBrowse(m_browseCheck->GetBooleanCheckState());
00618 }
00619
00620 void EditMetadataDialog::ToggleWatched()
00621 {
00622 m_workingMetadata->
00623 SetWatched(m_watchedCheck->GetBooleanCheckState());
00624 }
00625
00626 void EditMetadataDialog::FindCoverArt()
00627 {
00628 if (!m_workingMetadata->GetHost().isEmpty())
00629 {
00630 QString url = generate_file_url("Coverart",
00631 m_workingMetadata->GetHost(),
00632 "");
00633 FindImagePopup(url,"",
00634 *this, CEID_COVERARTFILE);
00635 }
00636 else
00637 FindImagePopup(gCoreContext->GetSetting("VideoArtworkDir"),
00638 GetConfDir() + "/MythVideo",
00639 *this, CEID_COVERARTFILE);
00640 }
00641
00642 void EditMetadataDialog::OnArtworkSearchDone(MetadataLookup *lookup)
00643 {
00644 if (!lookup)
00645 return;
00646
00647 if (m_busyPopup)
00648 {
00649 m_busyPopup->Close();
00650 m_busyPopup = NULL;
00651 }
00652
00653 VideoArtworkType type = qVariantValue<VideoArtworkType>(lookup->GetData());
00654 ArtworkList list = lookup->GetArtwork(type);
00655
00656 if (list.count() == 0)
00657 return;
00658
00659 MythScreenStack *m_popupStack =
00660 GetMythMainWindow()->GetStack("popup stack");
00661
00662 ImageSearchResultsDialog *resultsdialog =
00663 new ImageSearchResultsDialog(m_popupStack, list, type);
00664
00665 connect(resultsdialog, SIGNAL(haveResult(ArtworkInfo, VideoArtworkType)),
00666 SLOT(OnSearchListSelection(ArtworkInfo, VideoArtworkType)));
00667
00668 if (resultsdialog->Create())
00669 m_popupStack->AddScreen(resultsdialog);
00670 }
00671
00672 void EditMetadataDialog::OnSearchListSelection(ArtworkInfo info, VideoArtworkType type)
00673 {
00674 QString msg = tr("Downloading selected artwork...");
00675 createBusyDialog(msg);
00676
00677 MetadataLookup *lookup = new MetadataLookup();
00678 lookup->SetType(kMetadataVideo);
00679 if (m_workingMetadata->GetSeason() > 0 ||
00680 m_workingMetadata->GetEpisode() > 0)
00681 lookup->SetSubtype(kProbableTelevision);
00682 else if (m_workingMetadata->GetSubtitle().isEmpty())
00683 lookup->SetSubtype(kProbableMovie);
00684 else
00685 lookup->SetSubtype(kUnknownVideo);
00686 lookup->SetHost(m_workingMetadata->GetHost());
00687 lookup->SetAutomatic(true);
00688 lookup->SetData(qVariantFromValue<VideoArtworkType>(type));
00689
00690 ArtworkMap downloads;
00691 downloads.insert(type, info);
00692 lookup->SetDownloads(downloads);
00693 lookup->SetAllowOverwrites(true);
00694 lookup->SetTitle(m_workingMetadata->GetTitle());
00695 lookup->SetSubtitle(m_workingMetadata->GetSubtitle());
00696 lookup->SetSeason(m_workingMetadata->GetSeason());
00697 lookup->SetEpisode(m_workingMetadata->GetEpisode());
00698 lookup->SetInetref(m_workingMetadata->GetInetRef());
00699
00700 m_imageDownload->addDownloads(lookup);
00701 }
00702
00703 void EditMetadataDialog::handleDownloadedImages(MetadataLookup *lookup)
00704 {
00705 if (!lookup)
00706 return;
00707
00708 if (m_busyPopup)
00709 {
00710 m_busyPopup->Close();
00711 m_busyPopup = NULL;
00712 }
00713
00714 VideoArtworkType type = qVariantValue<VideoArtworkType>(lookup->GetData());
00715 ArtworkMap map = lookup->GetDownloads();
00716
00717 if (map.count() >= 1)
00718 {
00719 ArtworkInfo info = map.value(type);
00720 QString filename = info.url;
00721
00722 if (type == kArtworkCoverart)
00723 SetCoverArt(filename);
00724 else if (type == kArtworkFanart)
00725 SetFanart(filename);
00726 else if (type == kArtworkBanner)
00727 SetBanner(filename);
00728 else if (type == kArtworkScreenshot)
00729 SetScreenshot(filename);
00730 }
00731 }
00732
00733 void EditMetadataDialog::FindNetArt(VideoArtworkType type)
00734 {
00735 QString msg = tr("Searching for available artwork...");
00736 createBusyDialog(msg);
00737
00738 MetadataLookup *lookup = new MetadataLookup();
00739 lookup->SetStep(kLookupSearch);
00740 lookup->SetType(kMetadataVideo);
00741 lookup->SetAutomatic(true);
00742 if (m_workingMetadata->GetSeason() > 0 ||
00743 m_workingMetadata->GetEpisode() > 0)
00744 lookup->SetSubtype(kProbableTelevision);
00745 else if (m_workingMetadata->GetSubtitle().isEmpty())
00746 lookup->SetSubtype(kProbableMovie);
00747 else
00748 lookup->SetSubtype(kUnknownVideo);
00749 lookup->SetData(qVariantFromValue<VideoArtworkType>(type));
00750
00751 lookup->SetTitle(m_workingMetadata->GetTitle());
00752 lookup->SetSubtitle(m_workingMetadata->GetSubtitle());
00753 lookup->SetSeason(m_workingMetadata->GetSeason());
00754 lookup->SetEpisode(m_workingMetadata->GetEpisode());
00755 lookup->SetInetref(m_workingMetadata->GetInetRef());
00756
00757 m_query->addLookup(lookup);
00758 }
00759
00760 void EditMetadataDialog::FindNetCoverArt()
00761 {
00762 FindNetArt(kArtworkCoverart);
00763 }
00764
00765 void EditMetadataDialog::FindNetFanart()
00766 {
00767 FindNetArt(kArtworkFanart);
00768 }
00769
00770 void EditMetadataDialog::FindNetBanner()
00771 {
00772 FindNetArt(kArtworkBanner);
00773 }
00774
00775 void EditMetadataDialog::FindNetScreenshot()
00776 {
00777 FindNetArt(kArtworkScreenshot);
00778 }
00779
00780 void EditMetadataDialog::SetCoverArt(QString file)
00781 {
00782 if (file.isEmpty())
00783 return;
00784
00785 QString origfile = file;
00786
00787 if (file.startsWith("myth://"))
00788 {
00789 QUrl url(file);
00790 file = url.path();
00791 file = file.right(file.length() - 1);
00792 if (!file.endsWith("/"))
00793 m_workingMetadata->SetCoverFile(file);
00794 else
00795 m_workingMetadata->SetCoverFile(QString());
00796 }
00797 else
00798 m_workingMetadata->SetCoverFile(file);
00799
00800 CheckedSet(m_coverartText, file);
00801
00802 if (m_coverart)
00803 {
00804 m_coverart->SetFilename(origfile);
00805 m_coverart->Load();
00806 }
00807 }
00808
00809 void EditMetadataDialog::FindBanner()
00810 {
00811 if (!m_workingMetadata->GetHost().isEmpty())
00812 {
00813 QString url = generate_file_url("Banners",
00814 m_workingMetadata->GetHost(),
00815 "");
00816 FindImagePopup(url,"",
00817 *this, CEID_BANNERFILE);
00818 }
00819 else
00820 FindImagePopup(gCoreContext->GetSetting("mythvideo.bannerDir"),
00821 GetConfDir() + "/MythVideo/Banners",
00822 *this, CEID_BANNERFILE);
00823 }
00824
00825 void EditMetadataDialog::SetBanner(QString file)
00826 {
00827 if (file.isEmpty())
00828 return;
00829
00830 QString origfile = file;
00831
00832 if (file.startsWith("myth://"))
00833 {
00834 QUrl url(file);
00835 file = url.path();
00836 file = file.right(file.length() - 1);
00837 if (!file.endsWith("/"))
00838 m_workingMetadata->SetBanner(file);
00839 else
00840 m_workingMetadata->SetBanner(QString());
00841 }
00842 else
00843 m_workingMetadata->SetBanner(file);
00844
00845 CheckedSet(m_bannerText, file);
00846
00847 if (m_banner)
00848 {
00849 m_banner->SetFilename(origfile);
00850 m_banner->Load();
00851 }
00852 }
00853
00854 void EditMetadataDialog::FindFanart()
00855 {
00856 if (!m_workingMetadata->GetHost().isEmpty())
00857 {
00858 QString url = generate_file_url("Fanart",
00859 m_workingMetadata->GetHost(),
00860 "");
00861 FindImagePopup(url,"",
00862 *this, CEID_FANARTFILE);
00863 }
00864 else
00865 FindImagePopup(gCoreContext->GetSetting("mythvideo.fanartDir"),
00866 GetConfDir() + "/MythVideo/Fanart",
00867 *this, CEID_FANARTFILE);
00868 }
00869
00870 void EditMetadataDialog::SetFanart(QString file)
00871 {
00872 if (file.isEmpty())
00873 return;
00874
00875 QString origfile = file;
00876
00877 if (file.startsWith("myth://"))
00878 {
00879 QUrl url(file);
00880 file = url.path();
00881 file = file.right(file.length() - 1);
00882 if (!file.endsWith("/"))
00883 m_workingMetadata->SetFanart(file);
00884 else
00885 m_workingMetadata->SetFanart(QString());
00886 }
00887 else
00888 m_workingMetadata->SetFanart(file);
00889
00890 CheckedSet(m_fanartText, file);
00891
00892 if (m_fanart)
00893 {
00894 m_fanart->SetFilename(origfile);
00895 m_fanart->Load();
00896 }
00897 }
00898
00899 void EditMetadataDialog::FindScreenshot()
00900 {
00901 if (!m_workingMetadata->GetHost().isEmpty())
00902 {
00903 QString url = generate_file_url("Screenshots",
00904 m_workingMetadata->GetHost(),
00905 "");
00906 FindImagePopup(url,"",
00907 *this, CEID_SCREENSHOTFILE);
00908 }
00909 else
00910 FindImagePopup(gCoreContext->GetSetting("mythvideo.screenshotDir"),
00911 GetConfDir() + "/MythVideo/Screenshots",
00912 *this, CEID_SCREENSHOTFILE);
00913 }
00914
00915 void EditMetadataDialog::SetScreenshot(QString file)
00916 {
00917 if (file.isEmpty())
00918 return;
00919
00920 QString origfile = file;
00921
00922 if (file.startsWith("myth://"))
00923 {
00924 QUrl url(file);
00925 file = url.path();
00926 file = file.right(file.length() - 1);
00927 if (!file.endsWith("/"))
00928 m_workingMetadata->SetScreenshot(file);
00929 else
00930 m_workingMetadata->SetScreenshot(QString());
00931 }
00932 else
00933 m_workingMetadata->SetScreenshot(file);
00934
00935 CheckedSet(m_screenshotText, file);
00936
00937 if (m_screenshot)
00938 {
00939 m_screenshot->SetFilename(origfile);
00940 m_screenshot->Load();
00941 }
00942 }
00943
00944 void EditMetadataDialog::FindTrailer()
00945 {
00946 if (!m_workingMetadata->GetHost().isEmpty())
00947 {
00948 QString url = generate_file_url("Trailers",
00949 m_workingMetadata->GetHost(),
00950 "");
00951 FindVideoFilePopup(url,"",
00952 *this, CEID_TRAILERFILE);
00953 }
00954 else
00955 FindVideoFilePopup(gCoreContext->GetSetting("mythvideo.TrailersDir"),
00956 GetConfDir() + "/MythVideo/Trailers",
00957 *this, CEID_TRAILERFILE);
00958 }
00959
00960 void EditMetadataDialog::SetTrailer(QString file)
00961 {
00962 if (file.isEmpty())
00963 return;
00964
00965 if (file.startsWith("myth://"))
00966 {
00967 QUrl url(file);
00968 file = url.path();
00969 file = file.right(file.length() - 1);
00970 if (!file.endsWith("/"))
00971 m_workingMetadata->SetTrailer(file);
00972 else
00973 m_workingMetadata->SetTrailer(QString());
00974 }
00975 else
00976 m_workingMetadata->SetTrailer(file);
00977 CheckedSet(m_trailerText, file);
00978 }
00979
00980 void EditMetadataDialog::customEvent(QEvent *levent)
00981 {
00982 if (levent->type() == DialogCompletionEvent::kEventType)
00983 {
00984 DialogCompletionEvent *dce = (DialogCompletionEvent*)(levent);
00985
00986 const QString resultid = dce->GetId();
00987
00988 if (resultid == CEID_COVERARTFILE)
00989 SetCoverArt(dce->GetResultText());
00990 else if (resultid == CEID_BANNERFILE)
00991 SetBanner(dce->GetResultText());
00992 else if (resultid == CEID_FANARTFILE)
00993 SetFanart(dce->GetResultText());
00994 else if (resultid == CEID_SCREENSHOTFILE)
00995 SetScreenshot(dce->GetResultText());
00996 else if (resultid == CEID_TRAILERFILE)
00997 SetTrailer(dce->GetResultText());
00998 else if (resultid == CEID_NEWCATEGORY)
00999 AddCategory(dce->GetResultText());
01000 }
01001 else if (levent->type() == MetadataLookupEvent::kEventType)
01002 {
01003 MetadataLookupEvent *lue = (MetadataLookupEvent *)levent;
01004
01005 MetadataLookupList lul = lue->lookupList;
01006
01007 if (lul.isEmpty())
01008 return;
01009
01010
01011
01012 if (lul.count() == 1)
01013 {
01014 OnArtworkSearchDone(lul.takeFirst());
01015 }
01016 else
01017 {
01018 if (m_busyPopup)
01019 {
01020 m_busyPopup->Close();
01021 m_busyPopup = NULL;
01022 }
01023 }
01024 }
01025 else if (levent->type() == MetadataLookupFailure::kEventType)
01026 {
01027 MetadataLookupFailure *luf = (MetadataLookupFailure *)levent;
01028
01029 MetadataLookupList lul = luf->lookupList;
01030
01031 if (m_busyPopup)
01032 {
01033 m_busyPopup->Close();
01034 m_busyPopup = NULL;
01035 }
01036
01037 if (lul.size())
01038 {
01039 MetadataLookup *lookup = lul.takeFirst();
01040 LOG(VB_GENERAL, LOG_INFO,
01041 QString("No results found for %1 %2 %3").arg(lookup->GetTitle())
01042 .arg(lookup->GetSeason()).arg(lookup->GetEpisode()));
01043 }
01044 }
01045 else if (levent->type() == ImageDLEvent::kEventType)
01046 {
01047 ImageDLEvent *ide = (ImageDLEvent *)levent;
01048
01049 MetadataLookup *lookup = ide->item;
01050
01051 if (!lookup)
01052 return;
01053
01054 handleDownloadedImages(lookup);
01055 }
01056 }