1
/* This file is part of Clementine.
2
Copyright 2010, David Sansome <me@davidsansome.com>
4
Clementine is free software: you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation, either version 3 of the License, or
7
(at your option) any later version.
9
Clementine is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
GNU General Public License for more details.
14
You should have received a copy of the GNU General Public License
15
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
18
#include <QApplication>
22
#include <QXmlStreamWriter>
26
qWarning() << "Usage:" << qApp->arguments()[0].toUtf8().constData() << "sites.js\n";
27
qWarning() << "This tool parses a sites.js file from the Ultimate Lyrics Amarok script";
28
qWarning() << "and outputs an XML file that can be used by Clementine.";
32
void WriteRuleItem(QXmlStreamWriter& writer, const QVariant& value) {
33
if (value.type() == QVariant::String) {
34
writer.writeStartElement("item");
35
writer.writeAttribute("tag", value.toString());
36
writer.writeEndElement();
37
} else if (value.type() == QVariant::List) {
38
QVariantList list = value.toList();
39
writer.writeStartElement("item");
40
writer.writeAttribute("begin", list[0].toString());
41
writer.writeAttribute("end", list[1].toString());
42
writer.writeEndElement();
46
void WriteRules(QXmlStreamWriter& writer, const QString& name, const QVariantMap& map) {
47
for (int i=1 ; i<=4 ; ++i) {
48
const QString map_name = name + (i == 1 ? "" : QString::number(i));
50
if (!map.contains(map_name))
53
writer.writeStartElement(name);
55
QVariant value = map[map_name];
56
if (value.type() == QVariant::String) {
57
WriteRuleItem(writer, value);
58
} else if (value.type() == QVariant::List) {
59
foreach (const QVariant& child, value.toList()) {
60
WriteRuleItem(writer, child);
64
writer.writeEndElement();
68
void WriteList(QXmlStreamWriter& writer, const QString& name, const QVariantMap& map) {
69
if (!map.contains(name))
72
QVariant value = map[name];
73
if (value.type() == QVariant::String) {
74
writer.writeStartElement(name);
75
writer.writeAttribute("value", value.toString());
76
writer.writeEndElement();
77
} else if (value.type() == QVariant::List) {
78
foreach (const QVariant& child, value.toList()) {
79
writer.writeStartElement(name);
80
writer.writeAttribute("value", child.toString());
81
writer.writeEndElement();
86
void WriteUrlFormat(QXmlStreamWriter& writer, const QVariantList& list) {
87
foreach (const QVariant& child, list) {
88
if (child.type() != QVariant::Map)
90
QVariantMap map = child.toMap();
91
if (!map.contains("rep") || !map.contains("punct"))
94
writer.writeStartElement("urlFormat");
95
writer.writeAttribute("replace", map["punct"].toString());
96
writer.writeAttribute("with", map["rep"].toString());
97
writer.writeEndElement();
101
void WriteProvider(QXmlStreamWriter& writer, const QString& name, const QVariant& data) {
102
QVariantMap map = data.toMap();
103
if (!map.contains("url") || map.contains("getReply"))
106
writer.writeStartElement("provider");
107
writer.writeAttribute("name", name);
108
writer.writeAttribute("title", map["title"].toString());
109
writer.writeAttribute("charset", map["charset"].toString());
110
writer.writeAttribute("url", map["url"].toString());
112
WriteUrlFormat(writer, map["urlFormat"].toList());
114
WriteRules(writer, "extract", map);
115
WriteRules(writer, "exclude", map);
116
WriteList(writer, "invalidIndicator", map);
118
writer.writeEndElement();
121
int main(int argc, char** argv) {
122
QApplication a(argc, argv);
124
// Parse commandline arguments
125
if (a.arguments().count() != 2)
128
QString sites_filename = a.arguments()[1];
129
if (!QFile::exists(sites_filename)) {
130
qWarning() << "Error:" << sites_filename << "does not exist";
134
// Load the javascript file
135
QFile sites_file(sites_filename);
136
if (!sites_file.open(QIODevice::ReadOnly)) {
137
qWarning() << "Error: could not open" << sites_filename;
140
QString javascript = QString::fromUtf8(sites_file.readAll());
141
javascript = javascript.section("\n}", 0, 0, QString::SectionIncludeTrailingSep);
142
javascript.append(";\n(siteDescriptors)");
144
// Parse the javascript
146
QVariant data = page.mainFrame()->evaluateJavaScript(javascript);
150
stdout.open(1, QIODevice::WriteOnly);
151
QXmlStreamWriter writer(&stdout);
152
writer.setAutoFormatting(true);
153
writer.setAutoFormattingIndent(2);
156
writer.writeStartDocument();
157
writer.writeStartElement("lyricproviders");
159
foreach (const QString& provider_name, data.toMap().keys()) {
160
WriteProvider(writer, provider_name, data.toMap()[provider_name]);
163
writer.writeEndElement();
164
writer.writeEndDocument();