00001 #include <QDir>
00002 #include <QFileInfo>
00003
00004 #include "mythdirs.h"
00005 #include "mythdb.h"
00006 #include "mythcontext.h"
00007
00008 #include "netutils.h"
00009
00010 QString GetDisplaySeasonEpisode(int seasEp, int digits)
00011 {
00012 QString seasEpNum;
00013
00014 if (seasEp > -1)
00015 {
00016 seasEpNum = QString::number(seasEp);
00017
00018 if (digits == 2 && seasEpNum.size() < 2)
00019 seasEpNum.prepend("0");
00020 }
00021
00022 return seasEpNum;
00023 }
00024
00025 bool findTreeGrabberInDB(const QString& commandline,
00026 ArticleType type)
00027 {
00028 MSqlQuery query(MSqlQuery::InitCon());
00029 query.prepare("SELECT * FROM internetcontent WHERE "
00030 "commandline = :COMMAND AND host = :HOST "
00031 "AND type = :TYPE AND tree = 1;");
00032 QFileInfo fi(commandline);
00033 query.bindValue(":COMMAND", fi.fileName());
00034 query.bindValue(":HOST", gCoreContext->GetHostName());
00035 query.bindValue(":TYPE", type);
00036 if (!query.exec() || !query.isActive())
00037 {
00038 MythDB::DBError("Tree find in db", query);
00039 return false;
00040 }
00041
00042 return query.size() > 0;
00043 }
00044
00045 bool findSearchGrabberInDB(const QString& commandline,
00046 ArticleType type)
00047 {
00048 MSqlQuery query(MSqlQuery::InitCon());
00049 query.prepare("SELECT * FROM internetcontent WHERE "
00050 "commandline = :COMMAND AND host = :HOST "
00051 "AND type = :TYPE AND search = 1;");
00052 QFileInfo fi(commandline);
00053 query.bindValue(":COMMAND", fi.fileName());
00054 query.bindValue(":HOST", gCoreContext->GetHostName());
00055 query.bindValue(":TYPE", type);
00056 if (!query.exec() || !query.isActive())
00057 {
00058 MythDB::DBError("Search find in db", query);
00059 return false;
00060 }
00061
00062 return query.size() > 0;
00063 }
00064
00065 GrabberScript* findTreeGrabberByCommand(const QString& commandline,
00066 ArticleType type)
00067 {
00068 MSqlQuery query(MSqlQuery::InitCon());
00069 query.prepare("SELECT name,thumbnail,author,description,commandline,"
00070 "version,search,tree FROM internetcontent "
00071 "WHERE commandline = :COMMAND AND "
00072 "host = :HOST AND type = :TYPE "
00073 "AND tree = 1;");
00074 QFileInfo fi(commandline);
00075 query.bindValue(":COMMAND", fi.fileName());
00076 query.bindValue(":HOST", gCoreContext->GetHostName());
00077 query.bindValue(":TYPE", type);
00078 if (!query.exec() || !query.isActive()) {
00079 MythDB::DBError("Tree find in db", query);
00080 }
00081
00082 QString title = query.value(0).toString();
00083 QString image = query.value(1).toString();
00084 QString author = query.value(2).toString();
00085 QString desc = query.value(3).toString();
00086 QString command = QString("%1/internetcontent/%2").arg(GetShareDir())
00087 .arg(query.value(4).toString());
00088 double ver = query.value(5).toDouble();
00089 bool search = query.value(6).toBool();
00090 bool tree = query.value(7).toBool();
00091
00092 GrabberScript *tmp = new GrabberScript(title, image, type, author, search,
00093 tree, desc, command, ver);
00094 return tmp;
00095 }
00096
00097 GrabberScript* findSearchGrabberByCommand(const QString& commandline,
00098 ArticleType type)
00099 {
00100 MSqlQuery query(MSqlQuery::InitCon());
00101 query.prepare("SELECT name,thumbnail,author,description,commandline,"
00102 "version,search,tree FROM internetcontent "
00103 "WHERE commandline = :COMMAND AND "
00104 "type = :TYPE AND host = :HOST AND "
00105 "search = 1;");
00106 QFileInfo fi(commandline);
00107 query.bindValue(":COMMAND", fi.fileName());
00108 query.bindValue(":HOST", gCoreContext->GetHostName());
00109 query.bindValue(":TYPE", type);
00110 if (!query.exec() || !query.isActive()) {
00111 MythDB::DBError("Search find in db", query);
00112 }
00113
00114 QString title = query.value(0).toString();
00115 QString image = query.value(1).toString();
00116 QString author = query.value(2).toString();
00117 QString desc = query.value(3).toString();
00118 QString command = QString("%1/internetcontent/%2").arg(GetShareDir())
00119 .arg(query.value(4).toString());
00120 double ver = query.value(5).toDouble();
00121 bool search = query.value(6).toBool();
00122 bool tree = query.value(7).toBool();
00123
00124 GrabberScript *tmp = new GrabberScript(title, image, type, author, search,
00125 tree, desc, command, ver);
00126 return tmp;
00127 }
00128
00129 GrabberScript::scriptList findAllDBTreeGrabbers()
00130 {
00131 MSqlQuery query(MSqlQuery::InitCon());
00132 query.prepare("SELECT DISTINCT name,thumbnail,type,"
00133 "author,description,commandline,"
00134 "version,search,tree FROM internetcontent "
00135 "where tree = 1 ORDER BY name;");
00136 if (!query.exec() || !query.isActive()) {
00137 MythDB::DBError("Tree find in db", query);
00138 }
00139
00140 GrabberScript::scriptList tmp;
00141
00142 while (query.next())
00143 {
00144 QString title = query.value(0).toString();
00145 QString image = query.value(1).toString();
00146 ArticleType type = (ArticleType)query.value(2).toInt();
00147 QString author = query.value(3).toString();
00148 QString desc = query.value(4).toString();
00149 QString commandline = QString("%1/internetcontent/%2").arg(GetShareDir())
00150 .arg(query.value(5).toString());
00151 double ver = query.value(6).toDouble();
00152 bool search = query.value(7).toBool();
00153 bool tree = query.value(8).toBool();
00154
00155 GrabberScript *script = new GrabberScript(title, image, type, author, search,
00156 tree, desc, commandline, ver);
00157 tmp.append(script);
00158 }
00159
00160 return tmp;
00161 }
00162
00163 GrabberScript::scriptList findAllDBTreeGrabbersByHost(ArticleType type)
00164 {
00165 MSqlQuery query(MSqlQuery::InitCon());
00166 query.prepare("SELECT name,thumbnail,author,description,commandline,"
00167 "version,search,tree FROM internetcontent "
00168 "WHERE host = :HOST AND type = :TYPE "
00169 "AND tree = 1 ORDER BY name;");
00170 query.bindValue(":HOST", gCoreContext->GetHostName());
00171 query.bindValue(":TYPE", type);
00172 if (!query.exec() || !query.isActive()) {
00173 MythDB::DBError("Tree find in db", query);
00174 }
00175
00176 GrabberScript::scriptList tmp;
00177
00178 while (query.next())
00179 {
00180 QString title = query.value(0).toString();
00181 QString image = query.value(1).toString();
00182 QString author = query.value(2).toString();
00183 QString desc = query.value(3).toString();
00184 QString commandline = QString("%1/internetcontent/%2").arg(GetShareDir())
00185 .arg(query.value(4).toString());
00186 double ver = query.value(5).toDouble();
00187 bool search = query.value(6).toBool();
00188 bool tree = query.value(7).toBool();
00189
00190 GrabberScript *script = new GrabberScript(title, image, type, author, search,
00191 tree, desc, commandline, ver);
00192 tmp.append(script);
00193 }
00194
00195 return tmp;
00196 }
00197
00198 GrabberScript::scriptList findAllDBSearchGrabbers(ArticleType type)
00199 {
00200 MSqlQuery query(MSqlQuery::InitCon());
00201 query.prepare("SELECT name,thumbnail,author,description,commandline,"
00202 "version,search,tree FROM internetcontent "
00203 "WHERE host = :HOST AND type = :TYPE "
00204 "AND search = 1 ORDER BY name;");
00205 query.bindValue(":HOST", gCoreContext->GetHostName());
00206 query.bindValue(":TYPE", type);
00207 if (!query.exec() || !query.isActive()) {
00208 MythDB::DBError("Search find in db", query);
00209 }
00210
00211 GrabberScript::scriptList tmp;
00212
00213 while (query.next())
00214 {
00215 QString title = query.value(0).toString();
00216 QString image = query.value(1).toString();
00217 QString author = query.value(2).toString();
00218 QString desc = query.value(3).toString();
00219 QString commandline = QString("%1/internetcontent/%2").arg(GetShareDir())
00220 .arg(query.value(4).toString());
00221 double ver = query.value(5).toDouble();
00222 bool search = query.value(6).toBool();
00223 bool tree = query.value(7).toBool();
00224
00225 GrabberScript *script = new GrabberScript(title, image, type, author, search,
00226 tree, desc, commandline, ver);
00227 tmp.append(script);
00228 }
00229
00230 return tmp;
00231 }
00232
00233 bool insertSearchInDB(GrabberScript* script, ArticleType type)
00234 {
00235 if (!script)
00236 return false;
00237
00238 return insertGrabberInDB(script->GetTitle(), script->GetImage(),
00239 type, script->GetAuthor(), script->GetDescription(),
00240 script->GetCommandline(), script->GetVersion(),
00241 true, false, false);
00242 }
00243
00244 bool insertTreeInDB(GrabberScript* script, ArticleType type)
00245 {
00246 if (!script)
00247 return false;
00248
00249 return insertGrabberInDB(script->GetTitle(), script->GetImage(),
00250 type, script->GetAuthor(), script->GetDescription(),
00251 script->GetCommandline(), script->GetVersion(),
00252 false, true, false);
00253 }
00254
00255 bool insertGrabberInDB(const QString &name, const QString &thumbnail,
00256 ArticleType type, const QString &author,
00257 const QString &description, const QString &commandline,
00258 const double &version, bool search, bool tree,
00259 bool podcast)
00260 {
00261 QFileInfo fi(thumbnail);
00262 QString thumbbase = fi.fileName();
00263
00264 MSqlQuery query(MSqlQuery::InitCon());
00265 query.prepare("INSERT INTO internetcontent (name,thumbnail,type,author,"
00266 "description,commandline,version,search,tree,podcast,"
00267 "host) "
00268 "VALUES( :NAME, :THUMBNAIL, :TYPE, :AUTHOR, :DESCRIPTION, :COMMAND, "
00269 ":VERSION, :SEARCH, :TREE, :PODCAST, :HOST);");
00270 query.bindValue(":NAME", name);
00271 query.bindValue(":THUMBNAIL", thumbbase);
00272 query.bindValue(":TYPE", type);
00273 query.bindValue(":AUTHOR", author);
00274 query.bindValue(":DESCRIPTION", description);
00275 QFileInfo cmd(commandline);
00276 query.bindValue(":COMMAND", cmd.fileName());
00277 query.bindValue(":VERSION", version);
00278 query.bindValue(":SEARCH", search);
00279 query.bindValue(":TREE", tree);
00280 query.bindValue(":PODCAST", podcast);
00281 query.bindValue(":HOST", gCoreContext->GetHostName());
00282 if (!query.exec() || !query.isActive()) {
00283 MythDB::DBError("netcontent: inserting in DB", query);
00284 return false;
00285 }
00286
00287 return (query.numRowsAffected() > 0);
00288 }
00289
00290 bool removeTreeFromDB(GrabberScript* script)
00291 {
00292 if (!script) return false;
00293
00294 return removeGrabberFromDB(script->GetCommandline(), false);
00295 }
00296
00297 bool removeSearchFromDB(GrabberScript* script)
00298 {
00299 if (!script) return false;
00300
00301 return removeGrabberFromDB(script->GetCommandline(), true);
00302 }
00303
00304 bool removeGrabberFromDB(const QString &commandline, const bool &search)
00305 {
00306 MSqlQuery query(MSqlQuery::InitCon());
00307 if (search)
00308 query.prepare("DELETE FROM internetcontent WHERE commandline = :COMMAND "
00309 "AND host = :HOST AND search = 1;");
00310 else
00311 query.prepare("DELETE FROM internetcontent WHERE commandline = :COMMAND "
00312 "AND host = :HOST AND search = 0;");
00313 QFileInfo fi(commandline);
00314 query.bindValue(":COMMAND", fi.fileName());
00315 query.bindValue(":HOST", gCoreContext->GetHostName());
00316 if (!query.exec() || !query.isActive()) {
00317 MythDB::DBError("netcontent: delete from db", query);
00318 return false;
00319 }
00320
00321 return (query.numRowsAffected() > 0);
00322 }
00323
00324 bool markTreeUpdated(GrabberScript* script, QDateTime curTime)
00325 {
00326 MSqlQuery query(MSqlQuery::InitCon());
00327 query.prepare("UPDATE internetcontent SET updated = :UPDATED "
00328 "WHERE commandline = :COMMAND AND tree = 1;");
00329 query.bindValue(":UPDATED", curTime);
00330 QFileInfo fi(script->GetCommandline());
00331 query.bindValue(":COMMAND", fi.fileName());
00332 if (!query.exec() || !query.isActive()) {
00333 MythDB::DBError("netcontent: update db time", query);
00334 return false;
00335 }
00336
00337 return (query.numRowsAffected() > 0);
00338 }
00339
00340 bool needsUpdate(GrabberScript* script, uint updateFreq)
00341 {
00342 QDateTime now = QDateTime::currentDateTime();
00343 QDateTime then = lastUpdate(script);
00344
00345 return then.addSecs(updateFreq * 60 * 60) < now;
00346 }
00347
00348 QDateTime lastUpdate(GrabberScript* script)
00349 {
00350 QDateTime updated;
00351 MSqlQuery query(MSqlQuery::InitCon());
00352 query.prepare("SELECT updated "
00353 "FROM internetcontent "
00354 "WHERE commandline = :COMMAND ORDER "
00355 "BY updated DESC LIMIT 1;");
00356 QFileInfo fi(script->GetCommandline());
00357 query.bindValue(":COMMAND", fi.fileName());
00358 if (!query.exec() || !query.isActive())
00359 {
00360 MythDB::DBError("Tree last update in db", query);
00361 }
00362 else if (query.next())
00363 updated = query.value(0).toDateTime();
00364
00365 return updated;
00366 }
00367
00368 bool clearTreeItems(const QString &feedcommand)
00369 {
00370 if (feedcommand.isEmpty())
00371 return false;
00372
00373 MSqlQuery query(MSqlQuery::InitCon());
00374 query.prepare("DELETE FROM internetcontentarticles "
00375 "WHERE feedtitle = :FEEDTITLE AND podcast = 0;");
00376 query.bindValue(":FEEDTITLE", feedcommand);
00377
00378 if (!query.exec() || !query.isActive())
00379 {
00380 MythDB::DBError("netcontent: clearing DB", query);
00381 return false;
00382 }
00383
00384 return (query.numRowsAffected() > 0);
00385 }
00386
00387 bool isTreeInUse(const QString &feedcommand)
00388 {
00389 if (feedcommand.isEmpty())
00390 return false;
00391
00392 MSqlQuery query(MSqlQuery::InitCon());
00393 query.prepare("SELECT * FROM internetcontent "
00394 "WHERE commandline = :COMMAND;");
00395 QFileInfo fi(feedcommand);
00396 query.bindValue(":COMMAND", fi.fileName());
00397
00398 if (!query.exec() || !query.isActive())
00399 {
00400 MythDB::DBError("netcontent: isTreeInUse", query);
00401 return false;
00402 }
00403
00404 return query.next();
00405 }
00406
00407 bool insertTreeArticleInDB(const QString &feedtitle, const QString &path,
00408 const QString &paththumb, ResultItem *item,
00409 ArticleType type)
00410 {
00411 if (!item || feedtitle.isEmpty() || path.isEmpty())
00412 return false;
00413
00414 MSqlQuery query(MSqlQuery::InitCon());
00415 query.prepare("INSERT INTO internetcontentarticles (feedtitle, path, paththumb, "
00416 " title, subtitle, description, url, type, thumbnail, mediaURL, author, "
00417 "date, time, rating, filesize, player, playerargs, download, "
00418 "downloadargs, width, height, language, podcast, downloadable, "
00419 "customhtml, countries, season, episode) "
00420 "VALUES( :FEEDTITLE, :PATH, :PATHTHUMB, :TITLE, :SUBTITLE, :DESCRIPTION, "
00421 ":URL, :TYPE, :THUMBNAIL, :MEDIAURL, :AUTHOR, :DATE, :TIME, :RATING, "
00422 ":FILESIZE, :PLAYER, :PLAYERARGS, :DOWNLOAD, :DOWNLOADARGS, :WIDTH, :HEIGHT, "
00423 ":LANGUAGE, :PODCAST, :DOWNLOADABLE, :CUSTOMHTML, :COUNTRIES, :SEASON, "
00424 ":EPISODE);");
00425 query.bindValue(":FEEDTITLE", feedtitle);
00426 query.bindValue(":PATH", path);
00427 query.bindValue(":PATHTHUMB", paththumb);
00428 query.bindValue(":TITLE", item->GetTitle());
00429 query.bindValue(":SUBTITLE", item->GetSubtitle().isNull() ? "" : item->GetSubtitle());
00430 query.bindValue(":DESCRIPTION", item->GetDescription());
00431 query.bindValue(":URL", item->GetURL());
00432 query.bindValue(":TYPE", type);
00433 query.bindValue(":THUMBNAIL", item->GetThumbnail());
00434 query.bindValue(":MEDIAURL", item->GetMediaURL());
00435 query.bindValue(":AUTHOR", item->GetAuthor());
00436 query.bindValue(":DATE", item->GetDate());
00437 QString time;
00438 if (item->GetTime().isEmpty())
00439 time = QString::number(0);
00440 else
00441 time = item->GetTime();
00442 query.bindValue(":TIME", time);
00443 query.bindValue(":RATING", item->GetRating());
00444 query.bindValue(":FILESIZE", (qulonglong)item->GetFilesize());
00445 query.bindValue(":PLAYER", item->GetPlayer().isNull() ? "" : item->GetPlayer());
00446 query.bindValue(":PLAYERARGS", !item->GetPlayerArguments().count() ? "" :
00447 item->GetPlayerArguments().join(" "));
00448 query.bindValue(":DOWNLOAD", item->GetDownloader().isNull() ? "" :
00449 item->GetDownloader());
00450 query.bindValue(":DOWNLOADARGS", !item->GetDownloaderArguments().count() ? "" :
00451 item->GetDownloaderArguments().join(" "));
00452 query.bindValue(":WIDTH", item->GetWidth());
00453 query.bindValue(":HEIGHT", item->GetHeight());
00454 query.bindValue(":LANGUAGE", item->GetLanguage().isNull() ? "" : item->GetLanguage());
00455 query.bindValue(":PODCAST", false);
00456 query.bindValue(":DOWNLOADABLE", item->GetDownloadable());
00457 query.bindValue(":CUSTOMHTML", item->GetCustomHTML());
00458 query.bindValue(":COUNTRIES", !item->GetCountries().count() ? "" :
00459 item->GetCountries().join(" "));
00460 query.bindValue(":SEASON", item->GetSeason());
00461 query.bindValue(":EPISODE", item->GetEpisode());
00462
00463 if (!query.exec() || !query.isActive())
00464 {
00465 MythDB::DBError("netcontent: inserting article in DB", query);
00466 return false;
00467 }
00468
00469 return (query.numRowsAffected() > 0);
00470 }
00471
00472 QMultiMap<QPair<QString,QString>, ResultItem*> getTreeArticles(const QString &feedtitle,
00473 ArticleType type)
00474 {
00475 QMultiMap<QPair<QString,QString>, ResultItem*> ret;
00476
00477 MSqlQuery query(MSqlQuery::InitCon());
00478 query.prepare("SELECT title, subtitle, description, url, "
00479 "type, thumbnail, mediaURL, author, date, time, "
00480 "rating, filesize, player, playerargs, download, "
00481 "downloadargs, width, height, language, "
00482 "downloadable, customhtml, countries, season, episode, "
00483 "path, paththumb FROM internetcontentarticles "
00484 "WHERE feedtitle = :FEEDTITLE AND podcast = 0 "
00485 "AND type = :TYPE ORDER BY title DESC;");
00486 query.bindValue(":FEEDTITLE", feedtitle);
00487 query.bindValue(":TYPE", type);
00488 if (!query.exec() || !query.isActive())
00489 {
00490 MythDB::DBError("Tree find in db", query);
00491 return ret;
00492 }
00493
00494 while (query.next())
00495 {
00496 QString title = query.value(0).toString();
00497 QString subtitle = query.value(1).toString();
00498 QString desc = query.value(2).toString();
00499 QString URL = query.value(3).toString();
00500 QString type = query.value(4).toString();
00501 QString thumbnail = query.value(5).toString();
00502 QString mediaURL = query.value(6).toString();
00503 QString author = query.value(7).toString();
00504 QDateTime date = query.value(8).toDateTime();
00505 QString time = query.value(9).toString();
00506 QString rating = query.value(10).toString();
00507 off_t filesize = query.value(11).toULongLong();
00508 QString player = query.value(12).toString();
00509 QStringList playerargs = query.value(13).toString().split(" ");
00510 QString download = query.value(14).toString();
00511 QStringList downloadargs = query.value(15).toString().split(" ");
00512 uint width = query.value(16).toUInt();
00513 uint height = query.value(17).toUInt();
00514 QString language = query.value(18).toString();
00515 bool downloadable = query.value(19).toBool();
00516 bool customhtml = query.value(20).toBool();
00517 QStringList countries = query.value(21).toString().split(" ");
00518 uint season = query.value(22).toUInt();
00519 uint episode = query.value(23).toUInt();
00520
00521 QString path = query.value(24).toString();
00522 QString paththumb = query.value(25).toString();
00523
00524 QPair<QString,QString> pair(path,paththumb);
00525 ret.insert(pair, new ResultItem(title, subtitle, desc, URL,
00526 thumbnail, mediaURL, author, date, time, rating, filesize,
00527 player, playerargs, download, downloadargs,
00528 width, height, language, downloadable, countries,
00529 season, episode, customhtml));
00530 }
00531
00532 return ret;
00533 }
00534
00535 bool findInDB(const QString& url, ArticleType type)
00536 {
00537 MSqlQuery query(MSqlQuery::InitCon());
00538 query.prepare("SELECT commandline FROM internetcontent WHERE commandline = :URL AND "
00539 "type = :TYPE AND podcast = 1;");
00540 query.bindValue(":URL", url);
00541 query.bindValue(":TYPE", type);
00542 if (!query.exec() || !query.isActive()) {
00543 MythDB::DBError("RSS find in db", query);
00544 return false;
00545 }
00546
00547 return query.size() > 0;
00548 }
00549
00550 RSSSite* findByURL(const QString& url, ArticleType type)
00551 {
00552 RSSSite *tmp = NULL;
00553 MSqlQuery query(MSqlQuery::InitCon());
00554 query.prepare("SELECT name,thumbnail,author,description,"
00555 "commandline,download,updated FROM internetcontent "
00556 "WHERE commandline = :URL AND type = :TYPE "
00557 "AND podcast = 1;");
00558 query.bindValue(":URL", url);
00559 query.bindValue(":TYPE", type);
00560 if (!query.exec() || !query.next())
00561 {
00562 MythDB::DBError("RSS find in db", query);
00563 tmp = new RSSSite(QString(), QString(), (ArticleType)0, QString(),
00564 QString(), QString(), false,
00565 QDateTime());
00566 }
00567 else
00568 {
00569 QString title = query.value(0).toString();
00570 QString image = query.value(1).toString();
00571 QString author = query.value(2).toString();
00572 QString description = query.value(3).toString();
00573 QString outurl = query.value(4).toString();
00574 bool download = query.value(5).toInt();
00575 QDateTime updated; query.value(6).toDate();
00576
00577 tmp = new RSSSite(title, image, type, description, outurl,
00578 author, download, updated);
00579 }
00580
00581 return tmp;
00582 }
00583
00584 RSSSite::rssList findAllDBRSSByType(ArticleType type)
00585 {
00586 RSSSite::rssList tmp;
00587
00588 MSqlQuery query(MSqlQuery::InitCon());
00589 query.prepare(
00590 "SELECT name, thumbnail, description, commandline, author, "
00591 "download, updated FROM internetcontent WHERE podcast = 1 "
00592 "AND type = :TYPE ORDER BY name");
00593
00594 query.bindValue(":TYPE", type);
00595
00596 if (!query.exec())
00597 {
00598 return tmp;
00599 }
00600
00601 while (query.next())
00602 {
00603 QString title = query.value(0).toString();
00604 QString image = query.value(1).toString();
00605 QString description = query.value(2).toString();
00606 QString url = query.value(3).toString();
00607 QString author = query.value(4).toString();
00608 bool download = query.value(5).toInt();
00609 QDateTime updated; query.value(6).toDate();
00610 tmp.append(new RSSSite(title, image, type, description, url,
00611 author, download, updated));
00612 }
00613
00614 return tmp;
00615 }
00616
00617 RSSSite::rssList findAllDBRSS()
00618 {
00619 RSSSite::rssList tmp;
00620
00621 MSqlQuery query(MSqlQuery::InitCon());
00622 query.prepare(
00623 "SELECT name, thumbnail, type, description, commandline, author, "
00624 "download, updated FROM internetcontent WHERE podcast = 1 "
00625 "ORDER BY name");
00626
00627 if (!query.exec())
00628 {
00629 return tmp;
00630 }
00631
00632 while (query.next())
00633 {
00634 QString title = query.value(0).toString();
00635 QString image = query.value(1).toString();
00636 ArticleType type = (ArticleType)query.value(2).toInt();
00637 QString description = query.value(3).toString();
00638 QString url = query.value(4).toString();
00639 QString author = query.value(5).toString();
00640 bool download = query.value(6).toInt();
00641 QDateTime updated; query.value(7).toDate();
00642 tmp.append(new RSSSite(title, image, type, description, url,
00643 author, download, updated));
00644 }
00645
00646 return tmp;
00647 }
00648
00649 bool insertInDB(RSSSite* site)
00650 {
00651 if (!site) return false;
00652
00653 return insertInDB(site->GetTitle(), site->GetImage(),
00654 site->GetDescription(), site->GetURL(),
00655 site->GetAuthor(), site->GetDownload(),
00656 site->GetUpdated(), site->GetType());
00657 }
00658
00659 bool insertInDB(const QString &name, const QString &thumbnail,
00660 const QString &description, const QString &url,
00661 const QString &author, const bool &download,
00662 const QDateTime &updated, ArticleType type)
00663 {
00664 if (findInDB(name, type))
00665 return false;
00666
00667 MSqlQuery query(MSqlQuery::InitCon());
00668 query.prepare("INSERT INTO internetcontent (name,thumbnail,description,"
00669 "commandline,author,download,updated,podcast, type) "
00670 "VALUES( :NAME, :THUMBNAIL, :DESCRIPTION, :URL, :AUTHOR, :DOWNLOAD, "
00671 ":UPDATED, :PODCAST, :TYPE);");
00672 query.bindValue(":NAME", name);
00673 query.bindValue(":THUMBNAIL", thumbnail);
00674 query.bindValue(":DESCRIPTION", description);
00675 query.bindValue(":URL", url);
00676 query.bindValue(":AUTHOR", author);
00677 query.bindValue(":DOWNLOAD", download);
00678 query.bindValue(":UPDATED", updated);
00679 query.bindValue(":PODCAST", true);
00680 query.bindValue(":TYPE", type);
00681 if (!query.exec() || !query.isActive()) {
00682 MythDB::DBError("netcontent: inserting in DB", query);
00683 return false;
00684 }
00685
00686 return (query.numRowsAffected() > 0);
00687 }
00688
00689 bool removeFromDB(RSSSite* site)
00690 {
00691 if (!site) return false;
00692
00693 return removeFromDB(site->GetURL(), site->GetType());
00694 }
00695
00696 bool removeFromDB(const QString &url, ArticleType type)
00697 {
00698 MSqlQuery query(MSqlQuery::InitCon());
00699 query.prepare("DELETE FROM internetcontent WHERE commandline = :URL "
00700 "AND type = :TYPE;");
00701 query.bindValue(":URL", url);
00702 query.bindValue(":TYPE", type);
00703 if (!query.exec() || !query.isActive()) {
00704 MythDB::DBError("netcontent: delete from db", query);
00705 return false;
00706 }
00707
00708 return (query.numRowsAffected() > 0);
00709 }
00710
00711 void markUpdated(RSSSite *site)
00712 {
00713 QDateTime now = QDateTime::currentDateTime();
00714
00715 MSqlQuery query(MSqlQuery::InitCon());
00716 query.prepare("UPDATE internetcontent SET updated = :UPDATED "
00717 "WHERE commandline = :URL AND type = :TYPE;");
00718 query.bindValue(":UPDATED", now);
00719 query.bindValue(":URL", site->GetURL());
00720 query.bindValue(":TYPE", site->GetType());
00721 if (!query.exec() || !query.isActive())
00722 MythDB::DBError("netcontent update time", query);
00723 }
00724
00725 bool clearRSSArticles(const QString &feedtitle, ArticleType type)
00726 {
00727 if (feedtitle.isEmpty())
00728 return false;
00729
00730 MSqlQuery query(MSqlQuery::InitCon());
00731 query.prepare("DELETE FROM internetcontentarticles "
00732 "WHERE feedtitle = :FEEDTITLE AND podcast = 1 "
00733 "AND type = :TYPE ;");
00734 query.bindValue(":FEEDTITLE", feedtitle);
00735 query.bindValue(":TYPE", type);
00736
00737 if (!query.exec() || !query.isActive()) {
00738 MythDB::DBError("netcontent: clearing DB", query);
00739 return false;
00740 }
00741
00742 return (query.numRowsAffected() > 0);
00743 }
00744
00745 bool insertRSSArticleInDB(const QString &feedtitle, ResultItem *item,
00746 ArticleType type)
00747 {
00748 if (!item || feedtitle.isEmpty())
00749 return false;
00750
00751 MSqlQuery query(MSqlQuery::InitCon());
00752 query.prepare("INSERT INTO internetcontentarticles (feedtitle, title, "
00753 "description, url, type, thumbnail, mediaURL, author, date, time, "
00754 "rating, filesize, player, playerargs, download, "
00755 "downloadargs, width, height, language, downloadable, countries, "
00756 "podcast) "
00757 "VALUES( :FEEDTITLE, :TITLE, :DESCRIPTION, :URL, :TYPE, :THUMBNAIL, "
00758 ":MEDIAURL, :AUTHOR, :DATE, :TIME, :RATING, :FILESIZE, :PLAYER, "
00759 ":PLAYERARGS, :DOWNLOAD, :DOWNLOADARGS, :WIDTH, :HEIGHT, "
00760 ":LANGUAGE, :DOWNLOADABLE, :COUNTRIES, :PODCAST);");
00761 query.bindValue(":FEEDTITLE", feedtitle);
00762 query.bindValue(":TITLE", item->GetTitle());
00763 query.bindValue(":DESCRIPTION", item->GetDescription());
00764 query.bindValue(":URL", item->GetURL());
00765 query.bindValue(":TYPE", type);
00766 query.bindValue(":THUMBNAIL", item->GetThumbnail());
00767 query.bindValue(":MEDIAURL", item->GetMediaURL());
00768 query.bindValue(":AUTHOR", item->GetAuthor());
00769 query.bindValue(":DATE", item->GetDate());
00770 QString time;
00771 if (item->GetTime().isEmpty())
00772 time = QString::number(0);
00773 else
00774 time = item->GetTime();
00775 query.bindValue(":TIME", time);
00776 query.bindValue(":RATING", item->GetRating());
00777 query.bindValue(":FILESIZE", (qulonglong)item->GetFilesize());
00778 query.bindValue(":PLAYER", item->GetPlayer().isNull() ? "" : item->GetPlayer());
00779 query.bindValue(":PLAYERARGS", !item->GetPlayerArguments().count() ? "" :
00780 item->GetPlayerArguments().join(" "));
00781 query.bindValue(":DOWNLOAD", item->GetDownloader().isNull() ? "" :
00782 item->GetDownloader());
00783 query.bindValue(":DOWNLOADARGS", !item->GetDownloaderArguments().count() ? "" :
00784 item->GetDownloaderArguments().join(" "));
00785 query.bindValue(":WIDTH", item->GetWidth());
00786 query.bindValue(":HEIGHT", item->GetHeight());
00787 query.bindValue(":LANGUAGE", item->GetLanguage().isNull() ? "" : item->GetLanguage());
00788 query.bindValue(":DOWNLOADABLE", item->GetDownloadable());
00789 query.bindValue(":COUNTRIES", item->GetCountries());
00790 query.bindValue(":PODCAST", true);
00791
00792 if (!query.exec() || !query.isActive()) {
00793 MythDB::DBError("netcontent: inserting article in DB", query);
00794 return false;
00795 }
00796
00797 return (query.numRowsAffected() > 0);
00798 }
00799
00800 ResultItem::resultList getRSSArticles(const QString &feedtitle,
00801 ArticleType type)
00802 {
00803 ResultItem::resultList ret;
00804
00805 MSqlQuery query(MSqlQuery::InitCon());
00806 query.prepare("SELECT title, description, url, "
00807 "thumbnail, mediaURL, author, date, time, "
00808 "rating, filesize, player, playerargs, download, "
00809 "downloadargs, width, height, language, "
00810 "downloadable, countries, season, episode "
00811 "FROM internetcontentarticles "
00812 "WHERE feedtitle = :FEEDTITLE AND podcast = 1 "
00813 "AND type = :TYPE ORDER BY date DESC;");
00814 query.bindValue(":FEEDTITLE", feedtitle);
00815 query.bindValue(":TYPE", type);
00816 if (!query.exec() || !query.isActive()) {
00817 MythDB::DBError("RSS find in db", query);
00818 return ret;
00819 }
00820
00821 while (query.next())
00822 {
00823 QString title = query.value(0).toString();
00824 QString desc = query.value(1).toString();
00825 QString URL = query.value(2).toString();
00826 QString thumbnail = query.value(3).toString();
00827 QString mediaURL = query.value(4).toString();
00828 QString author = query.value(5).toString();
00829 QDateTime date = query.value(6).toDateTime();
00830 QString time = query.value(7).toString();
00831 QString rating = query.value(8).toString();
00832 off_t filesize = query.value(9).toULongLong();
00833 QString player = query.value(10).toString();
00834 QStringList playerargs = query.value(11).toString().split(" ");
00835 QString download = query.value(12).toString();
00836 QStringList downloadargs = query.value(13).toString().split(" ");
00837 uint width = query.value(14).toUInt();
00838 uint height = query.value(15).toUInt();
00839 QString language = query.value(16).toString();
00840 bool downloadable = query.value(17).toBool();
00841 QStringList countries = query.value(18).toString().split(" ");
00842 uint season = query.value(19).toUInt();
00843 uint episode = query.value(20).toUInt();
00844
00845 ret.append(new ResultItem(title, QString(), desc, URL, thumbnail,
00846 mediaURL, author, date, time, rating, filesize,
00847 player, playerargs, download, downloadargs,
00848 width, height, language, downloadable, countries,
00849 season, episode, false));
00850 }
00851
00852 return ret;
00853 }
00854
00855 QString GetDownloadFilename(QString title, QString url)
00856 {
00857 QByteArray urlarr(url.toLatin1());
00858 quint16 urlChecksum = qChecksum(urlarr.data(), urlarr.length());
00859 QByteArray titlearr(title.toLatin1());
00860 quint16 titleChecksum = qChecksum(titlearr.data(), titlearr.length());
00861 QUrl qurl(url);
00862 QString ext = QFileInfo(qurl.path()).suffix();
00863 QString basefilename = QString("download_%1_%2.%3")
00864 .arg(QString::number(urlChecksum))
00865 .arg(QString::number(titleChecksum)).arg(ext);
00866
00867 return basefilename;
00868 }