on xenial help sign in
Merged main branch.
95db08bPawel Stolowski
plugins/Utils/albumartprovider.cpp+23−18
@@ -24,14 +24,12 @@
24#include <QNetworkRequest>
24#include <QNetworkRequest>
25#include <QNetworkReply>
25#include <QNetworkReply>
26#include <QXmlQuery>
26#include <QXmlQuery>
27+#include <QTemporaryFile>
27#include <QBuffer>
28#include <QBuffer>
28−#include <cstdio>
29#include <QDebug>
29#include <QDebug>
30#include <QFile>
30#include <QFile>
31#include <QStringList>
31#include <QStringList>
32#include <QByteArray>
32#include <QByteArray>
33−#include <unistd.h>
34−#include <memory>
35#include <QImage>
33#include <QImage>
36#include <QUrl>
34#include <QUrl>
37
35
@@ -171,25 +169,32 @@ std::string AlbumArtProvider::get_image(const std::string &artist, const std::st
171 if(image_url.empty()) {
169 if(image_url.empty()) {
172 return DEFAULT_ALBUM_ART;
170 return DEFAULT_ALBUM_ART;
173 }
171 }
174− char tmpname[] = "/tmp/path/to/some/file/somewhere/maybe.jpg";
172+ QTemporaryFile tempFile;
175− tmpnam(tmpname);
173+ tempFile.open();
176− std::unique_ptr<char, int(*)(const char*)> deleter(tmpname, unlink);
174+ tempFile.setAutoRemove(true);
175+ QString fname = tempFile.fileName();
176+ std::string tmpname = fname.toUtf8().data();
177+
177 if(!download_and_store(image_url, tmpname)) {
178 if(!download_and_store(image_url, tmpname)) {
178 return DEFAULT_ALBUM_ART;
179 return DEFAULT_ALBUM_ART;
179 }
180 }
180− fix_format(tmpname);
181+ fix_format(tmpname.c_str());
181− FILE *f = fopen(tmpname, "r");
182+ QFile f(fname);
182− fseek(f, 0, SEEK_END);
183+ if(!f.open(QIODevice::ReadWrite)) {
183− long s = ftell(f);
184+ return DEFAULT_ALBUM_ART;
184− fseek(f, 0, SEEK_SET);
185+ }
185− char *buf = new char[s];
186+ QByteArray arr = f.readAll();
186− fread(buf, 1, s, f);
187+ f.close();
187− fclose(f);
188
188
189− // Fixme, leaks buf if throws.
190− cache.add_art(info.artist, info.album, buf, s);
189+ cache.add_art(info.artist, info.album, arr.data(), arr.size());
191− delete []buf;
190+ try {
192− return cache.get_art_file(info.artist, info.album);
191+ std::string res = cache.get_art_file(info.artist, info.album);
192+ if(res.empty())
193+ return DEFAULT_ALBUM_ART;
194+ return res;
195+ } catch(...) {
196+ }
197+ return DEFAULT_ALBUM_ART;
193}
198}
194
199
195QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
200QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {