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