MythTV master
metadataimagehelper.cpp
Go to the documentation of this file.
2
3#include <QUrl>
4
9
10ArtworkMap GetArtwork(const QString& inetref,
11 uint season,
12 bool strict)
13{
14 ArtworkMap map;
15
16 if (inetref.isEmpty())
17 return map;
18
20
21 QString querystring = "SELECT host, coverart, fanart, banner "
22 "FROM recordedartwork WHERE inetref = :INETREF ";
23
24 if (strict)
25 {
26 querystring += "AND season = :SEASON;";
27 }
28 else
29 {
30 if (season > 0)
31 {
32 querystring += "ORDER BY season = :SEASON DESC, season DESC;";
33 }
34 else
35 {
36 querystring += "ORDER BY season DESC;";
37 }
38 }
39
40 query.prepare(querystring);
41
42 query.bindValue(":INETREF", inetref);
43 if (strict || season > 0)
44 query.bindValue(":SEASON", season);
45
46 if (!query.exec())
47 {
48 MythDB::DBError("GetArtwork SELECT", query);
49 return map;
50 }
51
52 if (query.next())
53 {
54 QString host = query.value(0).toString();
55 QString coverart = query.value(1).toString();
56 QString fanart = query.value(2).toString();
57 QString banner = query.value(3).toString();
58
59 if (!coverart.isEmpty())
60 {
61 ArtworkInfo coverartinfo;
62 coverartinfo.url = StorageGroup::generate_file_url("Coverart", host, coverart);
63 map.insert(kArtworkCoverart, coverartinfo);
64 }
65
66 if (!fanart.isEmpty())
67 {
68 ArtworkInfo fanartinfo;
69 fanartinfo.url = StorageGroup::generate_file_url("Fanart", host, fanart);
70 map.insert(kArtworkFanart, fanartinfo);
71 }
72
73 if (!banner.isEmpty())
74 {
75 ArtworkInfo bannerinfo;
76 bannerinfo.url = StorageGroup::generate_file_url("Banners", host, banner);
77 map.insert(kArtworkBanner, bannerinfo);
78 }
79 }
80
81 return map;
82}
83
84bool SetArtwork(const QString &inetref,
85 uint season,
86 const QString &host,
87 const QString &coverart,
88 const QString &fanart,
89 const QString &banner)
90{
91 bool ret = false;
92 ArtworkMap map;
93
94 if (!coverart.isEmpty())
95 {
96 ArtworkInfo coverartinfo;
97 coverartinfo.url = StorageGroup::generate_file_url("Coverart", host, coverart);
98 map.insert(kArtworkCoverart, coverartinfo);
99 }
100
101 if (!fanart.isEmpty())
102 {
103 ArtworkInfo fanartinfo;
104 fanartinfo.url = StorageGroup::generate_file_url("Fanart", host, fanart);
105 map.insert(kArtworkFanart, fanartinfo);
106 }
107
108 if (!banner.isEmpty())
109 {
110 ArtworkInfo bannerinfo;
111 bannerinfo.url = StorageGroup::generate_file_url("Banners", host, banner);
112 map.insert(kArtworkBanner, bannerinfo);
113 }
114
115 ret = SetArtwork(inetref, season, host, map);
116
117 return ret;
118}
119
120bool SetArtwork(const QString &inetref,
121 uint season,
122 const QString &host,
123 const ArtworkMap& map)
124{
125 if (inetref.isEmpty())
126 return false;
127
128 QString coverart;
129 QString fanart;
130 QString banner;
131
132 QUrl coverurl(map.value(kArtworkCoverart).url);
133 if (!coverurl.path().isEmpty())
134 {
135 coverart = coverurl.path();
136 coverart = coverart.remove(0,1);
137 }
138
139 QUrl fanarturl(map.value(kArtworkFanart).url);
140 if (!fanarturl.path().isEmpty())
141 {
142 fanart = fanarturl.path();
143 fanart = fanart.remove(0,1);
144 }
145
146 QUrl bannerurl(map.value(kArtworkBanner).url);
147 if (!bannerurl.path().isEmpty())
148 {
149 banner = bannerurl.path();
150 banner = banner.remove(0,1);
151 }
152
153 // Have to delete the old row for this item
154
155 MSqlQuery prequery(MSqlQuery::InitCon());
156 prequery.prepare("DELETE FROM recordedartwork WHERE "
157 "inetref = :INETREF AND season = :SEASON;");
158
159 prequery.bindValue(":INETREF", inetref);
160 prequery.bindValue(":SEASON", season);
161
162 if (!prequery.exec())
163 {
164 MythDB::DBError("SetArtwork DELETE FROM", prequery);
165 return false;
166 }
167
168 // Now we can insert the new
170 query.prepare("INSERT INTO recordedartwork(inetref,"
171 "season,host,coverart,fanart,banner) VALUES( "
172 ":INETREF, :SEASON, :HOST, :COVERART, "
173 ":FANART, :BANNER);");
174
175 query.bindValue(":INETREF", inetref);
176 query.bindValue(":SEASON", season);
177 query.bindValue(":HOST", host);
178 query.bindValueNoNull(":COVERART", coverart);
179 query.bindValueNoNull(":FANART", fanart);
180 query.bindValueNoNull(":BANNER", banner);
181
182 if (!query.exec())
183 {
184 MythDB::DBError("SetArtwork INSERT INTO", query);
185 return false;
186 }
187
188 return true;
189}
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:838
QVariant value(int i) const
Definition: mythdbcon.h:204
void bindValueNoNull(const QString &placeholder, const QVariant &val)
Add a single binding, taking care not to set a NULL value.
Definition: mythdbcon.cpp:903
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:619
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:889
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:813
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:551
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:225
static QString generate_file_url(const QString &storage_group, const QString &host, const QString &path)
unsigned int uint
Definition: compat.h:60
ArtworkMap GetArtwork(const QString &inetref, uint season, bool strict)
bool SetArtwork(const QString &inetref, uint season, const QString &host, const QString &coverart, const QString &fanart, const QString &banner)
QMultiMap< VideoArtworkType, ArtworkInfo > ArtworkMap
@ kArtworkFanart
@ kArtworkBanner
@ kArtworkCoverart