#include <QStringList>
#include <QTextStream>
+#include <QUrl>
#include "mylist.h"
+#include "settings.h"
#include "abstracttask.h"
using namespace LocalMyList;
{
QCoreApplication a(argc, argv);
QTextStream cout(stdout);
- if (a.arguments().count() < 2)
+/* if (a.arguments().count() < 2)
{
cout << "Usage: " << a.arguments()[0] << " FILE";
return 1;
}
-
+*/
LocalMyList::instance()->loadLocalSettings();
if (!LocalMyList::instance()->database()->connect())
{
return 1;
}
- AbstractTask *t = LocalMyList::instance()->importTitles(a.arguments()[1]);
+ AbstractTask *t;
+ if (a.arguments().count() == 1)
+ t = LocalMyList::instance()->importTitlesFromUrl(QUrl::fromUserInput(LocalMyList::instance()->settings()->get("anidbTitleUrl").toString()));
+ else
+ t = LocalMyList::instance()->importTitles(a.arguments()[1]);
QObject::connect(t, SIGNAL(finished()), &a, SLOT(quit()));
return a.exec();
#include <QStringList>
#include "database.h"
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
#include <QDebug>
namespace LocalMyList {
-AnimeTitleParseTask::AnimeTitleParseTask(QObject *parent) :
+AnimeTitleParseTaskBase::AnimeTitleParseTaskBase(QObject *parent) :
AbstractTask(parent)
{
}
-QFileInfo AnimeTitleParseTask::file() const
-{
- return m_file;
-}
-QString AnimeTitleParseTask::taskSubject() const
-{
- return QString("Anime Title Parse (from file: %1)").arg(m_file.fileName());
-}
-bool AnimeTitleParseTask::canUseThreads() const
+bool AnimeTitleParseTaskBase::canUseThreads() const
{
return true;
}
-void AnimeTitleParseTask::start()
-{
- QFile f(m_file.absoluteFilePath());
- if (!f.open(QIODevice::ReadOnly))
- {
- emit finished();
- qWarning("AnimeTitleParseTask failed to open file");
- return;
- }
-
- parse(&f);
- emit finished();
-}
-
-void AnimeTitleParseTask::setFile(const QFileInfo &file)
-{
- m_file = file;
-}
-
-void AnimeTitleParseTask::parse(QIODevice *device)
+void AnimeTitleParseTaskBase::setup()
{
db->transaction();
db->truncateTitleData();
+ bytesRead = 0;
+ titles = 0;
+ buf.clear();
+}
- int titles = 0;
- QByteArray buf;
+void AnimeTitleParseTaskBase::parse(QIODevice *device)
+{
while (!device->atEnd())
{
- buf = device->readLine();
- QString s = QString::fromUtf8(buf);
+ QByteArray line = device->readLine();
+ buf += line;
+ bytesRead += line.length();
+
+ if (line.indexOf('\n') == -1)
+ continue;
+ line = buf; // Buf has at most one line
+ buf.clear();
+
+ QString s = QString::fromUtf8(line);
s = s.trimmed();
if (s.startsWith(QChar('#')))
continue;
if (titles % 100 != 0)
continue;
qDebug() << "Read" << titles << "titles";
- emit progress(device->pos(), device->size());
+ emit progress(bytesRead, device->size());
}
- qDebug() << "Done. Read" << titles << "titles";
+}
+void AnimeTitleParseTaskBase::finalize()
+{
+ qDebug() << "Done. Read" << titles << "titles";
db->commit();
}
+void AnimeTitleParseTaskBase::fail()
+{
+ qDebug() << "Read error";
+ db->rollback();
+}
+
+// ----
+
+QFileInfo AnimeTitleParseFileTask::file() const
+{
+ return m_file;
+}
+
+QString AnimeTitleParseFileTask::taskSubject() const
+{
+ return QString("Anime Title Parse (from file: %1)").arg(m_file.fileName());
+}
+
+void AnimeTitleParseFileTask::start()
+{
+ QFile f(m_file.absoluteFilePath());
+ if (!f.open(QIODevice::ReadOnly))
+ {
+ emit finished();
+ qWarning("AnimeTitleParseTask failed to open file");
+ return;
+ }
+
+ setup();
+ parse(&f);
+ finalize();
+ emit finished();
+}
+
+void AnimeTitleParseFileTask::setFile(const QFileInfo &file)
+{
+ m_file = file;
+}
+
+// ----
+
+AnimeTitleParseNetworkTask::AnimeTitleParseNetworkTask(QObject *parent) : AnimeTitleParseTaskBase(parent), nam(0), reply(0)
+{
+}
+
+QUrl AnimeTitleParseNetworkTask::url() const
+{
+ return m_url;
+}
+
+QString AnimeTitleParseNetworkTask::taskSubject() const
+{
+ return QString("Anime Title Parse (from url: %1)").arg(m_url.toString());
+}
+
+void AnimeTitleParseNetworkTask::start()
+{
+ nam = new QNetworkAccessManager(this);
+ QNetworkRequest request(m_url);
+ reply = nam->get(request);
+ reply->ignoreSslErrors();
+ connect(reply, SIGNAL(readyRead()), this, SLOT(readSome()));
+ connect(reply, SIGNAL(finished()), this, SLOT(handleFinished()));
+ setup();
+}
+
+void AnimeTitleParseNetworkTask::setUrl(const QUrl &url)
+{
+ m_url = url;
+}
+
+void AnimeTitleParseNetworkTask::readSome()
+{
+ parse(reply);
+}
+
+void AnimeTitleParseNetworkTask::handleFinished()
+{
+ if (reply->error() == QNetworkReply::NoError)
+ finalize();
+ else
+ fail();
+ reply->deleteLater();
+ nam->deleteLater();
+ reply = 0;
+ nam = 0;
+
+ emit finished();
+}
+
+AnimeTitleParseFileTask::AnimeTitleParseFileTask(QObject *parent) : AnimeTitleParseTaskBase(parent)
+{
+}
+
} // namespace LocalMyList
#include "abstracttask.h"
#include <QFileInfo>
+#include <QUrl>
+class QNetworkAccessManager;
+class QNetworkReply;
+
namespace LocalMyList {
-class LOCALMYLISTSHARED_EXPORT AnimeTitleParseTask : public AbstractTask
+class LOCALMYLISTSHARED_EXPORT AnimeTitleParseTaskBase : public AbstractTask
{
Q_OBJECT
+protected:
+ explicit AnimeTitleParseTaskBase(QObject *parent = 0);
+
public:
- explicit AnimeTitleParseTask(QObject *parent = 0);
-
- QFileInfo file() const;
- QString taskSubject() const;
bool canUseThreads() const;
+ void start() = 0;
+
+protected:
+ void setup();
+ void parse(QIODevice *device);
+ void finalize();
+ void fail();
+
+ QByteArray buf;
+ qint64 bytesRead;
+ int titles;
+};
+
+class LOCALMYLISTSHARED_EXPORT AnimeTitleParseFileTask : public AnimeTitleParseTaskBase
+{
+ Q_OBJECT
+public:
+ explicit AnimeTitleParseFileTask(QObject *parent = 0);
+ QFileInfo file() const;
+ QString taskSubject() const;
void start();
public slots:
void setFile(const QFileInfo &file);
-private:
- void parse(QIODevice *device);
-
+protected:
QFileInfo m_file;
-
};
+class LOCALMYLISTSHARED_EXPORT AnimeTitleParseNetworkTask : public AnimeTitleParseTaskBase
+{
+ Q_OBJECT
+public:
+ explicit AnimeTitleParseNetworkTask(QObject *parent = 0);
+ QUrl url() const;
+ QString taskSubject() const;
+
+ void start();
+
+public slots:
+ void setUrl(const QUrl &url);
+
+private slots:
+ void readSome();
+ void handleFinished();
+
+private:
+ QUrl m_url;
+ QNetworkAccessManager *nam;
+ QNetworkReply *reply;
+};
+
+
} // namespace LocalMyList
#endif // ANIMETITLEPARSETASK_H