48
47
using namespace zmm;
49
48
using namespace mxml;
53
50
// Base request URL
54
#define REST_BASE_URL "http://www.youtube.com/api2_rest?"
57
// dev_id=dev_id&user=user
58
#define REST_METHOD_LIST_FAVORITE "youtube.users.list_favorite_videos"
60
// dev_id=dev_id&tag=tag&page=page&per_page=per_page
61
#define REST_METHOD_LIST_BY_TAG "youtube.videos.list_by_tag"
63
// dev_id=dev_id&user=user&page=page&per_page=per_page
64
#define REST_METHOD_LIST_BY_USER "youtube.videos.list_by_user"
67
#define REST_METHOD_LIST_FEATURED "youtube.videos.list_featured"
69
// dev_id=dev_id&id=id&page=page&per_page=per_page
70
#define REST_METHOD_LIST_BY_PLAYLIST "youtube.videos.list_by_playlist"
72
// dev_id=dev_id&time_range=time_range
73
#define REST_METHOD_LIST_POPULAR "youtube.videos.list_popular"
75
// dev_id=dev_id& category_id=category_id &tag=tag&page=page&per_page=per_page
76
#define REST_METHOD_LIST_BY_CAT_AND_TAG "youtube.videos.list_by_category_and_tag"
77
// REST API parameters
78
#define REST_PARAM_DEV_ID "dev_id"
79
#define REST_PARAM_TAG "tag"
80
#define REST_PARAM_ITEMS_PER_PAGE "per_page"
81
#define REST_PARAM_PAGE_NUMBER "page"
82
#define REST_PARAM_USER "user"
83
#define REST_PARAM_METHOD "method"
84
#define REST_PARAM_PLAYLIST_ID "id"
85
#define REST_PARAM_CATEGORY_ID "category_id"
86
#define REST_PARAM_TIME_RANGE "time_range"
88
// REST API time range values
89
#define REST_VALUE_TIME_RANGE_ALL "all"
90
#define REST_VALUE_TIME_RANGE_DAY "day"
91
#define REST_VALUE_TIME_RANGE_WEEK "week"
92
#define REST_VALUE_TIME_RANGE_MONTH "month"
94
// REST API available categories
95
// categories are now handled in the enum
97
#define REST_VALUE_CAT_FILM_AND_ANIMATION "1"
98
#define REST_VALUE_CAT_AUTOS_AND_VEHICLES "2"
99
#define REST_VALUE_CAT_COMEDY "23"
100
#define REST_VALUE_CAT_ENTERTAINMENT "24"
101
#define REST_VALUE_CAT_MUSIC "10"
102
#define REST_VALUE_CAT_NEWS_AND_POLITICS "25"
103
#define REST_VALUE_CAT_PEOPLE_AND_BLOGS "22"
104
#define REST_VALUE_CAT_PETS_AND_ANIMALS "15"
105
#define REST_VALUE_CAT_HOWTO_AND_DIY "26"
106
#define REST_VALUE_CAT_SPORTS "17"
107
#define REST_VALUE_CAT_TRAVEL_AND_PLACES "19"
108
#define REST_VALUE_CAT_GADGETS_AND_GAMES "20"
51
#define GDATA_API_YT_BASE_URL "http://gdata.youtube.com/feeds/api/"
53
// /users/USERNAME/favorites
54
#define GDATA_REQUEST_USERS "users/"
55
#define GDATA_REQUEST_FAVORITES "/favorites"
56
#define GDATA_REQUEST_SUBSCRIPTIONS "/subscriptions"
57
#define GDATA_REQUEST_PLAYLISTS "/playlists"
58
#define GDATA_REQUEST_UPLOADS "/uploads"
59
// /feeds/api/videos?vq="SEARCH TERMS"
60
#define GDATA_REQUEST_SEARCH "videos"
62
// all stdfeeds: "/standardfeeds/REGION_ID/feed"
63
#define GDATA_REQUEST_STDFEED_BASE "standardfeeds"
65
#define GDATA_REQUEST_STDFEED_TOP_RATED "top_rated"
66
#define GDATA_REQUEST_STDFEED_TOP_FAVORITES "top_favorites"
67
#define GDATA_REQUEST_STDFEED_MOST_VIEWED "most_viewed"
68
#define GDATA_REQUEST_STDFEED_MOST_RECENT "most_recent"
69
#define GDATA_REQUEST_STDFEED_MOST_DISCUSSED "most_discussed"
70
#define GDATA_REQUEST_STDFEED_MOST_LINKED "most_linked"
71
#define GDATA_REQUEST_STDFEED_MOST_RESPONDED "most_responded"
72
#define GDATA_REQUEST_STDFEED_RECENTLY_FEATURED "recently_featured"
73
#define GDATA_REQUEST_STDFEED_WATCH_ON_MOBILE "watch_on_mobile"
75
static const char *YT_stdfeeds[] =
77
GDATA_REQUEST_STDFEED_TOP_RATED, // has time
78
GDATA_REQUEST_STDFEED_TOP_FAVORITES, // has time
79
GDATA_REQUEST_STDFEED_MOST_VIEWED, // has time
80
GDATA_REQUEST_STDFEED_MOST_RECENT,
81
GDATA_REQUEST_STDFEED_MOST_DISCUSSED, // has time
82
GDATA_REQUEST_STDFEED_MOST_LINKED, // has time
83
GDATA_REQUEST_STDFEED_MOST_RESPONDED, // has time
84
GDATA_REQUEST_STDFEED_RECENTLY_FEATURED,
85
GDATA_REQUEST_STDFEED_WATCH_ON_MOBILE,
89
// gdata default parameters
90
//http://code.google.com/apis/youtube/reference.html#Query_parameter_definitions
91
#define GDATA_PARAM_FEED_FORMAT "alt"
93
// additional YT specific parameters
94
#define GDATA_YT_PARAM_VIDEO_QUERY "vq" // value must be url escaped
95
#define GDATA_YT_PARAM_ORDERBY "orderby"
96
#define GDATA_YT_PARAM_FORMAT "format"
97
#define GDATA_YT_PARAM_RESTRICT_LANGUAGE "lr"
98
#define GDATA_YT_PARAM_RESTRICTED_CONTENT "racy"
99
#define GDATA_YT_PARAM_COUNTRY_RESTRICTION "restriction"
100
#define GDATA_YT_PARAM_TIME "time"
101
#define GDATA_YT_PARAM_AUTHOR "author"
103
#define GDATA_YT_PARAM_START_INDEX "start-index"
104
#define GDATA_YT_PARAM_MAX_RESULTS_PER_REQ "max-results"
105
#define GDATA_YT_MAXIMUM_ALLOWED_RESULTS 1000
107
// allowed parameter values
108
#define GDATA_VALUE_FEED_FORMAT_RSS "rss"
110
#define GDATA_YT_VALUE_ORDERBY_RELEVANCE "relevance"
111
#define GDATA_YT_VALUE_ORDERBY_PUBLISHED "published"
112
#define GDATA_YT_VALUE_ORDERBY_VIEWCOUNT "viewCount"
113
#define GDATA_YT_VALUE_ORDERBY_RATING "rating"
114
/// \todo relevance_lang_languageCode
116
#define GDATA_YT_VALUE_FORMAT_SWF "5"
117
/// \todo do we need rtsp stuff? resolution is quite small there
120
#define GDATA_YT_VALUE_TIME_RANGE_ALL "all_time"
121
#define GDATA_YT_VALUE_TIME_RANGE_DAY "today"
122
#define GDATA_YT_VALUE_TIME_RANGE_WEEK "this_week"
123
#define GDATA_YT_VALUE_TIME_RANGE_MONTH "this_month"
111
125
// REST API min/max items per page values
112
#define REST_VALUE_PER_PAGE_MIN "1" // allthouth the spec says 20,
113
// lower values also seem to
115
#define REST_VALUE_PER_PAGE_MAX "100"
117
#define AMOUNT_ALL (-333)
118
#define PER_PAGE_MIN 1
119
#define PER_PAGE_MAX 100
121
// REST API error codes
122
#define REST_ERROR_INTERNAL "1"
123
#define REST_ERROR_BAD_XMLRPC "2"
124
#define REST_ERROR_UNKOWN_PARAM "3"
125
#define REST_ERROR_MISSING_REQURED_PARAM "4"
126
#define REST_ERROR_MISSING_METHOD "5"
127
#define REST_ERROR_UNKNOWN_METHOD "6"
128
#define REST_ERROR_MISSING_DEV_ID "7"
129
#define REST_ERROR_BAD_DEV_ID "8"
130
#define REST_ERROR_NO_SUCH_USER "101"
132
#define CAT_NAME_FILM_AND_ANIM "Film & Animation"
133
#define CAT_NAME_AUTOS_AND_VEHICLES "Autos & Vehicles"
126
#define GDATA_YT_VALUE_START_INDEX_MIN "1"
127
#define GDATA_YT_VALUE_PER_PAGE_MAX "50"
129
#define GDATA_YT_VALUE_RACY_ON "include"
130
#define GDATA_YT_VALUE_RACY_OFF "exclude"
132
#define AMOUNT_ALL (1000) // max items that we can get
134
#define CAT_NAME_FILM "Film & Animation"
135
#define CAT_NAME_AUTOS "Autos & Vehicles"
134
136
#define CAT_NAME_COMEDY "Comedy"
135
137
#define CAT_NAME_ENTERTAINMENT "Entertainment"
136
138
#define CAT_NAME_MUSIC "Music"
137
#define CAT_NAME_NEWS_AND_POLITICS "News & Politics"
138
#define CAT_NAME_PEOPLE_AND_BLOGS "People & Blogs"
139
#define CAT_NAME_PETS_AND_ANIMALS "Pets & Animals"
140
#define CAT_NAME_HOWTO_AND_DIY "Howto & DIY"
139
#define CAT_NAME_NEWS "News & Politics"
140
#define CAT_NAME_PEOPLE "People & Blogs"
141
#define CAT_NAME_ANIMALS "Pets & Animals"
142
#define CAT_NAME_HOWTO "Howto & Style"
141
143
#define CAT_NAME_SPORTS "Sports"
142
#define CAT_NAME_TRAVEL_AND_PLACES "Travel & Places"
143
#define CAT_NAME_GADGETS_AND_GAMES "Gadgets & Games"
144
#define CAT_NAME_TRAVEL "Travel & Events"
145
#define CAT_NAME_GADGETS "Gadgets & Games"
146
#define CAT_NAME_SHORT_MOVIES "Short Movies"
147
#define CAT_NAME_VIDEOBLOG "Videoblogging"
148
#define CAT_NAME_EDUCATION "Education"
149
#define CAT_NAME_NONPROFIT "Nonprofits & Activism"
151
#define REQ_NAME_STDFEEDS "Standard Feeds"
152
#define REQ_NAME_VIDEO_SEARCH "Video Queries"
145
153
#define REQ_NAME_FAVORITES "Favorites"
146
#define REQ_NAME_FEATURED "Featured"
147
#define REQ_NAME_POPULAR "Popular"
148
#define REQ_NAME_PLAYLIST "Playlists"
149
#define REQ_NAME_CATEGORY_AND_TAG "Categories"
151
#define REQ_NAME_BY_USER "User"
152
#define REQ_NAME_BY_TAG "Tag"
154
#define REQ_NAME_PLAYLISTS "Playlists"
155
#define REQ_NAME_SUBSCRIPTIONS "Subscriptions"
156
#define REQ_NAME_UPLOADS "User Videos"
154
158
// config.xml defines
155
#define CFG_CAT_STRING_FILM_AND_ANIM "films_and_animation"
156
#define CFG_CAT_STRING_AUTOS_AND_VEHICLES "autos_and_vehicles"
157
#define CFG_CAT_STRING_COMEDY "comedy"
158
#define CFG_CAT_STRING_ENTERTAINMENT "entertainment"
159
#define CFG_CAT_STRING_MUSIC "music"
160
#define CFG_CAT_STRING_NEWS_AND_POLITICS "news_and_politics"
161
#define CFG_CAT_STRING_PEOPLE_AND_BLOGS "people_and_blogs"
162
#define CFG_CAT_STRING_PETS_AND_ANIMALS "pets_and_animals"
163
#define CFG_CAT_STRING_HOWTO_AND_DIY "howto_and_diy"
164
#define CFG_CAT_STRING_SPORTS "sports"
165
#define CFG_CAT_STRING_TRAVEL_AND_PLACES "travel_and_places"
166
#define CFG_CAT_STRING_GADGETS_AND_GAMES "gadgets_and_games"
159
#define CFG_CAT_TERM_FILM "Film"
160
#define CFG_CAT_TERM_AUTOS "Autos"
161
#define CFG_CAT_TERM_MUSIC "Music"
162
#define CFG_CAT_TERM_ANIMALS "Animals"
163
#define CFG_CAT_TERM_SPORTS "Sports"
164
#define CFG_CAT_TERM_TRAVEL "Travel"
165
#define CFG_CAT_TERM_SHORT_MOVIES "Shortmov"
166
#define CFG_CAT_TERM_VIDEOBLOG "Videoblog"
167
#define CFG_CAT_TERM_GADGETS "Games"
168
#define CFG_CAT_TERM_COMEDY "Comedy"
169
#define CFG_CAT_TERM_PEOPLE "People"
170
#define CFG_CAT_TERM_NEWS "News"
171
#define CFG_CAT_TERM_ENTERTAINMENT "Entertainment"
172
#define CFG_CAT_TERM_EDUCATION "Education"
173
#define CFG_CAT_TERM_HOWTO "Howto"
174
#define CFG_CAT_TERM_NONPROFIT "Nonprofit"
175
#define CFG_CAT_TERM_TECH "Tech"
168
#define CFG_METHOD_FAVORITES "favorites"
169
#define CFG_METHOD_TAG "tag"
170
#define CFG_METHOD_USER "user"
171
#define CFG_METHOD_FEATURED "featured"
172
#define CFG_METHOD_PLAYLIST "playlist"
173
#define CFG_METHOD_POPULAR "popular"
174
#define CFG_METHOD_CATEGORY_AND_TAG "category-and-tag"
177
#define CFG_REQUEST_STDFEED "standardfeed"
178
#define CFG_REQUEST_VIDEOSEARCH "search"
179
#define CFG_REQUEST_FAVORITES "favorites"
180
#define CFG_REQUEST_SUBSCRIPTIONS "subscriptions"
181
#define CFG_REQUEST_PLAYLISTS "playlists"
182
#define CFG_REQUEST_UPLOADS "uploads"
176
184
#define CFG_OPTION_USER "user"
177
185
#define CFG_OPTION_TAG "tag"
178
#define CFG_OPTION_STARTPAGE "start-page"
186
#define CFG_OPTION_STARTINDEX "start-index"
179
187
#define CFG_OPTION_AMOUNT "amount"
180
188
#define CFG_OPTION_PLAYLIST_ID "id"
181
189
#define CFG_OPTION_PLAYLIST_NAME "name"
182
190
#define CFG_OPTION_TIME_RANGE "time-range"
183
#define CFG_OPTION_CATEGORY "category"
191
#define CFG_OPTION_AUTHOR "author"
193
#define CFG_OPTION_STDFEED "feed"
194
#define CFG_OPTION_REGION_ID "region-id"
195
#define CFG_OPTION_SEARCH_QUERY "query"
197
#define CFG_OPTION_REGION_AUSTRALIA "au"
198
#define CFG_OPTION_REGION_BRAZIL "br"
199
#define CFG_OPTION_REGION_CANADA "ca"
200
#define CFG_OPTION_REGION_FRANCE "fr"
201
#define CFG_OPTION_REGION_GERMANY "de"
202
#define CFG_OPTION_REGION_GREAT_BRITAIN "gb"
203
#define CFG_OPTION_REGION_HOLLAND "nl"
204
#define CFG_OPTION_REGION_HONG_KONG "hk"
205
#define CFG_OPTION_REGION_IRELAND "ie"
206
#define CFG_OPTION_REGION_ITALY "it"
207
#define CFG_OPTION_REGION_JAPAN "jp"
208
#define CFG_OPTION_REGION_MEXICO "mx"
209
#define CFG_OPTION_REGION_NEW_ZEALAND "nz"
210
#define CFG_OPTION_REGION_POLAND "pl"
211
#define CFG_OPTION_RUSSIA "ru"
212
#define CFG_OPTION_SOUTH_KOREA "kr"
213
#define CFG_OPTION_SPAIN "es"
214
#define CFG_OPTION_TAIWAN "tw"
215
#define CFG_OPTION_UNITED_STATES "us"
217
typedef struct regions regions;
221
const char *region_code;
225
static regions YT_regions[] =
227
{ YT_region_au, CFG_OPTION_REGION_AUSTRALIA, "Australia" },
228
{ YT_region_br, CFG_OPTION_REGION_BRAZIL, "Brazil" },
229
{ YT_region_ca, CFG_OPTION_REGION_CANADA, "Canada" },
230
{ YT_region_fr, CFG_OPTION_REGION_FRANCE, "France" },
231
{ YT_region_de, CFG_OPTION_REGION_GERMANY, "Germany" },
232
{ YT_region_gb, CFG_OPTION_REGION_GREAT_BRITAIN, "Great Britain" },
233
{ YT_region_nl, CFG_OPTION_REGION_HOLLAND, "Netherlands" },
234
{ YT_region_hk, CFG_OPTION_REGION_HONG_KONG, "Hong Kong" },
235
{ YT_region_ie, CFG_OPTION_REGION_IRELAND, "Ireland" },
236
{ YT_region_it, CFG_OPTION_REGION_ITALY, "Italy" },
237
{ YT_region_jp, CFG_OPTION_REGION_JAPAN, "Japan" },
238
{ YT_region_mx, CFG_OPTION_REGION_MEXICO, "Mexico" },
239
{ YT_region_nz, CFG_OPTION_REGION_NEW_ZEALAND, "New Zealand" },
240
{ YT_region_pl, CFG_OPTION_REGION_POLAND, "Poland" },
241
{ YT_region_ru, CFG_OPTION_RUSSIA, "Russia" },
242
{ YT_region_kr, CFG_OPTION_SOUTH_KOREA, "South Korea" },
243
{ YT_region_es, CFG_OPTION_SPAIN, "Spain" },
244
{ YT_region_tw, CFG_OPTION_TAIWAN, "Taiwan" },
245
{ YT_region_us, CFG_OPTION_UNITED_STATES, "United States" },
246
{ YT_region_none, NULL , NULL },
185
249
YouTubeService::YouTubeService()
329
350
itmp = temp.toInt();
331
352
throw _Exception(_("Tag <") + xml->getName() +
332
_("> is missing the requred \"") + attrname +
353
_("> is missing the requred \"") + attrname +
336
357
throw _Exception(_("Invalid value in ") + attrname + _(" for <") +
337
xml->getName() + _("> tag"));
358
xml->getName() + _("> tag"));
342
void YouTubeService::addPagingParams(Ref<Element> xml, Ref<YouTubeTask> task)
365
void YouTubeService::getPagingParams(Ref<Element> xml, Ref<YouTubeTask> task)
346
temp = getCheckAttr(xml, _(CFG_OPTION_AMOUNT));
369
temp = xml->getAttribute(_(CFG_OPTION_AMOUNT));
370
if (!string_ok(temp))
347
373
if (temp == "all")
349
374
task->amount = AMOUNT_ALL;
350
task->parameters->put(_(REST_PARAM_ITEMS_PER_PAGE),
351
_(REST_VALUE_PER_PAGE_MAX));
355
377
itmp = getCheckPosIntAttr(xml, _(CFG_OPTION_AMOUNT));
356
if (itmp >= _(REST_VALUE_PER_PAGE_MAX).toInt())
357
task->parameters->put(_(REST_PARAM_ITEMS_PER_PAGE),
358
_(REST_VALUE_PER_PAGE_MAX));
360
task->parameters->put(_(REST_PARAM_ITEMS_PER_PAGE),
378
if (itmp > AMOUNT_ALL)
380
log_warning("Maximum amount of items to fetch can not exceed 1000\n");
362
383
task->amount = itmp;
365
itmp = getCheckPosIntAttr(xml, _(CFG_OPTION_STARTPAGE));
366
task->parameters->put(_(REST_PARAM_PAGE_NUMBER),
371
Ref<Object> YouTubeService::defineServiceTask(Ref<Element> xmlopt)
386
temp = xml->getAttribute(_(CFG_OPTION_STARTINDEX));
387
if (!string_ok(temp))
391
itmp = getCheckPosIntAttr(xml, _(CFG_OPTION_STARTINDEX));
394
throw _Exception(_("Tag <") + xml->getName() + _("> ") +
395
_(CFG_OPTION_STARTINDEX) + _(" must be at least 1!"));
398
task->cfg_start_index = itmp;
399
task->start_index = itmp;
402
void YouTubeService::addTimeParams(Ref<Element> xml, Ref<YouTubeTask> task)
406
temp = xml->getAttribute(_(CFG_OPTION_TIME_RANGE));
407
if (!string_ok(temp))
410
if ((temp != GDATA_YT_VALUE_TIME_RANGE_ALL) &&
411
(temp != GDATA_YT_VALUE_TIME_RANGE_DAY) &&
412
(temp != GDATA_YT_VALUE_TIME_RANGE_WEEK) &&
413
(temp != GDATA_YT_VALUE_TIME_RANGE_MONTH))
414
throw _Exception(_("Invalid time range parameter \"") + temp +
415
_("\" in <") + xml->getName() + _("> tag"));
417
task->parameters->put(_(GDATA_YT_PARAM_TIME), temp);
420
yt_regions_t YouTubeService::getRegion(Ref<Element> xml)
422
String region = xml->getAttribute(_(CFG_OPTION_REGION_ID));
423
if (!string_ok(region))
424
return YT_region_none;
427
while (YT_regions[count].region_code != NULL)
429
if (region == YT_regions[count].region_code)
430
return YT_regions[count].region;
434
throw _Exception(_("<") + xml->getName() + _("> tag has an invalid region setting: ") + region);
438
String YouTubeService::getFeed(Ref<Element> xml)
440
String feed = xml->getAttribute(_(CFG_OPTION_STDFEED));
441
if (!string_ok(feed))
442
throw _Exception(_("<") + xml->getName() + _("> tag is missing the required feed setting!"));
445
while (YT_stdfeeds[count] != NULL)
447
if (feed == YT_stdfeeds[count])
452
throw _Exception(_("<") + xml->getName() + _("> tag has an invalid feed setting: ") + feed);
455
Ref<Object> YouTubeService::defineServiceTask(Ref<Element> xmlopt, Ref<Object> params)
373
457
Ref<YouTubeTask> task(new YouTubeTask());
374
458
String temp = xmlopt->getName();
460
Ref<Option> racy = RefCast(params, Option);
376
if (temp == CFG_METHOD_FAVORITES)
377
task->method = YT_list_favorite;
378
else if (temp == CFG_METHOD_TAG)
379
task->method = YT_list_by_tag;
380
else if (temp == CFG_METHOD_USER)
381
task->method = YT_list_by_user;
382
else if (temp == CFG_METHOD_FEATURED)
383
task->method = YT_list_featured;
384
else if (temp == CFG_METHOD_PLAYLIST)
385
task->method = YT_list_by_playlist;
386
else if (temp == CFG_METHOD_POPULAR)
387
task->method = YT_list_popular;
388
else if (temp == CFG_METHOD_CATEGORY_AND_TAG)
389
task->method = YT_list_by_category_and_tag;
462
if (temp == CFG_REQUEST_STDFEED)
463
task->request = YT_request_stdfeed;
464
else if (temp == CFG_REQUEST_VIDEOSEARCH)
465
task->request = YT_request_video_search;
466
else if (temp == CFG_REQUEST_FAVORITES)
467
task->request = YT_request_user_favorites;
468
else if (temp == CFG_REQUEST_SUBSCRIPTIONS)
469
task->request = YT_request_user_subscriptions;
470
else if (temp == CFG_REQUEST_PLAYLISTS)
471
task->request = YT_request_user_playlists;
472
else if (temp == CFG_REQUEST_UPLOADS)
473
task->request = YT_request_user_uploads;
390
474
else throw _Exception(_("Unsupported tag while parsing YouTube options: ") + temp);
392
if (!hasPaging(task->method))
393
task->amount = AMOUNT_ALL;
476
task->amount = AMOUNT_ALL;
395
switch (task->method)
478
task->parameters->put(_(GDATA_PARAM_FEED_FORMAT),
479
_(GDATA_VALUE_FEED_FORMAT_RSS));
480
switch (task->request)
397
case YT_list_favorite:
398
task->parameters->put(_(REST_PARAM_METHOD),
399
_(REST_METHOD_LIST_FAVORITE));
401
task->parameters->put(_(REST_PARAM_USER),
402
getCheckAttr(xmlopt, _(CFG_OPTION_USER)));
406
task->parameters->put(_(REST_PARAM_METHOD),
407
_(REST_METHOD_LIST_BY_TAG));
409
task->parameters->put(_(REST_PARAM_TAG),
410
getCheckAttr(xmlopt, _(CFG_OPTION_TAG)));
412
addPagingParams(xmlopt, task);
415
case YT_list_by_user:
416
task->parameters->put(_(REST_PARAM_METHOD),
417
_(REST_METHOD_LIST_BY_USER));
419
task->parameters->put(_(REST_PARAM_USER),
420
getCheckAttr(xmlopt, _(CFG_OPTION_USER)));
422
addPagingParams(xmlopt, task);
425
case YT_list_featured:
426
task->parameters->put(_(REST_PARAM_METHOD),
427
_(REST_METHOD_LIST_FEATURED));
430
case YT_list_by_playlist:
431
task->parameters->put(_(REST_PARAM_METHOD),
432
_(REST_METHOD_LIST_BY_PLAYLIST));
433
task->parameters->put(_(REST_PARAM_PLAYLIST_ID),
434
getCheckAttr(xmlopt, _(CFG_OPTION_PLAYLIST_ID)));
435
addPagingParams(xmlopt, task);
437
task->playlist_name =
438
getCheckAttr(xmlopt, _(CFG_OPTION_PLAYLIST_NAME));
441
case YT_list_popular:
442
task->parameters->put(_(REST_PARAM_METHOD),
443
_(REST_METHOD_LIST_POPULAR));
444
temp = getCheckAttr(xmlopt, _(CFG_OPTION_TIME_RANGE));
445
if ((temp != REST_VALUE_TIME_RANGE_ALL) &&
446
(temp != REST_VALUE_TIME_RANGE_DAY) &&
447
(temp != REST_VALUE_TIME_RANGE_WEEK) &&
448
(temp != REST_VALUE_TIME_RANGE_MONTH))
450
throw _Exception(_("Invalid time range specified for <") +
451
xmlopt->getName() + _("< tag!"));
454
task->parameters->put(_(REST_PARAM_TIME_RANGE), temp);
457
case YT_list_by_category_and_tag:
458
task->parameters->put(_(REST_PARAM_METHOD),
459
_(REST_METHOD_LIST_BY_CAT_AND_TAG));
460
task->parameters->put(_(REST_PARAM_TAG),
461
getCheckAttr(xmlopt, _(CFG_OPTION_TAG)));
482
case YT_request_stdfeed:
483
task->parameters->put(_(GDATA_YT_PARAM_FORMAT),
484
_(GDATA_YT_VALUE_FORMAT_SWF));
486
temp2 = getFeed(xmlopt);
487
task->url_part = _(GDATA_REQUEST_STDFEED_BASE) + _("/");
489
if (temp2 != GDATA_REQUEST_STDFEED_WATCH_ON_MOBILE)
491
yt_regions_t r = getRegion(xmlopt);
492
if (r < YT_region_none)
494
task->url_part = task->url_part +
495
YT_regions[r].region_code + _("/");
500
task->url_part = task->url_part + temp2;
501
if ((temp2 != GDATA_REQUEST_STDFEED_MOST_RECENT) &&
502
(temp2 != GDATA_REQUEST_STDFEED_RECENTLY_FEATURED) &&
503
(temp2 != GDATA_REQUEST_STDFEED_WATCH_ON_MOBILE))
505
addTimeParams(xmlopt, task);
508
task->parameters->put(_(GDATA_YT_PARAM_RESTRICTED_CONTENT),
511
getPagingParams(xmlopt, task);
515
case YT_request_video_search:
516
task->parameters->put(_(GDATA_YT_PARAM_FORMAT),
517
_(GDATA_YT_VALUE_FORMAT_SWF));
518
task->url_part = _(GDATA_REQUEST_SEARCH);
519
/// \todo check if this needs additional URL escaping
520
temp = getCheckAttr(xmlopt, _(CFG_OPTION_SEARCH_QUERY));
521
task->parameters->put(_(GDATA_YT_PARAM_VIDEO_QUERY), temp);
523
temp = xmlopt->getAttribute(_(CFG_OPTION_AUTHOR));
525
task->parameters->put(_(GDATA_YT_PARAM_AUTHOR), temp);
463
temp = getCheckAttr(xmlopt, _(CFG_OPTION_CATEGORY));
464
if (temp == CFG_CAT_STRING_FILM_AND_ANIM)
466
task->category = YT_cat_film_and_animation;
467
temp = String::from(YT_cat_film_and_animation);
469
else if (temp == CFG_CAT_STRING_AUTOS_AND_VEHICLES)
471
task->category = YT_cat_autos_and_vehicles;
472
temp = String::from(YT_cat_autos_and_vehicles);
474
else if (temp == CFG_CAT_STRING_COMEDY)
476
task->category = YT_cat_comedy;
477
temp = String::from(YT_cat_comedy);
479
else if (temp == CFG_CAT_STRING_ENTERTAINMENT)
481
task->category = YT_cat_entertainment;
482
temp = String::from(YT_cat_entertainment);
484
else if (temp == CFG_CAT_STRING_MUSIC)
486
task->category = YT_cat_music;
487
temp = String::from(YT_cat_music);
489
else if (temp == CFG_CAT_STRING_NEWS_AND_POLITICS)
491
task->category = YT_cat_news_and_politics;
492
temp = String::from(YT_cat_news_and_politics);
494
else if (temp == CFG_CAT_STRING_PEOPLE_AND_BLOGS)
496
task->category = YT_cat_people_and_blogs;
497
temp = String::from(YT_cat_people_and_blogs);
499
else if (temp == CFG_CAT_STRING_PETS_AND_ANIMALS)
501
task->category = YT_cat_pets_and_animals;
502
temp = String::from(YT_cat_pets_and_animals);
504
else if (temp == CFG_CAT_STRING_HOWTO_AND_DIY)
506
task->category = YT_cat_howto_and_diy;
507
temp = String::from(YT_cat_howto_and_diy);
509
else if (temp == CFG_CAT_STRING_SPORTS)
511
task->category = YT_cat_sports;
512
temp = String::from(YT_cat_sports);
514
else if (temp == CFG_CAT_STRING_TRAVEL_AND_PLACES)
516
task->category = YT_cat_travel_and_places;
517
temp = String::from(YT_cat_travel_and_places);
519
else if (temp == CFG_CAT_STRING_GADGETS_AND_GAMES)
521
task->category = YT_cat_gadgets_and_games;
522
temp = String::from(YT_cat_gadgets_and_games);
526
throw _Exception(_("Invalid category specified for <") +
527
xmlopt->getName() + _("< tag!"));
529
task->parameters->put(_(REST_PARAM_CATEGORY_ID), temp);
531
addPagingParams(xmlopt, task);
527
task->parameters->put(_(GDATA_YT_PARAM_RESTRICTED_CONTENT),
531
getPagingParams(xmlopt, task);
534
case YT_request_user_favorites:
535
task->parameters->put(_(GDATA_YT_PARAM_FORMAT),
536
_(GDATA_YT_VALUE_FORMAT_SWF));
537
temp = getCheckAttr(xmlopt, _(CFG_OPTION_USER));
538
task->url_part = _(GDATA_REQUEST_USERS) + temp +
539
_(GDATA_REQUEST_FAVORITES);
541
task->parameters->put(_(GDATA_YT_PARAM_RESTRICTED_CONTENT),
544
getPagingParams(xmlopt, task);
546
case YT_request_user_subscriptions:
547
temp = getCheckAttr(xmlopt, _(CFG_OPTION_USER));
548
task->url_part = _(GDATA_REQUEST_USERS) + temp +
549
_(GDATA_REQUEST_SUBSCRIPTIONS);
550
task->amount = AMOUNT_ALL;
552
case YT_request_user_playlists:
553
temp = getCheckAttr(xmlopt, _(CFG_OPTION_USER));
554
task->url_part = _(GDATA_REQUEST_USERS) + temp +
555
_(GDATA_REQUEST_PLAYLISTS);
556
task->amount = AMOUNT_ALL;
558
case YT_request_user_uploads:
559
task->parameters->put(_(GDATA_YT_PARAM_FORMAT),
560
_(GDATA_YT_VALUE_FORMAT_SWF));
561
temp = getCheckAttr(xmlopt, _(CFG_OPTION_USER));
562
task->url_part = _(GDATA_REQUEST_USERS) + temp +
563
_(GDATA_REQUEST_UPLOADS);
565
task->parameters->put(_(GDATA_YT_PARAM_RESTRICTED_CONTENT),
568
getPagingParams(xmlopt, task);
570
case YT_request_none:
536
572
throw _Exception(_("Unsupported tag!"));
638
689
throw _Exception(_("Encountered invalid task!"));
640
task->parameters->put(_(REST_PARAM_DEV_ID), ConfigManager::getInstance()->getOption(CFG_ONLINE_CONTENT_YOUTUBE_DEV_ID));
642
if (hasPaging(task->method) &&
643
((task->amount == AMOUNT_ALL) || (task->amount > PER_PAGE_MAX)))
691
if (task->amount_fetched < task->amount)
645
task->current_page++;
646
task->parameters->put(_(REST_PARAM_PAGE_NUMBER),
647
String::from(task->current_page));
693
// yt start index begins at 1
694
task->start_index = task->cfg_start_index + task->amount_fetched;
695
task->parameters->put(_(GDATA_YT_PARAM_START_INDEX),
696
String::from(task->start_index));
698
if ((task->amount - task->amount_fetched) >=
699
_(GDATA_YT_VALUE_PER_PAGE_MAX).toInt())
701
task->parameters->put(_(GDATA_YT_PARAM_MAX_RESULTS_PER_REQ),
702
_(GDATA_YT_VALUE_PER_PAGE_MAX));
704
else if ((task->amount - task->amount_fetched) <
705
_(GDATA_YT_VALUE_PER_PAGE_MAX).toInt())
707
task->parameters->put(_(GDATA_YT_PARAM_MAX_RESULTS_PER_REQ),
708
String::from(task->amount - task->amount_fetched));
650
Ref<Element> reply = getData(task->parameters);
714
bool construct_url = true;
652
717
Ref<YouTubeContentHandler> yt(new YouTubeContentHandler());
719
if ((task->request == YT_request_user_subscriptions) ||
720
(task->request == YT_request_user_playlists))
722
reply = getData(task->url_part, task->parameters, true);
724
throw _Exception(_("Failed to retrieve YouTube subfeed"));
726
task->subfeed = yt->getSubFeed(reply);
729
for (int f = 0; f < task->subfeed->links->size(); f++)
731
Ref<YouTubeTask> subtask(new YouTubeTask());
732
subtask->kill = true; // autoremove after one time execution
733
if (task->request == YT_request_user_subscriptions)
734
subtask->request = YT_subrequest_subscriptions;
735
else if (task->request == YT_request_user_playlists)
736
subtask->request = YT_subrequest_playlists;
738
subtask->request = YT_request_none;
740
subtask->url_part = task->subfeed->links->get(f);
741
subtask->amount = AMOUNT_ALL;
742
subtask->sub_request_name = task->subfeed->title;
743
subtask->parameters->put(_(GDATA_YT_PARAM_FORMAT),
744
_(GDATA_YT_VALUE_FORMAT_SWF));
745
subtask->parameters->put(_(GDATA_PARAM_FEED_FORMAT),
746
_(GDATA_VALUE_FEED_FORMAT_RSS));
748
tasklist->append(RefCast(subtask, Object));
752
if (current_task >= tasklist->size())
755
killOneTimeTasks(tasklist);
761
if ((task->request == YT_subrequest_subscriptions) ||
762
(task->request == YT_subrequest_playlists))
763
construct_url = false;
765
reply = getData(task->url_part, task->parameters, construct_url);
654
767
if (reply != nil)
655
768
b = yt->setServiceContent(reply);