|
MythTV
0.26-pre
|
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 }
1.7.6.1