MythTV  0.26-pre
netutils.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends