MythTV  master
videometadata.cpp
Go to the documentation of this file.
1 #include <cmath> // for isnan()
2 
3 #include <QDir>
4 #include <QFile>
5 #include <QFileInfo>
6 #include <QRegularExpression>
7 
8 #include "libmyth/mythcontext.h"
10 #include "libmythbase/mythdate.h"
11 #include "libmythbase/mythdb.h"
13 #include "libmythbase/mythmiscutil.h"// for FileHash
15 #include "libmythbase/remotefile.h"
16 #include "libmythbase/remoteutil.h"
18 #include "libmythbase/stringutil.h"
20 
21 #include "dbaccess.h"
22 #include "globals.h"
24 #include "videoutils.h"
25 
26 #if QT_VERSION < QT_VERSION_CHECK(5,15,2)
27 #define capturedView capturedRef
28 #endif
29 
31 {
32  public:
36 
37  public:
38  VideoMetadataImp(QString filename, QString sortFilename,
39  QString hash, QString trailer,
40  QString coverfile, QString screenshot, QString banner,
41  QString fanart, const QString &title, QString sortTitle,
42  const QString &subtitle, QString sortSubtitle,
43  QString tagline, int year, const QDate releasedate,
44  QString inetref, int collectionref, QString homepage,
45  QString director, QString studio,
46  QString plot, float userrating,
47  QString rating, int length, int playcount,
48  int season, int episode, const QDate insertdate,
49  int id, ParentalLevel::Level showlevel, int categoryID,
50  int childID, bool browse, bool watched,
51  QString playcommand, QString category,
52  genre_list genres,
53  country_list countries,
54  cast_list cast,
55  QString host = "",
56  bool processed = false,
57  VideoContentType contenttype = kContentUnknown) :
58  m_title(title), m_sortTitle(std::move(sortTitle)), m_subtitle(subtitle),
59  m_sortSubtitle(std::move(sortSubtitle)), m_tagline(std::move(tagline)),
60  m_inetref(std::move(inetref)), m_collectionref(collectionref),
61  m_homepage(std::move(homepage)), m_director(std::move(director)),
62  m_studio(std::move(studio)), m_plot(std::move(plot)),
63  m_rating(std::move(rating)), m_playcommand(std::move(playcommand)),
64  m_category(std::move(category)), m_genres(std::move(genres)),
65  m_countries(std::move(countries)), m_cast(std::move(cast)),
66  m_filename(std::move(filename)), m_sortFilename(std::move(sortFilename)),
67  m_hash(std::move(hash)), m_trailer(std::move(trailer)),
68  m_coverfile(std::move(coverfile)), m_screenshot(std::move(screenshot)),
69  m_banner(std::move(banner)), m_fanart(std::move(fanart)),
70  m_host(std::move(host)), m_categoryID(categoryID), m_childID(childID),
71  m_year(year), m_releasedate(releasedate), m_length(length), m_playcount(playcount),
72  m_season(season), m_episode(episode), m_insertdate(insertdate), m_showlevel(showlevel),
73  m_browse(browse), m_watched(watched), m_id(id),
74  m_userrating(userrating), m_processed(processed),
75  m_contenttype(contenttype)
76  {
77  // Try to glean data if none provided.
78  if (title.isEmpty() and subtitle.isEmpty()
79  and season == 0 and episode == 0)
80  {
85  }
86 
88 
90  }
91 
92  explicit VideoMetadataImp(MSqlQuery &query)
93  {
94  fromDBRow(query);
96  }
97 
99  {
100  *this = other;
101  }
102 
104  {
105  if (this != &rhs)
106  {
107  m_title = rhs.m_title;
108  m_sortTitle = rhs.m_sortTitle;
109  m_subtitle = rhs.m_subtitle;
111  m_tagline = rhs.m_tagline;
112  m_inetref = rhs.m_inetref;
114  m_homepage = rhs.m_homepage;
115  m_director = rhs.m_director;
116  m_studio = rhs.m_studio;
117  m_plot = rhs.m_plot;
118  m_rating = rhs.m_rating;
120  m_category = rhs.m_category;
121  m_genres = rhs.m_genres;
122  m_countries = rhs.m_countries;
123  m_cast = rhs.m_cast;
124  m_filename = rhs.m_filename;
126  m_hash = rhs.m_hash;
127  m_trailer = rhs.m_trailer;
128  m_coverfile = rhs.m_coverfile;
130  m_banner = rhs.m_banner;
131  m_fanart = rhs.m_fanart;
132 
134  m_childID = rhs.m_childID;
135  m_year = rhs.m_year;
137  m_length = rhs.m_length;
138  m_playcount = rhs.m_playcount;
139  m_season = rhs.m_season;
140  m_episode = rhs.m_episode;
142  m_showlevel = rhs.m_showlevel;
143  m_browse = rhs.m_browse;
144  m_watched = rhs.m_watched;
145  m_id = rhs.m_id;
147  m_host = rhs.m_host;
148  m_processed = rhs.m_processed;
150 
151  // No DB vars
152  m_prefix = rhs.m_prefix;
153 
155  }
156 
157  return *this;
158  }
159 
160  void ensureSortFields(void)
161  {
162  std::shared_ptr<MythSortHelper>sh = getMythSortHelper();
163  if (m_sortTitle.isEmpty() and not m_title.isEmpty())
164  m_sortTitle = sh->doTitle(m_title);
165  if (m_sortSubtitle.isEmpty() and not m_subtitle.isEmpty())
166  m_sortSubtitle = sh->doTitle(m_subtitle);
167  if (m_sortFilename.isEmpty() and not m_filename.isEmpty())
168  m_sortFilename = sh->doPathname(m_filename);
169  }
170 
171  public:
172  const QString &GetPrefix() const { return m_prefix; }
173  void SetPrefix(const QString &prefix) { m_prefix = prefix; }
174 
175  const QString &getTitle() const { return m_title; }
176  const QString &getSortTitle() const { return m_sortTitle; }
177  void SetTitle(const QString& title, const QString& sortTitle = "")
178  {
179  m_title = title;
180  m_sortTitle = sortTitle;
182  }
183 
184  const QString &getSubtitle() const { return m_subtitle; }
185  const QString &getSortSubtitle() const { return m_sortSubtitle; }
186  void SetSubtitle(const QString &subtitle, const QString &sortSubtitle = "") {
187  m_subtitle = subtitle;
188  m_sortSubtitle = sortSubtitle;
190  }
191 
192  const QString &GetTagline() const { return m_tagline; }
193  void SetTagline(const QString &tagline) { m_tagline = tagline; }
194 
195  const QString &GetInetRef() const { return m_inetref; }
196  void SetInetRef(const QString &inetRef) { m_inetref = inetRef; }
197 
198  int GetCollectionRef() const { return m_collectionref; }
199  void SetCollectionRef(int collectionref) { m_collectionref = collectionref; }
200 
201  const QString &GetHomepage() const { return m_homepage; }
202  void SetHomepage(const QString &homepage) { m_homepage = homepage; }
203 
204  const QString &getDirector() const { return m_director; }
205  void SetDirector(const QString &director) { m_director = director; }
206 
207  const QString &getStudio() const { return m_studio; }
208  void SetStudio(const QString &studio) { m_studio = studio; }
209 
210  const QString &getPlot() const { return m_plot; }
211  void SetPlot(const QString &plot) { m_plot = plot; }
212 
213  const QString &GetRating() const { return m_rating; }
214  void SetRating(const QString &rating) { m_rating = rating; }
215 
216  const QString &getPlayCommand() const { return m_playcommand; }
217  void SetPlayCommand(const QString &playCommand)
218  {
219  m_playcommand = playCommand;
220  }
221 
222  const QString &GetCategory() const { return m_category; }
223 // void SetCategory(const QString &category) { m_category = category; }
224 
225  const genre_list &getGenres() const { return m_genres; }
226  void SetGenres(const genre_list &genres) { m_genres = genres; }
227 
228  const country_list &GetCountries() const { return m_countries; }
229  void SetCountries(const country_list &countries)
230  {
231  m_countries = countries;
232  }
233 
234  const cast_list &GetCast() const { return m_cast; }
235  void SetCast(const cast_list &cast) { m_cast = cast; }
236 
237  const QString &GetHost() const { return m_host; }
238  void SetHost(const QString &host) { m_host = host; }
239 
240  const QString &getFilename() const { return m_filename; }
241  const QString &getSortFilename() const { return m_sortFilename; }
242  void SetFilename(const QString &filename, const QString &sortFilename = "")
243  {
245  m_sortFilename = sortFilename;
247  }
248 
249  bool sortBefore(const VideoMetadataImp *rhs) const;
250 
251  const QString &GetHash() const { return m_hash; }
252  void SetHash(const QString &hash) { m_hash = hash; }
253 
254  const QString &GetTrailer() const { return m_trailer; }
255  void SetTrailer(const QString &trailer) { m_trailer = trailer; }
256 
257  const QString &GetCoverFile() const { return m_coverfile; }
258  void SetCoverFile(const QString &coverFile) { m_coverfile = coverFile; }
259 
260  const QString &GetScreenshot() const { return m_screenshot; }
261  void SetScreenshot(const QString &screenshot) { m_screenshot = screenshot; }
262 
263  const QString &GetBanner() const { return m_banner; }
264  void SetBanner(const QString &banner) { m_banner = banner; }
265 
266  const QString &GetFanart() const { return m_fanart; }
267  void SetFanart(const QString &fanart) { m_fanart = fanart; }
268 
269  int GetCategoryID() const
270  {
271  return m_categoryID;
272  }
273  void SetCategoryID(int id);
274 
275  int GetChildID() const { return m_childID; }
276  void SetChildID(int childID) { m_childID = childID; }
277 
278  int getYear() const { return m_year; }
279  void SetYear(int year) { m_year = year; }
280 
281  QDate getReleaseDate() const { return m_releasedate; }
282  void SetReleaseDate(QDate releasedate) { m_releasedate = releasedate; }
283 
284  std::chrono::minutes GetLength() const { return m_length; }
285  void SetLength(std::chrono::minutes length) { m_length = length; }
286 
287  unsigned int GetPlayCount() const { return m_playcount; }
288  void SetPlayCount(int playcount) { m_playcount = playcount; }
289 
290  int GetSeason() const { return m_season; }
291  void SetSeason(int season) { m_season = season; }
292 
293  int GetEpisode() const { return m_episode; }
294  void SetEpisode(int episode) { m_episode = episode; }
295 
296  QDate GetInsertdate() const { return m_insertdate;}
297  void SetInsertdate(QDate date) { m_insertdate = date;}
298 
301  {
302  m_showlevel = ParentalLevel(showLevel).GetLevel();
303  }
304 
305  bool GetBrowse() const { return m_browse; }
306  void SetBrowse(bool browse) { m_browse = browse; }
307 
308  bool GetWatched() const { return m_watched; }
309  void SetWatched(bool watched) { m_watched = watched; }
310 
311  unsigned int GetID() const { return m_id; }
312  void SetID(int id) { m_id = id; }
313 
314  float GetUserRating() const { return m_userrating; }
315  void SetUserRating(float userRating) { m_userrating = userRating; }
316 
317  bool GetProcessed() const { return m_processed; }
318  void SetProcessed(bool processed) { m_processed = processed; }
319 
321  void SetContentType(VideoContentType contenttype) { m_contenttype = contenttype; }
322 
324 
325  void SaveToDatabase();
326  void UpdateDatabase();
327  bool DeleteFromDatabase();
328 
329  bool DeleteFile();
330 
331  void Reset();
332 
333  bool IsHostSet() const;
334 
335  void GetImageMap(InfoMap &imageMap) const;
336  QString GetImage(const QString &name) const;
337 
338  private:
339  void fillCountries();
340  void updateCountries();
341  void fillGenres();
342  void fillCast();
343  void updateGenres();
344  void updateCast();
345  bool removeDir(const QString &dirName);
346  void fromDBRow(MSqlQuery &query);
347  void saveToDatabase();
348 
349  private:
350  QString m_title;
351  QString m_sortTitle;
352  QString m_subtitle;
353  QString m_sortSubtitle;
354  QString m_tagline;
355  QString m_inetref;
357  QString m_homepage;
358  QString m_director;
359  QString m_studio;
360  QString m_plot;
361  QString m_rating;
362  QString m_playcommand;
363  QString m_category;
367  QString m_filename;
368  QString m_sortFilename;
369  QString m_hash;
370  QString m_trailer;
371  QString m_coverfile;
372  QString m_screenshot;
373  QString m_banner;
374  QString m_fanart;
375  QString m_host;
376 
377  int m_categoryID {0};
378  int m_childID {-1};
381  std::chrono::minutes m_length {0min};
382  int m_playcount {0};
383  int m_season {0};
384  int m_episode {0};
387  bool m_browse {true};
388  bool m_watched {false};
389  unsigned int m_id {0}; // videometadata.intid
390  float m_userrating {0.0};
391  bool m_processed {false};
393 
394  // not in DB
395  QString m_prefix;
396 };
397 
401 
405 {
407  if (cmp == 0)
409  if (cmp == 0)
410  cmp = ternary_compare(m_id, rhs->m_id);
411  return cmp < 0;
412 }
413 
414 bool VideoMetadataImp::removeDir(const QString &dirName)
415 {
416  QDir d(dirName);
417 
418  d.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
419  QFileInfoList contents = d.entryInfoList();
420  if (contents.empty())
421  {
422  return d.rmdir(dirName);
423  }
424 
425  for (const auto& entry : qAsConst(contents))
426  {
427  if (entry.isDir())
428  {
429  QString fileName = entry.fileName();
430  if (!removeDir(fileName))
431  return false;
432  }
433  else
434  {
435  if (!QFile(entry.fileName()).remove())
436  return false;
437  }
438  }
439  return d.rmdir(dirName);
440 }
441 
444 {
445  bool isremoved = false;
446 
447  if (!m_host.isEmpty())
448  {
449  QString url = generate_file_url("Videos", m_host, m_filename);
450  isremoved = RemoteFile::DeleteFile(url);
451  }
452  else
453  {
454  QFileInfo fi(m_filename);
455  if (fi.isDir())
456  {
457  isremoved = removeDir(m_filename);
458  }
459  else
460  {
461  isremoved = QFile::remove(m_filename);
462  }
463  }
464 
465  if (!isremoved)
466  {
467  LOG(VB_GENERAL, LOG_DEBUG, QString("Could not delete file: %1")
468  .arg(m_filename));
469  }
470 
471  return isremoved;
472 }
473 
475 {
476  VideoMetadataImp tmp(m_filename, QString(),
479  VIDEO_FANART_DEFAULT, QString(), QString(), QString(), QString(),
480  QString(), VIDEO_YEAR_DEFAULT,
481  QDate(), VIDEO_INETREF_DEFAULT, -1, QString(), VIDEO_DIRECTOR_DEFAULT,
482  QString(), VIDEO_PLOT_DEFAULT, 0.0,
483  VIDEO_RATING_DEFAULT, 0, 0,
484  0, 0, QDate(), m_id,
485  ParentalLevel::plLowest, 0, -1, true, false, "", "",
487  VideoMetadata::cast_list(), m_host, false);
488  tmp.m_prefix = m_prefix;
489 
490  *this = tmp;
491 }
492 
494 {
495  return !m_host.isEmpty();
496 }
497 
499 {
500  m_genres.clear();
502  VideoGenreMap::entry genres;
503  if (vgm.get(m_id, genres))
504  {
506  for (long value : genres.values)
507  {
508  // Just add empty string for no-name genres
509  QString name;
510  vg.get(value, name);
511  m_genres.emplace_back(value, name);
512  }
513  }
514 }
515 
517 {
518  m_countries.clear();
520  VideoCountryMap::entry countries;
521  if (vcm.get(m_id, countries))
522  {
524  for (long value : countries.values)
525  {
526  // Just add empty string for no-name countries
527  QString name;
528  vc.get(value, name);
529  m_countries.emplace_back(value, name);
530  }
531  }
532 }
533 
535 {
536  m_cast.clear();
538  VideoCastMap::entry cast;
539  if (vcm.get(m_id, cast))
540  {
542  for (long value : cast.values)
543  {
544  // Just add empty string for no-name cast
545  QString name;
546  vc.get(value, name);
547  m_cast.emplace_back(value, name);
548  }
549  }
550 }
551 
557 {
558  m_title = query.value(0).toString();
559  m_director = query.value(1).toString();
560  m_studio = query.value(2).toString();
561  m_plot = query.value(3).toString();
562  m_rating = query.value(4).toString();
563  m_year = query.value(5).toInt();
564  m_releasedate = query.value(6).toDate();
565  m_userrating = (float)query.value(7).toDouble();
566  if (std::isnan(m_userrating) || m_userrating < 0)
567  m_userrating = 0.0;
568  if (m_userrating > 10.0F)
569  m_userrating = 10.0F;
570  m_length = std::chrono::minutes(query.value(8).toInt());
571  m_playcount = query.value(9).toInt();
572  m_filename = query.value(10).toString();
573  m_hash = query.value(11).toString();
574  m_showlevel = ParentalLevel(query.value(12).toInt()).GetLevel();
575  m_coverfile = query.value(13).toString();
576  m_inetref = query.value(14).toString();
577  m_collectionref = query.value(15).toUInt();
578  m_homepage = query.value(16).toString();
579  m_childID = query.value(17).toUInt();
580  m_browse = query.value(18).toBool();
581  m_watched = query.value(19).toBool();
582  m_playcommand = query.value(20).toString();
583  m_categoryID = query.value(21).toInt();
584  m_id = query.value(22).toInt();
585  m_trailer = query.value(23).toString();
586  m_screenshot = query.value(24).toString();
587  m_banner = query.value(25).toString();
588  m_fanart = query.value(26).toString();
589  m_subtitle = query.value(27).toString();
590  m_tagline = query.value(28).toString();
591  m_season = query.value(29).toInt();
592  m_episode = query.value(30).toInt();
593  m_host = query.value(31).toString();
594  m_insertdate = query.value(32).toDate();
595  m_processed = query.value(33).toBool();
596 
597  m_contenttype = ContentTypeFromString(query.value(34).toString());
598 
600 
602 
603  // Genres
604  fillGenres();
605 
606  //Countries
607  fillCountries();
608 
609  // Cast
610  fillCast();
611 }
612 
614 {
615  if (m_title.isEmpty())
617  if (m_hash.isEmpty())
619  if (m_subtitle.isEmpty())
621  if (m_director.isEmpty())
623  if (m_plot.isEmpty())
625  if (m_rating.isEmpty())
628 
629  InfoMap metadataMap;
630  GetImageMap(metadataMap);
631  QString coverfile = metadataMap["coverfile"];
632  QString screenshot = metadataMap["screenshotfile"];
633  QString bannerfile = metadataMap["bannerfile"];
634  QString fanartfile = metadataMap["fanartfile"];
635 
636  if (coverfile.isEmpty() || !RemoteFile::Exists(coverfile))
638  if (screenshot.isEmpty() || !RemoteFile::Exists(screenshot))
640  if (bannerfile.isEmpty() || !RemoteFile::Exists(bannerfile))
642  if (fanartfile.isEmpty() || !RemoteFile::Exists(fanartfile))
644  if (m_trailer.isEmpty())
646  if (m_inetref.isEmpty())
648  if (std::isnan(m_userrating))
649  m_userrating = 0.0;
650  if (m_userrating < -10.0F || m_userrating > 10.0F)
651  m_userrating = 0.0;
652  if (m_releasedate.toString().isEmpty())
653  m_releasedate = QDate::fromString("0000-00-00", "YYYY-MM-DD");
655  {
656  if (m_season > 0 || m_episode > 0)
658  else
660  }
661 
662  bool inserting = m_id == 0;
663 
664  MSqlQuery query(MSqlQuery::InitCon());
665 
666  if (inserting)
667  {
668  m_browse = true;
669 
670  m_watched = false;
671 
672  query.prepare("INSERT INTO videometadata (title,subtitle,tagline,director,studio,plot,"
673  "rating,year,userrating,length,season,episode,filename,hash,"
674  "showlevel,coverfile,inetref,homepage,browse,watched,trailer,"
675  "screenshot,banner,fanart,host,processed,contenttype) VALUES (:TITLE, :SUBTITLE, "
676  ":TAGLINE, :DIRECTOR, :STUDIO, :PLOT, :RATING, :YEAR, :USERRATING, "
677  ":LENGTH, :SEASON, :EPISODE, :FILENAME, :HASH, :SHOWLEVEL, "
678  ":COVERFILE, :INETREF, :HOMEPAGE, :BROWSE, :WATCHED, "
679  ":TRAILER, :SCREENSHOT, :BANNER, :FANART, :HOST, :PROCESSED, :CONTENTTYPE)");
680  }
681  else
682  {
683  query.prepare("UPDATE videometadata SET title = :TITLE, subtitle = :SUBTITLE, "
684  "tagline = :TAGLINE, director = :DIRECTOR, studio = :STUDIO, "
685  "plot = :PLOT, rating= :RATING, year = :YEAR, "
686  "releasedate = :RELEASEDATE, userrating = :USERRATING, "
687  "length = :LENGTH, playcount = :PLAYCOUNT, season = :SEASON, "
688  "episode = :EPISODE, filename = :FILENAME, hash = :HASH, trailer = :TRAILER, "
689  "showlevel = :SHOWLEVEL, coverfile = :COVERFILE, "
690  "screenshot = :SCREENSHOT, banner = :BANNER, fanart = :FANART, "
691  "inetref = :INETREF, collectionref = :COLLECTION, homepage = :HOMEPAGE, "
692  "browse = :BROWSE, watched = :WATCHED, host = :HOST, playcommand = :PLAYCOMMAND, "
693  "childid = :CHILDID, category = :CATEGORY, processed = :PROCESSED, "
694  "contenttype = :CONTENTTYPE WHERE intid = :INTID");
695 
696  query.bindValue(":PLAYCOMMAND", m_playcommand);
697  query.bindValue(":CHILDID", m_childID);
698  query.bindValue(":CATEGORY", m_categoryID);
699  query.bindValue(":INTID", m_id);
700  }
701 
702  query.bindValueNoNull(":TITLE", m_title);
703  query.bindValueNoNull(":SUBTITLE", m_subtitle);
704  query.bindValue(":TAGLINE", m_tagline);
705  query.bindValueNoNull(":DIRECTOR", m_director);
706  query.bindValue(":STUDIO", m_studio);
707  query.bindValue(":PLOT", m_plot);
708  query.bindValueNoNull(":RATING", m_rating);
709  query.bindValue(":YEAR", m_year);
710  query.bindValue(":RELEASEDATE", m_releasedate);
711  query.bindValue(":USERRATING", m_userrating);
712  query.bindValue(":LENGTH", static_cast<qint64>(m_length.count()));
713  query.bindValue(":PLAYCOUNT", m_playcount);
714  query.bindValue(":SEASON", m_season);
715  query.bindValue(":EPISODE", m_episode);
716  query.bindValue(":FILENAME", m_filename);
717  query.bindValue(":HASH", m_hash);
718  query.bindValueNoNull(":TRAILER", m_trailer);
719  query.bindValue(":SHOWLEVEL", m_showlevel);
720  query.bindValueNoNull(":COVERFILE", m_coverfile);
721  query.bindValueNoNull(":SCREENSHOT", m_screenshot);
722  query.bindValueNoNull(":BANNER", m_banner);
723  query.bindValueNoNull(":FANART", m_fanart);
724  query.bindValueNoNull(":INETREF", m_inetref);
725  query.bindValue(":COLLECTION", m_collectionref);
726  query.bindValueNoNull(":HOMEPAGE", m_homepage);
727  query.bindValue(":BROWSE", m_browse);
728  query.bindValue(":WATCHED", m_watched);
729  query.bindValue(":HOST", m_host);
730  query.bindValue(":PROCESSED", m_processed);
731  query.bindValue(":CONTENTTYPE", ContentTypeToString(m_contenttype));
732 
733  if (!query.exec() || !query.isActive())
734  {
735  MythDB::DBError("video metadata update", query);
736  return;
737  }
738 
739  if (inserting)
740  {
741  // Must make sure we have 'id' filled before we call updateGenres or
742  // updateCountries
743 
744  if (!query.exec("SELECT LAST_INSERT_ID()") || !query.next())
745  {
746  MythDB::DBError("metadata id get", query);
747  return;
748  }
749 
750  m_id = query.value(0).toUInt();
751 
752  if (0 == m_id)
753  {
754  LOG(VB_GENERAL, LOG_ERR,
755  QString("%1: The id of the last inserted row to "
756  "videometadata seems to be 0. This is odd.")
757  .arg(__FILE__));
758  return;
759  }
760  }
761 
762  updateGenres();
763  updateCountries();
764  updateCast();
765 }
766 
768 {
769  saveToDatabase();
770 }
771 
773 {
774  saveToDatabase();
775 }
776 
778 {
782 
783  MSqlQuery query(MSqlQuery::InitCon());
784  query.prepare("DELETE FROM videometadata WHERE intid = :ID");
785  query.bindValue(":ID", m_id);
786  if (!query.exec())
787  {
788  MythDB::DBError("delete from videometadata", query);
789  }
790 
791  query.prepare("DELETE FROM filemarkup WHERE filename = :FILENAME");
792  query.bindValue(":FILENAME", m_filename);
793  if (!query.exec())
794  {
795  MythDB::DBError("delete from filemarkup", query);
796  }
797 
798  return true;
799 }
800 
802 {
803  if (id == 0)
804  {
805  m_category = "";
806  m_categoryID = id;
807  }
808  else
809  {
810  if (m_categoryID != id)
811  {
812  QString cat;
814  {
815  m_category = cat;
816  m_categoryID = id;
817  }
818  else
819  {
820  LOG(VB_GENERAL, LOG_ERR, "Unknown category id");
821  }
822  }
823  }
824 }
825 
827 {
829 
830  // ensure that all genres we have are in the DB
831  auto genre = m_genres.begin();
832  while (genre != m_genres.end())
833  {
834  if (!genre->second.trimmed().isEmpty())
835  {
836  genre->first = VideoGenre::getGenre().add(genre->second);
837  VideoGenreMap::getGenreMap().add(m_id, genre->first);
838  ++genre;
839  }
840  else
841  {
842  genre = m_genres.erase(genre);
843  }
844  }
845 }
846 
848 {
849  // remove countries for this video
851 
852  auto country = m_countries.begin();
853  while (country != m_countries.end())
854  {
855  if (!country->second.trimmed().isEmpty())
856  {
857  country->first = VideoCountry::getCountry().add(country->second);
858  VideoCountryMap::getCountryMap().add(m_id, country->first);
859  ++country;
860  }
861  else
862  {
863  country = m_countries.erase(country);
864  }
865  }
866 }
867 
869 {
871 
872  // ensure that all cast we have are in the DB
873  auto cast = m_cast.begin();
874  while (cast != m_cast.end())
875  {
876  if (!cast->second.trimmed().isEmpty())
877  {
878  cast->first = VideoCast::GetCast().add(cast->second);
879  VideoCastMap::getCastMap().add(m_id, cast->first);
880  ++cast;
881  }
882  else
883  {
884  cast = m_cast.erase(cast);
885  }
886  }
887 }
888 
890 {
891  QString coverfile;
892  if (IsHostSet()
893  && !GetCoverFile().startsWith(u'/')
894  && !GetCoverFile().isEmpty()
896  {
897  coverfile = generate_file_url(QStringLiteral(u"Coverart"), GetHost(),
898  GetCoverFile());
899  }
900  else
901  {
902  coverfile = GetCoverFile();
903  }
904 
905  imageMap[QStringLiteral(u"coverfile")] = coverfile;
906  imageMap[QStringLiteral(u"coverart")] = coverfile;
907 
908  QString screenshotfile;
909  if (IsHostSet() && !GetScreenshot().startsWith(u'/')
910  && !GetScreenshot().isEmpty())
911  {
912  screenshotfile = generate_file_url(QStringLiteral(u"Screenshots"),
913  GetHost(), GetScreenshot());
914  }
915  else
916  {
917  screenshotfile = GetScreenshot();
918  }
919 
920  imageMap[QStringLiteral(u"screenshotfile")] = screenshotfile;
921  imageMap[QStringLiteral(u"screenshot")] = screenshotfile;
922 
923  QString bannerfile;
924  if (IsHostSet() && !GetBanner().startsWith(u'/')
925  && !GetBanner().isEmpty())
926  {
927  bannerfile = generate_file_url(QStringLiteral(u"Banners"), GetHost(),
928  GetBanner());
929  }
930  else
931  {
932  bannerfile = GetBanner();
933  }
934 
935  imageMap[QStringLiteral(u"bannerfile")] = bannerfile;
936  imageMap[QStringLiteral(u"banner")] = bannerfile;
937 
938  QString fanartfile;
939  if (IsHostSet() && !GetFanart().startsWith('/')
940  && !GetFanart().isEmpty())
941  {
942  fanartfile = generate_file_url(QStringLiteral(u"Fanart"), GetHost(),
943  GetFanart());
944  }
945  else
946  {
947  fanartfile = GetFanart();
948  }
949 
950  imageMap[QStringLiteral(u"fanartfile")] = fanartfile;
951  imageMap[QStringLiteral(u"fanart")] = fanartfile;
952 
953  QString smartimage = coverfile;
954  if (!screenshotfile.isEmpty () && (GetSeason() > 0 || GetEpisode() > 0))
955  smartimage = screenshotfile;
956  imageMap[QStringLiteral(u"smartimage")] = smartimage;
957 }
958 
959 // This should be the equivalent of GetImageMap, only the image names
960 // are computed one at a time as needed.
961 QString VideoMetadataImp::GetImage(const QString& name) const
962 {
963  if ((name == QStringLiteral(u"coverfile")) ||
964  (name == QStringLiteral(u"coverart")))
965  {
966  QString coverfile = GetCoverFile();
967  if (IsHostSet()
968  && !coverfile.startsWith(u'/')
969  && !coverfile.isEmpty()
970  && !IsDefaultCoverFile(coverfile))
971  return generate_file_url(QStringLiteral(u"Coverart"), GetHost(),
972  coverfile);
973  return coverfile;
974  }
975 
976  if ((name == QStringLiteral(u"screenshotfile")) ||
977  (name == QStringLiteral(u"screenshot")))
978  {
979  QString screenshot = GetScreenshot();
980  if (IsHostSet() && !screenshot.startsWith(u'/')
981  && !screenshot.isEmpty())
982  return generate_file_url(QStringLiteral(u"Screenshots"),
983  GetHost(), screenshot);
984  return screenshot;
985  }
986 
987  if ((name == QStringLiteral(u"bannerfile")) ||
988  (name == QStringLiteral(u"banner")))
989  {
990  QString bannerfile = GetBanner();
991  if (IsHostSet() && !bannerfile.startsWith(u'/')
992  && !bannerfile.isEmpty())
993  return generate_file_url(QStringLiteral(u"Banners"), GetHost(),
994  bannerfile);
995  return bannerfile;
996  }
997 
998  if ((name == QStringLiteral(u"fanartfile")) ||
999  (name == QStringLiteral(u"fanart")))
1000  {
1001  QString fanartfile = GetFanart();
1002  if (IsHostSet() && !fanartfile.startsWith('/')
1003  && !fanartfile.isEmpty())
1004  return generate_file_url(QStringLiteral(u"Fanart"), GetHost(),
1005  fanartfile);
1006  return fanartfile;
1007  }
1008 
1009  if ((name == QStringLiteral(u"smartimage")) ||
1010  (name == QStringLiteral(u"buttonimage")))
1011  {
1012  if (GetSeason() > 0 || GetEpisode() > 0)
1013  {
1014  QString screenshotfile = GetImage("screenshot");
1015  if (!screenshotfile.isEmpty())
1016  return screenshotfile;
1017  }
1018  return GetImage("coverart");
1019  }
1020 
1021  return {};
1022 }
1023 
1027 namespace
1028 {
1029  QString eatBraces(const QString &title, const QString &left_brace,
1030  const QString &right_brace)
1031  {
1032  QString ret(title);
1033  bool keep_checking = true;
1034 
1035  while (keep_checking)
1036  {
1037  int left_position = ret.indexOf(left_brace);
1038  int right_position = ret.indexOf(right_brace);
1039  if (left_position == -1 || right_position == -1)
1040  {
1041  //
1042  // No matching sets of these braces left.
1043  //
1044 
1045  keep_checking = false;
1046  }
1047  else
1048  {
1049  if (left_position < right_position)
1050  {
1051  //
1052  // We have a matching set like: ( foo )
1053  //
1054 
1055  ret = ret.left(left_position) +
1056  ret.right(ret.length() - right_position - 1);
1057  }
1058  else if (left_position > right_position)
1059  {
1060  //
1061  // We have a matching set like: ) foo (
1062  //
1063 
1064  ret = ret.left(right_position) +
1065  ret.right(ret.length() - left_position - 1);
1066  }
1067  }
1068  }
1069 
1070  return ret;
1071  }
1072 }
1073 
1074 int VideoMetadata::UpdateHashedDBRecord(const QString &hash,
1075  const QString &file_name,
1076  const QString &host)
1077 {
1078  MSqlQuery query(MSqlQuery::InitCon());
1079 
1080  query.prepare("SELECT intid,filename FROM videometadata WHERE "
1081  "hash = :HASH");
1082  query.bindValue(":HASH", hash);
1083 
1084  if (!query.exec() || !query.isActive())
1085  {
1086  MythDB::DBError("Video hashed metadata update", query);
1087  return -1;
1088  }
1089 
1090  if (!query.next())
1091  return -1;
1092 
1093  int intid = query.value(0).toInt();
1094  QString oldfilename = query.value(1).toString();
1095 
1096  query.prepare("UPDATE videometadata SET filename = :FILENAME, "
1097  "host = :HOST WHERE intid = :INTID");
1098  query.bindValue(":FILENAME", file_name);
1099  query.bindValue(":HOST", host);
1100  query.bindValue(":INTID", intid);
1101 
1102  if (!query.exec() || !query.isActive())
1103  {
1104  MythDB::DBError("Video hashed metadata update (videometadata)", query);
1105  return -1;
1106  }
1107 
1108  query.prepare("UPDATE filemarkup SET filename = :FILENAME "
1109  "WHERE filename = :OLDFILENAME");
1110  query.bindValue(":FILENAME", file_name);
1111  query.bindValue(":OLDFILENAME", oldfilename);
1112 
1113  if (!query.exec() || !query.isActive())
1114  {
1115  MythDB::DBError("Video hashed metadata update (filemarkup)", query);
1116  return -1;
1117  }
1118 
1119  return intid;
1120 }
1121 
1122 QString VideoMetadata::VideoFileHash(const QString &file_name,
1123  const QString &host)
1124 {
1125  if (host.isEmpty())
1126  return FileHash(file_name);
1127 
1129  {
1130  StorageGroup sgroup("Videos", host);
1131  QString fullname = sgroup.FindFile(file_name);
1132 
1133  return FileHash(fullname);
1134  }
1135 
1136  QString url = generate_file_url("Videos", host, file_name);
1137 
1138  return RemoteFile::GetFileHash(url);
1139 }
1140 
1141 QString VideoMetadata::FilenameToMeta(const QString &file_name, int position)
1142 {
1143  // position 1 returns title, 2 returns season,
1144  // 3 returns episode, 4 returns subtitle
1145 
1146  QString cleanFilename = file_name.left(file_name.lastIndexOf('.'));
1147  static const QRegularExpression kSpaceRE { "%20" };
1148  static const QRegularExpression kUnderscoreRE { "_" };
1149  static const QRegularExpression kDotRE { "\\." };
1150  cleanFilename.replace(kSpaceRE, " ");
1151  cleanFilename.replace(kUnderscoreRE, " ");
1152  cleanFilename.replace(kDotRE, " ");
1153 
1154  /*: Word(s) which should be recognized as "season" when parsing a video
1155  * file name. To list more than one word, separate them with a '|'.
1156  */
1157  QString season_translation = tr("Season", "Metadata file name parsing");
1158 
1159  /*: Word(s) which should be recognized as "episode" when parsing a video
1160  * file name. To list more than one word, separate them with a '|'.
1161  */
1162  QString episode_translation = tr("Episode", "Metadata file name parsing");
1163 
1164  // Primary Regexp
1165  QString separator = "(?:\\s?(?:-|/)?\\s?)?";
1166  QString regexp = QString(
1167  "^(.*[^s0-9])" // Title
1168  "%1" // optional separator
1169  "(?:s|(?:Season|%2))?" // season marker
1170  "%1" // optional separator
1171  "(\\d{1,4})" // Season
1172  "%1" // optional separator
1173  "(?:[ex/]|Episode|%3)" // episode marker
1174  "%1" // optional separator
1175  "(\\d{1,3})" // Episode
1176  "%1" // optional separator
1177  "(.*)$" // Subtitle
1178  ).arg(separator, season_translation, episode_translation);
1179  static const QRegularExpression filename_parse { regexp,
1180  QRegularExpression::CaseInsensitiveOption|QRegularExpression::UseUnicodePropertiesOption };
1181 
1182  // Cleanup Regexp
1183  QString regexp2 = QString("(%1(?:(?:Season|%2)%1\\d*%1)*%1)$")
1184  .arg(separator, season_translation);
1185  static const QRegularExpression title_parse {regexp2,
1186  QRegularExpression::CaseInsensitiveOption|QRegularExpression::UseUnicodePropertiesOption };
1187 
1188  auto match = filename_parse.match(cleanFilename);
1189  if (match.hasMatch())
1190  {
1191  // Return requested value
1192  if (position == 1 && !match.capturedView(1).isEmpty())
1193  {
1194  // Clean up the title
1195  QString title = match.captured(1);
1196  match = title_parse.match(title);
1197  if (match.hasMatch())
1198  title = title.left(match.capturedStart());
1199  title = title.right(title.length() - title.lastIndexOf('/') -1);
1200  return title.trimmed();
1201  }
1202  if (position == 2)
1203  return match.captured(2).trimmed();
1204  if (position == 3)
1205  return match.captured(3).trimmed();
1206  if (position == 4)
1207  return match.captured(4).trimmed();
1208  }
1209  else if (position == 1)
1210  {
1211  QString title = cleanFilename;
1212 
1213  // Clean up the title
1214  title = title.right(title.length() -
1215  title.lastIndexOf('/') -1);
1216 
1217  title = eatBraces(title, "[", "]");
1218  title = eatBraces(title, "(", ")");
1219  title = eatBraces(title, "{", "}");
1220  return title.trimmed();
1221  }
1222  else if (position == 2 || position == 3)
1223  return {"0"};
1224 
1225  return {};
1226 }
1227 
1228 VideoMetadata::VideoMetadata(const QString &filename, const QString &sortFilename,
1229  const QString &hash, const QString &trailer, const QString &coverfile,
1230  const QString &screenshot, const QString &banner, const QString &fanart,
1231  const QString &title, const QString &sortTitle,
1232  const QString &subtitle, const QString &sortSubtitle, const QString &tagline,
1233  int year, const QDate releasedate, const QString &inetref, int collectionref,
1234  const QString &homepage, const QString &director, const QString &studio,
1235  const QString &plot, float userrating, const QString &rating,
1236  int length, int playcount, int season, int episode, const QDate insertdate,
1237  int id, ParentalLevel::Level showlevel, int categoryID,
1238  int childID, bool browse, bool watched,
1239  const QString &playcommand, const QString &category,
1240  const genre_list &genres,
1241  const country_list &countries,
1242  const cast_list &cast,
1243  const QString &host, bool processed,
1244  VideoContentType contenttype)
1245 {
1246  m_imp = new VideoMetadataImp(filename, sortFilename, hash, trailer, coverfile,
1247  screenshot, banner, fanart, title, sortTitle, subtitle,
1248  sortSubtitle, tagline, year, releasedate, inetref,
1249  collectionref, homepage, director, studio, plot, userrating, rating,
1250  length, playcount, season, episode, insertdate, id, showlevel, categoryID,
1251  childID, browse, watched, playcommand, category, genres, countries,
1252  cast, host, processed, contenttype);
1253 }
1254 
1256 {
1257  delete m_imp;
1258 }
1259 
1261 {
1262  m_imp = new VideoMetadataImp(query);
1263 }
1264 
1265 VideoMetadata::VideoMetadata(const VideoMetadata &rhs) : m_imp(nullptr)
1266 {
1267  *this = rhs;
1268 }
1269 
1271 {
1272  if (this != &rhs)
1273  {
1274  m_imp = new VideoMetadataImp(*(rhs.m_imp));
1275  }
1276 
1277  return *this;
1278 }
1279 
1280 void VideoMetadata::toMap(InfoMap &metadataMap)
1281 {
1282  GetImageMap(metadataMap);
1283 
1284  metadataMap[QStringLiteral(u"filename")] = GetFilename();
1285  metadataMap[QStringLiteral(u"sortfilename")] = GetSortFilename();
1286  metadataMap[QStringLiteral(u"title")] = GetTitle();
1287  metadataMap[QStringLiteral(u"sorttitle")] = GetSortTitle();
1288  metadataMap[QStringLiteral(u"subtitle")] = GetSubtitle();
1289  metadataMap[QStringLiteral(u"sortsubtitle")] = GetSortSubtitle();
1290  metadataMap[QStringLiteral(u"tagline")] = GetTagline();
1291  metadataMap[QStringLiteral(u"director")] = GetDirector();
1292  metadataMap[QStringLiteral(u"studio")] = GetStudio();
1293  metadataMap[QStringLiteral(u"description0")] = metadataMap[QStringLiteral(u"description")] = GetPlot();
1294  metadataMap[QStringLiteral(u"genres")] = GetDisplayGenres(*this);
1295  metadataMap[QStringLiteral(u"countries")] = GetDisplayCountries(*this);
1296  metadataMap[QStringLiteral(u"cast")] = GetDisplayCast(*this).join(", ");
1297  metadataMap[QStringLiteral(u"rating")] = GetDisplayRating(GetRating());
1298  metadataMap[QStringLiteral(u"length")] = GetDisplayLength(GetLength());
1299  metadataMap[QStringLiteral(u"playcount")] = QString::number(GetPlayCount());
1300  metadataMap[QStringLiteral(u"year")] = GetDisplayYear(GetYear());
1301 
1302  metadataMap[QStringLiteral(u"releasedate")] = MythDate::toString(
1304 
1305  metadataMap[QStringLiteral(u"userrating")] = GetDisplayUserRating(GetUserRating());
1306 
1307  if (GetSeason() > 0 || GetEpisode() > 0)
1308  {
1309  metadataMap[QStringLiteral(u"season")] = StringUtil::intToPaddedString(GetSeason(), 1);
1310  metadataMap[QStringLiteral(u"episode")] = StringUtil::intToPaddedString(GetEpisode(), 1);
1311  QString usingSE = QStringLiteral(u"s%1e%2")
1314  metadataMap[QStringLiteral(u"s##e##")] = metadataMap[QStringLiteral(u"s00e00")] = usingSE;
1315  QString usingX = QStringLiteral(u"%1x%2")
1318  metadataMap[QStringLiteral(u"##x##")] = metadataMap[QStringLiteral(u"00x00")] = usingX;
1319  }
1320  else
1321  {
1322  metadataMap[QStringLiteral(u"s##e##")] = metadataMap[QStringLiteral(u"##x##")] = QString();
1323  metadataMap[QStringLiteral(u"s00e00")] = metadataMap[QStringLiteral(u"00x00")] = QString();
1324  metadataMap[QStringLiteral(u"season")] = metadataMap[QStringLiteral(u"episode")] = QString();
1325  }
1326 
1327  GetStateMap(metadataMap);
1328 
1329  metadataMap[QStringLiteral(u"insertdate")] = MythDate::toString(
1331  metadataMap[QStringLiteral(u"inetref")] = GetInetRef();
1332  metadataMap[QStringLiteral(u"homepage")] = GetHomepage();
1333  metadataMap[QStringLiteral(u"child_id")] = QString::number(GetChildID());
1334  metadataMap[QStringLiteral(u"browseable")] = GetDisplayBrowse(GetBrowse());
1335  metadataMap[QStringLiteral(u"watched")] = GetDisplayWatched(GetWatched());
1336  metadataMap[QStringLiteral(u"processed")] = GetDisplayProcessed(GetProcessed());
1337  metadataMap[QStringLiteral(u"category")] = GetCategory();
1338 }
1339 
1340 // This should be the equivalent of toMap, only the text strings
1341 // are computed one at a time as needed.
1342 QString VideoMetadata::GetText(const QString& name) const
1343 {
1344  if (name == QStringLiteral(u"filename"))
1345  return GetFilename();
1346  if (name == QStringLiteral(u"sortfilename"))
1347  return GetSortFilename();
1348  if (name == QStringLiteral(u"title"))
1349  return GetTitle();
1350  if (name == QStringLiteral(u"sorttitle"))
1351  return GetSortTitle();
1352  if (name == QStringLiteral(u"subtitle"))
1353  return GetSubtitle();
1354  if (name == QStringLiteral(u"sortsubtitle"))
1355  return GetSortSubtitle();
1356  if (name == QStringLiteral(u"tagline"))
1357  return GetTagline();
1358  if (name == QStringLiteral(u"director"))
1359  return GetDirector();
1360  if (name == QStringLiteral(u"studio"))
1361  return GetStudio();
1362  if ((name == QStringLiteral(u"description")) ||
1363  (name == QStringLiteral(u"description0")))
1364  return GetPlot();
1365  if (name == QStringLiteral(u"genres"))
1366  return GetDisplayGenres(*this);
1367  if (name == QStringLiteral(u"countries"))
1368  return GetDisplayCountries(*this);
1369  if (name == QStringLiteral(u"cast"))
1370  return GetDisplayCast(*this).join(", ");
1371  if (name == QStringLiteral(u"rating"))
1372  return GetDisplayRating(GetRating());
1373  if (name == QStringLiteral(u"length"))
1374  return GetDisplayLength(GetLength());
1375  if (name == QStringLiteral(u"playcount"))
1376  return QString::number(GetPlayCount());
1377  if (name == QStringLiteral(u"year"))
1378  return GetDisplayYear(GetYear());
1379 
1380  if (name == QStringLiteral(u"releasedate"))
1382 
1383  if (name == QStringLiteral(u"userrating"))
1385 
1386  if (GetSeason() > 0 || GetEpisode() > 0)
1387  {
1388  if (name == QStringLiteral(u"season"))
1390  if (name == QStringLiteral(u"episode"))
1392  if ((name == QStringLiteral(u"s##e##")) ||
1393  (name == QStringLiteral(u"s00e00")))
1394  {
1395  return QStringLiteral(u"s%1e%2")
1398  }
1399  if ((name == QStringLiteral(u"##x##")) ||
1400  (name == QStringLiteral(u"00x00")))
1401  {
1402  return QStringLiteral(u"%1x%2")
1405  }
1406  }
1407 
1408  if (name == QStringLiteral(u"insertdate"))
1409  return MythDate::toString(
1411  if (name == QStringLiteral(u"inetref"))
1412  return GetInetRef();
1413  if (name == QStringLiteral(u"homepage"))
1414  return GetHomepage();
1415  if (name == QStringLiteral(u"child_id"))
1416  return QString::number(GetChildID());
1417  if (name == QStringLiteral(u"browseable"))
1418  return GetDisplayBrowse(GetBrowse());
1419  if (name == QStringLiteral(u"watched"))
1420  return GetDisplayWatched(GetWatched());
1421  if (name == QStringLiteral(u"processed"))
1423  if (name == QStringLiteral(u"category"))
1424  return GetCategory();
1425  return {};
1426 }
1427 
1429 {
1430  stateMap[QStringLiteral(u"trailerstate")] = TrailerToState(GetTrailer());
1431  stateMap[QStringLiteral(u"userratingstate")] =
1432  QString::number((int)(GetUserRating()));
1433  stateMap[QStringLiteral(u"watchedstate")] = WatchedToState(GetWatched());
1434  stateMap[QStringLiteral(u"videolevel")] = ParentalLevelToState(GetShowLevel());
1435 }
1436 
1437 // This should be the equivalent of GetStateMap, only the state strings
1438 // are computed one at a time as needed.
1439 QString VideoMetadata::GetState(const QString& name) const
1440 {
1441  if (name == QStringLiteral(u"trailerstate"))
1442  return TrailerToState(GetTrailer());
1443  if (name == QStringLiteral(u"userratingstate"))
1444  return QString::number((int)(GetUserRating()));
1445  if (name == QStringLiteral(u"watchedstate"))
1446  return WatchedToState(GetWatched());
1447  if (name == QStringLiteral(u"videolevel"))
1449  return {};
1450 }
1451 
1453 {
1454  m_imp->GetImageMap(imageMap);
1455 }
1456 
1457 QString VideoMetadata::GetImage(const QString& name) const
1458 {
1459  return m_imp->GetImage(name);
1460 }
1461 
1462 void ClearMap(InfoMap &metadataMap)
1463 {
1464  metadataMap["coverfile"] = "";
1465  metadataMap["screenshotfile"] = "";
1466  metadataMap["bannerfile"] = "";
1467  metadataMap["fanartfile"] = "";
1468  metadataMap["filename"] = "";
1469  metadataMap["sortfilename"] = "";
1470  metadataMap["title"] = "";
1471  metadataMap["sorttitle"] = "";
1472  metadataMap["subtitle"] = "";
1473  metadataMap["sortsubtitle"] = "";
1474  metadataMap["tagline"] = "";
1475  metadataMap["director"] = "";
1476  metadataMap["studio"] = "";
1477  metadataMap["description"] = "";
1478  metadataMap["description0"] = "";
1479  metadataMap["genres"] = "";
1480  metadataMap["countries"] = "";
1481  metadataMap["cast"] = "";
1482  metadataMap["rating"] = "";
1483  metadataMap["length"] = "";
1484  metadataMap["playcount"] = "";
1485  metadataMap["year"] = "";
1486  metadataMap["releasedate"] = "";
1487  metadataMap["userrating"] = "";
1488  metadataMap["season"] = "";
1489  metadataMap["episode"] = "";
1490  metadataMap["s##e##"] = "";
1491  metadataMap["##x##"] = "";
1492  metadataMap["trailerstate"] = "";
1493  metadataMap["userratingstate"] = "";
1494  metadataMap["watchedstate"] = "";
1495  metadataMap["videolevel"] = "";
1496  metadataMap["insertdate"] = "";
1497  metadataMap["inetref"] = "";
1498  metadataMap["homepage"] = "";
1499  metadataMap["child_id"] = "";
1500  metadataMap["browseable"] = "";
1501  metadataMap["watched"] = "";
1502  metadataMap["category"] = "";
1503  metadataMap["processed"] = "";
1504 }
1505 
1506 QString VideoMetadata::MetadataGetTextCb(const QString& name, void *data)
1507 {
1508  if (data == nullptr)
1509  return {};
1510  auto *metadata = static_cast<VideoMetadata *>(data);
1511  QString result = metadata->GetText(name);
1512  if (!result.isEmpty())
1513  return result;
1514  result = metadata->GetImage(name);
1515  if (!result.isEmpty())
1516  return result;
1517  return metadata->GetState(name);
1518 }
1519 
1520 QString VideoMetadata::MetadataGetImageCb(const QString& name, void *data)
1521 {
1522  if (data == nullptr)
1523  return {};
1524  auto *metadata = static_cast<VideoMetadata *>(data);
1525  return metadata->GetImage(name);
1526 }
1527 
1528 QString VideoMetadata::MetadataGetStateCb(const QString& name, void *data)
1529 {
1530  if (data == nullptr)
1531  return {};
1532  auto *metadata = static_cast<VideoMetadata *>(data);
1533  return metadata->GetState(name);
1534 }
1535 
1536 const QString &VideoMetadata::GetPrefix() const
1537 {
1538  return m_imp->GetPrefix();
1539 }
1540 
1541 void VideoMetadata::SetPrefix(const QString &prefix)
1542 {
1544 }
1545 
1546 const QString &VideoMetadata::GetTitle() const
1547 {
1548  return m_imp->getTitle();
1549 }
1550 
1551 const QString &VideoMetadata::GetSortTitle() const
1552 {
1553  return m_imp->getSortTitle();
1554 }
1555 
1556 void VideoMetadata::SetTitle(const QString &title, const QString &sortTitle)
1557 {
1558  m_imp->SetTitle(title, sortTitle);
1559 }
1560 
1561 const QString &VideoMetadata::GetSubtitle() const
1562 {
1563  return m_imp->getSubtitle();
1564 }
1565 
1566 const QString &VideoMetadata::GetSortSubtitle() const
1567 {
1568  return m_imp->getSortSubtitle();
1569 }
1570 
1571 void VideoMetadata::SetSubtitle(const QString &subtitle, const QString &sortSubtitle)
1572 {
1573  m_imp->SetSubtitle(subtitle, sortSubtitle);
1574 }
1575 
1576 const QString &VideoMetadata::GetTagline() const
1577 {
1578  return m_imp->GetTagline();
1579 }
1580 
1581 void VideoMetadata::SetTagline(const QString &tagline)
1582 {
1583  m_imp->SetTagline(tagline);
1584 }
1585 
1587 {
1588  return m_imp->getYear();
1589 }
1590 
1592 {
1593  m_imp->SetYear(year);
1594 }
1595 
1597 {
1598  return m_imp->getReleaseDate();
1599 }
1600 
1601 void VideoMetadata::SetReleaseDate(QDate releasedate)
1602 {
1603  m_imp->SetReleaseDate(releasedate);
1604 }
1605 
1606 const QString &VideoMetadata::GetInetRef() const
1607 {
1608  return m_imp->GetInetRef();
1609 }
1610 
1611 void VideoMetadata::SetInetRef(const QString &inetRef)
1612 {
1613  m_imp->SetInetRef(inetRef);
1614 }
1615 
1617 {
1618  return m_imp->GetCollectionRef();
1619 }
1620 
1621 void VideoMetadata::SetCollectionRef(int collectionref)
1622 {
1623  m_imp->SetCollectionRef(collectionref);
1624 }
1625 
1626 const QString &VideoMetadata::GetHomepage() const
1627 {
1628  return m_imp->GetHomepage();
1629 }
1630 
1631 void VideoMetadata::SetHomepage(const QString &homepage)
1632 {
1633  m_imp->SetHomepage(homepage);
1634 }
1635 
1636 const QString &VideoMetadata::GetDirector() const
1637 {
1638  return m_imp->getDirector();
1639 }
1640 
1641 void VideoMetadata::SetDirector(const QString &director)
1642 {
1643  m_imp->SetDirector(director);
1644 }
1645 
1646 const QString &VideoMetadata::GetStudio() const
1647 {
1648  return m_imp->getStudio();
1649 }
1650 
1651 void VideoMetadata::SetStudio(const QString &studio)
1652 {
1653  m_imp->SetStudio(studio);
1654 }
1655 
1656 const QString &VideoMetadata::GetPlot() const
1657 {
1658  return m_imp->getPlot();
1659 }
1660 
1661 void VideoMetadata::SetPlot(const QString &plot)
1662 {
1663  m_imp->SetPlot(plot);
1664 }
1665 
1667 {
1668  return m_imp->GetUserRating();
1669 }
1670 
1671 void VideoMetadata::SetUserRating(float userRating)
1672 {
1673  m_imp->SetUserRating(userRating);
1674 }
1675 
1676 const QString &VideoMetadata::GetRating() const
1677 {
1678  return m_imp->GetRating();
1679 }
1680 
1681 void VideoMetadata::SetRating(const QString &rating)
1682 {
1684 }
1685 
1686 std::chrono::minutes VideoMetadata::GetLength() const
1687 {
1688  return m_imp->GetLength();
1689 }
1690 
1691 void VideoMetadata::SetLength(std::chrono::minutes length)
1692 {
1693  m_imp->SetLength(length);
1694 }
1695 
1696 unsigned int VideoMetadata::GetPlayCount() const
1697 {
1698  return m_imp->GetPlayCount();
1699 }
1700 
1702 {
1703  m_imp->SetPlayCount(count);
1704 }
1705 
1707 {
1708  return m_imp->GetSeason();
1709 }
1710 
1712 {
1713  m_imp->SetSeason(season);
1714 }
1715 
1717 {
1718  return m_imp->GetEpisode();
1719 }
1720 
1721 void VideoMetadata::SetEpisode(int episode)
1722 {
1723  m_imp->SetEpisode(episode);
1724 }
1725 
1727 {
1728  return m_imp->GetInsertdate();
1729 }
1730 
1732 {
1733  m_imp->SetInsertdate(date);
1734 }
1735 
1736 unsigned int VideoMetadata::GetID() const
1737 {
1738  return m_imp->GetID();
1739 }
1740 
1742 {
1743  m_imp->SetID(id);
1744 }
1745 
1747 {
1748  return m_imp->GetChildID();
1749 }
1750 
1751 void VideoMetadata::SetChildID(int childID)
1752 {
1753  m_imp->SetChildID(childID);
1754 }
1755 
1757 {
1758  return m_imp->GetBrowse();
1759 }
1760 
1761 void VideoMetadata::SetBrowse(bool browse)
1762 {
1763  m_imp->SetBrowse(browse);
1764 }
1765 
1767 {
1768  return m_imp->GetWatched();
1769 }
1770 
1771 void VideoMetadata::SetWatched(bool watched)
1772 {
1773  m_imp->SetWatched(watched);
1774 }
1775 
1777 {
1778  return m_imp->GetProcessed();
1779 }
1780 
1781 void VideoMetadata::SetProcessed(bool processed)
1782 {
1783  m_imp->SetProcessed(processed);
1784 }
1785 
1787 {
1788  return m_imp->GetContentType();
1789 }
1790 
1792 {
1793  m_imp->SetContentType(contenttype);
1794 }
1795 
1796 const QString &VideoMetadata::GetPlayCommand() const
1797 {
1798  return m_imp->getPlayCommand();
1799 }
1800 
1801 void VideoMetadata::SetPlayCommand(const QString &playCommand)
1802 {
1803  m_imp->SetPlayCommand(playCommand);
1804 }
1805 
1807 {
1808  return m_imp->GetShowLevel();
1809 }
1810 
1812 {
1813  m_imp->SetShowLevel(showLevel);
1814 }
1815 
1816 const QString &VideoMetadata::GetFilename() const
1817 {
1818  return m_imp->getFilename();
1819 }
1820 
1821 const QString &VideoMetadata::GetSortFilename() const
1822 {
1823  return m_imp->getSortFilename();
1824 }
1825 
1826 const QString &VideoMetadata::GetHash() const
1827 {
1828  return m_imp->GetHash();
1829 }
1830 
1831 void VideoMetadata::SetHash(const QString &hash)
1832 {
1833  m_imp->SetHash(hash);
1834 }
1835 
1836 const QString &VideoMetadata::GetHost() const
1837 {
1838  return m_imp->GetHost();
1839 }
1840 
1841 void VideoMetadata::SetHost(const QString &host)
1842 {
1843  m_imp->SetHost(host);
1844 }
1845 
1846 void VideoMetadata::SetFilename(const QString &filename, const QString &sortFilename)
1847 {
1848  m_imp->SetFilename(filename, sortFilename);
1849 }
1850 
1851 const QString &VideoMetadata::GetTrailer() const
1852 {
1853  return m_imp->GetTrailer();
1854 }
1855 
1856 void VideoMetadata::SetTrailer(const QString &trailer)
1857 {
1858  m_imp->SetTrailer(trailer);
1859 }
1860 
1861 const QString &VideoMetadata::GetCoverFile() const
1862 {
1863  return m_imp->GetCoverFile();
1864 }
1865 
1866 void VideoMetadata::SetCoverFile(const QString &coverFile)
1867 {
1868  m_imp->SetCoverFile(coverFile);
1869 }
1870 
1871 const QString &VideoMetadata::GetScreenshot() const
1872 {
1873  return m_imp->GetScreenshot();
1874 }
1875 
1876 void VideoMetadata::SetScreenshot(const QString &screenshot)
1877 {
1878  m_imp->SetScreenshot(screenshot);
1879 }
1880 
1881 const QString &VideoMetadata::GetBanner() const
1882 {
1883  return m_imp->GetBanner();
1884 }
1885 
1886 void VideoMetadata::SetBanner(const QString &banner)
1887 {
1888  m_imp->SetBanner(banner);
1889 }
1890 
1891 const QString &VideoMetadata::GetFanart() const
1892 {
1893  return m_imp->GetFanart();
1894 }
1895 
1896 void VideoMetadata::SetFanart(const QString &fanart)
1897 {
1898  m_imp->SetFanart(fanart);
1899 }
1900 
1901 const QString &VideoMetadata::GetCategory() const
1902 {
1903  return m_imp->GetCategory();
1904 }
1905 
1906 //void VideoMetadata::SetCategory(const QString &category)
1907 //{
1908 // m_imp->SetCategory(category);
1909 //}
1910 
1912 {
1913  return m_imp->getGenres();
1914 }
1915 
1917 {
1918  m_imp->SetGenres(genres);
1919 }
1920 
1922 {
1923  return m_imp->GetCast();
1924 }
1925 
1927 {
1928  m_imp->SetCast(cast);
1929 }
1930 
1932 {
1933  return m_imp->GetCountries();
1934 }
1935 
1937 {
1938  m_imp->SetCountries(countries);
1939 }
1940 
1942 {
1943  return m_imp->GetCategoryID();
1944 }
1945 
1947 {
1948  m_imp->SetCategoryID(id);
1949 }
1950 
1952 {
1953  m_imp->SaveToDatabase();
1954 }
1955 
1957 {
1958  m_imp->UpdateDatabase();
1959 }
1960 
1962 {
1963  return m_imp->DeleteFromDatabase();
1964 }
1965 
1966 #if 0
1967 bool VideoMetadata::fillDataFromID(const VideoMetadataListManager &cache)
1968 {
1969  if (m_imp->getID() == 0)
1970  return false;
1971 
1973  if (mp.get())
1974  {
1975  *this = *mp;
1976  return true;
1977  }
1978 
1979  return false;
1980 }
1981 #endif
1982 
1984 {
1985  if (m_imp->getFilename().isEmpty())
1986  return false;
1987 
1989  cache.byFilename(m_imp->getFilename());
1990  if (mp)
1991  {
1992  *this = *mp;
1993  return true;
1994  }
1995 
1996  return false;
1997 }
1998 
2000 {
2001  return m_imp->DeleteFile();
2002 }
2003 
2005 {
2006  m_imp->Reset();
2007 }
2008 
2010 {
2011  return m_imp->IsHostSet();
2012 }
2013 
2015 {
2016  return m_imp->sortBefore(rhs.m_imp);
2017 }
2018 
2019 bool operator==(const VideoMetadata& a, const VideoMetadata& b)
2020 {
2021  return a.GetFilename() == b.GetFilename();
2022 }
2023 
2024 bool operator!=(const VideoMetadata& a, const VideoMetadata& b)
2025 {
2026  return a.GetFilename() != b.GetFilename();
2027 }
VideoMetadataImp::GetFanart
const QString & GetFanart() const
Definition: videometadata.cpp:266
VideoMetadata::toMap
void toMap(InfoMap &metadataMap)
Definition: videometadata.cpp:1280
ternarycompare.h
VideoMetadataImp::fillGenres
void fillGenres()
Definition: videometadata.cpp:498
MSqlQuery::isActive
bool isActive(void) const
Definition: mythdbcon.h:216
VideoMetadataImp::SetEpisode
void SetEpisode(int episode)
Definition: videometadata.cpp:294
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:811
VideoMetadataImp::getStudio
const QString & getStudio() const
Definition: videometadata.cpp:207
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
VideoMetadataImp::m_inetref
QString m_inetref
Definition: videometadata.cpp:355
generate_file_url
QString generate_file_url(const QString &storage_group, const QString &host, const QString &path)
Definition: videoutils.h:65
VideoMetadata
Definition: videometadata.h:24
VideoMetadata::SetID
void SetID(int id)
Definition: videometadata.cpp:1741
VideoMetadata::SetTrailer
void SetTrailer(const QString &trailer)
Definition: videometadata.cpp:1856
VideoMetadataImp::m_processed
bool m_processed
Definition: videometadata.cpp:391
MythDate::toString
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:84
MSqlQuery::bindValueNoNull
void bindValueNoNull(const QString &placeholder, const QVariant &val)
Add a single binding, taking care not to set a NULL value.
Definition: mythdbcon.cpp:901
VideoMetadata::SetPlot
void SetPlot(const QString &plot)
Definition: videometadata.cpp:1661
VideoMetadata::SetCollectionRef
void SetCollectionRef(int collectionref)
Definition: videometadata.cpp:1621
VideoMetadata::FilenameToMeta
static QString FilenameToMeta(const QString &file_name, int position)
Definition: videometadata.cpp:1141
WatchedToState
QString WatchedToState(bool watched)
Definition: videoutils.cpp:272
VideoMetadataImp::getTitle
const QString & getTitle() const
Definition: videometadata.cpp:175
VideoMetadataImp::removeDir
bool removeDir(const QString &dirName)
Definition: videometadata.cpp:414
VideoMetadataImp::getFilename
const QString & getFilename() const
Definition: videometadata.cpp:240
VideoMetadataImp::SetScreenshot
void SetScreenshot(const QString &screenshot)
Definition: videometadata.cpp:261
VideoMetadataImp::m_homepage
QString m_homepage
Definition: videometadata.cpp:357
VideoMetadataImp::m_browse
bool m_browse
Definition: videometadata.cpp:387
VideoMetadata::GetReleaseDate
QDate GetReleaseDate() const
Definition: videometadata.cpp:1596
VideoMetadata::GetShowLevel
ParentalLevel::Level GetShowLevel() const
Definition: videometadata.cpp:1806
VideoMetadata::SetHomepage
void SetHomepage(const QString &homepage)
Definition: videometadata.cpp:1631
getMythSortHelper
std::shared_ptr< MythSortHelper > getMythSortHelper(void)
Get a pointer to the MythSortHelper singleton.
Definition: mythsorthelper.cpp:133
SingleValue::add
int add(const QString &name)
Definition: dbaccess.cpp:214
VideoMetadata::SetFanart
void SetFanart(const QString &fanart)
Definition: videometadata.cpp:1896
ParentalLevel::plLowest
@ plLowest
Definition: parentalcontrols.h:12
VideoMetadataImp::GetTagline
const QString & GetTagline() const
Definition: videometadata.cpp:192
mythdb.h
VideoMetadata::MetadataGetImageCb
static QString MetadataGetImageCb(const QString &name, void *data)
Definition: videometadata.cpp:1520
VideoMetadata::GetHost
const QString & GetHost() const
Definition: videometadata.cpp:1836
VideoMetadataImp::getSortFilename
const QString & getSortFilename() const
Definition: videometadata.cpp:241
VideoMetadataImp::SetCast
void SetCast(const cast_list &cast)
Definition: videometadata.cpp:235
VideoCountry
Definition: dbaccess.h:76
VideoMetadataListManager
Definition: videometadatalistmanager.h:10
VideoMetadataImp::SaveToDatabase
void SaveToDatabase()
Definition: videometadata.cpp:767
VideoMetadataImp::GetSeason
int GetSeason() const
Definition: videometadata.cpp:290
VideoMetadataImp::GetHomepage
const QString & GetHomepage() const
Definition: videometadata.cpp:201
VideoMetadataImp::SetCoverFile
void SetCoverFile(const QString &coverFile)
Definition: videometadata.cpp:258
RemoteFile::Exists
static bool Exists(const QString &url, struct stat *fileinfo)
Definition: remotefile.cpp:454
simple_ref_ptr
Definition: quicksp.h:24
VideoMetadataImp::SetFilename
void SetFilename(const QString &filename, const QString &sortFilename="")
Definition: videometadata.cpp:242
VideoMetadataImp::SetChildID
void SetChildID(int childID)
Definition: videometadata.cpp:276
VideoMetadataImp::m_tagline
QString m_tagline
Definition: videometadata.cpp:354
VideoCast
Definition: dbaccess.h:116
VideoMetadataImp::m_categoryID
int m_categoryID
Definition: videometadata.cpp:377
VideoMetadataImp::DeleteFile
bool DeleteFile()
Deletes the file associated with a metadata entry.
Definition: videometadata.cpp:443
StorageGroup::FindFile
QString FindFile(const QString &filename)
Definition: storagegroup.cpp:602
VideoMetadataImp::SetGenres
void SetGenres(const genre_list &genres)
Definition: videometadata.cpp:226
VideoMetadata::GetInsertdate
QDate GetInsertdate() const
Definition: videometadata.cpp:1726
VideoMetadata::GetChildID
int GetChildID() const
Definition: videometadata.cpp:1746
hardwareprofile.devicelist.cat
def cat(file_name)
Definition: devicelist.py:95
VideoMetadataImp::m_collectionref
int m_collectionref
Definition: videometadata.cpp:356
VideoMetadataImp::SetProcessed
void SetProcessed(bool processed)
Definition: videometadata.cpp:318
VideoMetadataImp::GetScreenshot
const QString & GetScreenshot() const
Definition: videometadata.cpp:260
VideoMetadata::SetFilename
void SetFilename(const QString &filename, const QString &sortFilename="")
Definition: videometadata.cpp:1846
VideoMetadata::GetFanart
const QString & GetFanart() const
Definition: videometadata.cpp:1891
VideoMetadataImp::SetHost
void SetHost(const QString &host)
Definition: videometadata.cpp:238
VideoMetadata::SetEpisode
void SetEpisode(int episode)
Definition: videometadata.cpp:1721
VideoMetadataImp::SetPlayCommand
void SetPlayCommand(const QString &playCommand)
Definition: videometadata.cpp:217
VideoMetadata::SetBanner
void SetBanner(const QString &banner)
Definition: videometadata.cpp:1886
VideoMetadataImp::UpdateDatabase
void UpdateDatabase()
Definition: videometadata.cpp:772
VideoMetadataImp::GetHost
const QString & GetHost() const
Definition: videometadata.cpp:237
VideoMetadata::SetUserRating
void SetUserRating(float userRating)
Definition: videometadata.cpp:1671
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:205
GetDisplayLength
QString GetDisplayLength(std::chrono::minutes length)
Definition: videoutils.cpp:155
VideoMetadataImp::m_childID
int m_childID
Definition: videometadata.cpp:378
GetDisplayProcessed
QString GetDisplayProcessed(bool processed)
Definition: videoutils.cpp:187
VideoMetadata::country_list
std::vector< country_entry > country_list
Definition: videometadata.h:33
ContentTypeFromString
VideoContentType ContentTypeFromString(const QString &type)
Definition: videoutils.cpp:282
VideoMetadataImp::SetFanart
void SetFanart(const QString &fanart)
Definition: videometadata.cpp:267
VideoMetadataImp::GetLength
std::chrono::minutes GetLength() const
Definition: videometadata.cpp:284
VideoMetadataImp::sortBefore
bool sortBefore(const VideoMetadataImp *rhs) const
Returns true if the object should appear before the argument.
Definition: videometadata.cpp:404
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:617
VideoMetadataListManager::byFilename
VideoMetadataPtr byFilename(const QString &file_name) const
Definition: videometadatalistmanager.cpp:171
VideoMetadataImp::SetYear
void SetYear(int year)
Definition: videometadata.cpp:279
VideoMetadata::GetPlayCommand
const QString & GetPlayCommand() const
Definition: videometadata.cpp:1796
ContentTypeToString
QString ContentTypeToString(VideoContentType type)
Definition: videoutils.cpp:300
VideoMetadataImp::cast_list
VideoMetadata::cast_list cast_list
Definition: videometadata.cpp:35
VideoMetadataImp::SetWatched
void SetWatched(bool watched)
Definition: videometadata.cpp:309
VideoMetadata::GetHomepage
const QString & GetHomepage() const
Definition: videometadata.cpp:1626
VideoMetadata::GetSeason
int GetSeason() const
Definition: videometadata.cpp:1706
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
VideoMetadata::genre_list
std::vector< genre_entry > genre_list
Definition: videometadata.h:32
VideoMetadata::SetPlayCount
void SetPlayCount(int count)
Definition: videometadata.cpp:1701
mythsorthelper.h
VideoMetadataImp::m_countries
country_list m_countries
Definition: videometadata.cpp:365
VideoMetadataImp::SetTagline
void SetTagline(const QString &tagline)
Definition: videometadata.cpp:193
VideoMetadata::SetInetRef
void SetInetRef(const QString &inetRef)
Definition: videometadata.cpp:1611
VideoMetadata::SetShowLevel
void SetShowLevel(ParentalLevel::Level showLevel)
Definition: videometadata.cpp:1811
VideoMetadataImp::m_genres
genre_list m_genres
Definition: videometadata.cpp:364
VideoMetadataImp::m_category
QString m_category
Definition: videometadata.cpp:363
VideoMetadataImp::ensureSortFields
void ensureSortFields(void)
Definition: videometadata.cpp:160
VideoMetadata::GetCategoryID
int GetCategoryID() const
Definition: videometadata.cpp:1941
VideoMetadataImp::updateGenres
void updateGenres()
Definition: videometadata.cpp:826
VideoMetadata::GetScreenshot
const QString & GetScreenshot() const
Definition: videometadata.cpp:1871
VideoMetadataImp::SetBanner
void SetBanner(const QString &banner)
Definition: videometadata.cpp:264
VideoMetadata::SetCast
void SetCast(const cast_list &cast)
Definition: videometadata.cpp:1926
remoteutil.h
VideoMetadata::GetDirector
const QString & GetDirector() const
Definition: videometadata.cpp:1636
VideoMetadataImp::SetHash
void SetHash(const QString &hash)
Definition: videometadata.cpp:252
VideoMetadataImp::m_coverfile
QString m_coverfile
Definition: videometadata.cpp:371
hardwareprofile.distros.mythtv_data.data_mythtv.prefix
string prefix
Definition: data_mythtv.py:40
VideoMetadata::GetPlot
const QString & GetPlot() const
Definition: videometadata.cpp:1656
VideoMetadataImp::m_rating
QString m_rating
Definition: videometadata.cpp:361
VideoMetadata::GetSubtitle
const QString & GetSubtitle() const
Definition: videometadata.cpp:1561
operator==
bool operator==(const VideoMetadata &a, const VideoMetadata &b)
Definition: videometadata.cpp:2019
VideoMetadataImp::GetCast
const cast_list & GetCast() const
Definition: videometadata.cpp:234
tmp
static guint32 * tmp
Definition: goom_core.cpp:26
VideoMetadataImp::m_director
QString m_director
Definition: videometadata.cpp:358
dbaccess.h
VideoMetadataImp::SetDirector
void SetDirector(const QString &director)
Definition: videometadata.cpp:205
VideoMetadataImp::GetID
unsigned int GetID() const
Definition: videometadata.cpp:311
InfoMap
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
VideoMetadataImp::m_sortFilename
QString m_sortFilename
Definition: videometadata.cpp:368
VideoMetadataImp::SetRating
void SetRating(const QString &rating)
Definition: videometadata.cpp:214
VideoMetadataImp::SetContentType
void SetContentType(VideoContentType contenttype)
Definition: videometadata.cpp:321
VideoMetadata::SetInsertdate
void SetInsertdate(QDate date)
Definition: videometadata.cpp:1731
VideoMetadataImp::getDirector
const QString & getDirector() const
Definition: videometadata.cpp:204
VideoGenreMap::getGenreMap
static VideoGenreMap & getGenreMap()
Definition: dbaccess.cpp:543
VideoMetadataImp::GetEpisode
int GetEpisode() const
Definition: videometadata.cpp:293
MythCoreContext::IsMasterBackend
bool IsMasterBackend(void)
is this the actual MBE process
Definition: mythcorecontext.cpp:694
VideoMetadataImp::VideoMetadataImp
VideoMetadataImp(MSqlQuery &query)
Definition: videometadata.cpp:92
mythdate.h
VideoMetadata::GetFilename
const QString & GetFilename() const
Definition: videometadata.cpp:1816
VideoMetadata::GetInetRef
const QString & GetInetRef() const
Definition: videometadata.cpp:1606
VideoMetadataImp::SetReleaseDate
void SetReleaseDate(QDate releasedate)
Definition: videometadata.cpp:282
GetDisplayRating
QString GetDisplayRating(const QString &rating)
Definition: videoutils.cpp:210
VideoMetadata::GetCountries
const country_list & GetCountries() const
Definition: videometadata.cpp:1931
VideoMetadataImp::m_hash
QString m_hash
Definition: videometadata.cpp:369
VideoGenre::getGenre
static VideoGenre & getGenre()
Definition: dbaccess.cpp:515
mythlogging.h
VideoMetadataImp::GetBanner
const QString & GetBanner() const
Definition: videometadata.cpp:263
VideoMetadataImp::m_season
int m_season
Definition: videometadata.cpp:383
VideoMetadata::GetCategory
const QString & GetCategory() const
Definition: videometadata.cpp:1901
VideoMetadataImp::m_title
QString m_title
Definition: videometadata.cpp:350
ParentalLevel::plNone
@ plNone
Definition: parentalcontrols.h:12
VideoMetadata::GetProcessed
bool GetProcessed() const
Definition: videometadata.cpp:1776
GetDisplayUserRating
QString GetDisplayUserRating(float userrating)
Definition: videoutils.cpp:150
MultiValue::add
int add(int id, int value)
Definition: dbaccess.cpp:445
remotefile.h
VideoMetadataImp::m_fanart
QString m_fanart
Definition: videometadata.cpp:374
VideoMetadataImp::genre_list
VideoMetadata::genre_list genre_list
Definition: videometadata.cpp:33
VideoMetadata::SetLength
void SetLength(std::chrono::minutes length)
Definition: videometadata.cpp:1691
ParentalLevel::Level
Level
Definition: parentalcontrols.h:12
VideoMetadataImp::m_releasedate
QDate m_releasedate
Definition: videometadata.cpp:380
VideoMetadataImp::SetID
void SetID(int id)
Definition: videometadata.cpp:312
VideoMetadata::GetContentType
VideoContentType GetContentType() const
Definition: videometadata.cpp:1786
globals.h
VideoMetadataImp::fillCountries
void fillCountries()
Definition: videometadata.cpp:516
VideoMetadataImp::getPlot
const QString & getPlot() const
Definition: videometadata.cpp:210
VideoMetadataImp::m_length
std::chrono::minutes m_length
Definition: videometadata.cpp:381
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:549
VideoMetadataImp::GetBrowse
bool GetBrowse() const
Definition: videometadata.cpp:305
VideoMetadata::UpdateHashedDBRecord
static int UpdateHashedDBRecord(const QString &hash, const QString &file_name, const QString &host)
Definition: videometadata.cpp:1074
GetDisplayCountries
QString GetDisplayCountries(const VideoMetadata &item)
Definition: videoutils.cpp:224
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
VideoMetadataImp::SetCategoryID
void SetCategoryID(int id)
Definition: videometadata.cpp:801
VideoMetadata::SaveToDatabase
void SaveToDatabase()
Definition: videometadata.cpp:1951
VideoMetadataImp::getSortSubtitle
const QString & getSortSubtitle() const
Definition: videometadata.cpp:185
VideoMetadataImp::DeleteFromDatabase
bool DeleteFromDatabase()
Definition: videometadata.cpp:777
VideoMetadataImp::m_playcount
int m_playcount
Definition: videometadata.cpp:382
VideoMetadataImp::m_screenshot
QString m_screenshot
Definition: videometadata.cpp:372
hardwareprofile.scan.rating
def rating(profile, smoonURL, gate)
Definition: scan.py:39
VideoMetadataImp::SetBrowse
void SetBrowse(bool browse)
Definition: videometadata.cpp:306
StringUtil::naturalCompare
MBASE_PUBLIC int naturalCompare(const QString &_a, const QString &_b, Qt::CaseSensitivity caseSensitivity=Qt::CaseSensitive)
This method chops the input a and b into pieces of digits and non-digits (a1.05 becomes a | 1 | .
Definition: stringutil.cpp:160
VideoMetadata::GetCollectionRef
int GetCollectionRef() const
Definition: videometadata.cpp:1616
VideoMetadataImp::fromDBRow
void fromDBRow(MSqlQuery &query)
Sets metadata from a DB row.
Definition: videometadata.cpp:556
VIDEO_COVERFILE_DEFAULT
const QString VIDEO_COVERFILE_DEFAULT
Definition: globals.cpp:25
VideoMetadataImp::getGenres
const genre_list & getGenres() const
Definition: videometadata.cpp:225
VideoMetadataImp::SetCollectionRef
void SetCollectionRef(int collectionref)
Definition: videometadata.cpp:199
VideoMetadata::SetProcessed
void SetProcessed(bool processed)
Definition: videometadata.cpp:1781
operator!=
bool operator!=(const VideoMetadata &a, const VideoMetadata &b)
Definition: videometadata.cpp:2024
VideoMetadataImp::m_watched
bool m_watched
Definition: videometadata.cpp:388
VideoMetadata::DeleteFromDatabase
bool DeleteFromDatabase()
Definition: videometadata.cpp:1961
stringutil.h
VideoMetadataImp::m_sortSubtitle
QString m_sortSubtitle
Definition: videometadata.cpp:353
VIDEO_PLOT_DEFAULT
const QString VIDEO_PLOT_DEFAULT
Definition: globals.cpp:32
RemoteFile::GetFileHash
static QString GetFileHash(const QString &url)
Definition: remotefile.cpp:546
VideoCastMap
Definition: dbaccess.h:126
GetDisplayBrowse
QString GetDisplayBrowse(bool browse)
Definition: videoutils.cpp:163
VideoMetadataImp::m_cast
cast_list m_cast
Definition: videometadata.cpp:366
VideoMetadata::GetYear
int GetYear() const
Definition: videometadata.cpp:1586
kContentTelevision
@ kContentTelevision
Definition: metadatacommon.h:62
VideoMetadataImp::GetContentType
VideoContentType GetContentType() const
Definition: videometadata.cpp:320
VideoMetadata::GetImageMap
void GetImageMap(InfoMap &imageMap)
Definition: videometadata.cpp:1452
VideoCountry::getCountry
static VideoCountry & getCountry()
Definition: dbaccess.cpp:501
VideoMetadataImp::SetTitle
void SetTitle(const QString &title, const QString &sortTitle="")
Definition: videometadata.cpp:177
VideoMetadata::GetSortFilename
const QString & GetSortFilename() const
Definition: videometadata.cpp:1821
VideoMetadataImp::GetInetRef
const QString & GetInetRef() const
Definition: videometadata.cpp:195
VideoMetadataImp::m_filename
QString m_filename
Definition: videometadata.cpp:367
VideoMetadataImp::GetCountries
const country_list & GetCountries() const
Definition: videometadata.cpp:228
VideoMetadata::SetPrefix
void SetPrefix(const QString &prefix)
Definition: videometadata.cpp:1541
storagegroup.h
ternary_compare
int ternary_compare(const QDateTime &a, const QDateTime &b)
balanced ternary (three way) comparison This is equivalent to C++20's operator <=>.
Definition: mythdate.h:76
StringUtil::intToPaddedString
QString intToPaddedString(int n, int width=2)
Creates a zero padded string representation of an integer.
Definition: stringutil.h:24
VideoMetadata::GetGenres
const genre_list & GetGenres() const
Definition: videometadata.cpp:1911
VideoMetadataImp::m_trailer
QString m_trailer
Definition: videometadata.cpp:370
RemoteFile::DeleteFile
static bool DeleteFile(const QString &url)
Definition: remotefile.cpp:411
VideoCategory::GetCategory
static VideoCategory & GetCategory()
Definition: dbaccess.cpp:487
VideoMetadata::SetSubtitle
void SetSubtitle(const QString &subtitle, const QString &sortSubtitle="")
Definition: videometadata.cpp:1571
VIDEO_TRAILER_DEFAULT
const QString VIDEO_TRAILER_DEFAULT
Definition: globals.cpp:26
VideoMetadata::operator=
VideoMetadata & operator=(const VideoMetadata &rhs)
Definition: videometadata.cpp:1270
VideoGenre
Definition: dbaccess.h:86
VideoMetadataImp::m_banner
QString m_banner
Definition: videometadata.cpp:373
VideoMetadata::GetEpisode
int GetEpisode() const
Definition: videometadata.cpp:1716
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:55
VideoMetadataImp::GetPlayCount
unsigned int GetPlayCount() const
Definition: videometadata.cpp:287
VideoMetadata::GetPrefix
const QString & GetPrefix() const
Definition: videometadata.cpp:1536
VideoMetadataImp::m_year
int m_year
Definition: videometadata.cpp:379
VideoMetadataImp::m_contenttype
VideoContentType m_contenttype
Definition: videometadata.cpp:392
VideoMetadataImp::GetChildID
int GetChildID() const
Definition: videometadata.cpp:275
VideoMetadata::FillDataFromFilename
bool FillDataFromFilename(const VideoMetadataListManager &cache)
Definition: videometadata.cpp:1983
VideoMetadataImp::SetInsertdate
void SetInsertdate(QDate date)
Definition: videometadata.cpp:297
VideoMetadataImp::SetPlot
void SetPlot(const QString &plot)
Definition: videometadata.cpp:211
VIDEO_INETREF_DEFAULT
const QString VIDEO_INETREF_DEFAULT
Definition: globals.cpp:24
VideoMetadata::sortBefore
bool sortBefore(const VideoMetadata &rhs) const
Definition: videometadata.cpp:2014
VIDEO_FANART_DEFAULT
const QString VIDEO_FANART_DEFAULT
Definition: globals.cpp:29
videometadatalistmanager.h
VideoMetadataImp::updateCountries
void updateCountries()
Definition: videometadata.cpp:847
VideoMetadataImp::SetUserRating
void SetUserRating(float userRating)
Definition: videometadata.cpp:315
VideoMetadataImp::GetImage
QString GetImage(const QString &name) const
Definition: videometadata.cpp:961
VideoMetadataImp::m_insertdate
QDate m_insertdate
Definition: videometadata.cpp:385
VideoMetadata::SetGenres
void SetGenres(const genre_list &genres)
Definition: videometadata.cpp:1916
VideoMetadata::GetHash
const QString & GetHash() const
Definition: videometadata.cpp:1826
VideoMetadata::SetPlayCommand
void SetPlayCommand(const QString &playCommand)
Definition: videometadata.cpp:1801
VideoMetadata::SetTagline
void SetTagline(const QString &tagline)
Definition: videometadata.cpp:1581
ParentalLevelToState
QString ParentalLevelToState(const ParentalLevel &level)
Definition: videoutils.cpp:238
IsDefaultCoverFile
bool IsDefaultCoverFile(const QString &coverfile)
Definition: videoutils.cpp:126
VideoMetadataImp::m_showlevel
ParentalLevel::Level m_showlevel
Definition: videometadata.cpp:386
MythDate::fromString
QDateTime fromString(const QString &dtstr)
Converts kFilename && kISODate formats to QDateTime.
Definition: mythdate.cpp:34
VideoMetadataImp::GetCoverFile
const QString & GetCoverFile() const
Definition: videometadata.cpp:257
VideoMetadataImp::operator=
VideoMetadataImp & operator=(const VideoMetadataImp &rhs)
Definition: videometadata.cpp:103
VideoCountryMap::getCountryMap
static VideoCountryMap & getCountryMap()
Definition: dbaccess.cpp:558
VideoMetadata::SetCategoryID
void SetCategoryID(int id)
Definition: videometadata.cpp:1946
VideoMetadataImp::m_subtitle
QString m_subtitle
Definition: videometadata.cpp:352
VideoMetadataImp::GetCategory
const QString & GetCategory() const
Definition: videometadata.cpp:222
VideoMetadataImp::SetPlayCount
void SetPlayCount(int playcount)
Definition: videometadata.cpp:288
VideoMetadataImp::GetHash
const QString & GetHash() const
Definition: videometadata.cpp:251
VideoMetadataImp::saveToDatabase
void saveToDatabase()
Definition: videometadata.cpp:613
VideoMetadata::SetSeason
void SetSeason(int season)
Definition: videometadata.cpp:1711
VideoMetadata::SetRating
void SetRating(const QString &rating)
Definition: videometadata.cpp:1681
VideoMetadataImp::GetUserRating
float GetUserRating() const
Definition: videometadata.cpp:314
VideoContentType
VideoContentType
Definition: metadatacommon.h:60
mythmiscutil.h
VideoMetadata::SetCoverFile
void SetCoverFile(const QString &coverFile)
Definition: videometadata.cpp:1866
VideoMetadataImp::SetTrailer
void SetTrailer(const QString &trailer)
Definition: videometadata.cpp:255
VideoMetadataImp::SetHomepage
void SetHomepage(const QString &homepage)
Definition: videometadata.cpp:202
MythDate::kAddYear
@ kAddYear
Add year to string if not included.
Definition: mythdate.h:25
VideoMetadataImp::SetLength
void SetLength(std::chrono::minutes length)
Definition: videometadata.cpp:285
VideoMetadataImp::getSortTitle
const QString & getSortTitle() const
Definition: videometadata.cpp:176
mythcorecontext.h
VideoMetadataImp::getPlayCommand
const QString & getPlayCommand() const
Definition: videometadata.cpp:216
VideoMetadata::cast_list
std::vector< cast_entry > cast_list
Definition: videometadata.h:34
VideoMetadata::SetHost
void SetHost(const QString &host)
Definition: videometadata.cpp:1841
VideoMetadata::SetDirector
void SetDirector(const QString &director)
Definition: videometadata.cpp:1641
VideoMetadata::GetText
QString GetText(const QString &name) const
Definition: videometadata.cpp:1342
VideoCast::GetCast
static VideoCast & GetCast()
Definition: dbaccess.cpp:529
VideoMetadata::GetUserRating
float GetUserRating() const
Definition: videometadata.cpp:1666
VideoMetadata::IsHostSet
bool IsHostSet() const
Definition: videometadata.cpp:2009
ParentalLevel
Definition: parentalcontrols.h:9
VideoMetadata::UpdateDatabase
void UpdateDatabase()
Definition: videometadata.cpp:1956
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:887
VIDEO_RATING_DEFAULT
const QString VIDEO_RATING_DEFAULT
Definition: globals.cpp:30
VideoMetadataImp::Reset
void Reset()
Definition: videometadata.cpp:474
std
Definition: mythchrono.h:23
VideoMetadata::GetWatched
bool GetWatched() const
Definition: videometadata.cpp:1766
MultiValue::get
bool get(int id, entry &values)
Definition: dbaccess.cpp:450
VideoMetadataImp::m_episode
int m_episode
Definition: videometadata.cpp:384
VideoMetadata::GetState
QString GetState(const QString &name) const
Definition: videometadata.cpp:1439
VideoMetadataImp::GetTrailer
const QString & GetTrailer() const
Definition: videometadata.cpp:254
VideoMetadata::SetContentType
void SetContentType(VideoContentType contenttype)
Definition: videometadata.cpp:1791
VideoMetadata::GetCoverFile
const QString & GetCoverFile() const
Definition: videometadata.cpp:1861
VideoMetadata::SetTitle
void SetTitle(const QString &title, const QString &sortTitle="")
Definition: videometadata.cpp:1556
hardwareprofile.distros.all.get
def get()
Definition: all.py:22
VideoMetadataImp::SetCountries
void SetCountries(const country_list &countries)
Definition: videometadata.cpp:229
VideoMetadata::SetStudio
void SetStudio(const QString &studio)
Definition: videometadata.cpp:1651
VideoMetadataImp::IsHostSet
bool IsHostSet() const
Definition: videometadata.cpp:493
mythcontext.h
VideoMetadataImp::m_studio
QString m_studio
Definition: videometadata.cpp:359
VideoMetadataImp::GetPrefix
const QString & GetPrefix() const
Definition: videometadata.cpp:172
VideoMetadataImp::SetSubtitle
void SetSubtitle(const QString &subtitle, const QString &sortSubtitle="")
Definition: videometadata.cpp:186
MultiValue::remove
void remove(int id, int value)
Definition: dbaccess.cpp:455
VideoMetadataImp
Definition: videometadata.cpp:30
VideoMetadata::GetLength
std::chrono::minutes GetLength() const
Definition: videometadata.cpp:1686
StorageGroup
Definition: storagegroup.h:11
VideoMetadataImp::m_prefix
QString m_prefix
Definition: videometadata.cpp:395
VideoMetadata::SetBrowse
void SetBrowse(bool browse)
Definition: videometadata.cpp:1761
VideoMetadataImp::VideoMetadataImp
VideoMetadataImp(const VideoMetadataImp &other)
Definition: videometadata.cpp:98
VideoMetadataImp::m_userrating
float m_userrating
Definition: videometadata.cpp:390
VideoMetadataImp::getReleaseDate
QDate getReleaseDate() const
Definition: videometadata.cpp:281
VideoMetadataImp::getYear
int getYear() const
Definition: videometadata.cpp:278
VideoMetadata::GetID
unsigned int GetID() const
Definition: videometadata.cpp:1736
VideoMetadata::SetYear
void SetYear(int year)
Definition: videometadata.cpp:1591
VIDEO_YEAR_DEFAULT
@ VIDEO_YEAR_DEFAULT
Definition: videometadata.h:18
VideoMetadata::GetSortTitle
const QString & GetSortTitle() const
Definition: videometadata.cpp:1551
VideoMetadataImp::GetShowLevel
ParentalLevel::Level GetShowLevel() const
Definition: videometadata.cpp:299
VideoMetadata::VideoMetadata
VideoMetadata(const QString &filename=QString(), const QString &sortFilename=QString(), const QString &hash=QString(), const QString &trailer=QString(), const QString &coverfile=QString(), const QString &screenshot=QString(), const QString &banner=QString(), const QString &fanart=QString(), const QString &title=QString(), const QString &sortTitle=QString(), const QString &subtitle=QString(), const QString &sortSubtitle=QString(), const QString &tagline=QString(), int year=VIDEO_YEAR_DEFAULT, QDate releasedate=QDate(), const QString &inetref=QString(), int collectionref=0, const QString &homepage=QString(), const QString &director=QString(), const QString &studio=QString(), const QString &plot=QString(), float userrating=0.0, const QString &rating=QString(), int length=0, int playcount=0, int season=0, int episode=0, QDate insertdate=QDate(), int id=0, ParentalLevel::Level showlevel=ParentalLevel::plLowest, int categoryID=0, int childID=-1, bool browse=true, bool watched=false, const QString &playcommand=QString(), const QString &category=QString(), const genre_list &genres=genre_list(), const country_list &countries=country_list(), const cast_list &cast=cast_list(), const QString &host="", bool processed=false, VideoContentType contenttype=kContentUnknown)
Definition: videometadata.cpp:1228
VideoMetadata::GetTitle
const QString & GetTitle() const
Definition: videometadata.cpp:1546
kContentMovie
@ kContentMovie
Definition: metadatacommon.h:61
VideoMetadata::SetScreenshot
void SetScreenshot(const QString &screenshot)
Definition: videometadata.cpp:1876
MythDate::kDateFull
@ kDateFull
Default local time.
Definition: mythdate.h:19
GetDisplayGenres
QString GetDisplayGenres(const VideoMetadata &item)
Definition: videoutils.cpp:217
VideoMetadata::SetWatched
void SetWatched(bool watched)
Definition: videometadata.cpp:1771
VideoMetadata::SetHash
void SetHash(const QString &hash)
Definition: videometadata.cpp:1831
VideoMetadata::GetSortSubtitle
const QString & GetSortSubtitle() const
Definition: videometadata.cpp:1566
VideoMetadata::m_imp
class VideoMetadataImp * m_imp
Definition: videometadata.h:242
VideoMetadataImp::m_id
unsigned int m_id
Definition: videometadata.cpp:389
VideoMetadata::GetTrailer
const QString & GetTrailer() const
Definition: videometadata.cpp:1851
VideoMetadataImp::country_list
VideoMetadata::country_list country_list
Definition: videometadata.cpp:34
VideoMetadataImp::SetShowLevel
void SetShowLevel(ParentalLevel::Level showLevel)
Definition: videometadata.cpp:300
MultiValue::entry::values
values_type values
Definition: dbaccess.h:44
kContentUnknown
@ kContentUnknown
Definition: metadatacommon.h:66
MythCoreContext::IsThisHost
bool IsThisHost(const QString &addr)
is this address mapped to this host
Definition: mythcorecontext.cpp:720
VideoCastMap::getCastMap
static VideoCastMap & getCastMap()
Definition: dbaccess.cpp:573
VideoMetadata::GetImage
QString GetImage(const QString &name) const
Definition: videometadata.cpp:1457
TrailerToState
QString TrailerToState(const QString &trailerFile)
Definition: videoutils.cpp:262
VideoMetadataImp::updateCast
void updateCast()
Definition: videometadata.cpp:868
VIDEO_BANNER_DEFAULT
const QString VIDEO_BANNER_DEFAULT
Definition: globals.cpp:28
d
static const iso6937table * d
Definition: iso6937tables.cpp:1025
VideoMetadata::GetRating
const QString & GetRating() const
Definition: videometadata.cpp:1676
VideoMetadataImp::GetProcessed
bool GetProcessed() const
Definition: videometadata.cpp:317
VideoMetadataImp::GetInsertdate
QDate GetInsertdate() const
Definition: videometadata.cpp:296
VideoCountryMap
Definition: dbaccess.h:106
VideoMetadata::MetadataGetTextCb
static QString MetadataGetTextCb(const QString &name, void *data)
Definition: videometadata.cpp:1506
VideoMetadata::DeleteFile
bool DeleteFile()
Definition: videometadata.cpp:1999
VideoMetadata::~VideoMetadata
~VideoMetadata()
Definition: videometadata.cpp:1255
VideoMetadataImp::GetRating
const QString & GetRating() const
Definition: videometadata.cpp:213
VideoMetadata::Reset
void Reset()
Resets to default metadata.
Definition: videometadata.cpp:2004
VideoMetadataImp::GetCollectionRef
int GetCollectionRef() const
Definition: videometadata.cpp:198
VideoMetadata::MetadataGetStateCb
static QString MetadataGetStateCb(const QString &name, void *data)
Definition: videometadata.cpp:1528
VideoMetadataImp::SetInetRef
void SetInetRef(const QString &inetRef)
Definition: videometadata.cpp:196
VideoMetadata::GetTagline
const QString & GetTagline() const
Definition: videometadata.cpp:1576
VideoMetadataImp::GetWatched
bool GetWatched() const
Definition: videometadata.cpp:308
VideoMetadataImp::SetStudio
void SetStudio(const QString &studio)
Definition: videometadata.cpp:208
VideoMetadata::GetBrowse
bool GetBrowse() const
Definition: videometadata.cpp:1756
VideoMetadataImp::SetSeason
void SetSeason(int season)
Definition: videometadata.cpp:291
build_compdb.filename
filename
Definition: build_compdb.py:21
VideoMetadata::GetBanner
const QString & GetBanner() const
Definition: videometadata.cpp:1881
VideoMetadata::VideoFileHash
static QString VideoFileHash(const QString &file_name, const QString &host)
Definition: videometadata.cpp:1122
VideoMetadataImp::getSubtitle
const QString & getSubtitle() const
Definition: videometadata.cpp:184
FileHash
QString FileHash(const QString &filename)
Definition: mythmiscutil.cpp:548
GetDisplayWatched
QString GetDisplayWatched(bool watched)
Definition: videoutils.cpp:175
VideoMetadataImp::m_plot
QString m_plot
Definition: videometadata.cpp:360
VideoMetadataImp::VideoMetadataImp
VideoMetadataImp(QString filename, QString sortFilename, QString hash, QString trailer, QString coverfile, QString screenshot, QString banner, QString fanart, const QString &title, QString sortTitle, const QString &subtitle, QString sortSubtitle, QString tagline, int year, const QDate releasedate, QString inetref, int collectionref, QString homepage, QString director, QString studio, QString plot, float userrating, QString rating, int length, int playcount, int season, int episode, const QDate insertdate, int id, ParentalLevel::Level showlevel, int categoryID, int childID, bool browse, bool watched, QString playcommand, QString category, genre_list genres, country_list countries, cast_list cast, QString host="", bool processed=false, VideoContentType contenttype=kContentUnknown)
Definition: videometadata.cpp:38
ParentalLevel::GetLevel
Level GetLevel() const
Definition: parentalcontrols.cpp:128
VideoMetadata::GetPlayCount
unsigned int GetPlayCount() const
Definition: videometadata.cpp:1696
GetDisplayCast
QStringList GetDisplayCast(const VideoMetadata &item)
Definition: videoutils.cpp:231
VideoMetadata::SetReleaseDate
void SetReleaseDate(QDate releasedate)
Definition: videometadata.cpp:1601
VideoMetadata::SetChildID
void SetChildID(int childID)
Definition: videometadata.cpp:1751
VideoMetadata::GetCast
const cast_list & GetCast() const
Definition: videometadata.cpp:1921
SingleValue::get
bool get(int id, QString &category)
Definition: dbaccess.cpp:219
VideoMetadata::GetStudio
const QString & GetStudio() const
Definition: videometadata.cpp:1646
VideoMetadataImp::GetImageMap
void GetImageMap(InfoMap &imageMap) const
Definition: videometadata.cpp:889
videoutils.h
VideoMetadata::SetCountries
void SetCountries(const country_list &countries)
Definition: videometadata.cpp:1936
VIDEO_DIRECTOR_DEFAULT
const QString VIDEO_DIRECTOR_DEFAULT
Definition: globals.cpp:23
VideoMetadataImp::m_playcommand
QString m_playcommand
Definition: videometadata.cpp:362
VideoMetadataImp::m_sortTitle
QString m_sortTitle
Definition: videometadata.cpp:351
VideoMetadataImp::m_host
QString m_host
Definition: videometadata.cpp:375
VideoMetadataImp::SetPrefix
void SetPrefix(const QString &prefix)
Definition: videometadata.cpp:173
simple_ref_ptr::get
T * get() const
Definition: quicksp.h:73
VideoMetadataImp::fillCast
void fillCast()
Definition: videometadata.cpp:534
VideoMetadata::GetStateMap
void GetStateMap(InfoMap &stateMap) const
Definition: videometadata.cpp:1428
VideoGenreMap
Definition: dbaccess.h:96
VIDEO_SCREENSHOT_DEFAULT
const QString VIDEO_SCREENSHOT_DEFAULT
Definition: globals.cpp:27
GetDisplayYear
QString GetDisplayYear(int year)
Definition: videoutils.cpp:205
VideoMetadataImp::GetCategoryID
int GetCategoryID() const
Definition: videometadata.cpp:269
MultiValue::entry
Definition: dbaccess.h:40
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:836
ClearMap
void ClearMap(InfoMap &metadataMap)
Definition: videometadata.cpp:1462
VideoMetadataListManager::byID
VideoMetadataPtr byID(unsigned int db_id) const
Definition: videometadatalistmanager.cpp:177
VIDEO_DIRECTOR_UNKNOWN
const QString VIDEO_DIRECTOR_UNKNOWN
Definition: globals.cpp:9