28
29
else if (!strcmp (tag.latin1 (), "link"))
29
30
return new ATOM::Link (m_doc);
30
31
else if (!strcmp (tag.latin1 (), "title"))
31
return new DarkNode (m_doc, tag, id_node_title);
32
return new DarkNode (m_doc, tag.toUtf8 (), id_node_title);
35
36
void ATOM::Feed::closed () {
36
37
for (NodePtr c = firstChild (); c; c = c->nextSibling ())
37
38
if (c->id == id_node_title) {
38
pretty_name = c->innerText ().simplifyWhiteSpace ();
39
title = c->innerText ().simplifyWhiteSpace ();
43
NodePtr ATOM::Entry::childFromTag (const QString & tag) {
44
if (!strcmp (tag.latin1 (), "link"))
45
NodePtr ATOM::Entry::childFromTag (const QString &tag) {
46
const char *cstr = tag.latin1 ();
47
if (!strcmp (cstr, "link"))
45
48
return new ATOM::Link (m_doc);
46
else if (!strcmp (tag.latin1 (), "content"))
49
else if (!strcmp (cstr, "content"))
47
50
return new ATOM::Content (m_doc);
48
else if (!strcmp (tag.latin1 (), "title"))
49
return new DarkNode (m_doc, tag, id_node_title);
50
else if (!strcmp (tag.latin1 (), "summary"))
51
return new DarkNode (m_doc, tag, id_node_summary);
51
else if (!strcmp (cstr, "title"))
52
return new DarkNode (m_doc, tag.toUtf8 (), id_node_title);
53
else if (!strcmp (cstr, "summary"))
54
return new DarkNode (m_doc, tag.toUtf8 (), id_node_summary);
55
else if (!strcmp (cstr, "media:group"))
56
return new MediaGroup (m_doc);
57
else if (!strcmp (cstr, "gd:rating"))
58
return new DarkNode (m_doc, tag.toUtf8 (), id_node_gd_rating);
59
else if (!strcmp (cstr, "category") ||
60
!strcmp (cstr, "author:") ||
61
!strcmp (cstr, "id") ||
62
!strcmp (cstr, "updated") ||
63
!strncmp (cstr, "yt:", 3) ||
64
!strncmp (cstr, "gd:", 3))
65
return new DarkNode (m_doc, tag.toUtf8 (), id_node_ignored);
55
69
void ATOM::Entry::closed () {
56
for (NodePtr c = firstChild (); c; c = c->nextSibling ())
70
MediaGroup *group = NULL;
72
for (Node *c = firstChild ().ptr (); c; c = c->nextSibling ().ptr ())
57
73
if (c->id == id_node_title) {
58
pretty_name = c->innerText ().simplifyWhiteSpace ();
74
title = c->innerText ().simplifyWhiteSpace ();
75
} else if (c->id == id_node_gd_rating) {
77
} else if (c->id == id_node_media_group) {
78
group = static_cast <MediaGroup *> (c);
81
group->addSummary (rating);
63
85
Node::PlayType ATOM::Link::playType () {
105
129
return play_type_none;
132
NodePtr ATOM::MediaGroup::childFromTag (const QString &tag) {
133
const char *cstr = tag.latin1 ();
134
if (!strcmp (cstr, "media:content"))
135
return new ATOM::MediaContent (m_doc);
136
else if (!strcmp (cstr, "media:title"))
137
return new DarkNode (m_doc, tag.toUtf8 (), id_node_media_title);
138
else if (!strcmp (cstr, "media:description"))
139
return new DarkNode (m_doc, tag.toUtf8 (), id_node_media_description);
140
else if (!strcmp (cstr, "media:thumbnail"))
141
return new DarkNode (m_doc, tag.toUtf8 (), id_node_media_thumbnail);
142
else if (!strcmp (cstr, "media:player"))
143
return new DarkNode (m_doc, tag.toUtf8 (), id_node_media_player);
144
else if (!strcmp (cstr, "media:category") ||
145
!strcmp (cstr, "media:keywords"))
146
return new DarkNode (m_doc, tag.toUtf8 (), id_node_ignored);
147
else if (!strcmp (cstr, "smil"))
148
return new SMIL::Smil (m_doc);
152
void *ATOM::MediaGroup::message (MessageType msg, void *content) {
153
if (MsgChildFinished == msg &&
154
((Posting *) content)->source->isPlayable ())
155
finish (); // only play one
156
return Element::message (msg, content);
159
static QString makeStar (int x, bool fill) {
160
QString path = "<path style=\"stroke:#A0A0A0;stroke-width:2px;stroke-opacity:1;";
162
path += "fill:#ff0000";
164
path += "fill:#C0C0C0";
165
path += "\" d=\"M 21.428572,23.571429 "
166
"L 10.84984,18.213257 L 0.43866021,23.890134 L 2.2655767,12.173396 "
167
"L -6.3506861,4.0260275 L 5.3571425,2.142857 L 10.443179,-8.5693712 "
168
"L 15.852098,1.9835038 L 27.611704,3.5103513 L 19.246772,11.915557 "
169
"L 21.428572,23.571429 z\""
170
" transform=\"translate(";
171
path += QString::number (x);
176
//http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html
177
void ATOM::MediaGroup::addSummary (Node *rating_node) {
185
Element *e = static_cast <Element *> (rating_node);
186
QString nr = e->getAttribute ("average");
187
if (!nr.isEmpty ()) {
188
int rating = ((int) nr.toDouble ()) % 6;
189
ratings = "<img region=\"rating\">"
190
"<svg width=\"200\" height=\"40\">";
191
for (int i = 0; i < 5; ++i)
192
ratings += makeStar (10 + i * 40, rating > i);
193
ratings += "</svg></img>";
196
for (Node *c = firstChild ().ptr (); c; c = c->nextSibling ().ptr ()) {
198
case id_node_media_title:
199
title = c->innerText ();
201
case id_node_media_description:
202
desc = c->innerText ();
204
case id_node_media_player:
205
player = static_cast <Element *> (c)->getAttribute (StringPool::attr_url);
207
case id_node_media_thumbnail:
209
Element *e = static_cast <Element *> (c);
210
QString url = e->getAttribute (StringPool::attr_url);
211
if (!url.isEmpty ()) {
212
images += QString ("<img region=\"image\" src=\"") + url + QChar ('"');
213
QString w = e->getAttribute (StringPool::attr_width);
215
images += QString (" width=\"") + w + QChar ('"');
216
QString h = e->getAttribute (StringPool::attr_height);
218
images += QString (" height=\"") + h + QChar ('"');
219
QString t = e->getAttribute (TrieString ("time"));
221
images += QString (" dur=\"") +
222
QString::number (Mrl::parseTimeString (t) / 100.0) +
224
images += QString (" transIn=\"fade\" transOut=\"ellipsewipe\" fit=\"meet\"/>");
233
QTextOStream out (&buf);
234
out << "<smil><head>";
235
if (!title.isEmpty ())
236
out << "<title>" << title << "</title>";
237
out << "<layout><root-layout width=\"400\" height=\"300\" background-color=\"#FFFFF0\"/>";
238
if (!title.isEmpty ())
239
out << "<region id=\"title\" left=\"20\" top=\"10\" height=\"18\" right=\"10\"/>";
240
out << "<region id=\"image\" left=\"5\" top=\"40\" width=\"130\" bottom=\"30\"/>";
241
if (!ratings.isEmpty ())
242
out << "<region id=\"rating\" left=\"15\" width=\"100\" height=\"20\" bottom=\"5\"/>";
243
out << "<region id=\"text\" left=\"140\" top=\"40\" bottom=\"10\" right=\"10\" fit=\"scroll\"/>"
245
"<transition id=\"fade\" dur=\"0.3\" type=\"fade\"/>"
246
"<transition id=\"ellipsewipe\" dur=\"0.5\" type=\"ellipseWipe\"/>"
248
"<par><seq repeatCount=\"indefinite\">";
251
if (!title.isEmpty ()) {
252
if (!player.isEmpty ())
253
out << "<a href=\"" << XMLStringlet(player) << "\" target=\"top\">";
254
out << "<smilText region=\"title\"><div textFontWeight=\"bold\"";
255
if (!player.isEmpty ())
256
out << " textColor=\"blue\"";
257
out << ">" << XMLStringlet (title) << "</div></smilText>";
258
if (!player.isEmpty ())
261
if (!ratings.isEmpty ())
263
out << "<smilText region=\"text\">";
264
out << XMLStringlet (desc);
265
out << QString ("</smilText></par></body></smil>");
266
QTextStream inxml (&buf, QIODevice::ReadOnly);
267
KMPlayer::readXML (this, inxml, QString (), false);
268
NodePtr n = lastChild();
270
n->auxiliary_node = true;
272
insertBefore (n, firstChild ());
276
void ATOM::MediaContent::closed () {
277
for (AttributePtr a = attributes ()->first (); a; a = a->nextSibling ()) {
278
if (a->name () == StringPool::attr_url)
280
else if (a->name () == StringPool::attr_type)
281
mimetype = a->value ();
286
Node::PlayType ATOM::MediaContent::playType () {
287
return src.isEmpty () ? play_type_none : play_type_unknown;