Go to the documentation of this file.
33 QString hash, QString trailer,
34 QString coverfile, QString screenshot, QString banner,
35 QString fanart,
const QString &
title, QString sortTitle,
36 const QString &subtitle, QString sortSubtitle,
37 QString tagline,
int year,
const QDate releasedate,
38 QString inetref,
int collectionref, QString homepage,
39 QString director, QString studio,
40 QString plot,
float userrating,
41 QString
rating,
int length,
int playcount,
42 int season,
int episode,
const QDate insertdate,
44 int childID,
bool browse,
bool watched,
45 QString playcommand, QString
category,
50 bool processed =
false,
72 if (
title.isEmpty() and subtitle.isEmpty()
73 and season == 0 and episode == 0)
180 void SetSubtitle(
const QString &subtitle,
const QString &sortSubtitle =
"") {
405 return (m_id < rhs->
m_id);
412 d.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
413 QFileInfoList contents =
d.entryInfoList();
414 if (contents.empty())
416 return d.rmdir(dirName);
419 for (
const auto& entry : qAsConst(contents))
423 QString fileName = entry.fileName();
429 if (!QFile(entry.fileName()).remove())
433 return d.rmdir(dirName);
439 bool isremoved =
false;
461 LOG(VB_GENERAL, LOG_DEBUG, QString(
"Could not delete file: %1")
500 for (
long value :
genres.values)
505 m_genres.push_back(genre_list::value_type(value, name));
523 m_countries.push_back(country_list::value_type(value, name));
536 for (
long value : cast.
values)
541 m_cast.push_back(cast_list::value_type(value, name));
625 QString coverfile = metadataMap[
"coverfile"];
626 QString screenshot = metadataMap[
"screenshotfile"];
627 QString bannerfile = metadataMap[
"bannerfile"];
628 QString fanartfile = metadataMap[
"fanartfile"];
644 if (m_userrating < -10.0F || m_userrating > 10.0F)
656 bool inserting =
m_id == 0;
666 query.
prepare(
"INSERT INTO videometadata (title,subtitle,tagline,director,studio,plot,"
667 "rating,year,userrating,length,season,episode,filename,hash,"
668 "showlevel,coverfile,inetref,homepage,browse,watched,trailer,"
669 "screenshot,banner,fanart,host,processed,contenttype) VALUES (:TITLE, :SUBTITLE, "
670 ":TAGLINE, :DIRECTOR, :STUDIO, :PLOT, :RATING, :YEAR, :USERRATING, "
671 ":LENGTH, :SEASON, :EPISODE, :FILENAME, :HASH, :SHOWLEVEL, "
672 ":COVERFILE, :INETREF, :HOMEPAGE, :BROWSE, :WATCHED, "
673 ":TRAILER, :SCREENSHOT, :BANNER, :FANART, :HOST, :PROCESSED, :CONTENTTYPE)");
677 query.
prepare(
"UPDATE videometadata SET title = :TITLE, subtitle = :SUBTITLE, "
678 "tagline = :TAGLINE, director = :DIRECTOR, studio = :STUDIO, "
679 "plot = :PLOT, rating= :RATING, year = :YEAR, "
680 "releasedate = :RELEASEDATE, userrating = :USERRATING, "
681 "length = :LENGTH, playcount = :PLAYCOUNT, season = :SEASON, "
682 "episode = :EPISODE, filename = :FILENAME, hash = :HASH, trailer = :TRAILER, "
683 "showlevel = :SHOWLEVEL, coverfile = :COVERFILE, "
684 "screenshot = :SCREENSHOT, banner = :BANNER, fanart = :FANART, "
685 "inetref = :INETREF, collectionref = :COLLECTION, homepage = :HOMEPAGE, "
686 "browse = :BROWSE, watched = :WATCHED, host = :HOST, playcommand = :PLAYCOMMAND, "
687 "childid = :CHILDID, category = :CATEGORY, processed = :PROCESSED, "
688 "contenttype = :CONTENTTYPE WHERE intid = :INTID");
748 LOG(VB_GENERAL, LOG_ERR,
749 QString(
"%1: The id of the last inserted row to "
750 "videometadata seems to be 0. This is odd.")
778 query.
prepare(
"DELETE FROM videometadata WHERE intid = :ID");
785 query.
prepare(
"DELETE FROM filemarkup WHERE filename = :FILENAME");
814 LOG(VB_GENERAL, LOG_ERR,
"Unknown category id");
828 if (!genre->second.trimmed().isEmpty())
849 if (!country->second.trimmed().isEmpty())
867 auto cast =
m_cast.begin();
868 while (cast !=
m_cast.end())
870 if (!cast->second.trimmed().isEmpty())
878 cast =
m_cast.erase(cast);
899 imageMap[
"coverfile"] = coverfile;
900 imageMap[
"coverart"] = coverfile;
902 QString screenshotfile;
914 imageMap[
"screenshotfile"] = screenshotfile;
915 imageMap[
"screenshot"] = screenshotfile;
929 imageMap[
"bannerfile"] = bannerfile;
930 imageMap[
"banner"] = bannerfile;
944 imageMap[
"fanartfile"] = fanartfile;
945 imageMap[
"fanart"] = fanartfile;
947 QString smartimage = coverfile;
949 smartimage = screenshotfile;
950 imageMap[
"smartimage"] = smartimage;
958 QString eatBraces(
const QString &
title,
const QString &left_brace,
959 const QString &right_brace)
962 bool keep_checking =
true;
964 while (keep_checking)
966 int left_position = ret.indexOf(left_brace);
967 int right_position = ret.indexOf(right_brace);
968 if (left_position == -1 || right_position == -1)
974 keep_checking =
false;
978 if (left_position < right_position)
984 ret = ret.left(left_position) +
985 ret.right(ret.length() - right_position - 1);
987 else if (left_position > right_position)
993 ret = ret.left(right_position) +
994 ret.right(ret.length() - left_position - 1);
1004 const QString &file_name,
1005 const QString &host)
1009 query.
prepare(
"SELECT intid,filename FROM videometadata WHERE "
1023 QString oldfilename =
query.
value(1).toString();
1025 query.
prepare(
"UPDATE videometadata SET filename = :FILENAME, "
1026 "host = :HOST WHERE intid = :INTID");
1037 query.
prepare(
"UPDATE filemarkup SET filename = :FILENAME "
1038 "WHERE filename = :OLDFILENAME");
1052 const QString &host)
1060 QString fullname = sgroup.
FindFile(file_name);
1075 QString cleanFilename = file_name.left(file_name.lastIndexOf(
'.'));
1076 cleanFilename.replace(QRegExp(
"%20"),
" ");
1077 cleanFilename.replace(QRegExp(
"_"),
" ");
1078 cleanFilename.replace(QRegExp(
"\\."),
" ");
1083 QString season_translation = tr(
"Season",
"Metadata file name parsing");
1088 QString episode_translation = tr(
"Episode",
"Metadata file name parsing");
1091 QString separator =
"(?:\\s?(?:-|/)?\\s?)?";
1092 QString regexp = QString(
1095 "(?:s|(?:Season|%2))?"
1099 "(?:[ex/]|Episode|%3)"
1105 .arg(season_translation).arg(episode_translation);
1106 QRegExp filename_parse(regexp,
1107 Qt::CaseInsensitive, QRegExp::RegExp2);
1110 QString regexp2 = QString(
"(%1(?:(?:Season|%2)%1\\d*%1)*%1)$")
1111 .arg(separator).arg(season_translation);
1112 QRegExp title_parse(regexp2, Qt::CaseInsensitive, QRegExp::RegExp2);
1114 int pos = filename_parse.indexIn(cleanFilename);
1117 QString
title = filename_parse.cap(1);
1118 QString season = filename_parse.cap(2);
1119 QString episode = filename_parse.cap(3);
1120 QString subtitle = filename_parse.cap(4);
1123 int pos2 = title_parse.indexIn(
title);
1127 title.lastIndexOf(
'/') -1);
1130 if (position == 1 && !
title.isEmpty())
1131 return title.trimmed();
1133 return season.trimmed();
1135 return episode.trimmed();
1137 return subtitle.trimmed();
1139 else if (position == 1)
1141 QString
title = cleanFilename;
1145 title.lastIndexOf(
'/') -1);
1150 return title.trimmed();
1152 else if (position == 2 || position == 3)
1153 return QString(
"0");
1159 const QString &hash,
const QString &trailer,
const QString &coverfile,
1160 const QString &screenshot,
const QString &banner,
const QString &fanart,
1161 const QString &
title,
const QString &sortTitle,
1162 const QString &subtitle,
const QString &sortSubtitle,
const QString &tagline,
1163 int year,
const QDate releasedate,
const QString &inetref,
int collectionref,
1164 const QString &homepage,
const QString &director,
const QString &studio,
1165 const QString &plot,
float userrating,
const QString &
rating,
1166 int length,
int playcount,
int season,
int episode,
const QDate insertdate,
1168 int childID,
bool browse,
bool watched,
1169 const QString &playcommand,
const QString &
category,
1173 const QString &host,
bool processed,
1177 screenshot, banner, fanart,
title, sortTitle, subtitle,
1178 sortSubtitle, tagline, year, releasedate, inetref,
1179 collectionref, homepage, director, studio, plot, userrating,
rating,
1180 length, playcount, season, episode, insertdate,
id, showlevel,
categoryID,
1182 cast, host, processed, contenttype);
1223 metadataMap[
"description0"] = metadataMap[
"description"] =
GetPlot();
1229 metadataMap[
"playcount"] = QString::number(
GetPlayCount());
1241 metadataMap[
"s##e##"] = metadataMap[
"s00e00"] = QString(
"s%1e%2")
1244 metadataMap[
"##x##"] = metadataMap[
"00x00"] = QString(
"%1x%2")
1250 metadataMap[
"s##e##"] = metadataMap[
"##x##"] = QString();
1251 metadataMap[
"s00e00"] = metadataMap[
"00x00"] = QString();
1252 metadataMap[
"season"] = metadataMap[
"episode"] = QString();
1261 metadataMap[
"child_id"] = QString::number(
GetChildID());
1272 stateMap[
"userratingstate"] =
1285 metadataMap[
"coverfile"] =
"";
1286 metadataMap[
"screenshotfile"] =
"";
1287 metadataMap[
"bannerfile"] =
"";
1288 metadataMap[
"fanartfile"] =
"";
1289 metadataMap[
"filename"] =
"";
1290 metadataMap[
"sortfilename"] =
"";
1291 metadataMap[
"title"] =
"";
1292 metadataMap[
"sorttitle"] =
"";
1293 metadataMap[
"subtitle"] =
"";
1294 metadataMap[
"sortsubtitle"] =
"";
1295 metadataMap[
"tagline"] =
"";
1296 metadataMap[
"director"] =
"";
1297 metadataMap[
"studio"] =
"";
1298 metadataMap[
"description"] =
"";
1299 metadataMap[
"description0"] =
"";
1300 metadataMap[
"genres"] =
"";
1301 metadataMap[
"countries"] =
"";
1302 metadataMap[
"cast"] =
"";
1303 metadataMap[
"rating"] =
"";
1304 metadataMap[
"length"] =
"";
1305 metadataMap[
"playcount"] =
"";
1306 metadataMap[
"year"] =
"";
1307 metadataMap[
"releasedate"] =
"";
1308 metadataMap[
"userrating"] =
"";
1309 metadataMap[
"season"] =
"";
1310 metadataMap[
"episode"] =
"";
1311 metadataMap[
"s##e##"] =
"";
1312 metadataMap[
"##x##"] =
"";
1313 metadataMap[
"trailerstate"] =
"";
1314 metadataMap[
"userratingstate"] =
"";
1315 metadataMap[
"watchedstate"] =
"";
1316 metadataMap[
"videolevel"] =
"";
1317 metadataMap[
"insertdate"] =
"";
1318 metadataMap[
"inetref"] =
"";
1319 metadataMap[
"homepage"] =
"";
1320 metadataMap[
"child_id"] =
"";
1321 metadataMap[
"browseable"] =
"";
1322 metadataMap[
"watched"] =
"";
1323 metadataMap[
"category"] =
"";
1324 metadataMap[
"processed"] =
"";
1760 if (
m_imp->getID() == 0)
bool isActive(void) const
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
QString generate_file_url(const QString &storage_group, const QString &host, const QString &path)
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
QString WatchedToState(bool watched)
std::shared_ptr< MythSortHelper > getMythSortHelper(void)
Get a pointer to the MythSortHelper singleton.
int add(const QString &name)
static bool Exists(const QString &url, struct stat *fileinfo)
QString FindFile(const QString &filename)
MPUBLIC QString format_season_and_episode(int seasEp, int digits)
QVariant value(int i) const
arg(title).arg(filename).arg(doDelete))
QString GetDisplayProcessed(bool processed)
VideoContentType ContentTypeFromString(const QString &type)
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
QString ContentTypeToString(VideoContentType type)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QString GetDisplayLength(int length)
QHash< QString, QString > InfoMap
static VideoGenreMap & getGenreMap()
bool IsMasterBackend(void)
is this the actual MBE process
QString GetDisplayRating(const QString &rating)
static VideoGenre & getGenre()
QString GetDisplayUserRating(float userrating)
int add(int id, int value)
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
QString GetDisplayCountries(const VideoMetadata &item)
static void DBError(const QString &where, const MSqlQuery &query)
def rating(profile, smoonURL, gate)
const QString VIDEO_COVERFILE_DEFAULT
const QString VIDEO_PLOT_DEFAULT
static QString GetFileHash(const QString &url)
QString GetDisplayBrowse(bool browse)
static VideoCountry & getCountry()
static bool DeleteFile(const QString &url)
static VideoCategory & GetCategory()
int naturalCompare(const QString &_a, const QString &_b, Qt::CaseSensitivity caseSensitivity)
const QString VIDEO_TRAILER_DEFAULT
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
const QString VIDEO_INETREF_DEFAULT
const QString VIDEO_FANART_DEFAULT
QString ParentalLevelToState(const ParentalLevel &level)
bool IsDefaultCoverFile(const QString &coverfile)
QDateTime fromString(const QString &dtstr)
Converts kFilename && kISODate formats to QDateTime.
static VideoCountryMap & getCountryMap()
@ kAddYear
Add year to string if not included.
static VideoCast & GetCast()
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
const QString VIDEO_RATING_DEFAULT
bool get(int id, entry &values)
void remove(int id, int value)
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)
@ kDateFull
Default local time.
QString GetDisplayGenres(const VideoMetadata &item)
bool IsThisHost(const QString &addr)
is this address mapped to this host
static VideoCastMap & getCastMap()
QString TrailerToState(const QString &trailerFile)
const QString VIDEO_BANNER_DEFAULT
static const iso6937table * d
QString FileHash(const QString &filename)
QString GetDisplayWatched(bool watched)
MSqlQuery query(MSqlQuery::InitCon())
QStringList GetDisplayCast(const VideoMetadata &item)
bool get(int id, QString &category)
const QString VIDEO_DIRECTOR_DEFAULT
const QString VIDEO_SCREENSHOT_DEFAULT
QString GetDisplayYear(int year)
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
const QString VIDEO_DIRECTOR_UNKNOWN