summaryrefslogtreecommitdiffstats
path: root/src/translators/gcfilmsexporter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/translators/gcfilmsexporter.cpp')
-rw-r--r--src/translators/gcfilmsexporter.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/translators/gcfilmsexporter.cpp b/src/translators/gcfilmsexporter.cpp
new file mode 100644
index 0000000..b172996
--- /dev/null
+++ b/src/translators/gcfilmsexporter.cpp
@@ -0,0 +1,235 @@
+/***************************************************************************
+ copyright : (C) 2005-2006 by Robby Stephenson
+ email : robby@periapsis.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of version 2 of the GNU General Public License as *
+ * published by the Free Software Foundation; *
+ * *
+ ***************************************************************************/
+
+#include "gcfilmsexporter.h"
+#include "../collection.h"
+#include "../document.h"
+#include "../filehandler.h"
+#include "../latin1literal.h"
+#include "../tellico_utils.h"
+#include "../stringset.h"
+#include "../tellico_kernel.h"
+#include "../imagefactory.h"
+
+#include <klocale.h>
+#include <kio/netaccess.h>
+
+namespace {
+ char GCFILMS_DELIMITER = '|';
+}
+
+using Tellico::Export::GCfilmsExporter;
+
+GCfilmsExporter::GCfilmsExporter() : Tellico::Export::Exporter() {
+}
+
+QString GCfilmsExporter::formatString() const {
+ return i18n("GCfilms");
+}
+
+QString GCfilmsExporter::fileFilter() const {
+ return i18n("*.gcf|GCfilms Data Files (*.gcf)") + QChar('\n') + i18n("*|All Files");
+#if 0
+ i18n("*.gcs|GCstar Data Files (*.gcs)")
+#endif
+}
+
+bool GCfilmsExporter::exec() {
+ Data::CollPtr coll = collection();
+ if(!coll) {
+ return false;
+ }
+
+ QString text;
+ QTextOStream ts(&text);
+
+ ts << "GCfilms|" << coll->entryCount() << "|";
+ if(options() & Export::ExportUTF8) {
+ ts << "UTF8" << endl;
+ }
+
+ char d = GCFILMS_DELIMITER;
+ bool format = options() & Export::ExportFormatted;
+ // when importing GCfilms, a url field is added
+ bool hasURL = coll->hasField(QString::fromLatin1("url"))
+ && coll->fieldByName(QString::fromLatin1("url"))->type() == Data::Field::URL;
+
+ uint minRating = 1;
+ uint maxRating = 5;
+ Data::FieldPtr f = coll->fieldByName(QString::fromLatin1("rating"));
+ if(f) {
+ bool ok;
+ uint n = Tellico::toUInt(f->property(QString::fromLatin1("minimum")), &ok);
+ if(ok) {
+ minRating = n;
+ }
+ n = Tellico::toUInt(f->property(QString::fromLatin1("maximum")), &ok);
+ if(ok) {
+ maxRating = n;
+ }
+ }
+
+ // only going to export images if it's a local path
+ KURL imageDir;
+ if(url().isLocalFile()) {
+ imageDir = url();
+ imageDir.cd(QString::fromLatin1(".."));
+ imageDir.addPath(url().fileName().section('.', 0, 0) + QString::fromLatin1("_images/"));
+ if(!KIO::NetAccess::exists(imageDir, false, 0)) {
+ bool success = KIO::NetAccess::mkdir(imageDir, Kernel::self()->widget());
+ if(!success) {
+ imageDir = KURL(); // means don't write images
+ }
+ }
+ }
+
+ QStringList images;
+ for(Data::EntryVec::ConstIterator entry = entries().begin(); entry != entries().end(); ++entry) {
+ ts << entry->id() << d;
+ push(ts, "title", entry, format);
+ push(ts, "year", entry, format);
+ push(ts, "running-time", entry, format);
+ push(ts, "director", entry, format);
+ push(ts, "nationality", entry, format);
+ push(ts, "genre", entry, format);
+ // do image
+ QString tmp = entry->field(QString::fromLatin1("cover"));
+ if(!tmp.isEmpty() && !imageDir.isEmpty()) {
+ images << tmp;
+ ts << imageDir.path() << tmp;
+ }
+ ts << d;
+
+ // do not format cast since the commas could get mixed up
+ const QStringList cast = entry->fields(QString::fromLatin1("cast"), false);
+ for(QStringList::ConstIterator it = cast.begin(); it != cast.end(); ++it) {
+ ts << (*it).section(QString::fromLatin1("::"), 0, 0);
+ if(it != cast.fromLast()) {
+ ts << ", ";
+ }
+ }
+ ts << d;
+
+ // values[9] is the original title
+ ts << d;
+
+ push(ts, "plot", entry, format);
+
+ if(hasURL) {
+ push(ts, "url", entry, format);
+ } else {
+ ts << d;
+ }
+
+ // values[12] is whether the film has been viewed or not
+ ts << d;
+
+ push(ts, "medium", entry, format);
+ // values[14] is number of DVDS?
+ ts << d;
+ // values[15] is place?
+ ts << d;
+
+ // gcfilms's ratings go 0-10, just multiply by two
+ bool ok;
+ int rat = Tellico::toUInt(entry->field(QString::fromLatin1("rating"), format), &ok);
+ if(ok) {
+ ts << rat * 10/(maxRating-minRating);
+ }
+ ts << d;
+
+ push(ts, "comments", entry, format);
+ push(ts, "language", entry, format); // ignoring audio-tracks
+
+ push(ts, "subtitle", entry, format);
+
+ // values[20] is borrower name, values[21] is loan date
+ if(entry->field(QString::fromLatin1("loaned")).isEmpty()) {
+ ts << d << d;
+ } else {
+ // find loan
+ bool found = false;
+ const Data::BorrowerVec& borrowers = Data::Document::self()->collection()->borrowers();
+ for(Data::BorrowerVec::ConstIterator b = borrowers.begin(); b != borrowers.end() && !found; ++b) {
+ const Data::LoanVec& loans = b->loans();
+ for(Data::LoanVec::ConstIterator loan = loans.begin(); loan != loans.end(); ++loan) {
+ if(entry.data() == loan->entry()) {
+ ts << b->name() << d;
+ ts << loan->loanDate().day() << '/'
+ << loan->loanDate().month() << '/'
+ << loan->loanDate().year() << d;
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+
+ // values[22] is history ?
+ ts << d;
+
+ // for certification, only thing we can do is assume default american ratings
+ tmp = entry->field(QString::fromLatin1("certification"), format);
+ int age = 0;
+ if(tmp == Latin1Literal("U (USA)")) {
+ age = 1;
+ } else if(tmp == Latin1Literal("G (USA)")) {
+ age = 2;
+ } else if(tmp == Latin1Literal("PG (USA)")) {
+ age = 5;
+ } else if(tmp == Latin1Literal("PG-13 (USA)")) {
+ age = 13;
+ } else if(tmp == Latin1Literal("R (USA)")) {
+ age = 17;
+ }
+ if(age > 0) {
+ ts << age << d;
+ }
+ ts << d;
+
+ // all done
+ ts << endl;
+ }
+
+ StringSet imageSet;
+ for(QStringList::ConstIterator it = images.begin(); it != images.end(); ++it) {
+ if(imageSet.has(*it)) {
+ continue;
+ }
+ if(ImageFactory::writeImage(*it, imageDir)) {
+ imageSet.add(*it);
+ } else {
+ kdWarning() << "GCfilmsExporter::exec() - unable to write image file: "
+ << imageDir << *it << endl;
+ }
+ }
+
+ return FileHandler::writeTextURL(url(), text, options() & Export::ExportUTF8, options() & Export::ExportForce);
+}
+
+void GCfilmsExporter::push(QTextOStream& ts_, QCString fieldName_, Data::EntryVec::ConstIterator entry_, bool format_) {
+ Data::FieldPtr f = collection()->fieldByName(QString::fromLatin1(fieldName_));
+ // don't format multiple names cause commas will cause problems
+ if(f->formatFlag() == Data::Field::FormatName && (f->flags() & Data::Field::AllowMultiple)) {
+ format_ = false;
+ }
+ QString s = entry_->field(QString::fromLatin1(fieldName_), format_);
+ if(f->flags() & Data::Field::AllowMultiple) {
+ ts_ << s.replace(QString::fromLatin1("; "), QChar(','));
+ } else {
+ ts_ << s;
+ }
+ ts_ << GCFILMS_DELIMITER;
+}
+
+#include "gcfilmsexporter.moc"