|
|
|
/***************************************************************************
|
|
|
|
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() {
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString GCfilmsExporter::formatString() const {
|
|
|
|
return i18n("GCfilms");
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString GCfilmsExporter::fileFilter() const {
|
|
|
|
return i18n("*.gcf|GCfilms Data Files (*.gcf)") + TQChar('\n') + i18n("*|All Files");
|
|
|
|
#if 0
|
|
|
|
i18n("*.gcs|GCstar Data Files (*.gcs)")
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
bool GCfilmsExporter::exec() {
|
|
|
|
Data::CollPtr coll = collection();
|
|
|
|
if(!coll) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString text;
|
|
|
|
TQTextOStream 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(TQString::tqfromLatin1("url"))
|
|
|
|
&& coll->fieldByName(TQString::tqfromLatin1("url"))->type() == Data::Field::URL;
|
|
|
|
|
|
|
|
uint minRating = 1;
|
|
|
|
uint maxRating = 5;
|
|
|
|
Data::FieldPtr f = coll->fieldByName(TQString::tqfromLatin1("rating"));
|
|
|
|
if(f) {
|
|
|
|
bool ok;
|
|
|
|
uint n = Tellico::toUInt(f->property(TQString::tqfromLatin1("minimum")), &ok);
|
|
|
|
if(ok) {
|
|
|
|
minRating = n;
|
|
|
|
}
|
|
|
|
n = Tellico::toUInt(f->property(TQString::tqfromLatin1("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(TQString::tqfromLatin1(".."));
|
|
|
|
imageDir.addPath(url().fileName().section('.', 0, 0) + TQString::tqfromLatin1("_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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQStringList 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
|
|
|
|
TQString tmp = entry->field(TQString::tqfromLatin1("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 TQStringList cast = entry->fields(TQString::tqfromLatin1("cast"), false);
|
|
|
|
for(TQStringList::ConstIterator it = cast.begin(); it != cast.end(); ++it) {
|
|
|
|
ts << (*it).section(TQString::tqfromLatin1("::"), 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(TQString::tqfromLatin1("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(TQString::tqfromLatin1("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(TQString::tqfromLatin1("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(TQStringList::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(TQTextOStream& ts_, TQCString fieldName_, Data::EntryVec::ConstIterator entry_, bool format_) {
|
|
|
|
Data::FieldPtr f = collection()->fieldByName(TQString::tqfromLatin1(fieldName_));
|
|
|
|
// don't format multiple names cause commas will cause problems
|
|
|
|
if(f->formatFlag() == Data::Field::FormatName && (f->flags() & Data::Field::AllowMultiple)) {
|
|
|
|
format_ = false;
|
|
|
|
}
|
|
|
|
TQString s = entry_->field(TQString::tqfromLatin1(fieldName_), format_);
|
|
|
|
if(f->flags() & Data::Field::AllowMultiple) {
|
|
|
|
ts_ << s.tqreplace(TQString::tqfromLatin1("; "), TQChar(','));
|
|
|
|
} else {
|
|
|
|
ts_ << s;
|
|
|
|
}
|
|
|
|
ts_ << GCFILMS_DELIMITER;
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "gcfilmsexporter.moc"
|