~ubuntu-branches/ubuntu/lucid/kmplayer/lucid

« back to all changes in this revision

Viewing changes to src/kmplayer_atom.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Anthony Mercatante
  • Date: 2009-01-31 23:59:43 UTC
  • mfrom: (1.1.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20090131235943-9py6tgmhb3pmkv3e
Tags: 1:0.11.0a+svn919425-0ubuntu1
* New upstream version released.
* SVN snapshot to fix FTBFS with 4.2
* Rewrite packaging for KDE4

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 * Boston, MA 02110-1301, USA.
17
17
 **/
18
18
 
19
 
#include <config.h>
 
19
#include "config-kmplayer.h"
20
20
#include <kdebug.h>
21
21
#include "kmplayer_atom.h"
 
22
#include "kmplayer_smil.h"
22
23
 
23
24
using namespace KMPlayer;
24
25
 
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 0L;
 
32
        return new DarkNode (m_doc, tag.toUtf8 (), id_node_title);
 
33
    return NULL;
33
34
}
34
35
 
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 ();
39
40
            break;
40
41
        }
 
42
    Mrl::closed ();
41
43
}
42
44
 
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);
52
 
    return 0L;
 
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);
 
66
    return NULL;
53
67
}
54
68
 
55
69
void ATOM::Entry::closed () {
56
 
    for (NodePtr c = firstChild (); c; c = c->nextSibling ())
 
70
    MediaGroup *group = NULL;
 
71
    Node *rating = 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 ();
59
 
            break;
 
74
            title = c->innerText ().simplifyWhiteSpace ();
 
75
        } else if (c->id == id_node_gd_rating) {
 
76
            rating = c;
 
77
        } else if (c->id == id_node_media_group) {
 
78
            group = static_cast <MediaGroup *> (c);
60
79
        }
 
80
    if (group)
 
81
        group->addSummary (rating);
 
82
    Mrl::closed ();
61
83
}
62
84
 
63
85
Node::PlayType ATOM::Link::playType () {
71
93
        if (a->name () == StringPool::attr_href)
72
94
            href = a->value ();
73
95
        else if (a->name () == StringPool::attr_title)
74
 
            pretty_name = a->value ();
 
96
            title = a->value ();
75
97
        else if (a->name () == "rel")
76
98
            rel = a->value ();
77
99
    }
78
100
    if (!href.isEmpty () && rel == QString::fromLatin1 ("enclosure"))
79
101
        src = href;
80
 
    else if (pretty_name.isEmpty ())
81
 
        pretty_name = href;
 
102
    else if (title.isEmpty ())
 
103
        title = href;
 
104
    Mrl::closed ();
82
105
}
83
106
 
84
107
void ATOM::Content::closed () {
97
120
                mimetype = v;
98
121
        }
99
122
    }
 
123
    Mrl::closed ();
100
124
}
101
125
 
102
126
Node::PlayType ATOM::Content::playType () {
105
129
    return play_type_none;
106
130
}
107
131
 
 
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);
 
149
    return NULL;
 
150
}
 
151
 
 
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);
 
157
}
 
158
 
 
159
static QString makeStar (int x, bool fill) {
 
160
    QString path = "<path style=\"stroke:#A0A0A0;stroke-width:2px;stroke-opacity:1;";
 
161
    if (fill)
 
162
        path += "fill:#ff0000";
 
163
    else
 
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);
 
172
    path += ",11)\"/>";
 
173
    return path;
 
174
}
 
175
 
 
176
//http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html
 
177
void ATOM::MediaGroup::addSummary (Node *rating_node) {
 
178
    QString images;
 
179
    QString desc;
 
180
    QString title;
 
181
    QString player;
 
182
    QString ratings;
 
183
    int img_count = 0;
 
184
    if (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>";
 
194
        }
 
195
    }
 
196
    for (Node *c = firstChild ().ptr (); c; c = c->nextSibling ().ptr ()) {
 
197
        switch (c->id) {
 
198
        case id_node_media_title:
 
199
            title = c->innerText ();
 
200
            break;
 
201
        case id_node_media_description:
 
202
            desc = c->innerText ();
 
203
            break;
 
204
        case id_node_media_player:
 
205
            player = static_cast <Element *> (c)->getAttribute (StringPool::attr_url);
 
206
            break;
 
207
        case id_node_media_thumbnail:
 
208
        {
 
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);
 
214
                if (!w.isEmpty ())
 
215
                    images += QString (" width=\"") + w + QChar ('"');
 
216
                QString h = e->getAttribute (StringPool::attr_height);
 
217
                if (!h.isEmpty ())
 
218
                    images += QString (" height=\"") + h + QChar ('"');
 
219
                QString t = e->getAttribute (TrieString ("time"));
 
220
                if (!t.isEmpty ())
 
221
                    images += QString (" dur=\"") +
 
222
                        QString::number (Mrl::parseTimeString (t) / 100.0) +
 
223
                        QChar ('"');
 
224
                images += QString (" transIn=\"fade\" transOut=\"ellipsewipe\" fit=\"meet\"/>");
 
225
                img_count++;
 
226
            }
 
227
            break;
 
228
        }
 
229
        }
 
230
    }
 
231
    if (img_count) {
 
232
        QString buf;
 
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\"/>"
 
244
            "</layout>"
 
245
            "<transition id=\"fade\" dur=\"0.3\" type=\"fade\"/>"
 
246
            "<transition id=\"ellipsewipe\" dur=\"0.5\" type=\"ellipseWipe\"/>"
 
247
            "</head><body>"
 
248
            "<par><seq repeatCount=\"indefinite\">";
 
249
        out << images;
 
250
        out << "</seq>";
 
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 ())
 
259
                out << "</a>";
 
260
        }
 
261
        if (!ratings.isEmpty ())
 
262
            out << ratings;
 
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();
 
269
        n->normalize ();
 
270
        n->auxiliary_node = true;
 
271
        removeChild (n);
 
272
        insertBefore (n, firstChild ());
 
273
    }
 
274
}
 
275
 
 
276
void ATOM::MediaContent::closed () {
 
277
    for (AttributePtr a = attributes ()->first (); a; a = a->nextSibling ()) {
 
278
        if (a->name () == StringPool::attr_url)
 
279
            src = a->value();
 
280
        else if (a->name () == StringPool::attr_type)
 
281
            mimetype = a->value ();
 
282
    }
 
283
    Mrl::closed ();
 
284
}
 
285
 
 
286
Node::PlayType ATOM::MediaContent::playType () {
 
287
    return src.isEmpty () ? play_type_none : play_type_unknown;
 
288
}