updated on Thu Jan 26 16:09:46 UTC 2012
[aur-mirror.git] / totem-gst / totem-3.2.patch
blob61008a1468a93a27b6a1a142d335ae918d3447f6
1 diff --git a/browser-plugin/totem-plugin-viewer.c b/browser-plugin/totem-plugin-viewer.c
2 index 2b5b92c..3bfafd1 100644
3 --- a/browser-plugin/totem-plugin-viewer.c
4 +++ b/browser-plugin/totem-plugin-viewer.c
5 @@ -104,7 +104,6 @@ typedef struct _TotemEmbedded {
6 DBusGConnection *conn;
7 GtkWidget *window;
8 GtkBuilder *menuxml, *xml;
9 - GtkWidget *about;
10 GtkWidget *pp_button;
11 GtkWidget *pp_fs_button;
12 TotemStatusbar *statusbar;
13 @@ -187,7 +186,6 @@ static void totem_embedded_update_menu (TotemEmbedded *emb);
14 static void on_open1_activate (GtkButton *button, TotemEmbedded *emb);
15 static void totem_embedded_toggle_fullscreen (TotemEmbedded *emb);
17 -void on_about1_activate (GtkButton *button, TotemEmbedded *emb);
18 void on_preferences1_activate (GtkButton *button, TotemEmbedded *emb);
19 void on_copy_location1_activate (GtkButton *button, TotemEmbedded *emb);
20 void on_fullscreen1_activate (GtkMenuItem *menuitem, TotemEmbedded *emb);
21 @@ -348,7 +346,7 @@ totem_embedded_set_state (TotemEmbedded *emb, TotemStates state)
23 switch (state) {
24 case TOTEM_STATE_STOPPED:
25 - id = GTK_STOCK_MEDIA_PLAY;
26 + id = "media-playback-start-symbolic";
27 totem_statusbar_set_text (emb->statusbar, _("Stopped"));
28 totem_statusbar_set_time_and_length (emb->statusbar, 0, 0);
29 totem_time_label_set_time
30 @@ -360,11 +358,11 @@ totem_embedded_set_state (TotemEmbedded *emb, TotemStates state)
32 break;
33 case TOTEM_STATE_PAUSED:
34 - id = GTK_STOCK_MEDIA_PLAY;
35 + id = "media-playback-start-symbolic";
36 totem_statusbar_set_text (emb->statusbar, _("Paused"));
37 break;
38 case TOTEM_STATE_PLAYING:
39 - id = GTK_STOCK_MEDIA_PAUSE;
40 + id = "media-playback-pause-symbolic";
41 totem_statusbar_set_text (emb->statusbar, _("Playing"));
42 if (emb->href_uri == NULL && emb->hidden == FALSE) {
43 gdk_window_set_cursor
44 @@ -380,8 +378,8 @@ totem_embedded_set_state (TotemEmbedded *emb, TotemStates state)
46 if (emb->scrsaver != NULL)
47 totem_scrsaver_set_state (emb->scrsaver, (state == TOTEM_STATE_PLAYING) ? FALSE : TRUE);
48 - gtk_image_set_from_stock (GTK_IMAGE (image), id, GTK_ICON_SIZE_MENU);
49 - gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (emb->pp_fs_button), id);
50 + gtk_image_set_from_icon_name (GTK_IMAGE (image), id, GTK_ICON_SIZE_MENU);
51 + gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (emb->pp_fs_button), id);
53 emb->state = state;
55 @@ -773,6 +771,7 @@ totem_embedded_set_fullscreen (TotemEmbedded *emb,
56 gdk_screen_get_monitor_geometry (gtk_widget_get_screen (GTK_WIDGET (emb->bvw)),
57 monitor, &rect);
58 gtk_window_move (GTK_WINDOW (emb->fs_window), rect.x, rect.y);
59 + totem_interface_set_transient_for (GTK_WINDOW (emb->fs_window), GTK_WINDOW (emb->window));
61 gtk_widget_reparent (GTK_WIDGET (emb->bvw), emb->fs_window);
62 bacon_video_widget_set_fullscreen (emb->bvw, TRUE);
63 @@ -1129,61 +1128,6 @@ on_fullscreen1_activate (GtkMenuItem *menuitem, TotemEmbedded *emb)
66 void
67 -on_about1_activate (GtkButton *button, TotemEmbedded *emb)
69 - char *backend_version, *description, *license;
70 - GtkWidget **about;
72 - const char *authors[] =
73 - {
74 - "Bastien Nocera <hadess@hadess.net>",
75 - "Ronald Bultje <rbultje@ronald.bitfreak.net>",
76 - "Christian Persch" " <" "chpe" "@" "gnome" "." "org" ">",
77 - NULL
78 - };
80 - if (emb->about != NULL)
81 - {
82 - gtk_window_present (GTK_WINDOW (emb->about));
83 - return;
84 - }
86 - backend_version = bacon_video_widget_get_backend_name (emb->bvw);
87 - description = g_strdup_printf (_("Browser Plugin using %s"),
88 - backend_version);
89 - license = totem_interface_get_license ();
91 - emb->about = g_object_new (GTK_TYPE_ABOUT_DIALOG,
92 - "program-name", _("Totem Browser Plugin"),
93 - "version", VERSION,
94 - "copyright", "Copyright © 2002-2007 Bastien Nocera\n"
95 - "Copyright © 2006, 2007, 2008 Christian Persch",
96 - "comments", description,
97 - "authors", authors,
98 - "translator-credits", _("translator-credits"),
99 - "logo-icon-name", "totem",
100 - "license", license,
101 - "wrap-license", TRUE,
102 - NULL);
104 - g_free (backend_version);
105 - g_free (description);
106 - g_free (license);
108 - totem_interface_set_transient_for (GTK_WINDOW (emb->about),
109 - GTK_WINDOW (emb->window));
111 - about = &emb->about;
112 - g_object_add_weak_pointer (G_OBJECT (emb->about),
113 - (gpointer *) about);
115 - g_signal_connect (G_OBJECT (emb->about), "response",
116 - G_CALLBACK (gtk_widget_destroy), NULL);
118 - gtk_widget_show (emb->about);
121 -void
122 on_copy_location1_activate (GtkButton *button, TotemEmbedded *emb)
124 GdkDisplay *display;
125 @@ -1867,7 +1811,7 @@ totem_embedded_construct (TotemEmbedded *emb,
126 G_CALLBACK (totem_embedded_on_fullscreen_exit), emb);
128 emb->pp_fs_button = GTK_WIDGET (gtk_tool_button_new_from_stock
129 - (GTK_STOCK_MEDIA_PLAY));
130 + ("media-playback-start-symbolic"));
131 g_signal_connect (G_OBJECT (emb->pp_fs_button), "clicked",
132 G_CALLBACK (on_play_pause), emb);
133 gtk_container_add (GTK_CONTAINER (emb->fs->buttons_box), emb->pp_fs_button);
134 @@ -1933,7 +1877,7 @@ totem_embedded_construct (TotemEmbedded *emb,
135 G_CALLBACK (cb_on_seek), emb);
137 emb->pp_button = GTK_WIDGET (gtk_builder_get_object (emb->xml, "pp_button"));
138 - image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU);
139 + image = gtk_image_new_from_icon_name ("media-playback-start-symbolic", GTK_ICON_SIZE_MENU);
140 gtk_button_set_image (GTK_BUTTON (emb->pp_button), image);
141 g_signal_connect (G_OBJECT (emb->pp_button), "clicked",
142 G_CALLBACK (on_play_pause), emb);
143 @@ -1994,6 +1938,7 @@ totem_embedded_construct (TotemEmbedded *emb,
144 } else {
145 /* Success! Apply the styling to various widgets */
146 GtkStyleContext *context;
147 + GtkWidget *widget;
149 context = gtk_widget_get_style_context (emb->pp_button);
150 gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
151 @@ -2003,6 +1948,10 @@ totem_embedded_construct (TotemEmbedded *emb,
153 context = gtk_widget_get_style_context (emb->volume);
154 gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
156 + widget = GTK_WIDGET (gtk_builder_get_object (emb->xml, "popup_button"));
157 + context = gtk_widget_get_style_context (widget);
158 + gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
161 g_object_unref (provider);
162 @@ -2276,6 +2225,7 @@ int main (int argc, char **argv)
163 guint res;
164 GError *e = NULL;
165 char svcname[256];
166 + GtkSettings *gtk_settings;
168 bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
169 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
170 @@ -2391,6 +2341,9 @@ int main (int argc, char **argv)
171 exit (1);
174 + gtk_settings = gtk_settings_get_default ();
175 + g_object_set (G_OBJECT (gtk_settings), "gtk-application-prefer-dark-theme", TRUE, NULL);
177 emb = g_object_new (TOTEM_TYPE_EMBEDDED, NULL);
179 emb->state = TOTEM_STATE_INVALID;
180 diff --git a/browser-plugin/totemPlugin.cpp b/browser-plugin/totemPlugin.cpp
181 index 9bacbf9..3eaab64 100644
182 --- a/browser-plugin/totemPlugin.cpp
183 +++ b/browser-plugin/totemPlugin.cpp
184 @@ -105,6 +105,7 @@ static const totemPluginMimeEntry kMimeTypes[] = {
185 { "image/x-macpaint", "pntg", NULL },
186 { "image/x-quicktime", "pict, pict1, pict2", "image/x-pict" },
187 { "video/x-m4v", "m4v", NULL },
188 + { "application/vnd.apple.mpegurl", "m3u8", NULL },
189 #elif defined(TOTEM_MULLY_PLUGIN)
190 { "video/divx", "divx", "video/x-msvideo" },
191 #elif defined(TOTEM_CONE_PLUGIN)
192 diff --git a/configure.in b/configure.in
193 index 797c8fc..997c2ca 100644
194 --- a/configure.in
195 +++ b/configure.in
196 @@ -48,9 +48,9 @@ TOTEM_PLPARSER_REQS=2.32.4
197 GNOMEICON_REQS=2.15.90
198 DBUS_REQS=0.82
199 VALA_REQS=0.11.1
200 -PEAS_REQS=0.7.2
201 +PEAS_REQS=1.1.0
202 PYTHON_REQS=2.3
203 -PYGOBJECT_REQS=2.27.0
204 +PYGOBJECT_REQS=2.90.3
206 AC_SUBST(GLIB_REQS)
207 AC_SUBST(GTK_REQS)
208 @@ -68,7 +68,7 @@ AC_SUBST(TOTEM_API_VERSION)
209 AC_DEFINE_UNQUOTED(TOTEM_API_VERSION, ["$TOTEM_API_VERSION"], [Define to the Totem plugin API version])
211 # The full list of plugins
212 -allowed_plugins="bemused brasero-disc-recorder chapters coherence_upnp dbus-service im-status gromit iplayer jamendo lirc media-player-keys ontop opensubtitles properties publish pythonconsole save-file sample-python sample-vala screensaver screenshot sidebar-test skipto thumbnail tracker youtube zeitgeist-dp"
213 +allowed_plugins="bemused brasero-disc-recorder chapters dbusservice im-status gromit iplayer lirc media-player-keys ontop opensubtitles properties publish pythonconsole save-file samplepython sample-vala screensaver screenshot sidebar-test skipto thumbnail youtube zeitgeist-dp grilo"
215 PLUGINDIR='${libdir}/totem/plugins'
216 AC_SUBST(PLUGINDIR)
217 @@ -300,16 +300,16 @@ if test "x$enable_python" != "xno"; then
218 have_python=no
221 - PKG_CHECK_MODULES([PYGOBJECT],[pygobject-2.0 >= $PYGOBJECT_REQS],[have_pygobject=yes],[have_pygobject=no])
222 + PKG_CHECK_MODULES([PYGOBJECT],[pygobject-3.0 >= $PYGOBJECT_REQS],[have_pygobject=yes],[have_pygobject=no])
225 # Output the results of the Python checks
226 if test "x$have_python" != "xyes" -o "x$have_pygobject" != "xyes"; then
227 if test "x$enable_python" = "xyes"; then
228 - AC_MSG_ERROR([python >= $PYTHON_REQS or pygobject-2.0 >= $PYGOBJECT_REQS not found])
229 + AC_MSG_ERROR([python >= $PYTHON_REQS or pygobject-3.0 >= $PYGOBJECT_REQS not found])
230 elif test "x$enable_python" = "xautodetect"; then
231 enable_python=no
232 - AC_MSG_WARN([python >= $PYTHON_REQS or pygobject-2.0 >= $PYGOBJECT_REQS not found; disabling Python support])
233 + AC_MSG_WARN([python >= $PYTHON_REQS or pygobject-3.0 >= $PYGOBJECT_REQS not found; disabling Python support])
235 elif test "x$enable_python" != "xno"; then
236 enable_python=yes
237 @@ -394,11 +394,6 @@ for plugin in ${used_plugins}; do
238 add_plugin="1"
240 case ${plugin} in
241 - coherence_upnp)
242 - # The Coherence framework still uses PyGTK, and thus conflicts with the new pygobject introspected bindings
243 - plugin_error_or_ignore "the coherence_upnp plugin uses PyGTK and conflicts with the new pygobject bindings"
244 - add_plugin="0"
245 - ;;
246 gromit)
247 if test "${have_x11}" != "yes" ; then
248 plugin_error_or_ignore "the gromit plugin is not supported on non-X11 targets"
249 @@ -406,10 +401,10 @@ for plugin in ${used_plugins}; do
252 media-player-keys)
253 - PKG_CHECK_MODULES(MEDIA_PLAYER_KEYS, dbus-glib-1,
254 + PKG_CHECK_MODULES(MEDIA_PLAYER_KEYS, gio-2.0 >= 2.24,
255 [HAVE_MEDIA_PLAYER_KEYS=yes], [HAVE_MEDIA_PLAYER_KEYS=no])
256 if test "${HAVE_MEDIA_PLAYER_KEYS}" != "yes" ; then
257 - plugin_error_or_ignore "you need dbus-glib-1 installed for the media-player-keys plugin"
258 + plugin_error_or_ignore "you need gio >= 2.24 installed for the media-player-keys plugin"
259 add_plugin="0"
262 @@ -436,19 +431,12 @@ for plugin in ${used_plugins}; do
264 publish)
265 # FIXME
266 - PKG_CHECK_MODULES(LIBEPC, libepc-ui-1.0 >= 0.3.0, [HAVE_LIBEPC=yes], [HAVE_LIBEPC=no])
267 + PKG_CHECK_MODULES(LIBEPC, libepc-ui-1.0 > 0.4.0, [HAVE_LIBEPC=yes], [HAVE_LIBEPC=no])
268 if test "${HAVE_LIBEPC}" != "yes" ; then
269 plugin_error_or_ignore "you need the easy-publish-and-consume library installed for the publish plugin"
270 add_plugin="0"
273 - tracker)
274 - PKG_CHECK_MODULES(TRACKER, tracker-sparql-0.10 >= 0.9.34, [HAVE_TRACKER=yes], [HAVE_TRACKER=no])
275 - if test "${HAVE_TRACKER}" != "yes" ; then
276 - plugin_error_or_ignore "you need the tracker development headers installed for the tracker plugin"
277 - add_plugin="0"
278 - fi
279 - ;;
280 sample-vala)
281 if test "${with_vala}" != "yes" ; then
282 plugin_error_or_ignore "you need vala installed to use the sample-vala plugin"
283 @@ -499,6 +487,13 @@ for plugin in ${used_plugins}; do
284 AC_DEFINE([HAVE_LIBGDATA_0_7],[1],[Define if libgdata >= 0.7.0 is available])
287 + # For the API breaks in libgdata 0.9. Remove this once we depend on libgdata >= 0.9.1
288 + PKG_CHECK_MODULES(LIBGDATA_0_9, libgdata >= 0.9.1,
289 + [HAVE_LIBGDATA_0_9=yes], [HAVE_LIBGDATA_0_9=no])
290 + if test "${HAVE_LIBGDATA_0_9}" = "yes" ; then
291 + AC_DEFINE([HAVE_LIBGDATA_0_9],[1],[Define if libgdata >= 0.9.1 is available])
292 + fi
294 PKG_CHECK_MODULES(LIBSOUP, libsoup-2.4,
295 [HAVE_LIBSOUP=yes], [HAVE_LIBSOUP=no])
296 if test "${HAVE_LIBSOUP}" != "yes" ; then
297 @@ -537,6 +532,14 @@ for plugin in ${used_plugins}; do
301 + grilo)
302 + PKG_CHECK_MODULES(LIBGRILO, grilo-0.1 >= 0.1.16,
303 + [HAVE_LIBGRILO=yes], [HAVE_LIBGRILO=no])
304 + if test "${HAVE_LIBGRILO}" != "yes" ; then
305 + plugin_error_or_ignore "you need libgrilo >= 0.1.16 installed for the Grilo plugin"
306 + add_plugin="0"
307 + fi
308 + ;;
309 esac
311 # Add the specified plugin
312 @@ -692,25 +695,6 @@ if test x$HAVE_NAUTILUS = "xyes"; then
314 AM_CONDITIONAL(HAVE_NAUTILUS, test x$HAVE_NAUTILUS = "xyes")
316 -dnl ***************************
317 -dnl D-Bus for gnome-screensaver
318 -dnl ***************************
319 -AC_ARG_WITH(dbus,
320 - AC_HELP_STRING([--with-dbus],
321 - [Enable D-BUS support]),,
322 - with_dbus=auto)
323 -if test "x$with_dbus" != "xno"; then
324 - PKG_CHECK_MODULES(DBUS, dbus-glib-1 >= $DBUS_REQS, enable_dbus=yes, enable_dbus=no)
325 - if test "x$with_dbus" = xyes && test "x$enable_dbus" = xno; then
326 - AC_MSG_ERROR([D-BUS explicitly requested but no support found])
327 - fi
328 - if test "x$enable_dbus" = xyes; then
329 - AC_DEFINE(WITH_DBUS, 1, [Define if D-BUS is enabled])
330 - AC_DEFINE(ENABLE_DBUS, 1, [Define if D-BUS is enabled])
331 - fi
333 -AM_CONDITIONAL(WITH_DBUS, test "x$enable_dbus" = "xyes")
335 GLIB_GSETTINGS
337 GNOME_COMMON_INIT
338 @@ -773,8 +757,7 @@ src/Makefile
339 src/properties/Makefile
340 src/plugins/Makefile
341 src/plugins/bemused/Makefile
342 -src/plugins/coherence_upnp/Makefile
343 -src/plugins/dbus-service/Makefile
344 +src/plugins/dbusservice/Makefile
345 src/plugins/screensaver/Makefile
346 src/plugins/screenshot/Makefile
347 src/plugins/ontop/Makefile
348 @@ -789,20 +772,18 @@ src/plugins/properties/Makefile
349 src/plugins/save-file/Makefile
350 src/plugins/sidebar-test/Makefile
351 src/plugins/skipto/Makefile
352 -src/plugins/sample-python/Makefile
353 +src/plugins/samplepython/Makefile
354 src/plugins/sample-vala/Makefile
355 src/plugins/thumbnail/Makefile
356 -src/plugins/tracker/Makefile
357 src/plugins/youtube/Makefile
358 src/plugins/pythonconsole/Makefile
359 src/plugins/pythonconsole/org.gnome.totem.plugins.pythonconsole.gschema.xml.in
360 src/plugins/publish/Makefile
361 src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in
362 -src/plugins/jamendo/Makefile
363 -src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in
364 src/plugins/brasero-disc-recorder/Makefile
365 src/plugins/chapters/Makefile
366 src/plugins/zeitgeist-dp/Makefile
367 +src/plugins/grilo/Makefile
368 src/backend/Makefile
369 browser-plugin/Makefile
370 data/Makefile
371 @@ -892,11 +873,6 @@ if test x$enable_xtest = xyes ; then
372 else
373 AC_MSG_NOTICE([ XTest (legacy screensaver) support disabled])
375 -if test x$enable_dbus = xyes ; then
376 - AC_MSG_NOTICE([** D-Bus (gnome-screensaver) support enabled])
377 -else
378 - AC_MSG_NOTICE([ D-Bus (gnome-screensaver) support disabled])
380 if test x$have_xvidmode = xyes ; then
381 AC_MSG_NOTICE([** XVidmode support enabled])
382 else
383 diff --git a/data/Makefile.am b/data/Makefile.am
384 index a4dc0d7..6dcab81 100644
385 --- a/data/Makefile.am
386 +++ b/data/Makefile.am
387 @@ -56,7 +56,7 @@ desktopdir = $(datadir)/applications
388 desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
389 @INTLTOOL_DESKTOP_RULE@
391 -totem.desktop.in: totem.desktop.in.in mime-type-list.txt desktop.sh
392 +totem.desktop.in: totem.desktop.in.in mime-type-list.txt uri-schemes-list.txt desktop.sh
393 $(AM_V_GEN) cat totem.desktop.in.in | sed 's,@FULL_LIBEXECDIR@,$(FULL_LIBEXECDIR),' > $@ &&\
394 $(SHELL) $(srcdir)/desktop.sh $(srcdir)/mime-type-list.txt $(srcdir)/uri-schemes-list.txt >> $@
396 @@ -82,20 +82,25 @@ CLEANFILES += \
397 $(thumbnailer_DATA)
399 # Content type handling
400 -nodist_noinst_HEADERS = totem-mime-types.h nautilus-audio-mime-types.h
401 +nodist_noinst_HEADERS = totem-mime-types.h nautilus-audio-mime-types.h totem-uri-schemes.h
402 totem-mime-types.h: mime-type-include.sh mime-type-list.txt mime-functions.sh
403 $(AM_V_GEN) $(srcdir)/mime-type-include.sh $(srcdir)/mime-type-list.txt > $@
404 nautilus-audio-mime-types.h: mime-type-include.sh mime-type-list.txt mime-functions.sh
405 $(AM_V_GEN) $(srcdir)/mime-type-include.sh --nautilus $(srcdir)/mime-type-list.txt > $@
406 +totem-uri-schemes.h: mime-type-include.sh mime-type-list.txt mime-functions.sh
407 + $(AM_V_GEN) $(srcdir)/uri-scheme-include.sh $(srcdir)/uri-schemes-list.txt > $@
409 EXTRA_DIST += \
410 mime-type-include.sh \
411 mime-type-list.txt \
412 + uri-scheme-include.sh \
413 uri-schemes-list.txt \
414 mime-functions.sh
415 CLEANFILES += \
416 totem-mime-types.h \
417 - nautilus-audio-mime-types.h
418 + totem-uri-schemes.h \
419 + nautilus-audio-mime-types.h \
420 + totem-uri-schemes.h
422 # GSettings schemas, enum files and conversion file
423 gsettings_ENUM_NAMESPACE = org.gnome.totem
424 diff --git a/data/fullscreen.ui b/data/fullscreen.ui
425 index 19e0bf5..8f26f65 100644
426 --- a/data/fullscreen.ui
427 +++ b/data/fullscreen.ui
428 @@ -51,7 +51,7 @@
429 <object class="GtkImage" id="tefw_image">
430 <property name="visible">True</property>
431 <property name="icon_size">4</property>
432 - <property name="icon_name">view-restore</property>
433 + <property name="icon_name">view-restore-symbolic</property>
434 <property name="xalign">0.5</property>
435 <property name="yalign">0.5</property>
436 <property name="xpad">0</property>
437 diff --git a/data/mime-type-include.sh b/data/mime-type-include.sh
438 index 3560839..e03c2a1 100755
439 --- a/data/mime-type-include.sh
440 +++ b/data/mime-type-include.sh
441 @@ -25,7 +25,7 @@ fi
442 MIMETYPES=`grep -v '^#' $1 | grep -v x-content/ | grep -v x-scheme-handler/`
444 echo "/* generated with mime-types-include.sh, don't edit */"
445 -echo "const char *mime_types[] = {"
446 +echo "static const gchar *mime_types[] = {"
448 for i in $MIMETYPES ; do
449 echo_mime;
450 @@ -35,7 +35,7 @@ echo "};"
452 get_audio_mimetypes $1;
454 -echo "const char *audio_mime_types[] = {"
455 +echo "static const gchar *audio_mime_types[] = {"
456 for i in $MIMETYPES ; do
457 echo_mime;
458 done
459 @@ -44,7 +44,7 @@ echo "};"
461 get_video_mimetypes $1;
463 -echo "const char *video_mime_types[] = {"
464 +echo "static const gchar *video_mime_types[] = {"
465 for i in $MIMETYPES ; do
466 echo_mime;
467 done
468 diff --git a/data/mime-type-list.txt b/data/mime-type-list.txt
469 index 0d298c9..acb242e 100644
470 --- a/data/mime-type-list.txt
471 +++ b/data/mime-type-list.txt
472 @@ -4,6 +4,7 @@ application/ram
473 application/sdp
474 application/smil
475 application/smil+xml
476 +application/vnd.apple.mpegurl
477 application/vnd.ms-wpl
478 application/vnd.rn-realmedia
479 application/x-extension-m4a
480 @@ -55,9 +56,11 @@ audio/x-pn-wav
481 audio/x-pn-windows-acm
482 audio/x-realaudio
483 audio/x-real-audio
484 +audio/x-s3m
485 audio/x-sbc
486 audio/x-scpls
487 audio/x-speex
488 +audio/x-stm
489 audio/x-tta
490 audio/x-wav
491 audio/x-wavpack
492 @@ -69,8 +72,10 @@ image/x-pict
493 misc/ultravox
494 text/google-video-pointer
495 text/x-google-video-pointer
496 +video/3gp
497 video/3gpp
498 video/dv
499 +video/divx
500 video/fli
501 video/flv
502 video/mp2t
503 @@ -82,6 +87,7 @@ video/ogg
504 video/quicktime
505 video/vivo
506 video/vnd.divx
507 +video/vnd.mpegurl
508 video/vnd.rn-realvideo
509 video/vnd.vivo
510 video/webm
511 @@ -94,6 +100,7 @@ video/x-flv
512 video/x-m4v
513 video/x-matroska
514 video/x-mpeg
515 +video/x-mpeg2
516 video/x-ms-asf
517 video/x-ms-asx
518 video/x-msvideo
519 diff --git a/data/mozilla-viewer.css b/data/mozilla-viewer.css
520 index 7048a36..dc48309 100644
521 --- a/data/mozilla-viewer.css
522 +++ b/data/mozilla-viewer.css
523 @@ -1,5 +1,12 @@
524 /* Style to attempt to reduce the size of the browser plugin */
526 - padding: 0;
527 + padding-top: 0;
528 + padding-bottom: 0;
529 margin: 0;
532 +.button {
533 + border-width: 0;
534 + border-style: none;
535 + border-image: none;
537 diff --git a/data/mozilla-viewer.ui b/data/mozilla-viewer.ui
538 index ea88369..ba0d8ce 100644
539 --- a/data/mozilla-viewer.ui
540 +++ b/data/mozilla-viewer.ui
541 @@ -34,13 +34,6 @@
542 <signal handler="on_fullscreen1_activate" name="activate"/>
543 </object>
544 </child>
545 - <child>
546 - <object class="GtkAction" id="about1">
547 - <property name="stock_id">gtk-about</property>
548 - <property name="name">about1</property>
549 - <signal handler="on_about1_activate" name="activate"/>
550 - </object>
551 - </child>
552 </object>
553 </child>
554 <ui>
555 @@ -48,8 +41,6 @@
556 <menuitem action="copy_location1"/>
557 <menuitem action="preferences1"/>
558 <menuitem action="fullscreen1"/>
559 - <separator/>
560 - <menuitem action="about1"/>
561 </popup>
562 </ui>
563 </object>
564 diff --git a/data/playlist.ui b/data/playlist.ui
565 index fe52e7a..c012a3c 100644
566 --- a/data/playlist.ui
567 +++ b/data/playlist.ui
568 @@ -93,6 +93,7 @@
569 <property name="visible">True</property>
570 <property name="can_focus">False</property>
571 <property name="icon_size">1</property>
572 + <property name="toolbar-style">icons</property>
573 <style>
574 <class name="inline-toolbar"/>
575 </style>
576 @@ -134,6 +135,7 @@
577 <property name="use_underline">True</property>
578 <property name="icon_name">document-save-symbolic</property>
579 <property name="tooltip-text" translatable="yes">Save Playlist...</property>
580 + <signal name="clicked" handler="totem_playlist_save_files"/>
581 </object>
582 <packing>
583 <property name="expand">False</property>
584 diff --git a/data/totem-bugreport.py b/data/totem-bugreport.py
585 index bd6207d..d324884 100644
586 --- a/data/totem-bugreport.py
587 +++ b/data/totem-bugreport.py
588 @@ -1,13 +1,13 @@
589 #!/usr/bin/python
590 -import gtk
591 import os
592 from datetime import datetime
593 +from gi.repository import Gtk
595 # Get the GStreamer version
596 if os.system ('gst-typefind-0.10 --version') == 0:
597 # List the formats of the last files played
598 last_visited = 0
599 - recent_manager = gtk.recent_manager_get_default ()
600 + recent_manager = Gtk.RecentManager.get_default ()
601 for recent in recent_manager.get_items ():
602 if recent.has_group ("Totem"):
603 if recent.get_visited () > last_visited:
604 diff --git a/data/uri-scheme-include.sh b/data/uri-scheme-include.sh
605 new file mode 100755
606 index 0000000..645b139
607 --- /dev/null
608 +++ b/data/uri-scheme-include.sh
609 @@ -0,0 +1,18 @@
610 +#!/bin/sh
612 +. `dirname $0`/mime-functions.sh
614 +echo_mime () {
615 + echo "\"$i\","
618 +SCHEMES=`grep -v '^#' $1`
620 +echo "/* generated with uri-scheme-include.sh, don't edit */"
621 +echo "static const gchar *uri_schemes[] = {"
623 +for i in $SCHEMES ; do
624 + echo_mime;
625 +done
627 +echo "};"
628 diff --git a/data/uri-schemes-list.txt b/data/uri-schemes-list.txt
629 index 68ec833..56ea8ff 100644
630 --- a/data/uri-schemes-list.txt
631 +++ b/data/uri-schemes-list.txt
632 @@ -2,6 +2,7 @@ pnm
636 +rtmp
637 rtsp
638 mmsh
639 uvox
640 diff --git a/lib/totem-scrsaver.c b/lib/totem-scrsaver.c
641 index aaa74bd..0572610 100644
642 --- a/lib/totem-scrsaver.c
643 +++ b/lib/totem-scrsaver.c
644 @@ -227,7 +227,7 @@ static void
645 screensaver_init_dbus (TotemScrsaver *scr)
647 g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
648 - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
649 + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
650 NULL,
651 GS_SERVICE,
652 GS_PATH,
653 @@ -273,6 +273,13 @@ fake_event (TotemScrsaver *scr)
655 if (scr->priv->disabled)
657 + /* If the video window isn't focused, don't send out the
658 + * events. Note that it probably breaks when popups are used
659 + * but we can't do much about that... */
660 + if (scr->priv->window != NULL &&
661 + gtk_window_has_toplevel_focus (scr->priv->window) == FALSE)
662 + return;
664 XLockDisplay (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
665 XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), *scr->priv->keycode,
666 True, CurrentTime);
667 diff --git a/po/POTFILES.in b/po/POTFILES.in
668 index 93771c5..091f1c3 100644
669 --- a/po/POTFILES.in
670 +++ b/po/POTFILES.in
671 @@ -46,9 +46,8 @@ src/plugins/brasero-disc-recorder/totem-disc-recorder.c
672 [type: gettext/glade]src/plugins/chapters/chapters-list.ui
673 src/plugins/chapters/totem-chapters.c
674 src/plugins/chapters/totem-cmml-parser.c
675 -src/plugins/coherence_upnp/coherence_upnp.py
676 -[type: gettext/ini]src/plugins/coherence_upnp/coherence_upnp.plugin.in
677 -[type: gettext/ini]src/plugins/dbus-service/dbus-service.plugin.in
678 +[type: gettext/ini]src/plugins/dbusservice/dbusservice.plugin.in
679 +src/plugins/dbusservice/dbusservice.py
680 [type: gettext/ini]src/plugins/im-status/totem-im-status.plugin.in
681 src/plugins/im-status/totem-im-status.c
682 [type: gettext/ini]src/plugins/gromit/gromit.plugin.in
683 @@ -57,10 +56,6 @@ src/plugins/gromit/totem-gromit.c
684 src/plugins/iplayer/iplayer.py
685 src/plugins/iplayer/iplayer2.py
686 [type: gettext/glade]src/plugins/iplayer/iplayer.ui
687 -[type: gettext/glade]src/plugins/jamendo/jamendo.ui
688 -[type: gettext/ini]src/plugins/jamendo/jamendo.plugin.in
689 -src/plugins/jamendo/jamendo.py
690 -src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in
691 [type: gettext/ini]src/plugins/lirc/lirc.plugin.in
692 src/plugins/lirc/totem-lirc.c
693 [type: gettext/ini]src/plugins/media-player-keys/media-player-keys.plugin.in
694 @@ -90,14 +85,14 @@ src/plugins/screenshot/totem-screenshot-plugin.c
695 [type: gettext/ini]src/plugins/skipto/skipto.plugin.in
696 src/plugins/skipto/totem-skipto.c
697 src/plugins/skipto/totem-skipto-plugin.c
698 +src/plugins/skipto/totem-time-entry.c
699 [type: gettext/glade]src/plugins/skipto/skipto.ui
700 -src/plugins/tracker/totem-tracker-widget.c
701 -src/plugins/tracker/totem-tracker.c
702 [type: gettext/ini]src/plugins/thumbnail/thumbnail.plugin.in
703 -[type: gettext/ini]src/plugins/tracker/tracker.plugin.in
704 [type: gettext/ini]src/plugins/youtube/youtube.plugin.in
705 [type: gettext/glade]src/plugins/youtube/youtube.ui
706 src/plugins/youtube/totem-youtube.c
707 browser-plugin/totem-plugin-viewer.c
708 [type: gettext/ini]src/plugins/pythonconsole/pythonconsole.plugin.in
709 src/plugins/pythonconsole/pythonconsole.py
710 +[type: gettext/ini]src/plugins/grilo/grilo.plugin.in
711 +src/plugins/grilo/totem-grilo.c
712 diff --git a/po/ca@valencia.po b/po/ca@valencia.po
713 index 11a343f..c7308a8 100644
714 --- a/po/ca@valencia.po
715 +++ b/po/ca@valencia.po
716 @@ -2,14 +2,14 @@
717 # Copyright © 2002-2008 Free Software Foundation, Inc.
718 # This file is distributed under the same license as the totem package.
719 # Jordi Mallach <jordi@sindominio.net>, 2002, 2003, 2004, 2005, 2006, 2007.
720 -# Gil Forcada <gilforcada@guifi.net>, 2006, 2007, 2008, 2009, 2010.
721 +# Gil Forcada <gilforcada@guifi.net>, 2006, 2007, 2008, 2009, 2010, 2011.
723 msgid ""
724 msgstr ""
725 "Project-Id-Version: totem 2.14\n"
726 "Report-Msgid-Bugs-To: \n"
727 -"POT-Creation-Date: 2010-10-29 21:55+0100\n"
728 -"PO-Revision-Date: 2010-08-29 16:16+0200\n"
729 +"POT-Creation-Date: 2011-05-29 19:08+0200\n"
730 +"PO-Revision-Date: 2011-04-05 22:59+0200\n"
731 "Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
732 "Language-Team: Catalan <tradgnome@softcatala.org>\n"
733 "Language: ca\n"
734 @@ -26,7 +26,7 @@ msgstr "Ix de la pantalla completa"
735 msgid "Time:"
736 msgstr "Temps:"
738 -#: ../data/playlist.ui.h:1 ../src/plugins/chapters/chapters-list.ui.h:1
739 +#: ../data/playlist.ui.h:1
740 msgid "Add..."
741 msgstr "Afig..."
743 @@ -42,7 +42,7 @@ msgstr "Mou avall"
744 msgid "Move Up"
745 msgstr "Mou amunt"
747 -#: ../data/playlist.ui.h:5 ../src/plugins/chapters/chapters-list.ui.h:8
748 +#: ../data/playlist.ui.h:5
749 msgid "Remove"
750 msgstr "Suprimeix"
752 @@ -62,7 +62,7 @@ msgstr "Seleccioneu el fitxer que conté els subtítols"
753 msgid "_Copy Location"
754 msgstr "_Copia la ubicació"
756 -#: ../data/playlist.ui.h:10 ../src/plugins/chapters/chapters-list.ui.h:12
757 +#: ../data/playlist.ui.h:10
758 msgid "_Remove"
759 msgstr "_Suprimeix"
761 @@ -70,35 +70,15 @@ msgstr "_Suprimeix"
762 msgid "_Select Text Subtitles..."
763 msgstr "_Seleccioneu els subtítols de text..."
765 -#: ../data/plugins.ui.h:1
766 -msgid "Author:"
767 -msgstr "Autor:"
769 -#: ../data/plugins.ui.h:2
770 -msgid "C_onfigure..."
771 -msgstr "C_onfigura..."
773 -#: ../data/plugins.ui.h:3
774 -msgid "Copyright:"
775 -msgstr "Copyright:"
777 -#: ../data/plugins.ui.h:4
778 -msgid "Description:"
779 -msgstr "Descripció:"
781 -#: ../data/plugins.ui.h:5
782 -msgid "Site:"
783 -msgstr "Lloc:"
785 #. Channels
786 #: ../data/properties.ui.h:1
787 -#: ../src/plugins/properties/bacon-video-widget-properties.c:173
788 +#: ../src/properties/bacon-video-widget-properties.c:175
789 msgid "0 Channels"
790 msgstr "0 canals"
792 #. Sample rate
793 #: ../data/properties.ui.h:2
794 -#: ../src/plugins/properties/bacon-video-widget-properties.c:171
795 +#: ../src/properties/bacon-video-widget-properties.c:173
796 msgid "0 Hz"
797 msgstr "0 Hz"
799 @@ -108,7 +88,7 @@ msgstr "0 quadres per segon"
801 #: ../data/properties.ui.h:4
802 msgid "0 kbps"
803 -msgstr "0 kbps"
804 +msgstr "0 Kbps"
806 #. 0 seconds
807 #: ../data/properties.ui.h:5 ../src/backend/video-utils.c:158
808 @@ -127,60 +107,50 @@ msgstr "Àlbum:"
809 msgid "Artist:"
810 msgstr "Artista:"
812 -#: ../data/properties.ui.h:9 ../data/totem.ui.h:22
813 +#: ../data/properties.ui.h:9 ../data/totem.ui.h:23
814 #: ../src/totem-properties-view.c:89
815 msgid "Audio"
816 msgstr "Àudio"
818 +#. Audio Codec
819 #: ../data/properties.ui.h:10
820 +#: ../src/properties/bacon-video-widget-properties.c:171
821 +msgctxt "Audio codec"
822 +msgid "N/A"
823 +msgstr "N/D"
825 +#: ../data/properties.ui.h:11
826 msgid "Bitrate:"
827 msgstr "Velocitat de transmissió:"
829 -#: ../data/properties.ui.h:11
830 +#: ../data/properties.ui.h:12
831 msgid "Channels:"
832 msgstr "Canals:"
834 -#: ../data/properties.ui.h:12
835 +#: ../data/properties.ui.h:13
836 msgid "Codec:"
837 msgstr "Còdec:"
839 -#: ../data/properties.ui.h:13
840 +#: ../data/properties.ui.h:14
841 msgid "Comment:"
842 msgstr "Comentari:"
844 -#: ../data/properties.ui.h:14
845 +#: ../data/properties.ui.h:15
846 msgid "Dimensions:"
847 msgstr "Dimensions:"
849 -#: ../data/properties.ui.h:15
850 +#: ../data/properties.ui.h:16
851 msgid "Duration:"
852 msgstr "Durada:"
854 -#: ../data/properties.ui.h:16
855 +#: ../data/properties.ui.h:17
856 msgid "Framerate:"
857 msgstr "Imatges per segon:"
859 -#: ../data/properties.ui.h:17 ../data/totem.ui.h:41
860 +#: ../data/properties.ui.h:18 ../data/totem.ui.h:41
861 msgid "General"
862 msgstr "General"
864 -#. Dimensions
865 -#. Video Codec
866 -#. Audio Codec
867 -#: ../data/properties.ui.h:18
868 -#: ../src/plugins/properties/bacon-video-widget-properties.c:156
869 -#: ../src/plugins/properties/bacon-video-widget-properties.c:158
870 -#: ../src/plugins/properties/bacon-video-widget-properties.c:161
871 -#: ../src/plugins/properties/bacon-video-widget-properties.c:164
872 -#: ../src/plugins/properties/bacon-video-widget-properties.c:167
873 -#: ../src/plugins/properties/bacon-video-widget-properties.c:169
874 -#: ../src/plugins/properties/bacon-video-widget-properties.c:238
875 -#: ../src/plugins/properties/bacon-video-widget-properties.c:248
876 -#: ../src/plugins/properties/bacon-video-widget-properties.c:271
877 -#: ../src/plugins/properties/bacon-video-widget-properties.c:274
878 -msgid "N/A"
879 -msgstr "N/D"
881 #: ../data/properties.ui.h:19
882 msgid "Sample rate:"
883 msgstr "Freqüència de mostratge:"
884 @@ -194,10 +164,10 @@ msgstr "Títol:"
885 #. Album
886 #. Year
887 #: ../data/properties.ui.h:21
888 -#: ../src/plugins/properties/bacon-video-widget-properties.c:143
889 -#: ../src/plugins/properties/bacon-video-widget-properties.c:145
890 -#: ../src/plugins/properties/bacon-video-widget-properties.c:147
891 -#: ../src/plugins/properties/bacon-video-widget-properties.c:149
892 +#: ../src/properties/bacon-video-widget-properties.c:145
893 +#: ../src/properties/bacon-video-widget-properties.c:147
894 +#: ../src/properties/bacon-video-widget-properties.c:149
895 +#: ../src/properties/bacon-video-widget-properties.c:151
896 msgid "Unknown"
897 msgstr "Desconegut"
899 @@ -206,7 +176,14 @@ msgstr "Desconegut"
900 msgid "Video"
901 msgstr "Vídeo"
903 +#. Video Codec
904 #: ../data/properties.ui.h:23
905 +#: ../src/properties/bacon-video-widget-properties.c:160
906 +msgctxt "Video codec"
907 +msgid "N/A"
908 +msgstr "N/D"
910 +#: ../data/properties.ui.h:24
911 msgid "Year:"
912 msgstr "Any:"
914 @@ -215,13 +192,13 @@ msgid "Add the video to the playlist"
915 msgstr "Afig el vídeo a la llista de reproducció"
917 #: ../data/video-list.ui.h:3 ../src/totem-dnd-menu.c:97
918 -#: ../src/plugins/jamendo/jamendo.ui.h:10
919 +#: ../src/plugins/jamendo/jamendo.ui.h:9
920 msgid "_Add to Playlist"
921 msgstr "_Afig a la llista de reproducció"
923 #. Title
924 #: ../data/totem.desktop.in.in.in.h:1 ../data/totem.ui.h:53
925 -#: ../src/totem-object.c:1620
926 +#: ../src/totem-object.c:1666
927 msgid "Movie Player"
928 msgstr "Reproductor de pel·lícules"
930 @@ -313,15 +290,15 @@ msgstr "Menú d'à_udio"
931 msgid "About this application"
932 msgstr "Quant a esta aplicació"
934 -#: ../data/totem.ui.h:23
935 -msgid "Audio Output"
936 -msgstr "Eixida d'àudio"
938 -#. Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD
939 -#: ../data/totem.ui.h:24 ../src/totem-menu.c:197
940 +#: ../data/totem.ui.h:22
941 +msgctxt "Aspect ratio"
942 msgid "Auto"
943 msgstr "Auto"
945 +#: ../data/totem.ui.h:24
946 +msgid "Audio Output"
947 +msgstr "Eixida d'àudio"
949 #: ../data/totem.ui.h:25
950 msgid "Clear the playlist"
951 msgstr "Neteja la llista de reproducció"
952 @@ -582,7 +559,7 @@ msgstr "Quadrat"
953 msgid "Start playing files from last position"
954 msgstr "Inicia la reproducció dels fitxers des de l'última posició"
956 -#: ../data/totem.ui.h:96 ../src/backend/bacon-video-widget-gst-0.10.c:5919
957 +#: ../data/totem.ui.h:96 ../src/backend/bacon-video-widget-gst-0.10.c:6012
958 msgid "Stereo"
959 msgstr "Estèreo"
961 @@ -788,12 +765,24 @@ msgstr "_Tipus de visualització:"
962 msgid "_View"
963 msgstr "_Visualitza"
965 -#: ../data/totem.schemas.in.h:1
966 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:1
967 +msgid ""
968 +"A list of the names of the plugins which are currently active (loaded and "
969 +"running)."
970 +msgstr ""
971 +"Una llista dels noms dels connectors que estan actius actualment (carregats "
972 +"i en funcionament)."
974 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:2
975 +msgid "Active plugins list"
976 +msgstr "Llista dels connectors actius"
978 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:3
979 msgid "Allow the screensaver to activate when playing audio"
980 msgstr ""
981 "Permet que s'active l'estalvi de pantalla quan s'estiga reproduint àudio"
983 -#: ../data/totem.schemas.in.h:2
984 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:4
985 msgid ""
986 "Allow the screensaver to activate when playing audio. Disable if you have "
987 "monitor-powered speakers."
988 @@ -801,197 +790,161 @@ msgstr ""
989 "Permet que s'active l'estalvi de pantalla quan s'estiga reproduint àudio. No "
990 "ho habiliteu si teniu un monitor amb altaveus."
992 -#: ../data/totem.schemas.in.h:3
993 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:5
994 msgid ""
995 "Amount of data to buffer for network streams before starting to display the "
996 -"stream (in seconds)"
997 +"stream (in seconds)."
998 msgstr ""
999 "Quantitat de dades (en segons) a emmagatzemar a la memòria intermèdia per "
1000 -"als fluxos de la xarxa abans de començar-los a mostrar"
1001 +"als fluxos de la xarxa abans de començar-los a mostrar."
1003 -#: ../data/totem.schemas.in.h:4
1004 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:6
1005 msgid ""
1006 "Approximate network connection speed, used to select quality on media over "
1007 -"the network: \"0\" for 14.4 Kbps Modem, \"1\" for 19.2 Kbps Modem, \"2\" for "
1008 -"28.8 Kbps Modem, \"3\" for 33.6 Kbps Modem, \"4\" for 34.4 Kbps Modem, \"5\" "
1009 -"for 56 Kbps Modem/ISDN, \"6\" for 112 Kbps Dual ISDN/DSL, \"7\" for 256 Kbps "
1010 -"DSL/Cable, \"8\" for 384 Kbps DSL/Cable, \"9\" for 512 Kbps DSL/Cable, "
1011 -"\"10\" for 1.5 Mbps T1/Intranet/LAN, \"11\" for Intranet/LAN."
1012 +"the network."
1013 msgstr ""
1014 -"Velocitat de connexió a la xarxa aproximada, s'utilitza per seleccionar la "
1015 -"qualitat dels recursos obtinguts a través de la xarxa: «0» mòdem de 14.4 "
1016 -"Kbps, «1» mòdem de 19.2 Kbps, «2» mòdem de 28.8 Kbps, «3» mòdem de 33.6 "
1017 -"Kbps, «4» mòdem de 34.4 Kbps, «5» mòdem/XDSI de 56 Kbps, «6» XDSI dual/ADSL "
1018 -"de 112 Kbps, «7» ADSL/Cable de 256 Kbps, «8» ADSL/cable de 384 Kbps, «9» "
1019 -"ADSL/cable de 512 Kbps, «10»T1/intranet/LAN de 1.5 Mbps i «11» intranet/LAN."
1021 -#: ../data/totem.schemas.in.h:5
1022 +"Velocitat estimada de la connexió a la xarxa. S'utilitza per seleccionar la "
1023 +"qualitat dels fitxers multimèdia a través de la xarxa."
1025 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:7
1026 msgid "Default location for the \"Open...\" dialogs"
1027 msgstr "Ubicació predeterminada per als diàlegs «Obri...»"
1029 -#: ../data/totem.schemas.in.h:6
1030 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:8
1031 msgid ""
1032 -"Default location for the \"Open...\" dialogs, default is the current "
1033 -"directory"
1034 +"Default location for the \"Open...\" dialogs. Default is the current "
1035 +"directory."
1036 msgstr ""
1037 -"Ubicació predeterminada per als diàlegs «Obri...»; la predeterminada és el "
1038 -"directori actual"
1039 +"Ubicació predeterminada per als diàlegs «Obri...». La predeterminada és el "
1040 +"directori actual."
1042 -#: ../data/totem.schemas.in.h:7
1043 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:9
1044 msgid "Default location for the \"Take Screenshot\" dialogs"
1045 msgstr "Ubicació predeterminada per als diàlegs «Feu una captura de pantalla»"
1047 -#: ../data/totem.schemas.in.h:8
1048 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:10
1049 msgid ""
1050 -"Default location for the \"Take Screenshot\" dialogs, default is the "
1051 -"Pictures directory"
1052 +"Default location for the \"Take Screenshot\" dialogs. Default is the "
1053 +"Pictures directory."
1054 msgstr ""
1055 -"Ubicació predeterminada per als diàlegs «Feu una captura de pantalla»; la "
1056 -"predeterminada és el directori d'imatges"
1057 +"Ubicació predeterminada per als diàlegs «Feu una captura de pantalla». La "
1058 +"predeterminada és el directori d'imatges."
1060 -#: ../data/totem.schemas.in.h:9
1061 -msgid "Encoding charset for subtitle"
1062 -msgstr "Codificació del joc de caràcters dels subtítols"
1063 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:11
1064 +msgid "Encoding character set for subtitle."
1065 +msgstr "Codificació del joc de caràcters dels subtítols."
1067 -#: ../data/totem.schemas.in.h:10
1068 -msgid "Name of the visual effects plugins"
1069 -msgstr "Nom dels connectors d'efectes visuals"
1070 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:12
1071 +msgid "Name of the visual effects plugin"
1072 +msgstr "Nom del connector d'efectes visuals"
1074 -#: ../data/totem.schemas.in.h:11
1075 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:13
1076 msgid "Network buffering threshold"
1077 msgstr "Llindar d'utilització de la memòria intermèdia de xarxa"
1079 -#: ../data/totem.schemas.in.h:12
1080 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:14
1081 msgid "Network connection speed"
1082 msgstr "Velocitat de connexió a la xarxa"
1084 -#: ../data/totem.schemas.in.h:13
1085 -msgid "Pango font description for subtitle rendering"
1086 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:15
1087 +msgid "Pango font description for subtitle rendering."
1088 msgstr ""
1089 -"Descripció del tipus de lletra Pango per a la representació dels subtítols"
1090 +"Descripció del tipus de lletra Pango per a la representació dels subtítols."
1092 -#: ../data/totem.schemas.in.h:14
1093 -msgid ""
1094 -"Quality settings for the audio visualization: \"0\" for small, \"1\" for "
1095 -"normal, \"2\" for large, \"3\" for extra large."
1096 -msgstr ""
1097 -"Paràmetres de la qualitat per a la visualització de l'àudio: «0» per a "
1098 -"petita, «1» per a normal, «2» per a gran i «3» per a extra gran."
1099 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:16
1100 +msgid "Quality setting for the audio visualization."
1101 +msgstr "Paràmetre de qualitat per a la visualització d'àudio."
1103 -#: ../data/totem.schemas.in.h:15
1104 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:17
1105 msgid "Repeat mode"
1106 msgstr "Mode de repetició"
1108 # FIXME: "canvas" (josep)
1109 -#: ../data/totem.schemas.in.h:16
1110 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:18
1111 msgid "Resize the canvas automatically on file load"
1112 msgstr "Redimensiona el llenç automàticament en carregar un fitxer"
1114 -#: ../data/totem.schemas.in.h:17
1115 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:19
1116 msgid "Show visual effects when no video is displayed"
1117 msgstr "Mostra efectes visuals quan no es mostre cap vídeo"
1119 -#: ../data/totem.schemas.in.h:18
1120 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:20
1121 msgid "Show visual effects when playing an audio only file."
1122 msgstr "Mostra efectes visuals quan es reproduïsca un fitxer d'àudio."
1124 -#: ../data/totem.schemas.in.h:19
1125 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:21
1126 msgid "Shuffle mode"
1127 msgstr "Mode aleatori"
1129 -#: ../data/totem.schemas.in.h:20
1130 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:22
1131 msgid "Subtitle encoding"
1132 msgstr "Codificació dels subtítols"
1134 -#: ../data/totem.schemas.in.h:21
1135 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:23
1136 msgid "Subtitle font"
1137 msgstr "Tipus de lletra dels subtítols"
1139 -#: ../data/totem.schemas.in.h:22
1140 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:24
1141 msgid "The brightness of the video"
1142 msgstr "La brillantor del vídeo"
1144 -#: ../data/totem.schemas.in.h:23
1145 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:25
1146 msgid "The contrast of the video"
1147 msgstr "El contrast del vídeo"
1149 -#: ../data/totem.schemas.in.h:24
1150 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:26
1151 msgid "The hue of the video"
1152 msgstr "El to del vídeo"
1154 -#: ../data/totem.schemas.in.h:25
1155 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:27
1156 msgid "The saturation of the video"
1157 msgstr "La saturació del vídeo"
1159 -#: ../data/totem.schemas.in.h:26
1160 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:28
1161 msgid "Type of audio output to use"
1162 msgstr "Tipus d'eixida d'àudio a utilitzar"
1164 -#: ../data/totem.schemas.in.h:27
1165 -msgid ""
1166 -"Type of audio output to use: \"0\" for stereo, \"1\" for 4-channel output, "
1167 -"\"2\" for 5.0 channel output, \"3\" for 5.1 channel output, \"4\" for AC3 "
1168 -"Passthrough."
1169 -msgstr ""
1170 -"Tipus d'eixida d'àudio a utilitzar: «0» per a estèreo, «1» per a eixida a 4 "
1171 -"canals, «2» per a eixida amb canals 5.0, «3» per a eixida amb canals 5.1, "
1172 -"«4» per a AC3 directe a la targeta de so."
1174 -#. Translators: This is default subtitle encoding
1175 -#. character set. You can change this to be the most common
1176 -#. encoding for fansub subtitles in your language. File a bug
1177 -#. against Totem, and leave UTF-8 as the default if in doubt.
1178 -#: ../data/totem.schemas.in.h:32
1179 -msgid "UTF-8"
1180 -msgstr "UTF-8"
1182 -#: ../data/totem.schemas.in.h:33
1183 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:29
1184 msgid "Visualization quality setting"
1185 msgstr "Paràmetre de la qualitat de la visualització"
1187 -#: ../data/totem.schemas.in.h:34
1188 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:30
1189 msgid "Whether to autoload external chapter files when a movie is loaded"
1190 msgstr ""
1191 "Si s'han de carregar automàticament els fitxers de capítols externs quan es "
1192 "carrega una pel·lícula"
1194 -#: ../data/totem.schemas.in.h:35
1195 -msgid "Whether to autoload external chapter files when a movie is loaded."
1196 -msgstr ""
1197 -"Si s'han de carregar automàticament els fitxers de capítols externs quan es "
1198 -"carrega una pel·lícula."
1200 -#: ../data/totem.schemas.in.h:36
1201 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:31
1202 msgid "Whether to autoload text subtitle files when a movie is loaded"
1203 msgstr ""
1204 "Si s'han de carregar automàticament els fitxers de subtítols quan es "
1205 "reproduïsca una pel·lícula"
1207 -#: ../data/totem.schemas.in.h:37
1208 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:32
1209 msgid "Whether to disable deinterlacing for interlaced movies"
1210 msgstr ""
1211 "Si s'ha d'inhabilitar el desentrallaçat de les pel·lícules entrellaçades"
1213 -#: ../data/totem.schemas.in.h:38
1214 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:33
1215 msgid "Whether to disable the keyboard shortcuts"
1216 msgstr "Si s'han d'inhabilitar les dreceres de teclat"
1218 -#: ../data/totem.schemas.in.h:39
1219 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:34
1220 msgid "Whether to disable the plugins in the user's home directory"
1221 msgstr ""
1222 "Si s'han d'inhabilitar els connectors del directori d'inici de l'usuari"
1224 -#: ../data/totem.schemas.in.h:40
1225 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:35
1226 msgid "Whether to enable debug for the playback engine"
1227 msgstr "Si s'ha d'habilitar la depuració per al motor de reproducció"
1229 -#: ../data/totem.schemas.in.h:41
1230 +#: ../data/org.gnome.totem.gschema.xml.in.in.h:36
1231 msgid ""
1232 "Whether to remember the position of played audio/video files when pausing or "
1233 -"closing them."
1234 +"closing them"
1235 msgstr ""
1236 "Si s'ha de recordar la posició dels fitxers d'àudio/vídeo quan s'hi faça una "
1237 -"pausa o es tanquen."
1238 +"pausa o es tanquen"
1240 #: ../data/uri.ui.h:1
1241 msgid "Enter the _address of the file you would like to open:"
1242 @@ -1007,60 +960,60 @@ msgstr "El fitxer no és un fitxer .desktop vàlid"
1243 msgid "Unrecognized desktop file Version '%s'"
1244 msgstr "Es desconeix la versió «%s» del fitxer d'escriptori"
1246 -#: ../src/eggdesktopfile.c:958
1247 +#: ../src/eggdesktopfile.c:968
1248 #, c-format
1249 msgid "Starting %s"
1250 msgstr "S'està iniciant %s"
1252 -#: ../src/eggdesktopfile.c:1100
1253 +#: ../src/eggdesktopfile.c:1110
1254 #, c-format
1255 msgid "Application does not accept documents on command line"
1256 msgstr "L'aplicació no accepta documents des de la línia d'ordes"
1258 -#: ../src/eggdesktopfile.c:1168
1259 +#: ../src/eggdesktopfile.c:1178
1260 #, c-format
1261 msgid "Unrecognized launch option: %d"
1262 msgstr "Es desconeix l'orde d'execució: %d"
1264 -#: ../src/eggdesktopfile.c:1373
1265 +#: ../src/eggdesktopfile.c:1383
1266 #, c-format
1267 msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
1268 msgstr ""
1269 "No s'ha pogut transformar l'URI del document a una entrada d'escriptori "
1270 "«Type=Link»"
1272 -#: ../src/eggdesktopfile.c:1394
1273 +#: ../src/eggdesktopfile.c:1404
1274 #, c-format
1275 msgid "Not a launchable item"
1276 msgstr "No és un element executable"
1278 -#: ../src/eggfileformatchooser.c:235
1279 +#: ../src/eggfileformatchooser.c:240
1280 #, c-format
1281 msgid "File _Format: %s"
1282 msgstr "_Format del fitxer: %s"
1284 -#: ../src/eggfileformatchooser.c:374
1285 +#: ../src/eggfileformatchooser.c:379
1286 msgid "All Files"
1287 msgstr "Tots els fitxers"
1289 -#: ../src/eggfileformatchooser.c:375
1290 +#: ../src/eggfileformatchooser.c:380
1291 msgid "All Supported Files"
1292 msgstr "Tots els fitxers reconeguts"
1294 -#: ../src/eggfileformatchooser.c:384
1295 +#: ../src/eggfileformatchooser.c:389
1296 msgid "By Extension"
1297 msgstr "Per extensió"
1299 -#: ../src/eggfileformatchooser.c:399
1300 +#: ../src/eggfileformatchooser.c:404
1301 msgid "File Format"
1302 msgstr "Format del fitxer"
1304 -#: ../src/eggfileformatchooser.c:417
1305 +#: ../src/eggfileformatchooser.c:422
1306 msgid "Extension(s)"
1307 msgstr "Extensions"
1309 #. Translators: the parameter is a filename
1310 -#: ../src/eggfileformatchooser.c:652
1311 +#: ../src/eggfileformatchooser.c:657
1312 #, c-format
1313 msgid ""
1314 "The program was not able to find out the file format you want to use for `"
1315 @@ -1068,41 +1021,93 @@ msgid ""
1316 "choose a file format from the list below."
1317 msgstr ""
1318 "No s'ha pogut descobrir el format de fitxer que voleu utilitzar per a «%s». "
1319 -"Hauríeu d'assegureu-vos que utilitzeu una extensió coneguda per al fitxer o "
1320 -"escolliu-ne una de la llista de sota."
1321 +"Hauríeu d'assegurar-vos que utilitzeu una extensió coneguda per al fitxer o "
1322 +"trieu-ne una de la llista de sota."
1324 -#: ../src/eggfileformatchooser.c:659
1325 +#: ../src/eggfileformatchooser.c:664
1326 msgid "File format not recognized"
1327 msgstr "No s'ha reconegut el format del fitxer"
1329 -#: ../src/eggsmclient.c:225
1330 +#: ../src/eggsmclient.c:226
1331 msgid "Disable connection to session manager"
1332 msgstr "Inhabilita la connexió al gestor de la sessió"
1334 -#: ../src/eggsmclient.c:228
1335 +#: ../src/eggsmclient.c:229
1336 msgid "Specify file containing saved configuration"
1337 msgstr "Especifica el fitxer que conté la configuració alçada"
1339 -#: ../src/eggsmclient.c:228
1340 +#: ../src/eggsmclient.c:229
1341 msgid "FILE"
1342 msgstr "FITXER"
1344 -#: ../src/eggsmclient.c:231
1345 +#: ../src/eggsmclient.c:232
1346 msgid "Specify session management ID"
1347 msgstr "Especifica l'identificador de la gestió de la sessió"
1349 -#: ../src/eggsmclient.c:231
1350 +#: ../src/eggsmclient.c:232
1351 msgid "ID"
1352 msgstr "Identificador"
1354 -#: ../src/eggsmclient.c:252
1355 +#: ../src/eggsmclient.c:253
1356 msgid "Session management options:"
1357 msgstr "Opcions de la gestió de la sessió:"
1359 -#: ../src/eggsmclient.c:253
1360 +#: ../src/eggsmclient.c:254
1361 msgid "Show session management options"
1362 msgstr "Mostra les opcions de la gestió de la sessió"
1364 +#. Dimensions
1365 +#: ../src/properties/bacon-video-widget-properties.c:158
1366 +msgctxt "Dimensions"
1367 +msgid "N/A"
1368 +msgstr "N/D"
1370 +#: ../src/properties/bacon-video-widget-properties.c:163
1371 +#: ../src/properties/bacon-video-widget-properties.c:240
1372 +msgctxt "Video bit rate"
1373 +msgid "N/A"
1374 +msgstr "N/D"
1376 +#: ../src/properties/bacon-video-widget-properties.c:166
1377 +#: ../src/properties/bacon-video-widget-properties.c:250
1378 +msgctxt "Frame rate"
1379 +msgid "N/A"
1380 +msgstr "N/D"
1382 +#: ../src/properties/bacon-video-widget-properties.c:169
1383 +#: ../src/properties/bacon-video-widget-properties.c:273
1384 +msgctxt "Audio bit rate"
1385 +msgid "N/A"
1386 +msgstr "N/D"
1388 +#: ../src/properties/bacon-video-widget-properties.c:237
1389 +#, c-format
1390 +msgid "%d x %d"
1391 +msgstr "%d x %d"
1393 +#: ../src/properties/bacon-video-widget-properties.c:240
1394 +#: ../src/properties/bacon-video-widget-properties.c:273
1395 +#, c-format
1396 +msgid "%d kbps"
1397 +msgstr "%d Kbps"
1399 +#: ../src/properties/bacon-video-widget-properties.c:247
1400 +#, c-format
1401 +msgid "%d frame per second"
1402 +msgid_plural "%d frames per second"
1403 +msgstr[0] "%d quadre per segon"
1404 +msgstr[1] "%d quadres per segon"
1406 +#: ../src/properties/bacon-video-widget-properties.c:276
1407 +#, c-format
1408 +msgid "%d Hz"
1409 +msgstr "%d Hz"
1411 +#: ../src/properties/bacon-video-widget-properties.c:276
1412 +msgctxt "Sample rate"
1413 +msgid "N/A"
1414 +msgstr "N/D"
1416 #: ../src/totem-audio-preview.c:82
1417 msgid "Audio Preview"
1418 msgstr "Previsualització d'àudio"
1419 @@ -1119,25 +1124,25 @@ msgstr "_Reprodueix"
1420 msgid "Cancel"
1421 msgstr "Cancel·la"
1423 -#: ../src/totem-fullscreen.c:595
1424 +#: ../src/totem-fullscreen.c:619
1425 msgid "No File"
1426 msgstr "Cap fitxer"
1428 -#: ../src/totem-interface.c:172 ../src/totem-interface.c:204
1429 +#: ../src/totem-interface.c:180 ../src/totem-interface.c:223
1430 #, c-format
1431 msgid "Couldn't load the '%s' interface. %s"
1432 msgstr "No s'ha pogut carregar la interfície «%s». %s"
1434 -#: ../src/totem-interface.c:172
1435 +#: ../src/totem-interface.c:180
1436 msgid "The file does not exist."
1437 msgstr "No existeix el fitxer."
1439 -#: ../src/totem-interface.c:174 ../src/totem-interface.c:176
1440 -#: ../src/totem-interface.c:206 ../src/totem-interface.c:208
1441 +#: ../src/totem-interface.c:182 ../src/totem-interface.c:184
1442 +#: ../src/totem-interface.c:225 ../src/totem-interface.c:227
1443 msgid "Make sure that Totem is properly installed."
1444 msgstr "Assegureu-vos que el Totem està instal·lat correctament."
1446 -#: ../src/totem-interface.c:319
1447 +#: ../src/totem-interface.c:346
1448 msgid ""
1449 "Totem is free software; you can redistribute it and/or modify it under the "
1450 "terms of the GNU General Public License as published by the Free Software "
1451 @@ -1149,7 +1154,7 @@ msgstr ""
1452 "per la Free Software Foundation; ja siga la versió 2 de la llicència o bé "
1453 "(si ho preferiu) qualsevol altra versió posterior."
1455 -#: ../src/totem-interface.c:323
1456 +#: ../src/totem-interface.c:350
1457 msgid ""
1458 "Totem is distributed in the hope that it will be useful, but WITHOUT ANY "
1459 "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
1460 @@ -1161,7 +1166,7 @@ msgstr ""
1461 "PER UN PROPÒSIT PARTICULAR. Vegeu la Llicència Pública General de GNU per "
1462 "obtindre'n més detalls."
1464 -#: ../src/totem-interface.c:327
1465 +#: ../src/totem-interface.c:354
1466 msgid ""
1467 "You should have received a copy of the GNU General Public License along with "
1468 "Totem; if not, write to the Free Software Foundation, Inc., 59 Temple Place, "
1469 @@ -1171,7 +1176,7 @@ msgstr ""
1470 "juntament amb el Totem; en cas contrari, escriviu a la Free Software "
1471 "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
1473 -#: ../src/totem-interface.c:330
1474 +#: ../src/totem-interface.c:357
1475 msgid ""
1476 "Totem contains an exception to allow the use of proprietary GStreamer "
1477 "plugins."
1478 @@ -1184,87 +1189,93 @@ msgstr ""
1479 msgid "None"
1480 msgstr "Cap"
1482 +#. Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD
1483 +#: ../src/totem-menu.c:197
1484 +msgctxt "Language"
1485 +msgid "Auto"
1486 +msgstr "Auto"
1488 #. Translators:
1489 #. * This is not a JPEG image, but a disc image, for example,
1490 #. * an ISO file
1491 -#: ../src/totem-menu.c:739
1492 +#: ../src/totem-menu.c:767
1493 #, c-format
1494 msgid "Play Image '%s'"
1495 msgstr "Reprodueix la imatge «%s»"
1497 -#: ../src/totem-menu.c:742 ../src/totem-menu.c:824
1498 +#: ../src/totem-menu.c:770 ../src/totem-menu.c:853
1499 #, c-format
1500 msgid "device%d"
1501 msgstr "dispositiu%d"
1503 -#: ../src/totem-menu.c:821
1504 +#: ../src/totem-menu.c:850
1505 #, c-format
1506 msgid "Play Disc '%s'"
1507 msgstr "Reprodueix el disc «%s»"
1509 #. This lists the back-end type and version, such as
1510 #. * Movie Player using GStreamer 0.10.1
1511 -#: ../src/totem-menu.c:1172
1512 +#: ../src/totem-menu.c:1201
1513 #, c-format
1514 msgid "Movie Player using %s"
1515 msgstr "Reproductor de vídeo que utilitza el %s"
1517 -#: ../src/totem-menu.c:1176
1518 +#: ../src/totem-menu.c:1205
1519 msgid "Copyright © 2002-2009 Bastien Nocera"
1520 msgstr "Copyright © 2002-2009 Bastien Nocera"
1522 -#: ../src/totem-menu.c:1181 ../browser-plugin/totem-plugin-viewer.c:1166
1523 +#: ../src/totem-menu.c:1210 ../browser-plugin/totem-plugin-viewer.c:1163
1524 msgid "translator-credits"
1525 msgstr ""
1526 "Jordi Mallach <jordi@sindominio.net>\n"
1527 "Gil Forcada <gilforcada@guifi.net>"
1529 -#: ../src/totem-menu.c:1185
1530 +#: ../src/totem-menu.c:1214
1531 msgid "Totem Website"
1532 msgstr "Pàgina web del Totem"
1534 -#: ../src/totem-menu.c:1220
1535 +#: ../src/totem-menu.c:1248
1536 msgid "Configure Plugins"
1537 msgstr "Configura els connectors"
1539 #. Translators: %s is the totem version number
1540 -#: ../src/totem-object.c:429
1541 +#: ../src/totem-object.c:473
1542 #, c-format
1543 msgid "Totem %s"
1544 msgstr "Totem %s"
1546 -#: ../src/totem-object.c:999 ../browser-plugin/totem-plugin-viewer.c:369
1547 +#: ../src/totem-object.c:1046 ../browser-plugin/totem-plugin-viewer.c:368
1548 msgid "Playing"
1549 msgstr "S'està reproduint"
1551 -#: ../src/totem-object.c:1001 ../src/totem-options.c:51
1552 +#: ../src/totem-object.c:1048 ../src/totem-options.c:52
1553 msgid "Pause"
1554 msgstr "Fes una pausa"
1556 -#: ../src/totem-object.c:1006 ../browser-plugin/totem-plugin-viewer.c:365
1557 +#: ../src/totem-object.c:1053 ../browser-plugin/totem-plugin-viewer.c:364
1558 msgid "Paused"
1559 msgstr "En pausa"
1561 #. Translators: this refers to a media file
1562 -#: ../src/totem-object.c:1008 ../src/totem-object.c:1018
1563 -#: ../src/totem-options.c:50
1564 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:76
1565 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:88
1566 +#: ../src/totem-object.c:1055 ../src/totem-object.c:1065
1567 +#: ../src/totem-options.c:51
1568 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:84
1569 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:96
1570 msgid "Play"
1571 msgstr "Reprodueix"
1573 -#: ../src/totem-object.c:1013 ../src/totem-object.c:1612
1574 -#: ../src/totem-statusbar.c:96 ../browser-plugin/totem-plugin-viewer.c:353
1575 +#: ../src/totem-object.c:1060 ../src/totem-object.c:1658
1576 +#: ../src/totem-statusbar.c:115 ../browser-plugin/totem-plugin-viewer.c:352
1577 msgid "Stopped"
1578 -msgstr "Aturat"
1579 +msgstr "Parat"
1581 -#: ../src/totem-object.c:1094 ../src/totem-object.c:1121
1582 -#: ../src/totem-object.c:1742 ../src/totem-object.c:1905
1583 +#: ../src/totem-object.c:1141 ../src/totem-object.c:1168
1584 +#: ../src/totem-object.c:1798 ../src/totem-object.c:1962
1585 #, c-format
1586 msgid "Totem could not play '%s'."
1587 msgstr "El Totem no ha pogut reproduir «%s»."
1589 -#: ../src/totem-object.c:1198
1590 +#: ../src/totem-object.c:1245
1591 #, c-format
1592 msgid ""
1593 "Totem could not play this media (%s) although a plugin is present to handle "
1594 @@ -1273,7 +1284,7 @@ msgstr ""
1595 "El Totem no ha pogut reproduir este medi (%s) encara que hi ha un connector "
1596 "per gestionar-lo."
1598 -#: ../src/totem-object.c:1199
1599 +#: ../src/totem-object.c:1246
1600 msgid ""
1601 "You might want to check that a disc is present in the drive and that it is "
1602 "correctly configured."
1603 @@ -1281,11 +1292,11 @@ msgstr ""
1604 "Hauríeu de comprovar que hi ha un disc en la unitat i que està correctament "
1605 "configurada."
1607 -#: ../src/totem-object.c:1207
1608 +#: ../src/totem-object.c:1254
1609 msgid "More information about media plugins"
1610 msgstr "Més informació sobre els connectors de medi"
1612 -#: ../src/totem-object.c:1208
1613 +#: ../src/totem-object.c:1255
1614 msgid ""
1615 "Please install the necessary plugins and restart Totem to be able to play "
1616 "this media."
1617 @@ -1293,7 +1304,7 @@ msgstr ""
1618 "Instal·leu els connectors necessaris i reinicieu el Totem per poder "
1619 "reproduir este medi."
1621 -#: ../src/totem-object.c:1210
1622 +#: ../src/totem-object.c:1257
1623 #, c-format
1624 msgid ""
1625 "Totem cannot play this type of media (%s) because it does not have the "
1626 @@ -1302,7 +1313,7 @@ msgstr ""
1627 "El Totem no pot reproduir este tipus de medi (%s) perquè no té els "
1628 "connectors adequats per poder llegir-lo del disc."
1630 -#: ../src/totem-object.c:1212
1631 +#: ../src/totem-object.c:1259
1632 #, c-format
1633 msgid ""
1634 "Totem cannot play this type of media (%s) because you do not have the "
1635 @@ -1311,139 +1322,137 @@ msgstr ""
1636 "El Totem no pot reproduir este tipus de medi (%s) perquè no teniu el "
1637 "connector adequat per gestionar-lo."
1639 -#: ../src/totem-object.c:1215
1640 +#: ../src/totem-object.c:1262
1641 #, c-format
1642 msgid "Totem cannot play this type of media (%s) because it is not supported."
1643 msgstr ""
1644 "El Totem no pot reproduir este tipus de medi (%s) perquè no el sap utilitzar."
1646 -#: ../src/totem-object.c:1216
1647 +#: ../src/totem-object.c:1263
1648 msgid "Please insert another disc to play back."
1649 msgstr "Inseriu un altre disc a reproduir."
1651 -#: ../src/totem-object.c:1251
1652 +#: ../src/totem-object.c:1299
1653 msgid "Totem was not able to play this disc."
1654 msgstr "El Totem no pot reproduir este disc."
1656 -#: ../src/totem-object.c:1252 ../src/totem-object.c:4186
1657 +#: ../src/totem-object.c:1300 ../src/totem-object.c:4280
1658 msgid "No reason."
1659 msgstr "Sense motiu."
1661 -#: ../src/totem-object.c:1266
1662 +#: ../src/totem-object.c:1314
1663 msgid "Totem does not support playback of Audio CDs"
1664 msgstr "El Totem no sap reproduir els CD d'àudio"
1666 -#: ../src/totem-object.c:1267
1667 +#: ../src/totem-object.c:1315
1668 msgid "Please consider using a music player or a CD extractor to play this CD"
1669 msgstr ""
1670 "Podeu utilitzar un reproductor de música o un extractor de CD per reproduir-"
1671 "lo"
1673 -#: ../src/totem-object.c:1748
1674 +#: ../src/totem-object.c:1804
1675 msgid "No error message"
1676 msgstr "No hi ha cap missatge d'error"
1678 -#: ../src/totem-object.c:2134
1679 +#: ../src/totem-object.c:2197
1680 msgid "Totem could not display the help contents."
1681 msgstr "El Totem no ha pogut mostrar els continguts de l'ajuda."
1683 -#: ../src/totem-object.c:2489 ../src/totem-object.c:2491
1684 -#: ../browser-plugin/totem-plugin-viewer.c:1469
1685 +#: ../src/totem-object.c:2535 ../src/totem-object.c:2537
1686 +#: ../browser-plugin/totem-plugin-viewer.c:1466
1687 msgid "An error occurred"
1688 msgstr "S'ha produït un error"
1690 -#: ../src/totem-object.c:4028 ../src/totem-object.c:4030
1691 +#: ../src/totem-object.c:4114 ../src/totem-object.c:4116
1692 msgid "Previous Chapter/Movie"
1693 msgstr "Capítol/pel·lícula anterior"
1695 -#: ../src/totem-object.c:4037 ../src/totem-object.c:4039
1696 +#: ../src/totem-object.c:4123 ../src/totem-object.c:4125
1697 msgid "Play / Pause"
1698 msgstr "Reprodueix / Fes una pausa"
1700 -#: ../src/totem-object.c:4047 ../src/totem-object.c:4049
1701 +#: ../src/totem-object.c:4133 ../src/totem-object.c:4135
1702 msgid "Next Chapter/Movie"
1703 msgstr "Capítol/pel·lícula següent"
1705 -#: ../src/totem-object.c:4061 ../src/totem-object.c:4063
1706 +#. Translators: this is the tooltip text for the fullscreen button in the controls box in Totem's main window.
1707 +#. Translators: this is the accessibility text for the fullscreen button in the controls box in Totem's main window.
1708 +#: ../src/totem-object.c:4147 ../src/totem-object.c:4149
1709 msgid "Fullscreen"
1710 msgstr "Pantalla completa"
1712 -#: ../src/totem-object.c:4186
1713 +#: ../src/totem-object.c:4280
1714 msgid "Totem could not startup."
1715 msgstr "No s'ha pogut executar el Totem."
1717 -#: ../src/totem-open-location.c:179
1718 +#: ../src/totem-open-location.c:182
1719 msgid "Open Location..."
1720 msgstr "Obri una ubicació..."
1722 -#: ../src/totem-options.c:48
1723 +#: ../src/totem-options.c:49
1724 msgid "Enable debug"
1725 msgstr "Habilita la depuració"
1727 -#: ../src/totem-options.c:49
1728 +#: ../src/totem-options.c:50
1729 msgid "Play/Pause"
1730 msgstr "Reprodueix/Fes una pausa"
1732 -#: ../src/totem-options.c:52
1733 +#: ../src/totem-options.c:53
1734 msgid "Next"
1735 msgstr "Següent"
1737 -#: ../src/totem-options.c:53
1738 +#: ../src/totem-options.c:54
1739 msgid "Previous"
1740 msgstr "Anterior"
1742 -#: ../src/totem-options.c:54
1743 +#: ../src/totem-options.c:55
1744 msgid "Seek Forwards"
1745 msgstr "Cerca avant"
1747 -#: ../src/totem-options.c:55
1748 +#: ../src/totem-options.c:56
1749 msgid "Seek Backwards"
1750 msgstr "Cerca cap arrere"
1752 -#: ../src/totem-options.c:56
1753 +#: ../src/totem-options.c:57
1754 msgid "Volume Up"
1755 msgstr "Apuja el volum"
1757 -#: ../src/totem-options.c:57
1758 +#: ../src/totem-options.c:58
1759 msgid "Volume Down"
1760 msgstr "Abaixa el volum"
1762 -#: ../src/totem-options.c:58
1763 +#: ../src/totem-options.c:59
1764 msgid "Mute sound"
1765 msgstr "Silencia el so"
1767 -#: ../src/totem-options.c:59
1768 +#: ../src/totem-options.c:60
1769 msgid "Toggle Fullscreen"
1770 msgstr "Commuta a pantalla completa"
1772 -#: ../src/totem-options.c:60
1773 +#: ../src/totem-options.c:61
1774 msgid "Show/Hide Controls"
1775 msgstr "Mostra/amaga els controls"
1777 -#: ../src/totem-options.c:61
1778 +#: ../src/totem-options.c:62
1779 msgid "Quit"
1780 msgstr "Ix"
1782 #. Translators: this refers to a media file
1783 -#: ../src/totem-options.c:62
1784 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:79
1785 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:91
1786 +#: ../src/totem-options.c:63
1787 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:87
1788 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:99
1789 msgid "Enqueue"
1790 msgstr "Afig a la cua"
1792 -#: ../src/totem-options.c:63
1793 +#: ../src/totem-options.c:64
1794 msgid "Replace"
1795 msgstr "Reemplaça"
1797 -#: ../src/totem-options.c:64
1798 -msgid "Don't connect to an already-running instance"
1799 -msgstr "No et connectes a una instància que ja estiga funcionant"
1801 #: ../src/totem-options.c:65
1802 msgid "Seek"
1803 msgstr "Cerca"
1805 -#. Translators: help for a (hidden) command line option to specify a playlist entry to start playing on load
1806 +#. Translators: help for a (hidden) command line option to specify (the zero-based index of) a playlist entry to start playing once Totem's finished loading
1807 #: ../src/totem-options.c:67
1808 msgid "Playlist index"
1809 msgstr "Índex de la llista de reproducció"
1810 @@ -1452,84 +1461,63 @@ msgstr "Índex de la llista de reproducció"
1811 msgid "Movies to play"
1812 msgstr "Pel·lícules a reproduir"
1814 +#: ../src/totem-options.c:117
1815 +msgid "Can't enqueue and replace at the same time"
1816 +msgstr "No es pot enviar a la cua i reemplaçar alhora"
1818 #. By extension entry
1819 -#: ../src/totem-playlist.c:157
1820 +#: ../src/totem-playlist.c:161
1821 msgid "MP3 ShoutCast playlist"
1822 msgstr "Llista de reproducció MP3 ShoutCast"
1824 -#: ../src/totem-playlist.c:158
1825 +#: ../src/totem-playlist.c:162
1826 msgid "MP3 audio (streamed)"
1827 msgstr "Àudio MP3 (en flux)"
1829 -#: ../src/totem-playlist.c:159
1830 +#: ../src/totem-playlist.c:163
1831 msgid "MP3 audio (streamed, DOS format)"
1832 msgstr "Àudio MP3 (en flux, format DOS)"
1834 -#: ../src/totem-playlist.c:160
1835 +#: ../src/totem-playlist.c:164
1836 msgid "XML Shareable Playlist"
1837 msgstr "Llista de reproducció XML per compartir"
1839 #. This is "Title 3", where title is a DVD title
1840 #. * Note: NOT a DVD chapter
1841 -#: ../src/totem-playlist.c:359
1842 +#: ../src/totem-playlist.c:363
1843 #, c-format
1844 msgid "Title %d"
1845 msgstr "Títol %d"
1847 -#: ../src/totem-playlist.c:458
1848 +#: ../src/totem-playlist.c:462
1849 msgid "Could not save the playlist"
1850 msgstr "No s'ha pogut alçar la llista de reproducció"
1852 -#: ../src/totem-playlist.c:1029
1853 +#: ../src/totem-playlist.c:1037
1854 msgid "Save Playlist"
1855 msgstr "Alça la llista de reproducció"
1857 #. translators: Playlist is the default saved playlist filename,
1858 #. * without the suffix
1859 -#: ../src/totem-playlist.c:1041 ../src/totem-sidebar.c:145
1860 +#: ../src/totem-playlist.c:1049 ../src/totem-sidebar.c:140
1861 msgid "Playlist"
1862 msgstr "Llista de reproducció"
1864 -#: ../src/totem-playlist.c:1863
1865 +#: ../src/totem-playlist.c:1869
1866 #, c-format
1867 msgid "The playlist '%s' could not be parsed. It might be damaged."
1868 msgstr ""
1869 "No s'ha pogut analitzar la llista de reproducció «%s», pot estar malmesa."
1871 -#: ../src/totem-playlist.c:1864
1872 +#: ../src/totem-playlist.c:1870
1873 msgid "Playlist error"
1874 msgstr "S'ha produït un error de la llista de reproducció"
1876 -#: ../src/totem-preferences.c:108
1877 -msgid "Enable visual effects?"
1878 -msgstr "Voleu habilitar els efectes visuals?"
1880 -#: ../src/totem-preferences.c:110
1881 -msgid ""
1882 -"It seems you are running Totem remotely.\n"
1883 -"Are you sure you want to enable the visual effects?"
1884 -msgstr ""
1885 -"Pareix que esteu executant el Totem remotament.\n"
1886 -"Esteu segur que voleu habilitar els efectes visuals?"
1888 -#: ../src/totem-preferences.c:405
1889 -msgid "Changing the visuals effect type will require a restart to take effect."
1890 -msgstr ""
1891 -"Si canvieu els tipus d'efectes visuals, haureu de reiniciar perquè els "
1892 -"canvis siguen efectius."
1894 -#: ../src/totem-preferences.c:489
1895 -msgid ""
1896 -"The change of audio output type will only take effect when Totem is "
1897 -"restarted."
1898 -msgstr ""
1899 -"El canvi del tipus d'eixida d'àudio serà efectiu quan es reinicie el Totem."
1901 -#: ../src/totem-preferences.c:593
1902 +#: ../src/totem-preferences.c:295
1903 msgid "Preferences"
1904 msgstr "Preferències"
1906 -#: ../src/totem-preferences.c:766
1907 +#: ../src/totem-preferences.c:451
1908 msgid "Select Subtitle Font"
1909 msgstr "Seleccioneu el tipus de lletra per als subtítols"
1911 @@ -1539,45 +1527,45 @@ msgstr "Seleccioneu el tipus de lletra per als subtítols"
1912 msgid "Audio/Video"
1913 msgstr "Àudio/Vídeo"
1915 -#: ../src/totem-statusbar.c:91
1916 +#: ../src/totem-statusbar.c:110
1917 msgid "0:00 / 0:00"
1918 msgstr "0:00 / 0:00"
1920 -#: ../src/totem-statusbar.c:113
1921 +#: ../src/totem-statusbar.c:133
1922 #, c-format
1923 msgid "%s (Streaming)"
1924 msgstr "%s (en flux)"
1926 #. Elapsed / Total Length
1927 -#: ../src/totem-statusbar.c:120 ../src/totem-time-label.c:64
1928 +#: ../src/totem-statusbar.c:140 ../src/totem-time-label.c:64
1929 #, c-format
1930 msgid "%s / %s"
1931 msgstr "%s / %s"
1933 #. Seeking to Time / Total Length
1934 -#: ../src/totem-statusbar.c:123 ../src/totem-time-label.c:67
1935 +#: ../src/totem-statusbar.c:143 ../src/totem-time-label.c:67
1936 #, c-format
1937 msgid "Seek to %s / %s"
1938 msgstr "Salta a %s / %s"
1940 -#: ../src/totem-statusbar.c:217
1941 +#: ../src/totem-statusbar.c:239
1942 msgid "Buffering"
1943 msgstr "S'està omplint la memòria intermèdia"
1945 #. eg: 75 %
1946 -#: ../src/totem-statusbar.c:228
1947 +#: ../src/totem-statusbar.c:250
1948 #, c-format
1949 msgid "%d %%"
1950 msgstr "%d%%"
1952 #. eg: Paused, 0:32 / 1:05
1953 -#: ../src/totem-statusbar.c:303
1954 +#: ../src/totem-statusbar.c:325
1955 #, c-format
1956 msgid "%s, %s"
1957 msgstr "%s, %s"
1959 #. eg: Buffering, 75 %
1960 -#: ../src/totem-statusbar.c:308
1961 +#: ../src/totem-statusbar.c:330
1962 #, c-format
1963 msgid "%s, %d %%"
1964 msgstr "%s, %d %%"
1965 @@ -1724,14 +1712,14 @@ msgstr "Occidental"
1966 msgid "Vietnamese"
1967 msgstr "Vietnamita"
1969 -#: ../src/totem-video-list.c:305
1970 +#: ../src/totem-video-list.c:329
1971 msgid "No video URI"
1972 msgstr "No hi ha cap URI de vídeo"
1974 #. Translators: The first string is "Filename" (as translated); the second is an actual filename.
1975 #. The third string is "Resolution" (as translated); the fourth and fifth are screenshot height and width, respectively.
1976 #. The sixth string is "Duration" (as translated); the seventh is the movie duration in words.
1977 -#: ../src/totem-video-thumbnailer.c:675
1978 +#: ../src/totem-video-thumbnailer.c:689
1979 #, c-format
1980 msgid ""
1981 "<b>%s</b>: %s\n"
1982 @@ -1742,70 +1730,52 @@ msgstr ""
1983 "<b>%s</b>: %d×%d\n"
1984 "<b>%s</b>: %s"
1986 -#: ../src/totem-video-thumbnailer.c:676
1987 +#: ../src/totem-video-thumbnailer.c:690
1988 msgid "Filename"
1989 msgstr "Nom del fitxer"
1991 -#: ../src/totem-video-thumbnailer.c:678
1992 +#: ../src/totem-video-thumbnailer.c:692
1993 msgid "Resolution"
1994 msgstr "Resolució"
1996 -#: ../src/totem-video-thumbnailer.c:681
1997 +#: ../src/totem-video-thumbnailer.c:695
1998 msgid "Duration"
1999 msgstr "Durada"
2001 -#: ../src/totem-uri.c:502 ../src/plugins/chapters/totem-chapters.c:1045
2002 +#: ../src/totem-uri.c:504 ../src/plugins/chapters/totem-chapters.c:998
2003 msgid "All files"
2004 msgstr "Tots els fitxers"
2006 -#: ../src/totem-uri.c:507 ../src/plugins/chapters/totem-chapters.c:1042
2007 +#: ../src/totem-uri.c:509 ../src/plugins/chapters/totem-chapters.c:995
2008 msgid "Supported files"
2009 msgstr "Fitxers permesos"
2011 -#: ../src/totem-uri.c:519
2012 +#: ../src/totem-uri.c:521
2013 msgid "Audio files"
2014 msgstr "Fitxers d'àudio"
2016 -#: ../src/totem-uri.c:527
2017 +#: ../src/totem-uri.c:529
2018 msgid "Video files"
2019 msgstr "Fitxers de vídeo"
2021 -#: ../src/totem-uri.c:537
2022 +#: ../src/totem-uri.c:539
2023 msgid "Subtitle files"
2024 msgstr "Fitxers de subtítols"
2026 -#: ../src/totem-uri.c:589
2027 +#: ../src/totem-uri.c:591
2028 msgid "Select Text Subtitles"
2029 msgstr "Seleccioneu els subtítols"
2031 -#: ../src/totem-uri.c:651
2032 +#: ../src/totem-uri.c:654
2033 msgid "Select Movies or Playlists"
2034 msgstr "Seleccioneu pel·lícules o llistes de reproducció"
2036 -#: ../src/totem.c:93
2037 -msgid "Could not open link"
2038 -msgstr "No s'ha pogut obrir l'enllaç"
2040 -#: ../src/totem.c:151 ../src/totem.c:177
2041 -#: ../browser-plugin/totem-plugin-viewer.c:666
2042 -#: ../browser-plugin/totem-plugin-viewer.c:1863
2043 -msgid "Totem Movie Player"
2044 -msgstr "Reproductor de vídeo Totem"
2046 -#: ../src/totem.c:152 ../browser-plugin/totem-plugin-viewer.c:2286
2047 -msgid "Could not initialize the thread-safe libraries."
2048 -msgstr "No s'han pogut inicialitzar les biblioteques que permeten fils segurs."
2050 -#: ../src/totem.c:152
2051 -msgid "Verify your system installation. Totem will now exit."
2052 -msgstr "Verifiqueu la instal·lació del sistema. El Totem eixirà ara."
2054 -#. Handle command line arguments
2055 -#: ../src/totem.c:160
2056 +#. Options parsing
2057 +#: ../src/totem.c:201
2058 msgid "- Play movies and songs"
2059 msgstr "- Reproduïu vídeos i cançons"
2061 -#: ../src/totem.c:169
2062 +#: ../src/totem.c:212
2063 #, c-format
2064 msgid ""
2065 "%s\n"
2066 @@ -1815,76 +1785,82 @@ msgstr ""
2067 "Executeu «%s --help» per veure una llista completa de les opcions de la "
2068 "línia d'ordes.\n"
2070 -#: ../src/totem.c:186
2071 -msgid "Totem could not initialize the configuration engine."
2072 -msgstr "El Totem no ha pogut inicialitzar el motor de configuració."
2073 +#: ../src/totem.c:254 ../src/totem.c:263
2074 +#: ../browser-plugin/totem-plugin-viewer.c:663
2075 +#: ../browser-plugin/totem-plugin-viewer.c:1861
2076 +msgid "Totem Movie Player"
2077 +msgstr "Reproductor de vídeo Totem"
2079 +#: ../src/totem.c:255 ../browser-plugin/totem-plugin-viewer.c:2302
2080 +msgid "Could not initialize the thread-safe libraries."
2081 +msgstr "No s'han pogut inicialitzar les biblioteques que permeten fils segurs."
2083 -#: ../src/totem.c:186
2084 -msgid "Make sure that GNOME is properly installed."
2085 -msgstr "Assegureu-vos que el GNOME està instal·lat correctament."
2086 +#: ../src/totem.c:255
2087 +msgid "Verify your system installation. Totem will now exit."
2088 +msgstr "Verifiqueu la instal·lació del sistema. El Totem eixirà ara."
2090 -#: ../src/backend/bacon-video-widget-gst-0.10.c:1772
2091 +#: ../src/backend/bacon-video-widget-gst-0.10.c:1850
2092 msgid "Password requested for RTSP server"
2093 msgstr "El servidor de RTSP sol·licita la contrasenya"
2095 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3019
2096 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3023
2097 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3124
2098 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3128
2099 #, c-format
2100 msgid "Audio Track #%d"
2101 msgstr "Pista d'àudio #%d"
2103 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3051
2104 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3055
2105 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3156
2106 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3160
2107 #, c-format
2108 msgid "Subtitle #%d"
2109 msgstr "Subtítol #%d"
2111 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3464
2112 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3569
2113 msgid ""
2114 "The requested audio output was not found. Please select another audio output "
2115 "in the Multimedia Systems Selector."
2116 msgstr ""
2117 -"No s'ha trobat la eixida d'àudio demanada. Seleccioneu una altra eixida "
2118 +"No s'ha trobat l'eixida d'àudio demanada. Seleccioneu una altra eixida "
2119 "d'àudio en el selector de sistemes multimèdia."
2121 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3469
2122 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3574
2123 msgid "Location not found."
2124 msgstr "No s'ha trobat la ubicació."
2126 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3473
2127 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3578
2128 msgid ""
2129 "Could not open location; you might not have permission to open the file."
2130 msgstr ""
2131 "No s'ha pogut obrir la ubicació. Potser no teniu permís per obrir el fitxer."
2133 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3484
2134 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3589
2135 msgid ""
2136 "The video output is in use by another application. Please close other video "
2137 "applications, or select another video output in the Multimedia Systems "
2138 "Selector."
2139 msgstr ""
2140 -"Una altra aplicació ja utilitza la eixida de vídeo. Tanqueu les altres "
2141 +"Una altra aplicació ja utilitza l'eixida de vídeo. Tanqueu les altres "
2142 "aplicacions de vídeo, o seleccioneu una altra eixida de vídeo al selector de "
2143 "sistemes multimèdia."
2145 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3490
2146 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3595
2147 msgid ""
2148 "The audio output is in use by another application. Please select another "
2149 "audio output in the Multimedia Systems Selector. You may want to consider "
2150 "using a sound server."
2151 msgstr ""
2152 -"Una altra aplicació ja utilitza la eixida d'àudio. Seleccioneu una altra "
2153 +"Una altra aplicació ja utilitza l'eixida d'àudio. Seleccioneu una altra "
2154 "eixida d'àudio al selector de sistemes multimèdia. Potser hauríeu de "
2155 "considerar utilitzar un servidor de so."
2157 #. should be exactly one missing thing (source or converter)
2158 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3508
2159 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3514
2160 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3613
2161 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3619
2162 #, c-format
2163 msgid "The playback of this movie requires a %s plugin which is not installed."
2164 msgstr "Hauríeu d'instal·lar el connector %s per reproduir esta pel·lícula."
2166 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3515
2167 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3620
2168 #, c-format
2169 msgid ""
2170 "The playback of this movie requires the following decoders which are not "
2171 @@ -1897,34 +1873,34 @@ msgstr ""
2172 "\n"
2173 "%s"
2175 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3540
2176 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3645
2177 msgid ""
2178 "Cannot play this file over the network. Try downloading it to disk first."
2179 msgstr ""
2180 "No es pot reproduir este fitxer a través de la xarxa. Proveu de baixar-lo al "
2181 "disc primer."
2183 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3612
2184 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3717
2185 msgid "Media file could not be played."
2186 msgstr "No s'ha pogut reproduir el fitxer multimèdia."
2188 -#: ../src/backend/bacon-video-widget-gst-0.10.c:5915
2189 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6008
2190 msgid "Surround"
2191 msgstr "Envoltant"
2193 -#: ../src/backend/bacon-video-widget-gst-0.10.c:5917
2194 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6010
2195 msgid "Mono"
2196 msgstr "Mono"
2198 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6264
2199 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6357
2200 msgid "Too old version of GStreamer installed."
2201 msgstr "La versió del GStreamer instal·lada és massa antiga."
2203 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6271
2204 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6364
2205 msgid "Media contains no supported video streams."
2206 msgstr "El medi no conté cap flux de vídeo conegut."
2208 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6784
2209 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6847
2210 msgid ""
2211 "Failed to create a GStreamer play object. Please check your GStreamer "
2212 "installation."
2213 @@ -1932,42 +1908,42 @@ msgstr ""
2214 "No s'ha pogut crear un objecte de reproducció del GStreamer. Comproveu la "
2215 "instal·lació del GStreamer."
2217 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6898
2218 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7033
2219 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6958
2220 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7093
2221 msgid ""
2222 "Failed to open video output. It may not be available. Please select another "
2223 "video output in the Multimedia Systems Selector."
2224 msgstr ""
2225 -"No s'ha pogut obrir la eixida de vídeo. Potser no està disponible. "
2226 +"No s'ha pogut obrir l'eixida de vídeo. Potser no està disponible. "
2227 "Seleccioneu una altra eixida de vídeo al selector de sistemes multimèdia."
2229 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6910
2230 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6970
2231 msgid ""
2232 "Could not find the video output. You may need to install additional "
2233 "GStreamer plugins, or select another video output in the Multimedia Systems "
2234 "Selector."
2235 msgstr ""
2236 -"No s'ha trobat la eixida de vídeo. Pot ser que hàgeu d'instal·lar connectors "
2237 +"No s'ha trobat l'eixida de vídeo. Pot ser que hàgeu d'instal·lar connectors "
2238 "del GStreamer, o bé seleccionar una altra eixida de vídeo al selector de "
2239 "sistemes multimèdia."
2241 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6945
2242 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7005
2243 msgid ""
2244 "Failed to open audio output. You may not have permission to open the sound "
2245 "device, or the sound server may not be running. Please select another audio "
2246 "output in the Multimedia Systems Selector."
2247 msgstr ""
2248 -"No s'ha pogut obrir la eixida d'àudio. Pot ser que no tingueu permís per "
2249 +"No s'ha pogut obrir l'eixida d'àudio. Pot ser que no tingueu permís per "
2250 "obrir el dispositiu d'àudio, o que el servidor de so no s'estiga executant. "
2251 "Seleccioneu una altra eixida de so al selector de sistemes multimèdia."
2253 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6965
2254 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7025
2255 msgid ""
2256 "Could not find the audio output. You may need to install additional "
2257 "GStreamer plugins, or select another audio output in the Multimedia Systems "
2258 "Selector."
2259 msgstr ""
2260 -"No s'ha trobat la eixida d'àudio. Pot ser que hàgeu d'instal·lar connectors "
2261 +"No s'ha trobat l'eixida d'àudio. Pot ser que hàgeu d'instal·lar connectors "
2262 "del GStreamer addicionals, o bé seleccionar una altra eixida d'àudio al "
2263 "selector de sistemes multimèdia."
2265 @@ -2034,150 +2010,140 @@ msgstr "%s %s"
2266 msgid "%s"
2267 msgstr "%s"
2269 -#: ../src/plugins/totem-plugin-manager.c:51
2270 -msgid "Plugin"
2271 -msgstr "Connector"
2273 -#: ../src/plugins/totem-plugin-manager.c:52
2274 -msgid "Enabled"
2275 -msgstr "Habilitat"
2277 -#: ../src/plugins/totem-plugins-engine.c:603
2278 -#, c-format
2279 -msgid ""
2280 -"Unable to activate plugin %s.\n"
2281 -"%s"
2282 -msgstr ""
2283 -"No s'ha pogut activar el connector %s.\n"
2284 -"%s"
2286 -#: ../src/plugins/totem-plugins-engine.c:606
2287 -#, c-format
2288 -msgid "Unable to activate plugin %s"
2289 -msgstr "No s'ha pogut activar el connector %s"
2291 -#: ../src/plugins/totem-plugins-engine.c:608
2292 -msgid "Plugin Error"
2293 -msgstr "Error del connector"
2295 -#: ../src/plugins/bemused/bemused.totem-plugin.in.h:1
2296 +#: ../src/plugins/bemused/bemused.plugin.in.h:1
2297 msgid "Bemused"
2298 msgstr "Bemused"
2300 -#: ../src/plugins/bemused/bemused.totem-plugin.in.h:2
2301 +#: ../src/plugins/bemused/bemused.plugin.in.h:2
2302 msgid "Control Totem through a mobile phone with a Bemused client"
2303 msgstr "Controleu el Totem a través d'un telèfon mòbil amb un client Bemused"
2305 #. Translators: the parameter is a number used to identify this playlist entry
2306 -#: ../src/plugins/bemused/totem-bemused.c:186
2307 +#: ../src/plugins/bemused/totem-bemused.c:171
2308 #, c-format
2309 msgid "Untitled %d"
2310 msgstr "%d desconegut"
2312 -#: ../src/plugins/bemused/totem-bemused.c:609
2313 +#: ../src/plugins/bemused/totem-bemused.c:597
2314 msgid "Totem Bemused Server"
2315 msgstr "Servidor Bemused del Totem"
2317 #. FIXME version
2318 -#: ../src/plugins/bemused/totem-bemused.c:611
2319 +#: ../src/plugins/bemused/totem-bemused.c:599
2320 msgid "Totem Bemused Server version 1.0"
2321 msgstr "Servidor Bemused del Totem (versió 1.0)"
2323 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:77
2324 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:65
2325 msgid "_Create Video Disc..."
2326 msgstr "_Crea un disc de vídeo..."
2328 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:78
2329 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:66
2330 msgid "Create a video DVD or a (S)VCD from the currently opened movie"
2331 msgstr "Crea un DVD de vídeo o un (S)VCD a partir de la pel·lícula actual"
2333 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:80
2334 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:68
2335 msgid "Copy Vide_o DVD..."
2336 msgstr "C_opia un DVD de vídeo..."
2338 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:81
2339 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:69
2340 msgid "Copy the currently playing video DVD"
2341 msgstr "Copia el DVD que s'està reproduint"
2343 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:83
2344 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:71
2345 msgid "Copy (S)VCD..."
2346 msgstr "Copia un (S)VCD..."
2348 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:84
2349 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:72
2350 msgid "Copy the currently playing (S)VCD"
2351 msgstr "Copia el (S)VCD que s'està reproduint"
2353 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:124
2354 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:129
2355 msgid "The video disc could not be duplicated."
2356 msgstr "No s'ha pogut duplicar el disc de vídeo."
2358 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:128
2359 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:279
2360 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:131
2361 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:276
2362 msgid "The movie could not be recorded."
2363 msgstr "No s'ha pogut enregistrar la pel·lícula."
2365 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:160
2366 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:170
2367 -#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:266
2368 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:157
2369 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:167
2370 +#: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:263
2371 msgid "Unable to write a project."
2372 msgstr "No s'ha pogut escriure un projecte."
2374 -#: ../src/plugins/brasero-disc-recorder/brasero-disc-recorder.totem-plugin.in.h:1
2375 +#: ../src/plugins/brasero-disc-recorder/brasero-disc-recorder.plugin.in.h:1
2376 msgid "Records (S)VCDs or video DVDs"
2377 msgstr "Enregistra (S)VCD o DVD de vídeo"
2379 -#: ../src/plugins/brasero-disc-recorder/brasero-disc-recorder.totem-plugin.in.h:2
2380 +#: ../src/plugins/brasero-disc-recorder/brasero-disc-recorder.plugin.in.h:2
2381 msgid "Video Disc Recorder"
2382 msgstr "Enregistrador de discs de vídeo"
2384 -#: ../src/plugins/chapters/chapters.totem-plugin.in.h:1
2385 -#: ../src/plugins/chapters/totem-chapters.c:1193
2386 +#: ../src/plugins/chapters/chapters.plugin.in.h:1
2387 +#: ../src/plugins/chapters/totem-chapters.c:1137
2388 msgid "Chapters"
2389 msgstr "Capítols"
2391 -#: ../src/plugins/chapters/chapters.totem-plugin.in.h:2
2392 -msgid "Chapters support"
2393 -msgstr "Permet l'ús de capítols"
2394 +#: ../src/plugins/chapters/chapters.plugin.in.h:2
2395 +msgid "Support chapter markers in movies."
2396 +msgstr "Permet posar marcadors de capítols a les pel·lícules."
2398 #: ../src/plugins/chapters/chapters-edit.ui.h:1
2399 -msgid "Enter new name for a chapter:"
2400 -msgstr "Introduïu el nom per al capítol:"
2401 +msgid "Name for new chapter:"
2402 +msgstr "El nom del capítol nou:"
2404 +#: ../src/plugins/chapters/chapters-list.ui.h:1
2405 +msgid "Add Chapter..."
2406 +msgstr "Afig un capítol..."
2408 #: ../src/plugins/chapters/chapters-list.ui.h:2
2409 -msgid "Continue to watch movie without loaded chapters"
2410 -msgstr "Continua reproduint la pel·lícula sense carregar els capítols"
2411 +msgid "Add New Chapters"
2412 +msgstr "Afig capítols nous"
2414 #: ../src/plugins/chapters/chapters-list.ui.h:3
2415 -msgid "Continue without"
2416 -msgstr "Continua sense"
2417 +msgid "Create a new chapter list for the movie"
2418 +msgstr "Crea una llista de capítols nova per a la pel·lícula"
2420 #: ../src/plugins/chapters/chapters-list.ui.h:4
2421 -msgid "Go to chapter"
2422 +msgid "Go to Chapter"
2423 msgstr "Vés al capítol"
2425 #: ../src/plugins/chapters/chapters-list.ui.h:5
2426 -msgid "Load chapters from external file"
2427 -msgstr "Carrega els capítols des d'un fitxer extern"
2428 +msgid "Go to the chapter in the movie"
2429 +msgstr "Vés al capítol de la pel·lícula"
2431 #: ../src/plugins/chapters/chapters-list.ui.h:6
2432 -msgid "Load chapters..."
2433 +msgid "Load Chapters..."
2434 msgstr "Carrega els capítols..."
2436 #: ../src/plugins/chapters/chapters-list.ui.h:7
2437 -msgid "No chapters data"
2438 -msgstr "No hi ha informació sobre capítols"
2439 +msgid "Load chapters from an external CMML file"
2440 +msgstr "Carrega els capítols des d'un fitxer CMML extern"
2442 +#: ../src/plugins/chapters/chapters-list.ui.h:8
2443 +msgid "No chapter data"
2444 +msgstr "No hi ha informació del capítol"
2446 #: ../src/plugins/chapters/chapters-list.ui.h:9
2447 -msgid "Remove chapter from the list"
2448 -msgstr "Suprimeix el capítol de la llista"
2449 +msgid "Remove Chapter"
2450 +msgstr "Suprimeix el capítol"
2452 #: ../src/plugins/chapters/chapters-list.ui.h:10
2453 +msgid "Remove the chapter from the list"
2454 +msgstr "Suprimeix el capítol de la llista"
2456 +#: ../src/plugins/chapters/chapters-list.ui.h:11
2457 msgid "Save Changes"
2458 msgstr "Alça els canvis"
2460 -#: ../src/plugins/chapters/chapters-list.ui.h:11
2461 -msgid "_Go to"
2462 -msgstr "Vé_s"
2463 +#: ../src/plugins/chapters/chapters-list.ui.h:12
2464 +msgid "_Go to Chapter"
2465 +msgstr "_Vés al capítol"
2467 +#: ../src/plugins/chapters/chapters-list.ui.h:13
2468 +msgid "_Remove Chapter"
2469 +msgstr "_Suprimeix el capítol"
2471 #: ../src/plugins/chapters/totem-chapters.c:56
2472 #, c-format
2473 @@ -2188,57 +2154,86 @@ msgstr ""
2474 "<b>Títol: </b>%s\n"
2475 "<b>Inici: </b>%s"
2477 -#: ../src/plugins/chapters/totem-chapters.c:370
2478 +#: ../src/plugins/chapters/totem-chapters.c:328
2479 msgid "Error while reading file with chapters"
2480 msgstr "S'ha produït un error en llegir el fitxer de capítols"
2482 -#: ../src/plugins/chapters/totem-chapters.c:585
2483 +#: ../src/plugins/chapters/totem-chapters.c:543
2484 msgid "Chapter with the same time already exists"
2485 msgstr "Ja existeix un capítol que comença al mateix moment"
2487 -#: ../src/plugins/chapters/totem-chapters.c:586
2488 -msgid "Try another name or remove an existing chapter"
2489 -msgstr "Canvieu-li el nom o suprimiu un capítol ja existent"
2490 +#: ../src/plugins/chapters/totem-chapters.c:544
2491 +msgid "Try another name or remove an existing chapter."
2492 +msgstr "Canvieu-li el nom o suprimiu un capítol ja existent."
2494 -#: ../src/plugins/chapters/totem-chapters.c:763
2495 +#: ../src/plugins/chapters/totem-chapters.c:717
2496 msgid "Error while writing file with chapters"
2497 msgstr "S'ha produït un error en escriure el fitxer dels capítols"
2499 -#: ../src/plugins/chapters/totem-chapters.c:888
2500 +#: ../src/plugins/chapters/totem-chapters.c:842
2501 msgid "Error occurred while saving chapters"
2502 msgstr "S'ha produït un error en alçar els capítols"
2504 -#: ../src/plugins/chapters/totem-chapters.c:889
2505 -msgid "Please check you rights and free space"
2506 -msgstr "Comproveu que teniu permisos i teniu espai lliure"
2507 +#: ../src/plugins/chapters/totem-chapters.c:843
2508 +msgid ""
2509 +"Please check you have permission to write to the folder containing the movie."
2510 +msgstr ""
2511 +"Assegureu-vos que teniu permisos d'escriptura al directori que conté la "
2512 +"pel·lícula."
2514 -#: ../src/plugins/chapters/totem-chapters.c:1023
2515 -msgid "Open Chapters File"
2516 +#: ../src/plugins/chapters/totem-chapters.c:976
2517 +msgid "Open Chapter File"
2518 msgstr "Obri un fitxer de capítols"
2520 -#: ../src/plugins/chapters/totem-cmml-parser.c:559
2521 +#: ../src/plugins/chapters/totem-chapters.c:1093
2522 +msgid "Chapter Screenshot"
2523 +msgstr "Captura de pantalla del capítol"
2525 +#: ../src/plugins/chapters/totem-chapters.c:1104
2526 +msgid "Chapter Title"
2527 +msgstr "Títol del capítol"
2529 +#: ../src/plugins/chapters/totem-chapters.c:1182
2530 +msgid "Save changes to chapter list before closing?"
2531 +msgstr "Voleu alçar els canvis a la llista de capítols abans de tancar?"
2533 +#. Translators: close Totem without saving changes to the chapter list of the current movie.
2534 +#: ../src/plugins/chapters/totem-chapters.c:1187
2535 +msgid "Close without Saving"
2536 +msgstr "Tanca sense alçar"
2538 +#. Translators: save changes to the chapter list of the current movie before closing Totem.
2539 +#: ../src/plugins/chapters/totem-chapters.c:1189
2540 +msgid "Save"
2541 +msgstr "Alça"
2543 +#: ../src/plugins/chapters/totem-chapters.c:1192
2544 +msgid "If you don't save, changes to the chapter list will be lost."
2545 +msgstr "Si no alceu es perdran els canvis a la llista de capítols."
2547 +#: ../src/plugins/chapters/totem-cmml-parser.c:651
2548 msgid "Failed to parse CMML file"
2549 msgstr "No s'ha pogut analitzar el fitxer CMML"
2551 #. Translators: this refers to a media file
2552 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:97
2553 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:105
2554 msgid "Delete"
2555 msgstr "Suprimeix"
2557 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:108
2558 -#: ../src/plugins/coherence_upnp/coherence_upnp.totem-plugin.in.h:2
2559 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:117
2560 +#: ../src/plugins/coherence_upnp/coherence_upnp.plugin.in.h:2
2561 msgid "Coherence DLNA/UPnP Client"
2562 msgstr "Client DLNA/UPnP de Coherence"
2564 -#: ../src/plugins/coherence_upnp/coherence_upnp.totem-plugin.in.h:1
2565 +#: ../src/plugins/coherence_upnp/coherence_upnp.plugin.in.h:1
2566 msgid "A DLNA/UPnP client for Totem powered by Coherence"
2567 msgstr "Un client DLNA/UPnP per al Totem que utilitza el Coherence"
2569 -#: ../src/plugins/dbus-service/dbus-service.totem-plugin.in.h:1
2570 +#: ../src/plugins/dbus-service/dbus-service.plugin.in.h:1
2571 msgid "D-Bus Service"
2572 msgstr "Servei D-Bus"
2574 -#: ../src/plugins/dbus-service/dbus-service.totem-plugin.in.h:2
2575 +#: ../src/plugins/dbus-service/dbus-service.plugin.in.h:2
2576 msgid ""
2577 "Plugin for sending notifications of currently playing movies to the D-Bus "
2578 "subsystem."
2579 @@ -2246,49 +2241,45 @@ msgstr ""
2580 "Connector per enviar notificacions al subsistema D-Bus sobre les pel·lícules "
2581 "que s'estan reproduint."
2583 -#: ../src/plugins/galago/galago.totem-plugin.in.h:1
2584 +#: ../src/plugins/im-status/totem-im-status.plugin.in.h:1
2585 msgid "Instant Messenger status"
2586 msgstr "Estat en la missatgeria instantània"
2588 -#: ../src/plugins/galago/galago.totem-plugin.in.h:2
2589 +#: ../src/plugins/im-status/totem-im-status.plugin.in.h:2
2590 msgid "Set your Instant Messenger status to away when a movie is playing"
2591 msgstr ""
2592 "Estableix l'estat d'absència en la missatgeria instantània quan s'estiga "
2593 "reproduint una pel·lícula"
2595 -#: ../src/plugins/galago/totem-galago.c:171
2596 -msgid "Could not connect to the Galago daemon."
2597 -msgstr "No s'ha pogut connectar amb el dimoni del Galago."
2599 -#: ../src/plugins/gromit/gromit.totem-plugin.in.h:1
2600 +#: ../src/plugins/gromit/gromit.plugin.in.h:1
2601 msgid "Gromit Annotations"
2602 msgstr "Anotacions del Gromit"
2604 -#: ../src/plugins/gromit/gromit.totem-plugin.in.h:2
2605 +#: ../src/plugins/gromit/gromit.plugin.in.h:2
2606 msgid "Presentation helper to make annotations on screen"
2607 msgstr "Ajudant de presentacions per poder fer anotacions a la pantalla"
2609 -#: ../src/plugins/gromit/totem-gromit.c:272
2610 +#: ../src/plugins/gromit/totem-gromit.c:231
2611 msgid "The gromit binary was not found."
2612 msgstr "No s'ha trobat el fitxer binari del Gromit."
2614 #. Add the interface to Totem's sidebar
2615 -#: ../src/plugins/iplayer/iplayer.totem-plugin.in.h:1
2616 -#: ../src/plugins/iplayer/iplayer.py:32
2617 +#: ../src/plugins/iplayer/iplayer.plugin.in.h:1
2618 +#: ../src/plugins/iplayer/iplayer.py:42
2619 msgid "BBC iPlayer"
2620 msgstr "iPlayer de la BBC"
2622 -#: ../src/plugins/iplayer/iplayer.totem-plugin.in.h:2
2623 +#: ../src/plugins/iplayer/iplayer.plugin.in.h:2
2624 msgid "Stream BBC programs from the last 7 days from the BBC iPlayer service."
2625 msgstr ""
2626 "Reprodueix els programes de la BBC dels últims 7 dies des del servei iPlayer "
2627 "de la BBC."
2629 -#: ../src/plugins/iplayer/iplayer.py:57
2630 +#: ../src/plugins/iplayer/iplayer.py:67
2631 msgid "Error listing channel categories"
2632 msgstr "S'ha produït un error en llistar les categories dels canals"
2634 -#: ../src/plugins/iplayer/iplayer.py:57
2635 +#: ../src/plugins/iplayer/iplayer.py:67
2636 msgid ""
2637 "There was an unknown error getting the list of television channels available "
2638 "on BBC iPlayer."
2639 @@ -2298,15 +2289,16 @@ msgstr ""
2641 #. Append a dummy child row so that the expander's visible; we can
2642 #. then queue off the expander to load the programme listing for this category
2643 -#: ../src/plugins/iplayer/iplayer.py:65
2644 +#: ../src/plugins/iplayer/iplayer.py:75
2645 msgid "Loading…"
2646 msgstr "S'està carregant…"
2648 -#: ../src/plugins/iplayer/iplayer.py:106
2649 +#. Translators: the "programme feed" is the list of TV shows available to watch online
2650 +#: ../src/plugins/iplayer/iplayer.py:120
2651 msgid "Error getting programme feed"
2652 msgstr "S'ha produït un error en obtindre la programació del canal"
2654 -#: ../src/plugins/iplayer/iplayer.py:106
2655 +#: ../src/plugins/iplayer/iplayer.py:120
2656 msgid ""
2657 "There was an error getting the list of programmes for this channel and "
2658 "category combination."
2659 @@ -2314,7 +2306,11 @@ msgstr ""
2660 "S'ha produït un error en obtindre la llista de programes per esta combinació "
2661 "de canal i categoria."
2663 -#: ../src/plugins/iplayer/iplayer2.py:295
2664 +#: ../src/plugins/iplayer/iplayer2.py:299
2665 +msgid "<no reason given>"
2666 +msgstr "<no s'ha donat cap motiu>"
2668 +#: ../src/plugins/iplayer/iplayer2.py:300
2669 #, python-format
2670 msgid "Programme unavailable (\"%s\")"
2671 msgstr "El programa no és disponible («%s»)"
2672 @@ -2332,79 +2328,75 @@ msgid "Jamendo Album Page"
2673 msgstr "Pàgina a Jamendo de l'àlbum"
2675 #: ../src/plugins/jamendo/jamendo.ui.h:4
2676 -msgid "Jamendo Plugin Configuration"
2677 -msgstr "Configuració del connector Jamendo"
2679 -#: ../src/plugins/jamendo/jamendo.ui.h:5
2680 msgid "Latest Releases"
2681 msgstr "Últimes versions"
2683 -#: ../src/plugins/jamendo/jamendo.ui.h:6
2684 +#: ../src/plugins/jamendo/jamendo.ui.h:5
2685 msgid "Number of albums to _retrieve:"
2686 msgstr "Nombre d'àlbums a _recuperar:"
2688 -#: ../src/plugins/jamendo/jamendo.ui.h:7
2689 +#: ../src/plugins/jamendo/jamendo.ui.h:6
2690 msgid "Popular"
2691 msgstr "Popular"
2693 -#: ../src/plugins/jamendo/jamendo.ui.h:8
2694 +#: ../src/plugins/jamendo/jamendo.ui.h:7
2695 msgid "Preferred audio _format:"
2696 msgstr "_Format d'àudio preferit:"
2698 -#: ../src/plugins/jamendo/jamendo.ui.h:9
2699 -#: ../src/plugins/tracker/totem-tracker-widget.c:521
2700 +#: ../src/plugins/jamendo/jamendo.ui.h:8
2701 +#: ../src/plugins/tracker/totem-tracker-widget.c:761
2702 #: ../src/plugins/youtube/youtube.ui.h:2
2703 msgid "Search Results"
2704 msgstr "Resultats de la cerca"
2706 -#: ../src/plugins/jamendo/jamendo.ui.h:11
2707 +#: ../src/plugins/jamendo/jamendo.ui.h:10
2708 msgid "_Open Jamendo Album Page in Browser"
2709 msgstr "_Obri la pàgina de l'àlbum a Jamendo en el navegador"
2711 -#: ../src/plugins/jamendo/jamendo.totem-plugin.in.h:1
2712 -#: ../src/plugins/jamendo/jamendo.py:127
2713 +#: ../src/plugins/jamendo/jamendo.plugin.in.h:1
2714 +#: ../src/plugins/jamendo/jamendo.py:128
2715 msgid "Jamendo"
2716 msgstr "Jamendo"
2718 -#: ../src/plugins/jamendo/jamendo.totem-plugin.in.h:2
2719 +#: ../src/plugins/jamendo/jamendo.plugin.in.h:2
2720 msgid ""
2721 "Listen to the large collection of Creative Commons licensed music on Jamendo."
2722 msgstr ""
2723 "Escolteu la gran col·lecció de música llicenciada sota Creative Commons de "
2724 "Jamendo."
2726 -#: ../src/plugins/jamendo/jamendo.py:55
2727 +#: ../src/plugins/jamendo/jamendo.py:58
2728 msgid "You need to install the Python simplejson module."
2729 msgstr "Heu d'instal·lar el mòdul simplejson del Python."
2731 -#: ../src/plugins/jamendo/jamendo.py:245 ../src/plugins/jamendo/jamendo.py:258
2732 -#: ../src/plugins/jamendo/jamendo.py:281
2733 +#: ../src/plugins/jamendo/jamendo.py:261 ../src/plugins/jamendo/jamendo.py:274
2734 +#: ../src/plugins/jamendo/jamendo.py:298
2735 #, python-format
2736 msgid "Artist: %s"
2737 msgstr "Artista: %s"
2739 #. Translators: this is the release date of an album in Python strptime format
2740 -#: ../src/plugins/jamendo/jamendo.py:251
2741 +#: ../src/plugins/jamendo/jamendo.py:267
2742 msgid "%Y-%m-%d"
2743 msgstr "%d-%m-%Y"
2745 #. Translators: this is the release time of an album in Python strftime format
2746 -#: ../src/plugins/jamendo/jamendo.py:253
2747 +#: ../src/plugins/jamendo/jamendo.py:269
2748 #, python-format
2749 msgid "%x"
2750 msgstr "%x"
2752 -#: ../src/plugins/jamendo/jamendo.py:259
2753 +#: ../src/plugins/jamendo/jamendo.py:275
2754 #, python-format
2755 msgid "Genre: %s"
2756 msgstr "Gènere: %s"
2758 -#: ../src/plugins/jamendo/jamendo.py:260
2759 +#: ../src/plugins/jamendo/jamendo.py:276
2760 #, python-format
2761 msgid "Released on: %s"
2762 msgstr "Publicat al: %s"
2764 -#: ../src/plugins/jamendo/jamendo.py:261
2765 +#: ../src/plugins/jamendo/jamendo.py:277
2766 #, python-format
2767 msgid "License: %s"
2768 msgstr "Llicència: %s"
2769 @@ -2412,30 +2404,26 @@ msgstr "Llicència: %s"
2770 #. track title
2771 #. Translators: this is the title of a track in Python format
2772 #. (first argument is the track number, second is the track title)
2773 -#: ../src/plugins/jamendo/jamendo.py:273
2774 +#: ../src/plugins/jamendo/jamendo.py:290
2775 #, python-format
2776 msgid "%02d. %s"
2777 msgstr "%02d. %s"
2779 -#: ../src/plugins/jamendo/jamendo.py:280
2780 +#: ../src/plugins/jamendo/jamendo.py:297
2781 #, python-format
2782 msgid "Album: %s"
2783 msgstr "Àlbum: %s"
2785 -#: ../src/plugins/jamendo/jamendo.py:282
2786 +#: ../src/plugins/jamendo/jamendo.py:299
2787 #, python-format
2788 msgid "Duration: %s"
2789 msgstr "Durada: %s"
2791 -#: ../src/plugins/jamendo/jamendo.py:339
2792 -msgid "Fetching albums, please wait..."
2793 -msgstr "S'estan obtenint els àlbums..."
2795 -#: ../src/plugins/jamendo/jamendo.py:388
2796 -msgid "An error occurred while fetching albums."
2797 -msgstr "S'ha produït un error mentre s'obtenien els àlbums."
2798 +#: ../src/plugins/jamendo/jamendo.py:356
2799 +msgid "Fetching albums, please wait…"
2800 +msgstr "S'estan obtenint els àlbums, espereu…"
2802 -#: ../src/plugins/jamendo/jamendo.py:400
2803 +#: ../src/plugins/jamendo/jamendo.py:411
2804 #, python-format
2805 msgid ""
2806 "Failed to connect to Jamendo server.\n"
2807 @@ -2444,20 +2432,24 @@ msgstr ""
2808 "No s'ha pogut connectar al servidor de Jamendo.\n"
2809 "%s."
2811 -#: ../src/plugins/jamendo/jamendo.py:402
2812 +#: ../src/plugins/jamendo/jamendo.py:413
2813 #, python-format
2814 msgid "The Jamendo server returned code %s."
2815 msgstr "El servidor de Jamendo ha retornat el codi %s."
2817 +#: ../src/plugins/jamendo/jamendo.py:417
2818 +msgid "An error occurred while fetching albums."
2819 +msgstr "S'ha produït un error mentre s'obtenien els àlbums."
2821 #. Translators: time formatting (in Python strftime format) for the Jamendo plugin
2822 #. for times longer than an hour
2823 -#: ../src/plugins/jamendo/jamendo.py:634
2824 +#: ../src/plugins/jamendo/jamendo.py:620
2825 msgid "%H:%M:%S"
2826 msgstr "%H:%M:%S"
2828 #. Translators: time formatting (in Python strftime format) for the Jamendo plugin
2829 #. for times shorter than an hour
2830 -#: ../src/plugins/jamendo/jamendo.py:637
2831 +#: ../src/plugins/jamendo/jamendo.py:623
2832 msgid "%M:%S"
2833 msgstr "%M:%S"
2835 @@ -2468,38 +2460,45 @@ msgstr "%M:%S"
2836 #. Compared to:
2837 #. http://www.jamendo.com/en/album/4818
2838 #. If Jamendo doesn't support your language, *do not translate this string*!
2839 -#: ../src/plugins/jamendo/jamendo.py:687
2840 +#: ../src/plugins/jamendo/jamendo.py:673
2841 msgid "en"
2842 msgstr "en"
2844 -#: ../src/plugins/lirc/lirc.totem-plugin.in.h:1
2845 +#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:1
2846 +msgid "Audio format to download from Jamendo"
2847 +msgstr "Format de l'àudio que es baixarà des de Jamendo"
2849 +#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:2
2850 +msgid "Number of results per page"
2851 +msgstr "Nombre de resultats per pàgina"
2853 +#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:3
2854 +msgid ""
2855 +"The number of Jamendo search results to display in each page of results."
2856 +msgstr ""
2857 +"La quantitat de resultats de la cerca a Jamendo que es mostraran a cada "
2858 +"pàgina de resultats."
2860 +#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:4
2861 +msgid "The preferred audio format to download tracks from Jamendo in."
2862 +msgstr "El format d'àudio preferit per baixar les peces de Jamendo."
2864 +#: ../src/plugins/lirc/lirc.plugin.in.h:1
2865 msgid "Infrared Remote Control"
2866 msgstr "Control remot per infraroigs"
2868 -#: ../src/plugins/lirc/lirc.totem-plugin.in.h:2
2869 +#: ../src/plugins/lirc/lirc.plugin.in.h:2
2870 msgid "Support infrared remote control"
2871 msgstr "Permet el control remot per infraroigs"
2873 -#: ../src/plugins/lirc/totem-lirc.c:281
2874 +#: ../src/plugins/lirc/totem-lirc.c:242
2875 msgid "Couldn't initialize lirc."
2876 msgstr "No s'ha pogut inicialitzar el lirc."
2878 -#: ../src/plugins/lirc/totem-lirc.c:290
2879 +#: ../src/plugins/lirc/totem-lirc.c:254
2880 msgid "Couldn't read lirc configuration."
2881 msgstr "No s'ha pogut llegir la configuració del lirc."
2883 -#: ../src/plugins/mythtv/totem-mythtv.c:198
2884 -msgid "Recordings"
2885 -msgstr "Enregistraments"
2887 -#: ../src/plugins/mythtv/totem-mythtv.c:521
2888 -msgid "MythTV Recordings"
2889 -msgstr "Enregistraments del MythTV"
2891 -#: ../src/plugins/mythtv/totem-mythtv.c:522
2892 -msgid "MythTV LiveTV"
2893 -msgstr "LiveTV del MythTV"
2895 #: ../src/plugins/opensubtitles/opensubtitles.ui.h:1
2896 msgid "Download Movie Subtitles"
2897 msgstr "Baixa els subtítols de la pel·lícula"
2898 @@ -2516,108 +2515,124 @@ msgstr "_Llengua dels subtítols:"
2899 msgid "_Play with Subtitle"
2900 msgstr "_Reprodueix amb subtítols"
2902 -#: ../src/plugins/opensubtitles/opensubtitles.totem-plugin.in.h:1
2903 +#: ../src/plugins/opensubtitles/opensubtitles.plugin.in.h:1
2904 msgid "Look for subtitles for the currently playing movie."
2905 msgstr "Cerca subtítols per a la pel·lícula que s'està reproduint."
2907 -#: ../src/plugins/opensubtitles/opensubtitles.totem-plugin.in.h:2
2908 +#: ../src/plugins/opensubtitles/opensubtitles.plugin.in.h:2
2909 msgid "Subtitle Downloader"
2910 msgstr "Baixador de subtítols"
2912 -#: ../src/plugins/opensubtitles/opensubtitles.py:35
2913 +#: ../src/plugins/opensubtitles/opensubtitles.py:44
2914 msgid "Brasilian Portuguese"
2915 msgstr "Brasiler"
2917 -#: ../src/plugins/opensubtitles/opensubtitles.py:238
2918 -#: ../src/plugins/opensubtitles/opensubtitles.py:254
2919 -#: ../src/plugins/opensubtitles/opensubtitles.py:271
2920 -#: ../src/plugins/opensubtitles/opensubtitles.py:277
2921 +#: ../src/plugins/opensubtitles/opensubtitles.py:247
2922 +#: ../src/plugins/opensubtitles/opensubtitles.py:263
2923 +#: ../src/plugins/opensubtitles/opensubtitles.py:280
2924 +#: ../src/plugins/opensubtitles/opensubtitles.py:286
2925 msgid "Could not contact the OpenSubtitles website"
2926 msgstr "No s'ha pogut contactar amb el lloc web de l'OpenSubtitles"
2928 -#: ../src/plugins/opensubtitles/opensubtitles.py:259
2929 +#: ../src/plugins/opensubtitles/opensubtitles.py:268
2930 msgid "No results found"
2931 msgstr "No s'ha trobat cap resultat"
2933 -#: ../src/plugins/opensubtitles/opensubtitles.py:368
2934 +#: ../src/plugins/opensubtitles/opensubtitles.py:376
2935 msgid "Subtitles"
2936 msgstr "Subtítols"
2938 #. translators comment:
2939 #. This is the file-type of the subtitle file detected
2940 -#: ../src/plugins/opensubtitles/opensubtitles.py:374
2941 +#: ../src/plugins/opensubtitles/opensubtitles.py:382
2942 msgid "Format"
2943 msgstr "Format"
2945 #. translators comment:
2946 #. This is a rating of the quality of the subtitle
2947 -#: ../src/plugins/opensubtitles/opensubtitles.py:379
2948 +#: ../src/plugins/opensubtitles/opensubtitles.py:387
2949 msgid "Rating"
2950 msgstr "Valoració"
2952 -#: ../src/plugins/opensubtitles/opensubtitles.py:420
2953 -msgid "_Download Movie Subtitles..."
2954 -msgstr "_Baixa subtítols de pel·lícules..."
2955 +#: ../src/plugins/opensubtitles/opensubtitles.py:428
2956 +msgid "_Download Movie Subtitles…"
2957 +msgstr "_Baixa els subtítols de la pel·lícula…"
2959 -#: ../src/plugins/opensubtitles/opensubtitles.py:421
2960 +#: ../src/plugins/opensubtitles/opensubtitles.py:429
2961 msgid "Download movie subtitles from OpenSubtitles"
2962 msgstr "Baixa subtítols de pel·lícules de l'OpenSubtitles"
2964 -#: ../src/plugins/opensubtitles/opensubtitles.py:480
2965 -msgid "Searching subtitles..."
2966 -msgstr "S'estan cercant subtítols..."
2967 +#: ../src/plugins/opensubtitles/opensubtitles.py:488
2968 +msgid "Searching subtitles…"
2969 +msgstr "S'estan cercant subtítols…"
2971 +#: ../src/plugins/opensubtitles/opensubtitles.py:546
2972 +msgid "Downloading the subtitles…"
2973 +msgstr "S'estan baixant els subtítols…"
2975 +#: ../src/plugins/opensubtitles/org.gnome.totem.plugins.opensubtitles.gschema.xml.in.in.h:1
2976 +msgid "Subtitle language"
2977 +msgstr "Llengua dels subtítols"
2979 -#: ../src/plugins/opensubtitles/opensubtitles.py:538
2980 -msgid "Downloading the subtitles..."
2981 -msgstr "S'estan baixant els subtítols..."
2982 +#: ../src/plugins/opensubtitles/org.gnome.totem.plugins.opensubtitles.gschema.xml.in.in.h:2
2983 +msgid "The language to search for subtitles for movies in."
2984 +msgstr "La llengua a la qual cercar subtítols de la pel·lícula."
2986 -#: ../src/plugins/ontop/ontop.totem-plugin.in.h:1
2987 +#: ../src/plugins/ontop/ontop.plugin.in.h:1
2988 msgid "Always On Top"
2989 msgstr "Sempre per damunt"
2991 -#: ../src/plugins/ontop/ontop.totem-plugin.in.h:2
2992 +#: ../src/plugins/ontop/ontop.plugin.in.h:2
2993 msgid "Keep the main window on top when playing a movie"
2994 msgstr ""
2995 "Mantingues la finestra principal per sobre de les altres quan s'estiga "
2996 "reproduint una pel·lícula"
2998 -#: ../src/plugins/properties/totem-movie-properties.c:152
2999 +#: ../src/plugins/properties/totem-movie-properties.c:128
3000 msgid "Properties"
3001 msgstr "Propietats"
3003 -#: ../src/plugins/properties/bacon-video-widget-properties.c:235
3004 -#, c-format
3005 -msgid "%d x %d"
3006 -msgstr "%d x %d"
3008 -#: ../src/plugins/properties/bacon-video-widget-properties.c:238
3009 -#: ../src/plugins/properties/bacon-video-widget-properties.c:271
3010 -#, c-format
3011 -msgid "%d kbps"
3012 -msgstr "%d kbps"
3014 -#: ../src/plugins/properties/bacon-video-widget-properties.c:245
3015 -#, c-format
3016 -msgid "%d frame per second"
3017 -msgid_plural "%d frames per second"
3018 -msgstr[0] "%d quadre per segon"
3019 -msgstr[1] "%d quadres per segon"
3021 -#: ../src/plugins/properties/bacon-video-widget-properties.c:274
3022 -#, c-format
3023 -msgid "%d Hz"
3024 -msgstr "%d Hz"
3025 +#: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:2
3026 +#, no-c-format
3027 +msgid ""
3028 +"A format string used to build the network service name used when publishing "
3029 +"playlists over the network. The following format placeholders can be used: • "
3030 +"%a: the program name as returned by g_get_application_name() • %h: the "
3031 +"machine's host name in title case • %u: the user's login name in title case "
3032 +"• %U: the user's real name • %%: the percent sign"
3033 +msgstr ""
3034 +"Una cadena de format per construir el nom del servei de xarxa per la "
3035 +"publicació de llistes de reproducció a través de la xarxa. Es poden "
3036 +"utilitzar les variables següents: %a - el nom del programa que retorna "
3037 +"g_get_application_name(); %h - el nom de l'ordinador; %u - el nom "
3038 +"d'identificació de l'usuari; %U el nom real de l'usuari; %% - el símbol de "
3039 +"percentatge"
3041 +#: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:3
3042 +msgid "Format for network service name"
3043 +msgstr "Format pel nom del servei de xarxa"
3045 +#: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:4
3046 +msgid "Publisher protocol to use"
3047 +msgstr "Protocol de publicació que s'utilitza"
3049 +#: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:5
3050 +msgid ""
3051 +"The transport protocol to use when publishing playlists over the network."
3052 +msgstr ""
3053 +"El protocol de transport per la publicació de llistes de reproducció a "
3054 +"través de la xarxa."
3056 #. Translators: computers on the local network which are publishing their playlists over the network
3057 -#: ../src/plugins/publish/totem-publish.c:589
3058 +#: ../src/plugins/publish/totem-publish.c:552
3059 msgid "Neighbors"
3060 msgstr "Veïns"
3062 -#: ../src/plugins/publish/publish.totem-plugin.in.h:1
3063 +#: ../src/plugins/publish/publish.plugin.in.h:1
3064 msgid "Publish Playlist"
3065 msgstr "Publica la llista de reproducció"
3067 -#: ../src/plugins/publish/publish.totem-plugin.in.h:2
3068 +#: ../src/plugins/publish/publish.plugin.in.h:2
3069 msgid "Share the current playlist via HTTP"
3070 msgstr "Comparteix la llista de reproducció actual a través d'HTTP"
3072 @@ -2641,8 +2656,43 @@ msgstr ""
3073 msgid "Use _encrypted transport protocol (HTTPS)"
3074 msgstr "Utilitza un protocol de transport _xifrat (HTTPS)"
3076 -#: ../src/plugins/screensaver/totem-screensaver.c:94
3077 -#: ../browser-plugin/totem-plugin-viewer.c:1964
3078 +#: ../src/plugins/pythonconsole/org.gnome.totem.plugins.pythonconsole.gschema.xml.in.in.h:1
3079 +msgid ""
3080 +"A password to protect the rpdb2 server for debugging Totem from unauthorized "
3081 +"remote access. If this is empty, a default of 'totem' will be used."
3082 +msgstr ""
3083 +"Una contrasenya per protegir el servidor rpdb2 d'accessos remots no "
3084 +"autoritzats a la depuració del Totem. Si es deixa buida la contrasenya serà "
3085 +"«totem»."
3087 +#: ../src/plugins/pythonconsole/org.gnome.totem.plugins.pythonconsole.gschema.xml.in.in.h:2
3088 +msgid "rpdb2 password"
3089 +msgstr "contrasenya rpdb2"
3091 +#: ../src/plugins/save-file/totem-save-file.c:63
3092 +msgid "Save a Copy..."
3093 +msgstr "Alça'n una còpia..."
3095 +#: ../src/plugins/save-file/totem-save-file.c:64
3096 +msgid "Save a copy of the movie"
3097 +msgstr "Alça una còpia de la pel·lícula"
3099 +#: ../src/plugins/save-file/totem-save-file.c:129
3100 +msgid "Save a Copy"
3101 +msgstr "Alça'n una còpia"
3103 +#. translators: Movie is the default saved movie filename,
3104 +#. * without the suffix
3105 +#: ../src/plugins/save-file/totem-save-file.c:161
3106 +msgid "Movie"
3107 +msgstr "Pel·lícula"
3109 +#: ../src/plugins/save-file/totem-save-file.c:183
3110 +msgid "Movie stream"
3111 +msgstr "Flux de la pel·lícula"
3113 +#: ../src/plugins/screensaver/totem-screensaver.c:116
3114 +#: ../browser-plugin/totem-plugin-viewer.c:1961
3115 msgid "Playing a movie"
3116 msgstr "S'està reproduint una pel·lícula"
3118 @@ -2671,12 +2721,12 @@ msgid "_Name:"
3119 msgstr "_Nom:"
3121 #. Write the screenshot to the temporary file
3122 -#: ../src/plugins/screenshot/gnome-screenshot-widget.c:389
3123 -#: ../src/plugins/screenshot/totem-screenshot.c:63
3124 +#: ../src/plugins/screenshot/gnome-screenshot-widget.c:387
3125 +#: ../src/plugins/screenshot/totem-screenshot.c:64
3126 msgid "Screenshot.png"
3127 msgstr "Captura.png"
3129 -#: ../src/plugins/screenshot/totem-gallery.c:90
3130 +#: ../src/plugins/screenshot/totem-gallery.c:91
3131 msgid "Save Gallery"
3132 msgstr "Alça la galeria"
3134 @@ -2684,7 +2734,7 @@ msgstr "Alça la galeria"
3135 #. * argument is a number which is used to prevent overwriting files.
3136 #. * Just translate "Gallery", and not the ".jpg". Example:
3137 #. * "Galerie-%s-%d.jpg".
3138 -#: ../src/plugins/screenshot/totem-gallery.c:114
3139 +#: ../src/plugins/screenshot/totem-gallery.c:115
3140 #, c-format
3141 msgid "Gallery-%s-%d.jpg"
3142 msgstr "Galeria-%s-%d.jpg"
3143 @@ -2698,142 +2748,139 @@ msgstr "S'està creant la galeria..."
3144 #: ../src/plugins/screenshot/totem-gallery-progress.c:107
3145 #, c-format
3146 msgid "Saving gallery as \"%s\""
3147 -msgstr "S'està desant la galeria com a «%s»"
3148 +msgstr "S'està alçant la galeria com a «%s»"
3150 -#: ../src/plugins/screenshot/totem-screenshot.c:112
3151 +#: ../src/plugins/screenshot/totem-screenshot.c:113
3152 msgid "There was an error saving the screenshot."
3153 msgstr "S'ha produït un error en alçar la captura de pantalla."
3155 -#: ../src/plugins/screenshot/totem-screenshot.c:138
3156 +#: ../src/plugins/screenshot/totem-screenshot.c:139
3157 msgid "Save Screenshot"
3158 msgstr "Alça la captura de pantalla"
3160 #. Create the screenshot widget
3161 #. Translators: %s is the movie title and %d is an auto-incrementing number to make filename unique
3162 -#: ../src/plugins/screenshot/totem-screenshot.c:159
3163 +#: ../src/plugins/screenshot/totem-screenshot.c:160
3164 #, c-format
3165 msgid "Screenshot-%s-%d.png"
3166 msgstr "Captura-%s-%d.png"
3168 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:98
3169 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:105
3170 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:88
3171 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:95
3172 msgid "Totem could not get a screenshot of the video."
3173 msgstr ""
3174 "El Totem no ha pogut obtindre una captura de pantalla d'esta pel·lícula."
3176 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:105
3177 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:95
3178 msgid "This is not supposed to happen; please file a bug report."
3179 msgstr "Això no hauria de passar. Envieu un informe d'error."
3181 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:208
3182 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:197
3183 msgid "Take _Screenshot..."
3184 msgstr "Fes una _captura de pantalla..."
3186 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:208
3187 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:197
3188 msgid "Take a screenshot"
3189 msgstr "Fes una captura de pantalla"
3191 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:209
3192 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:198
3193 msgid "Create Screenshot _Gallery..."
3194 msgstr "Crea una _galeria de captures de pantalla..."
3196 -#: ../src/plugins/screenshot/totem-screenshot-plugin.c:209
3197 +#: ../src/plugins/screenshot/totem-screenshot-plugin.c:198
3198 msgid "Create a gallery of screenshots"
3199 msgstr "Crea una galeria de captures de pantalla"
3201 #. Update the "seconds" label so that it always has the correct singular/plural form
3202 #. Translators: label for the seconds selector in the "Skip to" dialogue
3203 -#. Fix the label width at the maximum necessary for the plural labels, to prevent it changing size when we change the spinner value
3204 -#: ../src/plugins/skipto/totem-skipto.c:158
3205 -#: ../src/plugins/skipto/totem-skipto.c:184
3206 +#: ../src/plugins/skipto/totem-skipto.c:160
3207 msgid "second"
3208 msgid_plural "seconds"
3209 msgstr[0] "segon"
3210 msgstr[1] "segons"
3212 -#: ../src/plugins/skipto/totem-skipto.c:184
3213 -msgid "seconds"
3214 -msgstr "segons"
3216 +#. Fix the label width at the maximum necessary for the plural labels, to prevent it changing size when we change the spinner value
3217 +#. Translators: you should translate this string to a number (written in digits) which corresponds to the longer character length of the
3218 +#. * translations for "second" and "seconds", as translated elsewhere in this file. For example, in English, "second" is 6 characters long and
3219 +#. * "seconds" is 7 characters long, so this string should be translated to "7". See: bgo#639398
3220 #: ../src/plugins/skipto/totem-skipto.c:190
3221 -msgid "Skip to"
3222 +msgctxt "Skip To label length"
3223 +msgid "7"
3224 +msgstr "6"
3226 +#: ../src/plugins/skipto/totem-skipto.c:197
3227 +msgid "Skip To"
3228 msgstr "Salta a"
3230 -#: ../src/plugins/skipto/totem-skipto-plugin.c:216
3231 -msgid "_Skip to..."
3232 +#: ../src/plugins/skipto/totem-skipto-plugin.c:182
3233 +msgid "_Skip To..."
3234 msgstr "Sa_lta a..."
3236 -#: ../src/plugins/skipto/totem-skipto-plugin.c:216
3237 +#: ../src/plugins/skipto/totem-skipto-plugin.c:182
3238 msgid "Skip to a specific time"
3239 msgstr "Salta a un moment en concret"
3241 -#: ../src/plugins/skipto/totem-skipto-plugin.c:222
3242 -msgid "Could not load the \"Skip to\" dialog interface."
3243 -msgstr "No s'ha pogut carregar la interfície de diàleg de «Salta a»."
3245 #: ../src/plugins/skipto/skipto.ui.h:1
3246 msgid "_Skip to:"
3247 msgstr "_Salta a:"
3249 -#. Display an error
3250 -#: ../src/plugins/tracker/totem-tracker-widget.c:173
3251 -#, c-format
3252 -msgid "Could not get name and thumbnail for %s: %s"
3253 -msgstr "No s'han pogut obtindre el nom i la miniatura per a %s: %s"
3255 -#: ../src/plugins/tracker/totem-tracker-widget.c:174
3256 -msgid "File Error"
3257 -msgstr "Error en el fitxer"
3259 -#: ../src/plugins/tracker/totem-tracker-widget.c:251
3260 -#: ../src/plugins/tracker/totem-tracker-widget.c:368
3261 +#: ../src/plugins/tracker/totem-tracker-widget.c:587
3262 +#: ../src/plugins/tracker/totem-tracker-widget.c:676
3263 msgid "Could not connect to Tracker"
3264 msgstr "No s'ha pogut connectar amb el Tracker"
3266 -#: ../src/plugins/tracker/totem-tracker-widget.c:258
3267 +#: ../src/plugins/tracker/totem-tracker-widget.c:594
3268 msgid "No results"
3269 msgstr "Cap resultat"
3271 #. Translators:
3272 -#. * This is used to show which items are listed in the list view, for example:
3273 -#. * Showing 10-20 of 128 matches
3274 -#. * This is similar to what web searches use, eg. Google on the top-right of their search results page show:
3275 -#. * Personalized Results 1 - 10 of about 4,130,000 for foobar
3276 -#: ../src/plugins/tracker/totem-tracker-widget.c:283
3277 +#. * This is used to show which items are listed in the
3278 +#. * list view, for example:
3279 +#. *
3280 +#. * Showing 10-20 of 128 matches
3281 +#. *
3282 +#. * This is similar to what web searches use, eg.
3283 +#. * Google on the top-right of their search results
3284 +#. * page show:
3285 +#. *
3286 +#. * Personalized Results 1 - 10 of about 4,130,000 for foobar
3287 +#. *
3289 +#: ../src/plugins/tracker/totem-tracker-widget.c:618
3290 #, c-format
3291 msgid "Showing %i - %i of %i match"
3292 msgid_plural "Showing %i - %i of %i matches"
3293 msgstr[0] "Es mostra %i - %i de %i coincidència"
3294 msgstr[1] "Es mostren %i - %i de %i coincidències"
3296 -#: ../src/plugins/tracker/totem-tracker-widget.c:581
3297 +#: ../src/plugins/tracker/totem-tracker-widget.c:823
3298 msgid "Page"
3299 msgstr "Pàgina"
3301 -#: ../src/plugins/tracker/totem-tracker.c:91
3302 -#: ../src/plugins/tracker/tracker.totem-plugin.in.h:1
3303 +#: ../src/plugins/tracker/totem-tracker.c:65
3304 +#: ../src/plugins/tracker/tracker.plugin.in.h:1
3305 msgid "Local Search"
3306 msgstr "Cerca local"
3308 -#: ../src/plugins/thumbnail/thumbnail.totem-plugin.in.h:1
3309 +#: ../src/plugins/thumbnail/thumbnail.plugin.in.h:1
3310 msgid "Set the window icon to the thumbnail of the playing movie"
3311 msgstr ""
3312 "Fes que la icona de la finestra siga la miniatura de la pel·lícula que "
3313 "s'estiga reproduint"
3315 -#: ../src/plugins/thumbnail/thumbnail.totem-plugin.in.h:2
3316 +#: ../src/plugins/thumbnail/thumbnail.plugin.in.h:2
3317 msgid "Thumbnail"
3318 msgstr "Miniatura"
3320 -#: ../src/plugins/tracker/tracker.totem-plugin.in.h:2
3321 +#: ../src/plugins/tracker/tracker.plugin.in.h:2
3322 msgid "Search for local videos using Tracker"
3323 msgstr "Cerca vídeos a l'ordinador amb el Tracker"
3325 -#: ../src/plugins/youtube/youtube.totem-plugin.in.h:1
3326 +#: ../src/plugins/youtube/youtube.plugin.in.h:1
3327 msgid "A plugin to let you browse YouTube videos."
3328 msgstr "Un connector que vos permet navegar per vídeos del YouTube."
3330 -#: ../src/plugins/youtube/youtube.totem-plugin.in.h:2
3331 +#: ../src/plugins/youtube/youtube.plugin.in.h:2
3332 msgid "YouTube Browser"
3333 msgstr "Navegador del YouTube"
3335 @@ -2845,36 +2892,33 @@ msgstr "Vídeos relacionats"
3336 msgid "Videos"
3337 msgstr "Vídeos"
3339 -#: ../src/plugins/youtube/totem-youtube.c:316
3340 +#: ../src/plugins/youtube/totem-youtube.c:144
3341 +#: ../src/plugins/youtube/totem-youtube.c:803
3342 msgid "_Open in Web Browser"
3343 msgstr "_Obri en el navegador web"
3345 -#: ../src/plugins/youtube/totem-youtube.c:316
3346 +#: ../src/plugins/youtube/totem-youtube.c:144
3347 msgid "Open the video in your web browser"
3348 msgstr "Obri el vídeo en el navegador web"
3350 #. Add the sidebar page
3351 -#: ../src/plugins/youtube/totem-youtube.c:366
3352 +#: ../src/plugins/youtube/totem-youtube.c:195
3353 msgid "YouTube"
3354 msgstr "YouTube"
3356 -#: ../src/plugins/youtube/totem-youtube.c:452
3357 +#: ../src/plugins/youtube/totem-youtube.c:279
3358 msgid "Cancelling query…"
3359 msgstr "S'està cancel·lant la consulta…"
3361 -#: ../src/plugins/youtube/totem-youtube.c:513
3362 -msgid "Error Looking Up Video URI"
3363 -msgstr "S'ha produït un error en consultar l'URI del vídeo"
3365 #. Hide the ugly technical message libgdata gives behind a nice one telling them it's out of date (which it likely is
3366 #. * if we're receiving a protocol error).
3367 #. Spew out the error message as provided
3368 -#: ../src/plugins/youtube/totem-youtube.c:797
3369 -#: ../src/plugins/youtube/totem-youtube.c:802
3370 +#: ../src/plugins/youtube/totem-youtube.c:424
3371 +#: ../src/plugins/youtube/totem-youtube.c:429
3372 msgid "Error Searching for Videos"
3373 msgstr "S'ha produït un error en cercar vídeos"
3375 -#: ../src/plugins/youtube/totem-youtube.c:798
3376 +#: ../src/plugins/youtube/totem-youtube.c:425
3377 msgid ""
3378 "The response from the server could not be understood. Please check you are "
3379 "running the latest version of libgdata."
3380 @@ -2883,23 +2927,35 @@ msgstr ""
3381 "l'última versió de la libgdata."
3383 #. Update the UI
3384 -#: ../src/plugins/youtube/totem-youtube.c:972
3385 +#: ../src/plugins/youtube/totem-youtube.c:618
3386 msgid "Fetching search results…"
3387 msgstr "S'estan obtenint els resultats de la cerca…"
3389 #. Update the UI
3390 -#: ../src/plugins/youtube/totem-youtube.c:1037
3391 +#: ../src/plugins/youtube/totem-youtube.c:680
3392 msgid "Fetching related videos…"
3393 msgstr "S'estan obtenint els vídeos relacionats…"
3395 -#: ../src/plugins/youtube/totem-youtube.c:1088
3396 +#: ../src/plugins/youtube/totem-youtube.c:732
3397 msgid "Error Opening Video in Web Browser"
3398 msgstr "S'ha produït un error en obrir el vídeo en el navegador web"
3400 -#: ../src/plugins/youtube/totem-youtube.c:1108
3401 +#: ../src/plugins/youtube/totem-youtube.c:752
3402 msgid "Fetching more videos…"
3403 msgstr "S'estan obtenint més vídeos…"
3405 +#: ../src/plugins/youtube/totem-youtube.c:797
3406 +msgid "Video Format Not Supported"
3407 +msgstr "No hi ha cap còdec per este format de vídeo"
3409 +#: ../src/plugins/youtube/totem-youtube.c:799
3410 +msgid ""
3411 +"This video is not available in any formats which Totem supports. Would you "
3412 +"like to open it in your web browser instead?"
3413 +msgstr ""
3414 +"El vídeo no està disponible en cap dels formats que accepta el Totem. Voleu "
3415 +"obrir-lo en el navegador web?"
3417 #: ../browser-plugin/totem-plugin-viewer.c:431
3418 msgid "No URI to play"
3419 msgstr "No hi ha cap URI per reproduir"
3420 @@ -2907,79 +2963,234 @@ msgstr "No hi ha cap URI per reproduir"
3421 #. translators: this is:
3422 #. * Open With ApplicationName
3423 #. * as in nautilus' right-click menu
3424 -#: ../browser-plugin/totem-plugin-viewer.c:1104
3425 +#: ../browser-plugin/totem-plugin-viewer.c:1101
3426 #, c-format
3427 msgid "_Open with \"%s\""
3428 msgstr "_Obri amb el «%s»"
3430 -#: ../browser-plugin/totem-plugin-viewer.c:1155
3431 +#: ../browser-plugin/totem-plugin-viewer.c:1152
3432 #, c-format
3433 msgid "Browser Plugin using %s"
3434 msgstr "Connector de navegació que utilitza %s"
3436 -#: ../browser-plugin/totem-plugin-viewer.c:1160
3437 +#: ../browser-plugin/totem-plugin-viewer.c:1157
3438 msgid "Totem Browser Plugin"
3439 msgstr "Navegador de connectors del Totem"
3441 -#: ../browser-plugin/totem-plugin-viewer.c:2179
3442 +#: ../browser-plugin/totem-plugin-viewer.c:2195
3443 msgid "No playlist or playlist empty"
3444 msgstr "No hi ha cap llista de reproducció o bé és buida"
3446 -#: ../browser-plugin/totem-plugin-viewer.c:2270
3447 +#: ../browser-plugin/totem-plugin-viewer.c:2286
3448 msgid "Movie browser plugin"
3449 msgstr "Connector per veure pel·lícules al navegador"
3451 -#: ../browser-plugin/totem-plugin-viewer.c:2286
3452 +#: ../browser-plugin/totem-plugin-viewer.c:2302
3453 msgid "Verify your system installation. The Totem plugin will now exit."
3454 msgstr ""
3455 "Verifiqueu la instal·lació del sistema. El connector del Totem eixirà ara."
3457 -#: ../src/plugins/pythonconsole/pythonconsole.totem-plugin.in.h:1
3458 +#: ../src/plugins/pythonconsole/pythonconsole.plugin.in.h:1
3459 msgid "Interactive Python console."
3460 msgstr "Consola interactiva del Python."
3462 -#: ../src/plugins/pythonconsole/pythonconsole.totem-plugin.in.h:2
3463 +#: ../src/plugins/pythonconsole/pythonconsole.plugin.in.h:2
3464 msgid "Python Console"
3465 msgstr "Consola del Python"
3467 -#: ../src/plugins/pythonconsole/pythonconsole.py:74
3468 +#: ../src/plugins/pythonconsole/pythonconsole.py:86
3469 msgid "Python Console Menu"
3470 msgstr "Menú de la consola del Python"
3472 -#: ../src/plugins/pythonconsole/pythonconsole.py:77
3473 +#: ../src/plugins/pythonconsole/pythonconsole.py:89
3474 msgid "_Python Console"
3475 msgstr "Consola del _Python"
3477 -#: ../src/plugins/pythonconsole/pythonconsole.py:78
3478 +#: ../src/plugins/pythonconsole/pythonconsole.py:90
3479 msgid "Show Totem's Python console"
3480 msgstr "Mostra la consola del Python del Totem"
3482 -#: ../src/plugins/pythonconsole/pythonconsole.py:83
3483 +#: ../src/plugins/pythonconsole/pythonconsole.py:95
3484 msgid "Python Debugger"
3485 msgstr "Depurador del Python"
3487 -#: ../src/plugins/pythonconsole/pythonconsole.py:84
3488 +#: ../src/plugins/pythonconsole/pythonconsole.py:96
3489 msgid "Enable remote Python debugging with rpdb2"
3490 msgstr "Habilita la depuració remota del Python amb el rpdb2"
3492 -#: ../src/plugins/pythonconsole/pythonconsole.py:106
3493 +#: ../src/plugins/pythonconsole/pythonconsole.py:117
3494 #, python-format
3495 -msgid "You can access the totem object through 'totem_object' :\\n%s"
3496 -msgstr "Podeu accedir a l'objecte Totem a través de «totem_object»: \\n%s"
3497 +msgid "You can access the Totem.Object through 'totem_object' :\\n%s"
3498 +msgstr "Podeu accedir a Totem.Object a través de «totem_object»: \\n%s"
3500 -#: ../src/plugins/pythonconsole/pythonconsole.py:111
3501 +#: ../src/plugins/pythonconsole/pythonconsole.py:121
3502 msgid "Totem Python Console"
3503 msgstr "Consola del Python del Totem"
3505 -#: ../src/plugins/pythonconsole/pythonconsole.py:120
3506 +#: ../src/plugins/pythonconsole/pythonconsole.py:130
3507 msgid ""
3508 "After you press OK, Totem will wait until you connect to it with winpdb or "
3509 -"rpdb2. If you have not set a debugger password in GConf, it will use the "
3510 +"rpdb2. If you have not set a debugger password in DConf, it will use the "
3511 "default password ('totem')."
3512 msgstr ""
3513 "Després de prémer D'acord, el Totem s'esperarà fins que vos hi connecteu amb "
3514 "el winpdb o el rpdb2. Si no heu establit una contrasenya de depuració en el "
3515 -"GConf, utilitzarà la contrasenya predeterminada («totem»)."
3516 +"DConf, s'utilitzarà la contrasenya predeterminada («totem»)."
3518 +#~ msgid "Author:"
3519 +#~ msgstr "Autor:"
3521 +#~ msgid "C_onfigure..."
3522 +#~ msgstr "C_onfigura..."
3524 +#~ msgid "Copyright:"
3525 +#~ msgstr "Copyright:"
3527 +#~ msgid "Description:"
3528 +#~ msgstr "Descripció:"
3530 +#~ msgid "Site:"
3531 +#~ msgstr "Lloc:"
3533 +#~ msgid ""
3534 +#~ "Approximate network connection speed, used to select quality on media "
3535 +#~ "over the network: \"0\" for 14.4 Kbps Modem, \"1\" for 19.2 Kbps Modem, "
3536 +#~ "\"2\" for 28.8 Kbps Modem, \"3\" for 33.6 Kbps Modem, \"4\" for 34.4 Kbps "
3537 +#~ "Modem, \"5\" for 56 Kbps Modem/ISDN, \"6\" for 112 Kbps Dual ISDN/DSL, "
3538 +#~ "\"7\" for 256 Kbps DSL/Cable, \"8\" for 384 Kbps DSL/Cable, \"9\" for 512 "
3539 +#~ "Kbps DSL/Cable, \"10\" for 1.5 Mbps T1/Intranet/LAN, \"11\" for Intranet/"
3540 +#~ "LAN."
3541 +#~ msgstr ""
3542 +#~ "Velocitat de connexió a la xarxa aproximada, s'utilitza per seleccionar "
3543 +#~ "la qualitat dels recursos obtinguts a través de la xarxa: «0» mòdem de "
3544 +#~ "14.4 Kbps, «1» mòdem de 19.2 Kbps, «2» mòdem de 28.8 Kbps, «3» mòdem de "
3545 +#~ "33.6 Kbps, «4» mòdem de 34.4 Kbps, «5» mòdem/XDSI de 56 Kbps, «6» XDSI "
3546 +#~ "dual/ADSL de 112 Kbps, «7» ADSL/Cable de 256 Kbps, «8» ADSL/cable de 384 "
3547 +#~ "Kbps, «9» ADSL/cable de 512 Kbps, «10»T1/intranet/LAN de 1.5 Mbps i «11» "
3548 +#~ "intranet/LAN."
3550 +#~ msgid ""
3551 +#~ "Quality settings for the audio visualization: \"0\" for small, \"1\" for "
3552 +#~ "normal, \"2\" for large, \"3\" for extra large."
3553 +#~ msgstr ""
3554 +#~ "Paràmetres de la qualitat per a la visualització de l'àudio: «0» per a "
3555 +#~ "petita, «1» per a normal, «2» per a gran i «3» per a extra gran."
3557 +#~ msgid ""
3558 +#~ "Type of audio output to use: \"0\" for stereo, \"1\" for 4-channel "
3559 +#~ "output, \"2\" for 5.0 channel output, \"3\" for 5.1 channel output, \"4\" "
3560 +#~ "for AC3 Passthrough."
3561 +#~ msgstr ""
3562 +#~ "Tipus de sortida d'àudio a utilitzar: «0» per a estèreo, «1» per a "
3563 +#~ "sortida a 4 canals, «2» per a sortida amb canals 5.0, «3» per a sortida "
3564 +#~ "amb canals 5.1, «4» per a AC3 directe a la targeta de so."
3566 +#~ msgid "UTF-8"
3567 +#~ msgstr "UTF-8"
3569 +#~ msgid "Whether to autoload external chapter files when a movie is loaded."
3570 +#~ msgstr ""
3571 +#~ "Si s'han de carregar automàticament els fitxers de capítols externs quan "
3572 +#~ "es carrega una pel·lícula."
3574 +#~ msgid "Don't connect to an already-running instance"
3575 +#~ msgstr "No et connectis a una instància que ja estigui funcionant"
3577 +#~ msgid "Enable visual effects?"
3578 +#~ msgstr "Voleu habilitar els efectes visuals?"
3580 +#~ msgid ""
3581 +#~ "It seems you are running Totem remotely.\n"
3582 +#~ "Are you sure you want to enable the visual effects?"
3583 +#~ msgstr ""
3584 +#~ "Sembla que esteu executant el Totem remotament.\n"
3585 +#~ "Esteu segur que voleu habilitar els efectes visuals?"
3587 +#~ msgid ""
3588 +#~ "Changing the visuals effect type will require a restart to take effect."
3589 +#~ msgstr ""
3590 +#~ "Si canvieu els tipus d'efectes visuals, haureu de reiniciar perquè els "
3591 +#~ "canvis siguin efectius."
3593 +#~ msgid ""
3594 +#~ "The change of audio output type will only take effect when Totem is "
3595 +#~ "restarted."
3596 +#~ msgstr ""
3597 +#~ "El canvi del tipus de sortida d'àudio serà efectiu quan es reiniciï el "
3598 +#~ "Totem."
3600 +#~ msgid "Could not open link"
3601 +#~ msgstr "No s'ha pogut obrir l'enllaç"
3603 +#~ msgid "Totem could not initialize the configuration engine."
3604 +#~ msgstr "El Totem no ha pogut inicialitzar el motor de configuració."
3606 +#~ msgid "Make sure that GNOME is properly installed."
3607 +#~ msgstr "Assegureu-vos que el GNOME està instal·lat correctament."
3609 +#~ msgid "Plugin"
3610 +#~ msgstr "Connector"
3612 +#~ msgid "Enabled"
3613 +#~ msgstr "Habilitat"
3615 +#~ msgid ""
3616 +#~ "Unable to activate plugin %s.\n"
3617 +#~ "%s"
3618 +#~ msgstr ""
3619 +#~ "No s'ha pogut activar el connector %s.\n"
3620 +#~ "%s"
3622 +#~ msgid "Unable to activate plugin %s"
3623 +#~ msgstr "No s'ha pogut activar el connector %s"
3625 +#~ msgid "Plugin Error"
3626 +#~ msgstr "Error del connector"
3628 +#~ msgid "Chapters support"
3629 +#~ msgstr "Permet l'ús de capítols"
3631 +#~ msgid "Continue to watch movie without loaded chapters"
3632 +#~ msgstr "Continua reproduint la pel·lícula sense carregar els capítols"
3634 +#~ msgid "_Go to"
3635 +#~ msgstr "Vé_s"
3637 +#~ msgid "Please check you rights and free space"
3638 +#~ msgstr "Comproveu que teniu permisos i teniu espai lliure"
3640 +#~ msgid "Could not connect to the Galago daemon."
3641 +#~ msgstr "No s'ha pogut connectar amb el dimoni del Galago."
3643 +#~ msgid "Jamendo Plugin Configuration"
3644 +#~ msgstr "Configuració del connector Jamendo"
3646 +#~ msgid "Recordings"
3647 +#~ msgstr "Enregistraments"
3649 +#~ msgid "MythTV Recordings"
3650 +#~ msgstr "Enregistraments del MythTV"
3652 +#~ msgid "MythTV LiveTV"
3653 +#~ msgstr "LiveTV del MythTV"
3655 +#~ msgid "_Download Movie Subtitles..."
3656 +#~ msgstr "_Baixa subtítols de pel·lícules..."
3658 +#~ msgid "seconds"
3659 +#~ msgstr "segons"
3661 +#~ msgid "Could not load the \"Skip to\" dialog interface."
3662 +#~ msgstr "No s'ha pogut carregar la interfície de diàleg de «Salta a»."
3664 +#~ msgid "Could not get name and thumbnail for %s: %s"
3665 +#~ msgstr "No s'han pogut obtenir el nom i la miniatura per a %s: %s"
3667 +#~ msgid "File Error"
3668 +#~ msgstr "Error en el fitxer"
3670 +#~ msgid "Error Looking Up Video URI"
3671 +#~ msgstr "S'ha produït un error en consultar l'URI del vídeo"
3673 #~ msgid "Deinterlace"
3674 #~ msgstr "Desentrellaça"
3675 @@ -3578,9 +3789,6 @@ msgstr ""
3676 #~ "No s'ha pogut carregar la interfície principal (vanity.glade).\n"
3677 #~ "Assegureu-vos que el Vanity està instal·lat correctament."
3679 -#~ msgid "Save..."
3680 -#~ msgstr "Desa..."
3682 #~ msgid "Backend options"
3683 #~ msgstr "Opcions del rerefons"
3685 @@ -3848,9 +4056,6 @@ msgstr ""
3686 #~ msgid "Unnamed Video Device"
3687 #~ msgstr "Dispositiu de vídeo no anomenat"
3689 -#~ msgid "No reason given."
3690 -#~ msgstr "No s'ha donat cap raó."
3692 #~ msgid "Connecting to the server"
3693 #~ msgstr "S'està connectant al servidor"
3695 @@ -3934,9 +4139,6 @@ msgstr ""
3696 #~ msgid "Only start if there isn't already a Totem application running"
3697 #~ msgstr "Només s'inicia si no hi ha una aplicació del Totem executant-se"
3699 -#~ msgid "Next stream"
3700 -#~ msgstr "Següent flux"
3702 #~ msgid "Previous stream"
3703 #~ msgstr "Anterior flux"
3705 diff --git a/po/es.po b/po/es.po
3706 index d2e3a89..9164c99 100644
3707 --- a/po/es.po
3708 +++ b/po/es.po
3709 @@ -14,8 +14,8 @@ msgid ""
3710 msgstr ""
3711 "Project-Id-Version: totem.master\n"
3712 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
3713 -"product=totem&component=general\n"
3714 -"POT-Creation-Date: 2011-01-13 18:04+0000\n"
3715 +"product=totem&keywords=I18N+L10N&component=general\n"
3716 +"POT-Creation-Date: 2011-05-16 16:25+0000\n"
3717 "PO-Revision-Date: 2011-01-14 10:49+0100\n"
3718 "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
3719 "Language-Team: Español <gnome-es-list@gnome.org>\n"
3720 @@ -80,13 +80,13 @@ msgstr "_Seleccionar subtítulos de texto…"
3722 #. Channels
3723 #: ../data/properties.ui.h:1
3724 -#: ../src/plugins/properties/bacon-video-widget-properties.c:175
3725 +#: ../src/properties/bacon-video-widget-properties.c:175
3726 msgid "0 Channels"
3727 msgstr "0 canales"
3729 #. Sample rate
3730 #: ../data/properties.ui.h:2
3731 -#: ../src/plugins/properties/bacon-video-widget-properties.c:173
3732 +#: ../src/properties/bacon-video-widget-properties.c:173
3733 msgid "0 Hz"
3734 msgstr "0 Hz"
3736 @@ -122,7 +122,7 @@ msgstr "Sonido"
3738 #. Audio Codec
3739 #: ../data/properties.ui.h:10
3740 -#: ../src/plugins/properties/bacon-video-widget-properties.c:171
3741 +#: ../src/properties/bacon-video-widget-properties.c:171
3742 msgctxt "Audio codec"
3743 msgid "N/A"
3744 msgstr "N/D"
3745 @@ -172,10 +172,10 @@ msgstr "Título:"
3746 #. Album
3747 #. Year
3748 #: ../data/properties.ui.h:21
3749 -#: ../src/plugins/properties/bacon-video-widget-properties.c:145
3750 -#: ../src/plugins/properties/bacon-video-widget-properties.c:147
3751 -#: ../src/plugins/properties/bacon-video-widget-properties.c:149
3752 -#: ../src/plugins/properties/bacon-video-widget-properties.c:151
3753 +#: ../src/properties/bacon-video-widget-properties.c:145
3754 +#: ../src/properties/bacon-video-widget-properties.c:147
3755 +#: ../src/properties/bacon-video-widget-properties.c:149
3756 +#: ../src/properties/bacon-video-widget-properties.c:151
3757 msgid "Unknown"
3758 msgstr "Desconocido"
3760 @@ -186,7 +186,7 @@ msgstr "Vídeo"
3762 #. Video Codec
3763 #: ../data/properties.ui.h:23
3764 -#: ../src/plugins/properties/bacon-video-widget-properties.c:160
3765 +#: ../src/properties/bacon-video-widget-properties.c:160
3766 msgctxt "Video codec"
3767 msgid "N/A"
3768 msgstr "N/D"
3769 @@ -567,7 +567,7 @@ msgstr "Cuadrada"
3770 msgid "Start playing files from last position"
3771 msgstr "Reproducir archivos desde la última posición"
3773 -#: ../data/totem.ui.h:96 ../src/backend/bacon-video-widget-gst-0.10.c:6003
3774 +#: ../data/totem.ui.h:96 ../src/backend/bacon-video-widget-gst-0.10.c:6012
3775 msgid "Stereo"
3776 msgstr "Estéreo"
3778 @@ -994,33 +994,33 @@ msgstr ""
3779 msgid "Not a launchable item"
3780 msgstr "No es un elemento lanzable"
3782 -#: ../src/eggfileformatchooser.c:235
3783 +#: ../src/eggfileformatchooser.c:240
3784 #, c-format
3785 msgid "File _Format: %s"
3786 msgstr "_Formato de archivo: %s"
3788 -#: ../src/eggfileformatchooser.c:374
3789 +#: ../src/eggfileformatchooser.c:379
3790 msgid "All Files"
3791 msgstr "Todos los archivos"
3793 -#: ../src/eggfileformatchooser.c:375
3794 +#: ../src/eggfileformatchooser.c:380
3795 msgid "All Supported Files"
3796 msgstr "Todos los archivos soportados"
3798 -#: ../src/eggfileformatchooser.c:384
3799 +#: ../src/eggfileformatchooser.c:389
3800 msgid "By Extension"
3801 msgstr "Por extensión"
3803 -#: ../src/eggfileformatchooser.c:399
3804 +#: ../src/eggfileformatchooser.c:404
3805 msgid "File Format"
3806 msgstr "Formato de archivo"
3808 -#: ../src/eggfileformatchooser.c:417
3809 +#: ../src/eggfileformatchooser.c:422
3810 msgid "Extension(s)"
3811 msgstr "Extensiones"
3813 #. Translators: the parameter is a filename
3814 -#: ../src/eggfileformatchooser.c:652
3815 +#: ../src/eggfileformatchooser.c:657
3816 #, c-format
3817 msgid ""
3818 "The program was not able to find out the file format you want to use for `%"
3819 @@ -1031,7 +1031,7 @@ msgstr ""
3820 "s». Asegúrese de que usa una extensión conocida para ese archivo o elija "
3821 "manualmente un formato de archivo de la lista inferior."
3823 -#: ../src/eggfileformatchooser.c:659
3824 +#: ../src/eggfileformatchooser.c:664
3825 msgid "File format not recognized"
3826 msgstr "Formato de archivo no reconocido"
3828 @@ -1063,6 +1063,58 @@ msgstr "Opciones de gestión de la sesión:"
3829 msgid "Show session management options"
3830 msgstr "Mostrar las opciones de gestión de la sesión"
3832 +#. Dimensions
3833 +#: ../src/properties/bacon-video-widget-properties.c:158
3834 +msgctxt "Dimensions"
3835 +msgid "N/A"
3836 +msgstr "N/D"
3838 +#: ../src/properties/bacon-video-widget-properties.c:163
3839 +#: ../src/properties/bacon-video-widget-properties.c:240
3840 +msgctxt "Video bit rate"
3841 +msgid "N/A"
3842 +msgstr "N/D"
3844 +#: ../src/properties/bacon-video-widget-properties.c:166
3845 +#: ../src/properties/bacon-video-widget-properties.c:250
3846 +msgctxt "Frame rate"
3847 +msgid "N/A"
3848 +msgstr "N/D"
3850 +#: ../src/properties/bacon-video-widget-properties.c:169
3851 +#: ../src/properties/bacon-video-widget-properties.c:273
3852 +msgctxt "Audio bit rate"
3853 +msgid "N/A"
3854 +msgstr "N/D"
3856 +#: ../src/properties/bacon-video-widget-properties.c:237
3857 +#, c-format
3858 +msgid "%d x %d"
3859 +msgstr "%d x %d"
3861 +#: ../src/properties/bacon-video-widget-properties.c:240
3862 +#: ../src/properties/bacon-video-widget-properties.c:273
3863 +#, c-format
3864 +msgid "%d kbps"
3865 +msgstr "%d Kbps"
3867 +#: ../src/properties/bacon-video-widget-properties.c:247
3868 +#, c-format
3869 +msgid "%d frame per second"
3870 +msgid_plural "%d frames per second"
3871 +msgstr[0] "%d fotograma por segundo"
3872 +msgstr[1] "%d fotogramas por segundo"
3874 +#: ../src/properties/bacon-video-widget-properties.c:276
3875 +#, c-format
3876 +msgid "%d Hz"
3877 +msgstr "%d Hz"
3879 +#: ../src/properties/bacon-video-widget-properties.c:276
3880 +msgctxt "Sample rate"
3881 +msgid "N/A"
3882 +msgstr "N/D"
3884 #: ../src/totem-audio-preview.c:82
3885 msgid "Audio Preview"
3886 msgstr "Vista previa del sonido"
3887 @@ -1079,7 +1131,7 @@ msgstr "_Reproducir ahora"
3888 msgid "Cancel"
3889 msgstr "Cancelar"
3891 -#: ../src/totem-fullscreen.c:617
3892 +#: ../src/totem-fullscreen.c:619
3893 msgid "No File"
3894 msgstr "Ningún archivo"
3896 @@ -1153,33 +1205,33 @@ msgstr "Automático"
3897 #. Translators:
3898 #. * This is not a JPEG image, but a disc image, for example,
3899 #. * an ISO file
3900 -#: ../src/totem-menu.c:739
3901 +#: ../src/totem-menu.c:767
3902 #, c-format
3903 msgid "Play Image '%s'"
3904 msgstr "Reproducir imagen «%s»"
3906 -#: ../src/totem-menu.c:742 ../src/totem-menu.c:824
3907 +#: ../src/totem-menu.c:770 ../src/totem-menu.c:853
3908 #, c-format
3909 msgid "device%d"
3910 msgstr "dispositivo%d"
3912 -#: ../src/totem-menu.c:821
3913 +#: ../src/totem-menu.c:850
3914 #, c-format
3915 msgid "Play Disc '%s'"
3916 msgstr "Reproducir disco «%s»"
3918 #. This lists the back-end type and version, such as
3919 #. * Movie Player using GStreamer 0.10.1
3920 -#: ../src/totem-menu.c:1172
3921 +#: ../src/totem-menu.c:1201
3922 #, c-format
3923 msgid "Movie Player using %s"
3924 msgstr "Reproductor de películas que usa %s"
3926 -#: ../src/totem-menu.c:1176
3927 +#: ../src/totem-menu.c:1205
3928 msgid "Copyright © 2002-2009 Bastien Nocera"
3929 msgstr "Copyright © 2002-2009 Bastien Nocera"
3931 -#: ../src/totem-menu.c:1181 ../browser-plugin/totem-plugin-viewer.c:1166
3932 +#: ../src/totem-menu.c:1210 ../browser-plugin/totem-plugin-viewer.c:1163
3933 msgid "translator-credits"
3934 msgstr ""
3935 "Jorge González <jorgegonz@svn.gnome.org>\n"
3936 @@ -1190,11 +1242,11 @@ msgstr ""
3937 "Germán Poo Caamaño <gpoo@ubiobio.cl>\n"
3938 "Daniel Mustieles <daniel.mustieles@gmail.com>"
3940 -#: ../src/totem-menu.c:1185
3941 +#: ../src/totem-menu.c:1214
3942 msgid "Totem Website"
3943 msgstr "Página web de Totem"
3945 -#: ../src/totem-menu.c:1220
3946 +#: ../src/totem-menu.c:1248
3947 msgid "Configure Plugins"
3948 msgstr "Configurar complementos"
3950 @@ -1230,7 +1282,7 @@ msgid "Stopped"
3951 msgstr "Detenido"
3953 #: ../src/totem-object.c:1141 ../src/totem-object.c:1168
3954 -#: ../src/totem-object.c:1796 ../src/totem-object.c:1959
3955 +#: ../src/totem-object.c:1798 ../src/totem-object.c:1962
3956 #, c-format
3957 msgid "Totem could not play '%s'."
3958 msgstr "Totem no pudo reproducir «%s»."
3959 @@ -1296,7 +1348,7 @@ msgstr "Introduzca otro disco para reproducir."
3960 msgid "Totem was not able to play this disc."
3961 msgstr "No no fue capaz de reproducir este disco."
3963 -#: ../src/totem-object.c:1300 ../src/totem-object.c:4273
3964 +#: ../src/totem-object.c:1300 ../src/totem-object.c:4280
3965 msgid "No reason."
3966 msgstr "No hay razón."
3968 @@ -1310,42 +1362,42 @@ msgstr ""
3969 "Considere usar un reproductor de música o un extractor de CD para reproducir "
3970 "este CD"
3972 -#: ../src/totem-object.c:1802
3973 +#: ../src/totem-object.c:1804
3974 msgid "No error message"
3975 msgstr "Sin mensaje de error"
3977 -#: ../src/totem-object.c:2194
3978 +#: ../src/totem-object.c:2197
3979 msgid "Totem could not display the help contents."
3980 msgstr "Totem no pudo mostrar el contenido de la ayuda."
3982 -#: ../src/totem-object.c:2532 ../src/totem-object.c:2534
3983 -#: ../browser-plugin/totem-plugin-viewer.c:1469
3984 +#: ../src/totem-object.c:2535 ../src/totem-object.c:2537
3985 +#: ../browser-plugin/totem-plugin-viewer.c:1466
3986 msgid "An error occurred"
3987 msgstr "Ha ocurrido un error"
3989 -#: ../src/totem-object.c:4107 ../src/totem-object.c:4109
3990 +#: ../src/totem-object.c:4114 ../src/totem-object.c:4116
3991 msgid "Previous Chapter/Movie"
3992 msgstr "Capítulo / película anterior"
3994 -#: ../src/totem-object.c:4116 ../src/totem-object.c:4118
3995 +#: ../src/totem-object.c:4123 ../src/totem-object.c:4125
3996 msgid "Play / Pause"
3997 msgstr "Reproducir / Pausar"
3999 -#: ../src/totem-object.c:4126 ../src/totem-object.c:4128
4000 +#: ../src/totem-object.c:4133 ../src/totem-object.c:4135
4001 msgid "Next Chapter/Movie"
4002 msgstr "Capítulo / película siguiente"
4004 #. Translators: this is the tooltip text for the fullscreen button in the controls box in Totem's main window.
4005 #. Translators: this is the accessibility text for the fullscreen button in the controls box in Totem's main window.
4006 -#: ../src/totem-object.c:4140 ../src/totem-object.c:4142
4007 +#: ../src/totem-object.c:4147 ../src/totem-object.c:4149
4008 msgid "Fullscreen"
4009 msgstr "Pantalla completa"
4011 -#: ../src/totem-object.c:4273
4012 +#: ../src/totem-object.c:4280
4013 msgid "Totem could not startup."
4014 msgstr "No se ha podido iniciar Totem."
4016 -#: ../src/totem-open-location.c:179
4017 +#: ../src/totem-open-location.c:182
4018 msgid "Open Location..."
4019 msgstr "Abrir dirección…"
4021 @@ -1426,69 +1478,57 @@ msgid "Can't enqueue and replace at the same time"
4022 msgstr "No se puede encolar y reemplazar al mismo tiempo"
4024 #. By extension entry
4025 -#: ../src/totem-playlist.c:157
4026 +#: ../src/totem-playlist.c:161
4027 msgid "MP3 ShoutCast playlist"
4028 msgstr "Lista de reproducción MP3 ShoutCast"
4030 -#: ../src/totem-playlist.c:158
4031 +#: ../src/totem-playlist.c:162
4032 msgid "MP3 audio (streamed)"
4033 msgstr "Sonido MP3 (en flujo)"
4035 -#: ../src/totem-playlist.c:159
4036 +#: ../src/totem-playlist.c:163
4037 msgid "MP3 audio (streamed, DOS format)"
4038 msgstr "Sonido MP3 (en flujo, formato DOS)"
4040 -#: ../src/totem-playlist.c:160
4041 +#: ../src/totem-playlist.c:164
4042 msgid "XML Shareable Playlist"
4043 msgstr "Lista de reproducción XML compartible"
4045 #. This is "Title 3", where title is a DVD title
4046 #. * Note: NOT a DVD chapter
4047 -#: ../src/totem-playlist.c:359
4048 +#: ../src/totem-playlist.c:363
4049 #, c-format
4050 msgid "Title %d"
4051 msgstr "Título %d"
4053 -#: ../src/totem-playlist.c:458
4054 +#: ../src/totem-playlist.c:462
4055 msgid "Could not save the playlist"
4056 msgstr "No se pudo guardar la lista de reproducción"
4058 -#: ../src/totem-playlist.c:1033
4059 +#: ../src/totem-playlist.c:1037
4060 msgid "Save Playlist"
4061 msgstr "Guardar lista de reproducción"
4063 #. translators: Playlist is the default saved playlist filename,
4064 #. * without the suffix
4065 -#: ../src/totem-playlist.c:1045 ../src/totem-sidebar.c:140
4066 +#: ../src/totem-playlist.c:1049 ../src/totem-sidebar.c:140
4067 msgid "Playlist"
4068 msgstr "Lista de reproducción"
4070 -#: ../src/totem-playlist.c:1852
4071 +#: ../src/totem-playlist.c:1869
4072 #, c-format
4073 msgid "The playlist '%s' could not be parsed. It might be damaged."
4074 msgstr "La lista de reproducción «%s» no se pudo analizar. Puede estar dañada."
4076 -#: ../src/totem-playlist.c:1853
4077 +#: ../src/totem-playlist.c:1870
4078 msgid "Playlist error"
4079 msgstr "Error en la lista de reproducción"
4081 -#: ../src/totem-preferences.c:66
4082 -msgid "Enable visual effects?"
4083 -msgstr "¿Quiere activar los efectos visuales?"
4085 -#: ../src/totem-preferences.c:68
4086 -msgid ""
4087 -"It seems you are running Totem remotely.\n"
4088 -"Are you sure you want to enable the visual effects?"
4089 -msgstr ""
4090 -"Parece que está ejecutando Totem remotamente.\n"
4091 -"¿Está seguro de que quiere activar los efectos visuales?"
4093 -#: ../src/totem-preferences.c:332
4094 +#: ../src/totem-preferences.c:295
4095 msgid "Preferences"
4096 msgstr "Preferencias"
4098 -#: ../src/totem-preferences.c:490
4099 +#: ../src/totem-preferences.c:451
4100 msgid "Select Subtitle Font"
4101 msgstr "Seleccionar la tipografía de los subtítulos"
4103 @@ -1689,7 +1729,7 @@ msgstr "No existe el URI del vídeo"
4104 #. Translators: The first string is "Filename" (as translated); the second is an actual filename.
4105 #. The third string is "Resolution" (as translated); the fourth and fifth are screenshot height and width, respectively.
4106 #. The sixth string is "Duration" (as translated); the seventh is the movie duration in words.
4107 -#: ../src/totem-video-thumbnailer.c:679
4108 +#: ../src/totem-video-thumbnailer.c:689
4109 #, c-format
4110 msgid ""
4111 "<b>%s</b>: %s\n"
4112 @@ -1700,43 +1740,43 @@ msgstr ""
4113 "<b>%s</b>: %d×%d\n"
4114 "<b>%s</b>: %s"
4116 -#: ../src/totem-video-thumbnailer.c:680
4117 +#: ../src/totem-video-thumbnailer.c:690
4118 msgid "Filename"
4119 msgstr "Nombre del archivo"
4121 -#: ../src/totem-video-thumbnailer.c:682
4122 +#: ../src/totem-video-thumbnailer.c:692
4123 msgid "Resolution"
4124 msgstr "Resolución"
4126 -#: ../src/totem-video-thumbnailer.c:685
4127 +#: ../src/totem-video-thumbnailer.c:695
4128 msgid "Duration"
4129 msgstr "Duración"
4131 -#: ../src/totem-uri.c:502 ../src/plugins/chapters/totem-chapters.c:1000
4132 +#: ../src/totem-uri.c:504 ../src/plugins/chapters/totem-chapters.c:998
4133 msgid "All files"
4134 msgstr "Todos los archivos"
4136 -#: ../src/totem-uri.c:507 ../src/plugins/chapters/totem-chapters.c:997
4137 +#: ../src/totem-uri.c:509 ../src/plugins/chapters/totem-chapters.c:995
4138 msgid "Supported files"
4139 msgstr "Archivos soportados"
4141 -#: ../src/totem-uri.c:519
4142 +#: ../src/totem-uri.c:521
4143 msgid "Audio files"
4144 msgstr "Archivos de audio"
4146 -#: ../src/totem-uri.c:527
4147 +#: ../src/totem-uri.c:529
4148 msgid "Video files"
4149 msgstr "Archivos de vídeo"
4151 -#: ../src/totem-uri.c:537
4152 +#: ../src/totem-uri.c:539
4153 msgid "Subtitle files"
4154 msgstr "Archivos de subtítulos"
4156 -#: ../src/totem-uri.c:589
4157 +#: ../src/totem-uri.c:591
4158 msgid "Select Text Subtitles"
4159 msgstr "Seleccionar los subtítulos de texto"
4161 -#: ../src/totem-uri.c:652
4162 +#: ../src/totem-uri.c:654
4163 msgid "Select Movies or Playlists"
4164 msgstr "Seleccionar películas o listas de reproducción"
4166 @@ -1756,12 +1796,12 @@ msgstr ""
4167 "disponibles de la línea de comandos.\n"
4169 #: ../src/totem.c:254 ../src/totem.c:263
4170 -#: ../browser-plugin/totem-plugin-viewer.c:666
4171 -#: ../browser-plugin/totem-plugin-viewer.c:1864
4172 +#: ../browser-plugin/totem-plugin-viewer.c:663
4173 +#: ../browser-plugin/totem-plugin-viewer.c:1861
4174 msgid "Totem Movie Player"
4175 msgstr "Reproductor de películas Totem"
4177 -#: ../src/totem.c:255 ../browser-plugin/totem-plugin-viewer.c:2305
4178 +#: ../src/totem.c:255 ../browser-plugin/totem-plugin-viewer.c:2302
4179 msgid "Could not initialize the thread-safe libraries."
4180 msgstr "No se pudo inicializar el soporte de hilos seguro."
4182 @@ -1769,23 +1809,23 @@ msgstr "No se pudo inicializar el soporte de hilos seguro."
4183 msgid "Verify your system installation. Totem will now exit."
4184 msgstr "Verifique la instalación de su sistema. Totem ahora terminará."
4186 -#: ../src/backend/bacon-video-widget-gst-0.10.c:1843
4187 +#: ../src/backend/bacon-video-widget-gst-0.10.c:1850
4188 msgid "Password requested for RTSP server"
4189 msgstr "Contraseña solicitada para el servidor RTSP"
4191 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3115
4192 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3119
4193 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3124
4194 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3128
4195 #, c-format
4196 msgid "Audio Track #%d"
4197 msgstr "Pista de sonido nº %d"
4199 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3147
4200 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3151
4201 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3156
4202 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3160
4203 #, c-format
4204 msgid "Subtitle #%d"
4205 msgstr "Subtítulo nº %d"
4207 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3560
4208 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3569
4209 msgid ""
4210 "The requested audio output was not found. Please select another audio output "
4211 "in the Multimedia Systems Selector."
4212 @@ -1793,17 +1833,17 @@ msgstr ""
4213 "No se encontró la salida de sonido solicitada. Seleccione otra salida de "
4214 "sonido en el «Selector de sistemas multimedia»."
4216 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3565
4217 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3574
4218 msgid "Location not found."
4219 msgstr "No se encontró la dirección."
4221 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3569
4222 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3578
4223 msgid ""
4224 "Could not open location; you might not have permission to open the file."
4225 msgstr ""
4226 "No se pudo abrir la dirección; quizá no tiene permiso para abrir el archivo."
4228 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3580
4229 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3589
4230 msgid ""
4231 "The video output is in use by another application. Please close other video "
4232 "applications, or select another video output in the Multimedia Systems "
4233 @@ -1813,7 +1853,7 @@ msgstr ""
4234 "aplicaciones de vídeo o seleccione otra salida de vídeo en el selector de "
4235 "Sistemas Multimedia."
4237 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3586
4238 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3595
4239 msgid ""
4240 "The audio output is in use by another application. Please select another "
4241 "audio output in the Multimedia Systems Selector. You may want to consider "
4242 @@ -1824,15 +1864,15 @@ msgstr ""
4243 "un servidor de sonido."
4245 #. should be exactly one missing thing (source or converter)
4246 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3604
4247 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3610
4248 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3613
4249 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3619
4250 #, c-format
4251 msgid "The playback of this movie requires a %s plugin which is not installed."
4252 msgstr ""
4253 "La reproducción de esta película requiere un complemento %s que no está "
4254 "instalado."
4256 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3611
4257 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3620
4258 #, c-format
4259 msgid ""
4260 "The playback of this movie requires the following decoders which are not "
4261 @@ -1845,34 +1885,34 @@ msgstr ""
4262 "\n"
4263 "%s"
4265 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3636
4266 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3645
4267 msgid ""
4268 "Cannot play this file over the network. Try downloading it to disk first."
4269 msgstr ""
4270 "No se puede reproducir este archivo a través de la red. Intente descargarlo "
4271 "primero."
4273 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3708
4274 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3717
4275 msgid "Media file could not be played."
4276 msgstr "El archivo soporte no se pudo reproducir."
4278 -#: ../src/backend/bacon-video-widget-gst-0.10.c:5999
4279 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6008
4280 msgid "Surround"
4281 msgstr "Envolvente"
4283 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6001
4284 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6010
4285 msgid "Mono"
4286 msgstr "Mono"
4288 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6348
4289 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6357
4290 msgid "Too old version of GStreamer installed."
4291 msgstr "La versión de GStreamer que está instalada es demasiado antigua."
4293 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6355
4294 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6364
4295 msgid "Media contains no supported video streams."
4296 msgstr "El soporte no contiene ningún flujo de vídeo soportado."
4298 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6840
4299 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6847
4300 msgid ""
4301 "Failed to create a GStreamer play object. Please check your GStreamer "
4302 "installation."
4303 @@ -1880,8 +1920,8 @@ msgstr ""
4304 "Falló al crear el objeto de reproducción GStreamer. Compruebe su instalación "
4305 "de GStreamer."
4307 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6951
4308 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7086
4309 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6958
4310 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7093
4311 msgid ""
4312 "Failed to open video output. It may not be available. Please select another "
4313 "video output in the Multimedia Systems Selector."
4314 @@ -1889,7 +1929,7 @@ msgstr ""
4315 "Falló al abrir la salida de vídeo. Quizá no esté disponible. Seleccione otra "
4316 "salida de vídeo en el «Selector de sistemas multimedia»."
4318 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6963
4319 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6970
4320 msgid ""
4321 "Could not find the video output. You may need to install additional "
4322 "GStreamer plugins, or select another video output in the Multimedia Systems "
4323 @@ -1899,7 +1939,7 @@ msgstr ""
4324 "complementos adicionales de GStreamer, o seleccionar otra salida de vídeo en "
4325 "el «Selector de sistemas multimedia»."
4327 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6998
4328 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7005
4329 msgid ""
4330 "Failed to open audio output. You may not have permission to open the sound "
4331 "device, or the sound server may not be running. Please select another audio "
4332 @@ -1909,7 +1949,7 @@ msgstr ""
4333 "dispositivo de sonido, o el servidor de sonido quizá no esté funcionando. "
4334 "Seleccione otra salida de sonido en el «Selector de Sistemas Multimedia»."
4336 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7018
4337 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7025
4338 msgid ""
4339 "Could not find the audio output. You may need to install additional "
4340 "GStreamer plugins, or select another audio output in the Multimedia Systems "
4341 @@ -2047,14 +2087,14 @@ msgstr "No se pudo escribir un proyecto."
4343 #: ../src/plugins/brasero-disc-recorder/brasero-disc-recorder.plugin.in.h:1
4344 msgid "Records (S)VCDs or video DVDs"
4345 -msgstr "Grar (S)VCD o DVD de vídeo"
4346 +msgstr "Grabar (S)VCD o DVD de vídeo"
4348 #: ../src/plugins/brasero-disc-recorder/brasero-disc-recorder.plugin.in.h:2
4349 msgid "Video Disc Recorder"
4350 msgstr "Grabador de discos de vídeo"
4352 #: ../src/plugins/chapters/chapters.plugin.in.h:1
4353 -#: ../src/plugins/chapters/totem-chapters.c:1139
4354 +#: ../src/plugins/chapters/totem-chapters.c:1137
4355 msgid "Chapters"
4356 msgstr "Capítulos"
4358 @@ -2127,64 +2167,64 @@ msgstr ""
4359 "<b>Título: </b>%s\n"
4360 "<b>Tiempo de inicio: </b>%s"
4362 -#: ../src/plugins/chapters/totem-chapters.c:330
4363 +#: ../src/plugins/chapters/totem-chapters.c:328
4364 msgid "Error while reading file with chapters"
4365 msgstr "Error al intentar leer el archivo con capítulos"
4367 -#: ../src/plugins/chapters/totem-chapters.c:545
4368 +#: ../src/plugins/chapters/totem-chapters.c:543
4369 msgid "Chapter with the same time already exists"
4370 msgstr "Ya existe un capítulo con los mismos tiempos"
4372 -#: ../src/plugins/chapters/totem-chapters.c:546
4373 +#: ../src/plugins/chapters/totem-chapters.c:544
4374 msgid "Try another name or remove an existing chapter."
4375 msgstr "Intente usar otro nombre o quite un capítulo existente."
4377 -#: ../src/plugins/chapters/totem-chapters.c:719
4378 +#: ../src/plugins/chapters/totem-chapters.c:717
4379 msgid "Error while writing file with chapters"
4380 msgstr "Error al escribir el archivo con capítulos"
4382 -#: ../src/plugins/chapters/totem-chapters.c:844
4383 +#: ../src/plugins/chapters/totem-chapters.c:842
4384 msgid "Error occurred while saving chapters"
4385 msgstr "Ocurrió un error al guardar los capítulos"
4387 -#: ../src/plugins/chapters/totem-chapters.c:845
4388 +#: ../src/plugins/chapters/totem-chapters.c:843
4389 msgid ""
4390 "Please check you have permission to write to the folder containing the movie."
4391 msgstr ""
4392 "Compruebe que tiene permisos para escribir en la carpeta que contiene la "
4393 "película."
4395 -#: ../src/plugins/chapters/totem-chapters.c:978
4396 +#: ../src/plugins/chapters/totem-chapters.c:976
4397 msgid "Open Chapter File"
4398 msgstr "Abrir archivo de capítulo"
4400 -#: ../src/plugins/chapters/totem-chapters.c:1095
4401 +#: ../src/plugins/chapters/totem-chapters.c:1093
4402 msgid "Chapter Screenshot"
4403 msgstr "Captura del capítulo"
4405 -#: ../src/plugins/chapters/totem-chapters.c:1106
4406 +#: ../src/plugins/chapters/totem-chapters.c:1104
4407 msgid "Chapter Title"
4408 msgstr "Título del capítulo"
4410 -#: ../src/plugins/chapters/totem-chapters.c:1184
4411 +#: ../src/plugins/chapters/totem-chapters.c:1182
4412 msgid "Save changes to chapter list before closing?"
4413 msgstr "¿Guardar los cambios de la lista de capítulos antes de cerrar?"
4415 #. Translators: close Totem without saving changes to the chapter list of the current movie.
4416 -#: ../src/plugins/chapters/totem-chapters.c:1189
4417 +#: ../src/plugins/chapters/totem-chapters.c:1187
4418 msgid "Close without Saving"
4419 msgstr "Cerrar sin guardar"
4421 #. Translators: save changes to the chapter list of the current movie before closing Totem.
4422 -#: ../src/plugins/chapters/totem-chapters.c:1191
4423 +#: ../src/plugins/chapters/totem-chapters.c:1189
4424 msgid "Save"
4425 msgstr "Guardar"
4427 -#: ../src/plugins/chapters/totem-chapters.c:1194
4428 +#: ../src/plugins/chapters/totem-chapters.c:1192
4429 msgid "If you don't save, changes to the chapter list will be lost."
4430 msgstr "Si no guarda, se perderán los cambios en el capítulo."
4432 -#: ../src/plugins/chapters/totem-cmml-parser.c:559
4433 +#: ../src/plugins/chapters/totem-cmml-parser.c:651
4434 msgid "Failed to parse CMML file"
4435 msgstr "Falló al analizar el archivo CMML"
4437 @@ -2193,7 +2233,7 @@ msgstr "Falló al analizar el archivo CMML"
4438 msgid "Delete"
4439 msgstr "Eliminar"
4441 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:116
4442 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:117
4443 #: ../src/plugins/coherence_upnp/coherence_upnp.plugin.in.h:2
4444 msgid "Coherence DLNA/UPnP Client"
4445 msgstr "Cliente de DLNA/UPnP Coherence"
4446 @@ -2214,24 +2254,16 @@ msgstr ""
4447 "Complemento para enviar notificaciones de las películas actualmente en "
4448 "reproducción al subsistema D-Bus."
4450 -#: ../src/plugins/galago/galago.plugin.in.h:1
4451 +#: ../src/plugins/im-status/totem-im-status.plugin.in.h:1
4452 msgid "Instant Messenger status"
4453 msgstr "Estado de la mensajería instantánea"
4455 -#: ../src/plugins/galago/galago.plugin.in.h:2
4456 +#: ../src/plugins/im-status/totem-im-status.plugin.in.h:2
4457 msgid "Set your Instant Messenger status to away when a movie is playing"
4458 msgstr ""
4459 "Establecer el estado de su programa de mensajería instantánea a ausente "
4460 "cuando se está reproduciendo una película"
4462 -#: ../src/plugins/galago/totem-galago.c:117
4463 -msgid "Error loading Galago plugin"
4464 -msgstr "Error al cargar el complemento Galago"
4466 -#: ../src/plugins/galago/totem-galago.c:117
4467 -msgid "Could not connect to the Galago daemon."
4468 -msgstr "No se pudo conectar con el demonio Galago."
4470 #: ../src/plugins/gromit/gromit.plugin.in.h:1
4471 msgid "Gromit Annotations"
4472 msgstr "Anotaciones Gromit"
4473 @@ -2246,7 +2278,7 @@ msgstr "No se encontró el binario gromit."
4475 #. Add the interface to Totem's sidebar
4476 #: ../src/plugins/iplayer/iplayer.plugin.in.h:1
4477 -#: ../src/plugins/iplayer/iplayer.py:41
4478 +#: ../src/plugins/iplayer/iplayer.py:42
4479 msgid "BBC iPlayer"
4480 msgstr "Reproductor iPlayer de la BBC"
4482 @@ -2256,11 +2288,11 @@ msgstr ""
4483 "Reproducir programas de la BBC de los últimos 7 días desde el servicio "
4484 "iPlayer de la BBC."
4486 -#: ../src/plugins/iplayer/iplayer.py:66
4487 +#: ../src/plugins/iplayer/iplayer.py:67
4488 msgid "Error listing channel categories"
4489 msgstr "Error al listar las categorías de canales"
4491 -#: ../src/plugins/iplayer/iplayer.py:66
4492 +#: ../src/plugins/iplayer/iplayer.py:67
4493 msgid ""
4494 "There was an unknown error getting the list of television channels available "
4495 "on BBC iPlayer."
4496 @@ -2270,16 +2302,16 @@ msgstr ""
4498 #. Append a dummy child row so that the expander's visible; we can
4499 #. then queue off the expander to load the programme listing for this category
4500 -#: ../src/plugins/iplayer/iplayer.py:74
4501 +#: ../src/plugins/iplayer/iplayer.py:75
4502 msgid "Loading…"
4503 msgstr "Cargando…"
4505 #. Translators: the "programme feed" is the list of TV shows available to watch online
4506 -#: ../src/plugins/iplayer/iplayer.py:119
4507 +#: ../src/plugins/iplayer/iplayer.py:120
4508 msgid "Error getting programme feed"
4509 msgstr "Error al obtener el proveedor de la programación"
4511 -#: ../src/plugins/iplayer/iplayer.py:119
4512 +#: ../src/plugins/iplayer/iplayer.py:120
4513 msgid ""
4514 "There was an error getting the list of programmes for this channel and "
4515 "category combination."
4516 @@ -2325,7 +2357,7 @@ msgid "Preferred audio _format:"
4517 msgstr "_Formato de sonido preferido:"
4519 #: ../src/plugins/jamendo/jamendo.ui.h:8
4520 -#: ../src/plugins/tracker/totem-tracker-widget.c:521
4521 +#: ../src/plugins/tracker/totem-tracker-widget.c:761
4522 #: ../src/plugins/youtube/youtube.ui.h:2
4523 msgid "Search Results"
4524 msgstr "Resultados de la búsqueda"
4525 @@ -2335,7 +2367,7 @@ msgid "_Open Jamendo Album Page in Browser"
4526 msgstr "_Abrir la página del álbum en Jamendo en el navegador"
4528 #: ../src/plugins/jamendo/jamendo.plugin.in.h:1
4529 -#: ../src/plugins/jamendo/jamendo.py:127
4530 +#: ../src/plugins/jamendo/jamendo.py:128
4531 msgid "Jamendo"
4532 msgstr "Jamendo"
4534 @@ -2350,34 +2382,34 @@ msgstr ""
4535 msgid "You need to install the Python simplejson module."
4536 msgstr "Debe instalar el módulo Python simplejson."
4538 -#: ../src/plugins/jamendo/jamendo.py:260 ../src/plugins/jamendo/jamendo.py:273
4539 -#: ../src/plugins/jamendo/jamendo.py:297
4540 +#: ../src/plugins/jamendo/jamendo.py:261 ../src/plugins/jamendo/jamendo.py:274
4541 +#: ../src/plugins/jamendo/jamendo.py:298
4542 #, python-format
4543 msgid "Artist: %s"
4544 msgstr "Artista: %s"
4546 #. Translators: this is the release date of an album in Python strptime format
4547 -#: ../src/plugins/jamendo/jamendo.py:266
4548 +#: ../src/plugins/jamendo/jamendo.py:267
4549 msgid "%Y-%m-%d"
4550 msgstr "%d-%m-%Y"
4552 #. Translators: this is the release time of an album in Python strftime format
4553 -#: ../src/plugins/jamendo/jamendo.py:268
4554 +#: ../src/plugins/jamendo/jamendo.py:269
4555 #, python-format
4556 msgid "%x"
4557 msgstr "%x"
4559 -#: ../src/plugins/jamendo/jamendo.py:274
4560 +#: ../src/plugins/jamendo/jamendo.py:275
4561 #, python-format
4562 msgid "Genre: %s"
4563 msgstr "Género: %s"
4565 -#: ../src/plugins/jamendo/jamendo.py:275
4566 +#: ../src/plugins/jamendo/jamendo.py:276
4567 #, python-format
4568 msgid "Released on: %s"
4569 msgstr "Publicado en: %s"
4571 -#: ../src/plugins/jamendo/jamendo.py:276
4572 +#: ../src/plugins/jamendo/jamendo.py:277
4573 #, python-format
4574 msgid "License: %s"
4575 msgstr "Licencia: %s"
4576 @@ -2385,26 +2417,26 @@ msgstr "Licencia: %s"
4577 #. track title
4578 #. Translators: this is the title of a track in Python format
4579 #. (first argument is the track number, second is the track title)
4580 -#: ../src/plugins/jamendo/jamendo.py:289
4581 +#: ../src/plugins/jamendo/jamendo.py:290
4582 #, python-format
4583 msgid "%02d. %s"
4584 msgstr "%02d. %s"
4586 -#: ../src/plugins/jamendo/jamendo.py:296
4587 +#: ../src/plugins/jamendo/jamendo.py:297
4588 #, python-format
4589 msgid "Album: %s"
4590 msgstr "Álbum: %s"
4592 -#: ../src/plugins/jamendo/jamendo.py:298
4593 +#: ../src/plugins/jamendo/jamendo.py:299
4594 #, python-format
4595 msgid "Duration: %s"
4596 msgstr "Duración: %s"
4598 -#: ../src/plugins/jamendo/jamendo.py:355
4599 +#: ../src/plugins/jamendo/jamendo.py:356
4600 msgid "Fetching albums, please wait…"
4601 msgstr "Obteniendo álbumes, espere…"
4603 -#: ../src/plugins/jamendo/jamendo.py:410
4604 +#: ../src/plugins/jamendo/jamendo.py:411
4605 #, python-format
4606 msgid ""
4607 "Failed to connect to Jamendo server.\n"
4608 @@ -2413,24 +2445,24 @@ msgstr ""
4609 "Falló al contactar con el servidor de Jamendo.\n"
4610 "%s."
4612 -#: ../src/plugins/jamendo/jamendo.py:412
4613 +#: ../src/plugins/jamendo/jamendo.py:413
4614 #, python-format
4615 msgid "The Jamendo server returned code %s."
4616 msgstr "El servidor de Jamendo devolvió el código %s."
4618 -#: ../src/plugins/jamendo/jamendo.py:416
4619 +#: ../src/plugins/jamendo/jamendo.py:417
4620 msgid "An error occurred while fetching albums."
4621 msgstr "Ocurrió un error al obtener los álbumes."
4623 #. Translators: time formatting (in Python strftime format) for the Jamendo plugin
4624 #. for times longer than an hour
4625 -#: ../src/plugins/jamendo/jamendo.py:618
4626 +#: ../src/plugins/jamendo/jamendo.py:620
4627 msgid "%H:%M:%S"
4628 msgstr "%H:%M:%S"
4630 #. Translators: time formatting (in Python strftime format) for the Jamendo plugin
4631 #. for times shorter than an hour
4632 -#: ../src/plugins/jamendo/jamendo.py:621
4633 +#: ../src/plugins/jamendo/jamendo.py:623
4634 msgid "%M:%S"
4635 msgstr "%M:%S"
4637 @@ -2441,7 +2473,7 @@ msgstr "%M:%S"
4638 #. Compared to:
4639 #. http://www.jamendo.com/en/album/4818
4640 #. If Jamendo doesn't support your language, *do not translate this string*!
4641 -#: ../src/plugins/jamendo/jamendo.py:671
4642 +#: ../src/plugins/jamendo/jamendo.py:673
4643 msgid "en"
4644 msgstr "es"
4646 @@ -2520,35 +2552,35 @@ msgstr "No se pudo contactar con la página web OpenSubtitles"
4647 msgid "No results found"
4648 msgstr "No se encontraron resultados"
4650 -#: ../src/plugins/opensubtitles/opensubtitles.py:374
4651 +#: ../src/plugins/opensubtitles/opensubtitles.py:376
4652 msgid "Subtitles"
4653 msgstr "Subtítulos"
4655 #. translators comment:
4656 #. This is the file-type of the subtitle file detected
4657 -#: ../src/plugins/opensubtitles/opensubtitles.py:380
4658 +#: ../src/plugins/opensubtitles/opensubtitles.py:382
4659 msgid "Format"
4660 msgstr "Formato"
4662 #. translators comment:
4663 #. This is a rating of the quality of the subtitle
4664 -#: ../src/plugins/opensubtitles/opensubtitles.py:385
4665 +#: ../src/plugins/opensubtitles/opensubtitles.py:387
4666 msgid "Rating"
4667 msgstr "Puntuación"
4669 -#: ../src/plugins/opensubtitles/opensubtitles.py:426
4670 +#: ../src/plugins/opensubtitles/opensubtitles.py:428
4671 msgid "_Download Movie Subtitles…"
4672 msgstr "_Descargar subtítulos para la película…"
4674 -#: ../src/plugins/opensubtitles/opensubtitles.py:427
4675 +#: ../src/plugins/opensubtitles/opensubtitles.py:429
4676 msgid "Download movie subtitles from OpenSubtitles"
4677 msgstr "Descargar subtítulos para la película desde OpenSubtitles"
4679 -#: ../src/plugins/opensubtitles/opensubtitles.py:486
4680 +#: ../src/plugins/opensubtitles/opensubtitles.py:488
4681 msgid "Searching subtitles…"
4682 msgstr "Buscando subtítulos…"
4684 -#: ../src/plugins/opensubtitles/opensubtitles.py:544
4685 +#: ../src/plugins/opensubtitles/opensubtitles.py:546
4686 msgid "Downloading the subtitles…"
4687 msgstr "Descargando los subtítulos…"
4689 @@ -2574,58 +2606,6 @@ msgstr ""
4690 msgid "Properties"
4691 msgstr "Propiedades"
4693 -#. Dimensions
4694 -#: ../src/plugins/properties/bacon-video-widget-properties.c:158
4695 -msgctxt "Dimensions"
4696 -msgid "N/A"
4697 -msgstr "N/D"
4699 -#: ../src/plugins/properties/bacon-video-widget-properties.c:163
4700 -#: ../src/plugins/properties/bacon-video-widget-properties.c:240
4701 -msgctxt "Video bit rate"
4702 -msgid "N/A"
4703 -msgstr "N/D"
4705 -#: ../src/plugins/properties/bacon-video-widget-properties.c:166
4706 -#: ../src/plugins/properties/bacon-video-widget-properties.c:250
4707 -msgctxt "Frame rate"
4708 -msgid "N/A"
4709 -msgstr "N/D"
4711 -#: ../src/plugins/properties/bacon-video-widget-properties.c:169
4712 -#: ../src/plugins/properties/bacon-video-widget-properties.c:273
4713 -msgctxt "Audio bit rate"
4714 -msgid "N/A"
4715 -msgstr "N/D"
4717 -#: ../src/plugins/properties/bacon-video-widget-properties.c:237
4718 -#, c-format
4719 -msgid "%d x %d"
4720 -msgstr "%d x %d"
4722 -#: ../src/plugins/properties/bacon-video-widget-properties.c:240
4723 -#: ../src/plugins/properties/bacon-video-widget-properties.c:273
4724 -#, c-format
4725 -msgid "%d kbps"
4726 -msgstr "%d Kbps"
4728 -#: ../src/plugins/properties/bacon-video-widget-properties.c:247
4729 -#, c-format
4730 -msgid "%d frame per second"
4731 -msgid_plural "%d frames per second"
4732 -msgstr[0] "%d fotograma por segundo"
4733 -msgstr[1] "%d fotogramas por segundo"
4735 -#: ../src/plugins/properties/bacon-video-widget-properties.c:276
4736 -#, c-format
4737 -msgid "%d Hz"
4738 -msgstr "%d Hz"
4740 -#: ../src/plugins/properties/bacon-video-widget-properties.c:276
4741 -msgctxt "Sample rate"
4742 -msgid "N/A"
4743 -msgstr "N/D"
4745 #: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:2
4746 #, no-c-format
4747 msgid ""
4748 @@ -2725,8 +2705,8 @@ msgstr "Película"
4749 msgid "Movie stream"
4750 msgstr "Flujo de la película"
4752 -#: ../src/plugins/screensaver/totem-screensaver.c:112
4753 -#: ../browser-plugin/totem-plugin-viewer.c:1964
4754 +#: ../src/plugins/screensaver/totem-screensaver.c:116
4755 +#: ../browser-plugin/totem-plugin-viewer.c:1961
4756 msgid "Playing a movie"
4757 msgstr "Reproduciendo una película"
4759 @@ -2842,12 +2822,10 @@ msgid "7"
4760 msgstr "7"
4762 #: ../src/plugins/skipto/totem-skipto.c:197
4763 -#| msgid "Skip to"
4764 msgid "Skip To"
4765 msgstr "Saltar a"
4767 #: ../src/plugins/skipto/totem-skipto-plugin.c:182
4768 -#| msgid "_Skip to..."
4769 msgid "_Skip To..."
4770 msgstr "Sa_ltar a…"
4772 @@ -2859,38 +2837,36 @@ msgstr "Salta a un tiempo específico"
4773 msgid "_Skip to:"
4774 msgstr "_Saltar a:"
4776 -#. Display an error
4777 -#: ../src/plugins/tracker/totem-tracker-widget.c:173
4778 -#, c-format
4779 -msgid "Could not get name and thumbnail for %s: %s"
4780 -msgstr "No se pudo obtener el nombre y la miniatura para %s: %s"
4782 -#: ../src/plugins/tracker/totem-tracker-widget.c:174
4783 -msgid "File Error"
4784 -msgstr "Error de archivo"
4786 -#: ../src/plugins/tracker/totem-tracker-widget.c:251
4787 -#: ../src/plugins/tracker/totem-tracker-widget.c:368
4788 +#: ../src/plugins/tracker/totem-tracker-widget.c:587
4789 +#: ../src/plugins/tracker/totem-tracker-widget.c:676
4790 msgid "Could not connect to Tracker"
4791 msgstr "No se pudo conectar con Tracker"
4793 -#: ../src/plugins/tracker/totem-tracker-widget.c:258
4794 +#: ../src/plugins/tracker/totem-tracker-widget.c:594
4795 msgid "No results"
4796 msgstr "No hay resultados"
4798 #. Translators:
4799 -#. * This is used to show which items are listed in the list view, for example:
4800 -#. * Showing 10-20 of 128 matches
4801 -#. * This is similar to what web searches use, eg. Google on the top-right of their search results page show:
4802 -#. * Personalized Results 1 - 10 of about 4,130,000 for foobar
4803 -#: ../src/plugins/tracker/totem-tracker-widget.c:283
4804 +#. * This is used to show which items are listed in the
4805 +#. * list view, for example:
4806 +#. *
4807 +#. * Showing 10-20 of 128 matches
4808 +#. *
4809 +#. * This is similar to what web searches use, eg.
4810 +#. * Google on the top-right of their search results
4811 +#. * page show:
4812 +#. *
4813 +#. * Personalized Results 1 - 10 of about 4,130,000 for foobar
4814 +#. *
4816 +#: ../src/plugins/tracker/totem-tracker-widget.c:618
4817 #, c-format
4818 msgid "Showing %i - %i of %i match"
4819 msgid_plural "Showing %i - %i of %i matches"
4820 msgstr[0] "Mostrando %i - %i de %i coincidencia"
4821 msgstr[1] "Mostrando %i - %i de %i coincidencias"
4823 -#: ../src/plugins/tracker/totem-tracker-widget.c:581
4824 +#: ../src/plugins/tracker/totem-tracker-widget.c:823
4825 msgid "Page"
4826 msgstr "Página"
4828 @@ -3000,29 +2976,29 @@ msgstr "No hay una URI para reproducir"
4829 #. translators: this is:
4830 #. * Open With ApplicationName
4831 #. * as in nautilus' right-click menu
4832 -#: ../browser-plugin/totem-plugin-viewer.c:1104
4833 +#: ../browser-plugin/totem-plugin-viewer.c:1101
4834 #, c-format
4835 msgid "_Open with \"%s\""
4836 msgstr "_Abrir con «%s»"
4838 -#: ../browser-plugin/totem-plugin-viewer.c:1155
4839 +#: ../browser-plugin/totem-plugin-viewer.c:1152
4840 #, c-format
4841 msgid "Browser Plugin using %s"
4842 msgstr "Complemento de visualización usando %s"
4844 -#: ../browser-plugin/totem-plugin-viewer.c:1160
4845 +#: ../browser-plugin/totem-plugin-viewer.c:1157
4846 msgid "Totem Browser Plugin"
4847 msgstr "Complemento de visualización para Totem"
4849 -#: ../browser-plugin/totem-plugin-viewer.c:2198
4850 +#: ../browser-plugin/totem-plugin-viewer.c:2195
4851 msgid "No playlist or playlist empty"
4852 msgstr "Ninguna lista o lista vacía"
4854 -#: ../browser-plugin/totem-plugin-viewer.c:2289
4855 +#: ../browser-plugin/totem-plugin-viewer.c:2286
4856 msgid "Movie browser plugin"
4857 msgstr "Complemento de examinador de películas"
4859 -#: ../browser-plugin/totem-plugin-viewer.c:2305
4860 +#: ../browser-plugin/totem-plugin-viewer.c:2302
4861 msgid "Verify your system installation. The Totem plugin will now exit."
4862 msgstr ""
4863 "Verifique la instalación de su sistema. EL complemento de Totem ahora "
4864 @@ -3036,36 +3012,36 @@ msgstr "Consola Python interactiva."
4865 msgid "Python Console"
4866 msgstr "Consola Python"
4868 -#: ../src/plugins/pythonconsole/pythonconsole.py:85
4869 +#: ../src/plugins/pythonconsole/pythonconsole.py:86
4870 msgid "Python Console Menu"
4871 msgstr "Menú de la consola Python"
4873 -#: ../src/plugins/pythonconsole/pythonconsole.py:88
4874 +#: ../src/plugins/pythonconsole/pythonconsole.py:89
4875 msgid "_Python Console"
4876 msgstr "Consola _Python"
4878 -#: ../src/plugins/pythonconsole/pythonconsole.py:89
4879 +#: ../src/plugins/pythonconsole/pythonconsole.py:90
4880 msgid "Show Totem's Python console"
4881 msgstr "Mostrar la consola Python de Totem"
4883 -#: ../src/plugins/pythonconsole/pythonconsole.py:94
4884 +#: ../src/plugins/pythonconsole/pythonconsole.py:95
4885 msgid "Python Debugger"
4886 msgstr "Depurador Python"
4888 -#: ../src/plugins/pythonconsole/pythonconsole.py:95
4889 +#: ../src/plugins/pythonconsole/pythonconsole.py:96
4890 msgid "Enable remote Python debugging with rpdb2"
4891 msgstr "Activar la depuración remota Python con rpdb2"
4893 -#: ../src/plugins/pythonconsole/pythonconsole.py:116
4894 +#: ../src/plugins/pythonconsole/pythonconsole.py:117
4895 #, python-format
4896 msgid "You can access the Totem.Object through 'totem_object' :\\n%s"
4897 msgstr "Puede acceder al objeto de Totem a través de «totem_object»: \\n%s"
4899 -#: ../src/plugins/pythonconsole/pythonconsole.py:120
4900 +#: ../src/plugins/pythonconsole/pythonconsole.py:121
4901 msgid "Totem Python Console"
4902 msgstr "Consola Python de Totem"
4904 -#: ../src/plugins/pythonconsole/pythonconsole.py:129
4905 +#: ../src/plugins/pythonconsole/pythonconsole.py:130
4906 msgid ""
4907 "After you press OK, Totem will wait until you connect to it with winpdb or "
4908 "rpdb2. If you have not set a debugger password in DConf, it will use the "
4909 @@ -3075,6 +3051,28 @@ msgstr ""
4910 "rpdb2. Si no ha establecido una contraseña para el depurador en DConf, se "
4911 "usará la contraseña predeterminada («totem»)."
4913 +#~ msgid "Enable visual effects?"
4914 +#~ msgstr "¿Quiere activar los efectos visuales?"
4916 +#~ msgid ""
4917 +#~ "It seems you are running Totem remotely.\n"
4918 +#~ "Are you sure you want to enable the visual effects?"
4919 +#~ msgstr ""
4920 +#~ "Parece que está ejecutando Totem remotamente.\n"
4921 +#~ "¿Está seguro de que quiere activar los efectos visuales?"
4923 +#~ msgid "Error loading Galago plugin"
4924 +#~ msgstr "Error al cargar el complemento Galago"
4926 +#~ msgid "Could not connect to the Galago daemon."
4927 +#~ msgstr "No se pudo conectar con el demonio Galago."
4929 +#~ msgid "Could not get name and thumbnail for %s: %s"
4930 +#~ msgstr "No se pudo obtener el nombre y la miniatura para %s: %s"
4932 +#~ msgid "File Error"
4933 +#~ msgstr "Error de archivo"
4935 #~ msgid "seconds"
4936 #~ msgstr "segundos"
4938 diff --git a/po/pl.po b/po/pl.po
4939 index 2d4a565..a7a072d 100644
4940 --- a/po/pl.po
4941 +++ b/po/pl.po
4942 @@ -7,16 +7,17 @@
4943 msgid ""
4944 msgstr ""
4945 "Project-Id-Version: totem\n"
4946 -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=totem&component=general\n"
4947 -"POT-Creation-Date: 2011-01-28 12:39+0000\n"
4948 -"PO-Revision-Date: 2011-03-08 10:43+0100\n"
4949 -"Last-Translator: js <asiaslowik@gmail.com>\n"
4950 +"Report-Msgid-Bugs-To: \n"
4951 +"POT-Creation-Date: 2011-06-01 23:47+0200\n"
4952 +"PO-Revision-Date: 2011-06-01 23:48+0200\n"
4953 +"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
4954 "Language-Team: Polish <gnomepl@aviary.pl>\n"
4955 +"Language: pl\n"
4956 "MIME-Version: 1.0\n"
4957 "Content-Type: text/plain; charset=UTF-8\n"
4958 "Content-Transfer-Encoding: 8bit\n"
4959 -"Language: pl\n"
4960 -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
4961 +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
4962 +"|| n%100>=20) ? 1 : 2);\n"
4963 "X-Poedit-Language: Polish\n"
4964 "X-Poedit-Country: Poland\n"
4966 @@ -24,8 +25,7 @@ msgstr ""
4967 msgid "Leave Fullscreen"
4968 msgstr "Opuść pełny ekran"
4970 -#: ../data/fullscreen.ui.h:2
4971 -#: ../data/totem.ui.h:102
4972 +#: ../data/fullscreen.ui.h:2 ../data/totem.ui.h:102
4973 msgid "Time:"
4974 msgstr "Czas:"
4976 @@ -33,8 +33,7 @@ msgstr "Czas:"
4977 msgid "Add..."
4978 msgstr "Dodaje do listy odtwarzania..."
4980 -#: ../data/playlist.ui.h:2
4981 -#: ../data/video-list.ui.h:2
4982 +#: ../data/playlist.ui.h:2 ../data/video-list.ui.h:2
4983 msgid "Copy the location to the clipboard"
4984 msgstr "Kopiuje położenie do schowka"
4986 @@ -58,13 +57,11 @@ msgstr "Usuwa plik z listy odtwarzania"
4987 msgid "Save Playlist..."
4988 msgstr "Zapisuje listę odtwarzania..."
4990 -#: ../data/playlist.ui.h:8
4991 -#: ../data/totem.ui.h:77
4992 +#: ../data/playlist.ui.h:8 ../data/totem.ui.h:77
4993 msgid "Select a file to use for text subtitles"
4994 msgstr "Wybór pliku napisów"
4996 -#: ../data/playlist.ui.h:9
4997 -#: ../data/video-list.ui.h:4
4998 +#: ../data/playlist.ui.h:9 ../data/video-list.ui.h:4
4999 msgid "_Copy Location"
5000 msgstr "S_kopiuj położenie"
5002 @@ -72,8 +69,7 @@ msgstr "S_kopiuj położenie"
5003 msgid "_Remove"
5004 msgstr "_Usuń"
5006 -#: ../data/playlist.ui.h:11
5007 -#: ../data/totem.ui.h:145
5008 +#: ../data/playlist.ui.h:11 ../data/totem.ui.h:145
5009 msgid "_Select Text Subtitles..."
5010 msgstr "_Wybierz plik napisów..."
5012 @@ -98,8 +94,7 @@ msgid "0 kbps"
5013 msgstr "0 kb/s"
5015 #. 0 seconds
5016 -#: ../data/properties.ui.h:5
5017 -#: ../src/backend/video-utils.c:192
5018 +#: ../data/properties.ui.h:5 ../src/backend/video-utils.c:158
5019 msgid "0 seconds"
5020 msgstr "0 sekund"
5022 @@ -115,8 +110,7 @@ msgstr "Album:"
5023 msgid "Artist:"
5024 msgstr "Wykonawca:"
5026 -#: ../data/properties.ui.h:9
5027 -#: ../data/totem.ui.h:23
5028 +#: ../data/properties.ui.h:9 ../data/totem.ui.h:23
5029 #: ../src/totem-properties-view.c:89
5030 msgid "Audio"
5031 msgstr "Dźwięk"
5032 @@ -156,8 +150,7 @@ msgstr "Czas trwania:"
5033 msgid "Framerate:"
5034 msgstr "Liczba klatek na sekundę:"
5036 -#: ../data/properties.ui.h:18
5037 -#: ../data/totem.ui.h:41
5038 +#: ../data/properties.ui.h:18 ../data/totem.ui.h:41
5039 msgid "General"
5040 msgstr "Ogólne"
5042 @@ -181,8 +174,7 @@ msgstr "Tytuł:"
5043 msgid "Unknown"
5044 msgstr "Nieznany"
5046 -#: ../data/properties.ui.h:22
5047 -#: ../data/totem.ui.h:104
5048 +#: ../data/properties.ui.h:22 ../data/totem.ui.h:104
5049 #: ../src/totem-properties-view.c:85
5050 msgid "Video"
5051 msgstr "Wideo"
5052 @@ -202,15 +194,13 @@ msgstr "Rok:"
5053 msgid "Add the video to the playlist"
5054 msgstr "Dodanie nagrania wideo do listy odtwarzania"
5056 -#: ../data/video-list.ui.h:3
5057 -#: ../src/totem-dnd-menu.c:97
5058 +#: ../data/video-list.ui.h:3 ../src/totem-dnd-menu.c:97
5059 #: ../src/plugins/jamendo/jamendo.ui.h:9
5060 msgid "_Add to Playlist"
5061 msgstr "Dod_aj do listy odtwarzania"
5063 #. Title
5064 -#: ../data/totem.desktop.in.in.in.h:1
5065 -#: ../data/totem.ui.h:53
5066 +#: ../data/totem.desktop.in.in.in.h:1 ../data/totem.ui.h:53
5067 #: ../src/totem-object.c:1666
5068 msgid "Movie Player"
5069 msgstr "Odtwarzacz filmów Totem"
5070 @@ -572,8 +562,7 @@ msgstr "Kwadratowy"
5071 msgid "Start playing files from last position"
5072 msgstr "Rozpoczęcie odtwarzania plików od ostatniej pozycji"
5074 -#: ../data/totem.ui.h:96
5075 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6008
5076 +#: ../data/totem.ui.h:96 ../src/backend/bacon-video-widget-gst-0.10.c:6012
5077 msgid "Stereo"
5078 msgstr "Stereo"
5080 @@ -778,7 +767,9 @@ msgid "_View"
5081 msgstr "_Widok"
5083 #: ../data/org.gnome.totem.gschema.xml.in.in.h:1
5084 -msgid "A list of the names of the plugins which are currently active (loaded and running)."
5085 +msgid ""
5086 +"A list of the names of the plugins which are currently active (loaded and "
5087 +"running)."
5088 msgstr "Lista aktywnych wtyczek (wczytanych i uruchomionych)."
5090 #: ../data/org.gnome.totem.gschema.xml.in.in.h:2
5091 @@ -790,32 +781,52 @@ msgid "Allow the screensaver to activate when playing audio"
5092 msgstr "Umożliwia wygaszanie ekranu podczas odtwarzania dźwięku"
5094 #: ../data/org.gnome.totem.gschema.xml.in.in.h:4
5095 -msgid "Allow the screensaver to activate when playing audio. Disable if you have monitor-powered speakers."
5096 -msgstr "Zezwolenie na włączenie wygaszacza ekranu podczas odtwarzania dźwięku. Przydatne w przypadku głośników wbudowanych w monitor."
5097 +msgid ""
5098 +"Allow the screensaver to activate when playing audio. Disable if you have "
5099 +"monitor-powered speakers."
5100 +msgstr ""
5101 +"Zezwolenie na włączenie wygaszacza ekranu podczas odtwarzania dźwięku. "
5102 +"Przydatne w przypadku głośników wbudowanych w monitor."
5104 #: ../data/org.gnome.totem.gschema.xml.in.in.h:5
5105 -msgid "Amount of data to buffer for network streams before starting to display the stream (in seconds)."
5106 -msgstr "Ilość buforowanych danych dla strumieni sieciowych przed rozpoczęciem wyświetlania strumienia (w sekundach)."
5107 +msgid ""
5108 +"Amount of data to buffer for network streams before starting to display the "
5109 +"stream (in seconds)."
5110 +msgstr ""
5111 +"Ilość buforowanych danych dla strumieni sieciowych przed rozpoczęciem "
5112 +"wyświetlania strumienia (w sekundach)."
5114 #: ../data/org.gnome.totem.gschema.xml.in.in.h:6
5115 -msgid "Approximate network connection speed, used to select quality on media over the network."
5116 -msgstr "Przybliżona prędkość połączenia sieciowego używana do wyboru jakości multimediów przesyłanych przez sieć."
5117 +msgid ""
5118 +"Approximate network connection speed, used to select quality on media over "
5119 +"the network."
5120 +msgstr ""
5121 +"Przybliżona prędkość połączenia sieciowego używana do wyboru jakości "
5122 +"multimediów przesyłanych przez sieć."
5124 #: ../data/org.gnome.totem.gschema.xml.in.in.h:7
5125 msgid "Default location for the \"Open...\" dialogs"
5126 msgstr "Domyślne położenie dla okien dialogowych \"Otwórz...\""
5128 #: ../data/org.gnome.totem.gschema.xml.in.in.h:8
5129 -msgid "Default location for the \"Open...\" dialogs. Default is the current directory."
5130 -msgstr "Domyślne położenie dla okien dialogowych \"Otwórz...\". Domyślnie jest to bieżący katalog."
5131 +msgid ""
5132 +"Default location for the \"Open...\" dialogs. Default is the current "
5133 +"directory."
5134 +msgstr ""
5135 +"Domyślne położenie dla okien dialogowych \"Otwórz...\". Domyślnie jest to "
5136 +"bieżący katalog."
5138 #: ../data/org.gnome.totem.gschema.xml.in.in.h:9
5139 msgid "Default location for the \"Take Screenshot\" dialogs"
5140 msgstr "Domyślne położenie dla okien dialogowych \"Pobierz zrzut ekranu\""
5142 #: ../data/org.gnome.totem.gschema.xml.in.in.h:10
5143 -msgid "Default location for the \"Take Screenshot\" dialogs. Default is the Pictures directory."
5144 -msgstr "Domyślne położenie dla okien dialogowych \"Pobierz zrzut ekranu\". Domyślnie jest to katalog Obrazy."
5145 +msgid ""
5146 +"Default location for the \"Take Screenshot\" dialogs. Default is the "
5147 +"Pictures directory."
5148 +msgstr ""
5149 +"Domyślne położenie dla okien dialogowych \"Pobierz zrzut ekranu\". Domyślnie "
5150 +"jest to katalog Obrazy."
5152 #: ../data/org.gnome.totem.gschema.xml.in.in.h:11
5153 msgid "Encoding character set for subtitle."
5154 @@ -855,7 +866,8 @@ msgstr "Efekty wizualne przy braku obrazu"
5156 #: ../data/org.gnome.totem.gschema.xml.in.in.h:20
5157 msgid "Show visual effects when playing an audio only file."
5158 -msgstr "Wyświetlanie efektów wizualnych podczas odtwarzania plików dźwiękowych."
5159 +msgstr ""
5160 +"Wyświetlanie efektów wizualnych podczas odtwarzania plików dźwiękowych."
5162 #: ../data/org.gnome.totem.gschema.xml.in.in.h:21
5163 msgid "Shuffle mode"
5164 @@ -895,11 +907,15 @@ msgstr "Ustawienia jakości wizualizacji"
5166 #: ../data/org.gnome.totem.gschema.xml.in.in.h:30
5167 msgid "Whether to autoload external chapter files when a movie is loaded"
5168 -msgstr "Określa, czy automatycznie wczytywać zewnętrzne pliki rozdziałów podczas wczytywania nagrania wideo"
5169 +msgstr ""
5170 +"Określa, czy automatycznie wczytywać zewnętrzne pliki rozdziałów podczas "
5171 +"wczytywania nagrania wideo"
5173 #: ../data/org.gnome.totem.gschema.xml.in.in.h:31
5174 msgid "Whether to autoload text subtitle files when a movie is loaded"
5175 -msgstr "Określa, czy automatycznie wczytywać plik z napisami podczas wczytywania nagrania wideo"
5176 +msgstr ""
5177 +"Określa, czy automatycznie wczytywać plik z napisami podczas wczytywania "
5178 +"nagrania wideo"
5180 #: ../data/org.gnome.totem.gschema.xml.in.in.h:32
5181 msgid "Whether to disable deinterlacing for interlaced movies"
5182 @@ -911,15 +927,20 @@ msgstr "Określa, czy wyłączyć skróty klawiszowe"
5184 #: ../data/org.gnome.totem.gschema.xml.in.in.h:34
5185 msgid "Whether to disable the plugins in the user's home directory"
5186 -msgstr "Określa, czy wyłączyć wtyczki znajdujące się w katalogu domowym użytkownika"
5187 +msgstr ""
5188 +"Określa, czy wyłączyć wtyczki znajdujące się w katalogu domowym użytkownika"
5190 #: ../data/org.gnome.totem.gschema.xml.in.in.h:35
5191 msgid "Whether to enable debug for the playback engine"
5192 msgstr "Określa, czy włączyć dodatkowe informacje dla mechanizmu odtwarzania"
5194 #: ../data/org.gnome.totem.gschema.xml.in.in.h:36
5195 -msgid "Whether to remember the position of played audio/video files when pausing or closing them"
5196 -msgstr "Określa, czy zapamiętywać położenie plików dźwiękowych i nagrań wideo przy wstrzymaniu odtwarzania lub ich zamknięciu"
5197 +msgid ""
5198 +"Whether to remember the position of played audio/video files when pausing or "
5199 +"closing them"
5200 +msgstr ""
5201 +"Określa, czy zapamiętywać położenie plików dźwiękowych i nagrań wideo przy "
5202 +"wstrzymaniu odtwarzania lub ich zamknięciu"
5204 #: ../data/uri.ui.h:1
5205 msgid "Enter the _address of the file you would like to open:"
5206 @@ -953,45 +974,53 @@ msgstr "Nierozpoznana opcja uruchamiania: %d"
5207 #: ../src/eggdesktopfile.c:1383
5208 #, c-format
5209 msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
5210 -msgstr "Nie można przekazać adresu URI dokumentu do wpisu \"Type=Link\" pliku .desktop"
5211 +msgstr ""
5212 +"Nie można przekazać adresu URI dokumentu do wpisu \"Type=Link\" pliku ."
5213 +"desktop"
5215 #: ../src/eggdesktopfile.c:1404
5216 #, c-format
5217 msgid "Not a launchable item"
5218 msgstr "Nie można uruchomić elementu"
5220 -#: ../src/eggfileformatchooser.c:235
5221 +#: ../src/eggfileformatchooser.c:240
5222 #, c-format
5223 msgid "File _Format: %s"
5224 msgstr "_Format pliku: %s"
5226 -#: ../src/eggfileformatchooser.c:374
5227 +#: ../src/eggfileformatchooser.c:379
5228 msgid "All Files"
5229 msgstr "Wszystkie pliki"
5231 -#: ../src/eggfileformatchooser.c:375
5232 +#: ../src/eggfileformatchooser.c:380
5233 msgid "All Supported Files"
5234 msgstr "Wszystkie obsługiwane pliki"
5236 -#: ../src/eggfileformatchooser.c:384
5237 +#: ../src/eggfileformatchooser.c:389
5238 msgid "By Extension"
5239 msgstr "Według rozszerzenia"
5241 -#: ../src/eggfileformatchooser.c:399
5242 +#: ../src/eggfileformatchooser.c:404
5243 msgid "File Format"
5244 msgstr "Format pliku"
5246 -#: ../src/eggfileformatchooser.c:417
5247 +#: ../src/eggfileformatchooser.c:422
5248 msgid "Extension(s)"
5249 msgstr "Rozszerzenia"
5251 #. Translators: the parameter is a filename
5252 -#: ../src/eggfileformatchooser.c:652
5253 +#: ../src/eggfileformatchooser.c:657
5254 #, c-format
5255 -msgid "The program was not able to find out the file format you want to use for `%s'. Please make sure to use a known extension for that file or manually choose a file format from the list below."
5256 -msgstr "Program nie mógł odnaleźć formatu pliku do użycia dla \"%s\". Proszę się upewnić, że używane jest znane rozszerzenie dla tego pliku lub wybrać format pliku ręcznie z poniższej listy."
5257 +msgid ""
5258 +"The program was not able to find out the file format you want to use for `"
5259 +"%s'. Please make sure to use a known extension for that file or manually "
5260 +"choose a file format from the list below."
5261 +msgstr ""
5262 +"Program nie mógł odnaleźć formatu pliku do użycia dla \"%s\". Proszę się "
5263 +"upewnić, że używane jest znane rozszerzenie dla tego pliku lub wybrać format "
5264 +"pliku ręcznie z poniższej listy."
5266 -#: ../src/eggfileformatchooser.c:659
5267 +#: ../src/eggfileformatchooser.c:664
5268 msgid "File format not recognized"
5269 msgstr "Format pliku nie został rozpoznany"
5271 @@ -1092,12 +1121,11 @@ msgstr "_Odtwarzaj teraz"
5272 msgid "Cancel"
5273 msgstr "Anuluj"
5275 -#: ../src/totem-fullscreen.c:617
5276 +#: ../src/totem-fullscreen.c:619
5277 msgid "No File"
5278 msgstr "Brak pliku"
5280 -#: ../src/totem-interface.c:180
5281 -#: ../src/totem-interface.c:223
5282 +#: ../src/totem-interface.c:180 ../src/totem-interface.c:223
5283 #, c-format
5284 msgid "Couldn't load the '%s' interface. %s"
5285 msgstr "Nie można wczytać interfejsu \"%s\". %s"
5286 @@ -1106,28 +1134,53 @@ msgstr "Nie można wczytać interfejsu \"%s\". %s"
5287 msgid "The file does not exist."
5288 msgstr "Plik nie istnieje."
5290 -#: ../src/totem-interface.c:182
5291 -#: ../src/totem-interface.c:184
5292 -#: ../src/totem-interface.c:225
5293 -#: ../src/totem-interface.c:227
5294 +#: ../src/totem-interface.c:182 ../src/totem-interface.c:184
5295 +#: ../src/totem-interface.c:225 ../src/totem-interface.c:227
5296 msgid "Make sure that Totem is properly installed."
5297 msgstr "Proszę się upewnić, że program Totem został poprawnie zainstalowany."
5299 #: ../src/totem-interface.c:346
5300 -msgid "Totem is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version."
5301 -msgstr "Program Totem jest wolnym oprogramowaniem; można go rozprowadzać dalej i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundację Wolnego Oprogramowania (Free Software Foundation) - według wersji drugiej tej Licencji lub którejś z późniejszych wersji."
5302 +msgid ""
5303 +"Totem is free software; you can redistribute it and/or modify it under the "
5304 +"terms of the GNU General Public License as published by the Free Software "
5305 +"Foundation; either version 2 of the License, or (at your option) any later "
5306 +"version."
5307 +msgstr ""
5308 +"Program Totem jest wolnym oprogramowaniem; można go rozprowadzać dalej i/lub "
5309 +"modyfikować na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez "
5310 +"Fundację Wolnego Oprogramowania (Free Software Foundation) - według wersji "
5311 +"drugiej tej Licencji lub którejś z późniejszych wersji."
5313 #: ../src/totem-interface.c:350
5314 -msgid "Totem is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details."
5315 -msgstr "Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. W celu uzyskania bliższych informacji należy zapoznać się z Powszechną Licencją Publiczną GNU."
5316 +msgid ""
5317 +"Totem is distributed in the hope that it will be useful, but WITHOUT ANY "
5318 +"WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
5319 +"FOR A PARTICULAR PURPOSE. See the GNU General Public License for more "
5320 +"details."
5321 +msgstr ""
5322 +"Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - "
5323 +"jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI "
5324 +"HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. W celu uzyskania "
5325 +"bliższych informacji należy zapoznać się z Powszechną Licencją Publiczną GNU."
5327 #: ../src/totem-interface.c:354
5328 -msgid "You should have received a copy of the GNU General Public License along with Totem; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
5329 -msgstr "Z pewnością wraz z niniejszym programem dostarczono także egzemplarz Powszechnej Licencji Publicznej GNU (GNU General Public License); jeśli nie - proszę napisać do Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-130159 USA."
5330 +msgid ""
5331 +"You should have received a copy of the GNU General Public License along with "
5332 +"Totem; if not, write to the Free Software Foundation, Inc., 59 Temple Place, "
5333 +"Suite 330, Boston, MA 02111-1307 USA"
5334 +msgstr ""
5335 +"Z pewnością wraz z niniejszym programem dostarczono także egzemplarz "
5336 +"Powszechnej Licencji Publicznej GNU (GNU General Public License); jeśli nie "
5337 +"- proszę napisać do Free Software Foundation, Inc., 51 Franklin Street, "
5338 +"Fifth Floor, Boston, MA 02110-130159 USA."
5340 #: ../src/totem-interface.c:357
5341 -msgid "Totem contains an exception to allow the use of proprietary GStreamer plugins."
5342 -msgstr "Program Totem zawiera wyjątek pozwalający na używanie własnościowych wtyczek biblioteki GStreamer."
5343 +msgid ""
5344 +"Totem contains an exception to allow the use of proprietary GStreamer "
5345 +"plugins."
5346 +msgstr ""
5347 +"Program Totem zawiera wyjątek pozwalający na używanie własnościowych wtyczek "
5348 +"biblioteki GStreamer."
5350 #. Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD
5351 #: ../src/totem-menu.c:192
5352 @@ -1143,43 +1196,41 @@ msgstr "Automatyczny"
5353 #. Translators:
5354 #. * This is not a JPEG image, but a disc image, for example,
5355 #. * an ISO file
5356 -#: ../src/totem-menu.c:739
5357 +#: ../src/totem-menu.c:767
5358 #, c-format
5359 msgid "Play Image '%s'"
5360 msgstr "Odtwarzaj obraz \"%s\""
5362 -#: ../src/totem-menu.c:742
5363 -#: ../src/totem-menu.c:824
5364 +#: ../src/totem-menu.c:770 ../src/totem-menu.c:853
5365 #, c-format
5366 msgid "device%d"
5367 msgstr "urządzenie%d"
5369 -#: ../src/totem-menu.c:821
5370 +#: ../src/totem-menu.c:850
5371 #, c-format
5372 msgid "Play Disc '%s'"
5373 msgstr "Odtwarzaj płytę \"%s\""
5375 #. This lists the back-end type and version, such as
5376 #. * Movie Player using GStreamer 0.10.1
5377 -#: ../src/totem-menu.c:1172
5378 +#: ../src/totem-menu.c:1201
5379 #, c-format
5380 msgid "Movie Player using %s"
5381 msgstr "Odtwarzacz filmów używający biblioteki %s"
5383 -#: ../src/totem-menu.c:1176
5384 +#: ../src/totem-menu.c:1205
5385 msgid "Copyright © 2002-2009 Bastien Nocera"
5386 msgstr "Copyright © 2002-2009 Bastien Nocera"
5388 -#: ../src/totem-menu.c:1181
5389 -#: ../browser-plugin/totem-plugin-viewer.c:1166
5390 +#: ../src/totem-menu.c:1210 ../browser-plugin/totem-plugin-viewer.c:1163
5391 msgid "translator-credits"
5392 msgstr "Aviary.pl <gnomepl@aviary.pl>, 2007, 2008, 2009, 2010, 2011"
5394 -#: ../src/totem-menu.c:1185
5395 +#: ../src/totem-menu.c:1214
5396 msgid "Totem Website"
5397 msgstr "Witryna programu Totem"
5399 -#: ../src/totem-menu.c:1219
5400 +#: ../src/totem-menu.c:1248
5401 msgid "Configure Plugins"
5402 msgstr "Konfiguracja wtyczek"
5404 @@ -1189,76 +1240,90 @@ msgstr "Konfiguracja wtyczek"
5405 msgid "Totem %s"
5406 msgstr "Totem %s"
5408 -#: ../src/totem-object.c:1046
5409 -#: ../browser-plugin/totem-plugin-viewer.c:368
5410 +#: ../src/totem-object.c:1046 ../browser-plugin/totem-plugin-viewer.c:368
5411 msgid "Playing"
5412 -msgstr "Odtwarza"
5413 +msgstr "Odtwarzanie"
5415 -#: ../src/totem-object.c:1048
5416 -#: ../src/totem-options.c:52
5417 +#: ../src/totem-object.c:1048 ../src/totem-options.c:52
5418 msgid "Pause"
5419 msgstr "Wstrzymuje"
5421 -#: ../src/totem-object.c:1053
5422 -#: ../browser-plugin/totem-plugin-viewer.c:364
5423 +#: ../src/totem-object.c:1053 ../browser-plugin/totem-plugin-viewer.c:364
5424 msgid "Paused"
5425 msgstr "Wstrzymano"
5427 #. Translators: this refers to a media file
5428 -#: ../src/totem-object.c:1055
5429 -#: ../src/totem-object.c:1065
5430 +#: ../src/totem-object.c:1055 ../src/totem-object.c:1065
5431 #: ../src/totem-options.c:51
5432 #: ../src/plugins/coherence_upnp/coherence_upnp.py:84
5433 #: ../src/plugins/coherence_upnp/coherence_upnp.py:96
5434 msgid "Play"
5435 msgstr "Odtwarzanie"
5437 -#: ../src/totem-object.c:1060
5438 -#: ../src/totem-object.c:1658
5439 -#: ../src/totem-statusbar.c:115
5440 -#: ../browser-plugin/totem-plugin-viewer.c:352
5441 +#: ../src/totem-object.c:1060 ../src/totem-object.c:1658
5442 +#: ../src/totem-statusbar.c:115 ../browser-plugin/totem-plugin-viewer.c:352
5443 msgid "Stopped"
5444 msgstr "Zatrzymano"
5446 -#: ../src/totem-object.c:1141
5447 -#: ../src/totem-object.c:1168
5448 -#: ../src/totem-object.c:1796
5449 -#: ../src/totem-object.c:1959
5450 +#: ../src/totem-object.c:1141 ../src/totem-object.c:1168
5451 +#: ../src/totem-object.c:1798 ../src/totem-object.c:1962
5452 #, c-format
5453 msgid "Totem could not play '%s'."
5454 msgstr "Program Totem nie może odtworzyć \"%s\"."
5456 #: ../src/totem-object.c:1245
5457 #, c-format
5458 -msgid "Totem could not play this media (%s) although a plugin is present to handle it."
5459 -msgstr "Program Totem nie może odtworzyć tego nośnika (%s), mimo że w systemie obecna jest odpowiednia wtyczka."
5460 +msgid ""
5461 +"Totem could not play this media (%s) although a plugin is present to handle "
5462 +"it."
5463 +msgstr ""
5464 +"Program Totem nie może odtworzyć tego nośnika (%s), mimo że w systemie "
5465 +"obecna jest odpowiednia wtyczka."
5467 #: ../src/totem-object.c:1246
5468 -msgid "You might want to check that a disc is present in the drive and that it is correctly configured."
5469 -msgstr "Proszę sprawdzić, czy płyta znajduje się w napędzie i czy napęd jest prawidłowo skonfigurowany."
5470 +msgid ""
5471 +"You might want to check that a disc is present in the drive and that it is "
5472 +"correctly configured."
5473 +msgstr ""
5474 +"Proszę sprawdzić, czy płyta znajduje się w napędzie i czy napęd jest "
5475 +"prawidłowo skonfigurowany."
5477 #: ../src/totem-object.c:1254
5478 msgid "More information about media plugins"
5479 msgstr "Więcej informacji na temat wtyczek multimediów"
5481 #: ../src/totem-object.c:1255
5482 -msgid "Please install the necessary plugins and restart Totem to be able to play this media."
5483 -msgstr "Aby odtworzyć ten nośnik należy zainstalować odpowiednie wtyczki i ponownie uruchomić program."
5484 +msgid ""
5485 +"Please install the necessary plugins and restart Totem to be able to play "
5486 +"this media."
5487 +msgstr ""
5488 +"Aby odtworzyć ten nośnik należy zainstalować odpowiednie wtyczki i ponownie "
5489 +"uruchomić program."
5491 #: ../src/totem-object.c:1257
5492 #, c-format
5493 -msgid "Totem cannot play this type of media (%s) because it does not have the appropriate plugins to be able to read from the disc."
5494 -msgstr "Program Totem nie może odtworzyć tego typu nośnika (%s), ponieważ nie zainstalowano wtyczek obsługujących ten format."
5495 +msgid ""
5496 +"Totem cannot play this type of media (%s) because it does not have the "
5497 +"appropriate plugins to be able to read from the disc."
5498 +msgstr ""
5499 +"Program Totem nie może odtworzyć tego typu nośnika (%s), ponieważ nie "
5500 +"zainstalowano wtyczek obsługujących ten format."
5502 #: ../src/totem-object.c:1259
5503 #, c-format
5504 -msgid "Totem cannot play this type of media (%s) because you do not have the appropriate plugins to handle it."
5505 -msgstr "Program Totem nie może odtworzyć tego typu nośnika (%s), ponieważ nie zainstalowano wtyczek obsługujących ten format."
5506 +msgid ""
5507 +"Totem cannot play this type of media (%s) because you do not have the "
5508 +"appropriate plugins to handle it."
5509 +msgstr ""
5510 +"Program Totem nie może odtworzyć tego typu nośnika (%s), ponieważ nie "
5511 +"zainstalowano wtyczek obsługujących ten format."
5513 #: ../src/totem-object.c:1262
5514 #, c-format
5515 msgid "Totem cannot play this type of media (%s) because it is not supported."
5516 -msgstr "Program Totem nie może odtworzyć tego typu nośnika (%s), ponieważ nie jest on obsługiwany."
5517 +msgstr ""
5518 +"Program Totem nie może odtworzyć tego typu nośnika (%s), ponieważ nie jest "
5519 +"on obsługiwany."
5521 #: ../src/totem-object.c:1263
5522 msgid "Please insert another disc to play back."
5523 @@ -1268,8 +1333,7 @@ msgstr "Proszę wsunąć następną płytę, aby odtwarzać."
5524 msgid "Totem was not able to play this disc."
5525 msgstr "Program Totem nie może odtworzyć tej płyty."
5527 -#: ../src/totem-object.c:1300
5528 -#: ../src/totem-object.c:4273
5529 +#: ../src/totem-object.c:1300 ../src/totem-object.c:4280
5530 msgid "No reason."
5531 msgstr "Brak powodu."
5533 @@ -1279,49 +1343,46 @@ msgstr "Program Totem nie obsługuje odtwarzania płyt CD-Audio"
5535 #: ../src/totem-object.c:1315
5536 msgid "Please consider using a music player or a CD extractor to play this CD"
5537 -msgstr "Proszę skorzystać z odtwarzacza muzyki lub zgrywarki CD-Audio do odtworzenia tej płyty CD"
5538 +msgstr ""
5539 +"Proszę skorzystać z odtwarzacza muzyki lub zgrywarki CD-Audio do odtworzenia "
5540 +"tej płyty CD"
5542 -#: ../src/totem-object.c:1802
5543 +#: ../src/totem-object.c:1804
5544 msgid "No error message"
5545 msgstr "Brak komunikatu błędu"
5547 -#: ../src/totem-object.c:2194
5548 +#: ../src/totem-object.c:2197
5549 msgid "Totem could not display the help contents."
5550 msgstr "Nie można wyświetlić spisu treści pomocy programu Totem."
5552 -#: ../src/totem-object.c:2532
5553 -#: ../src/totem-object.c:2534
5554 -#: ../browser-plugin/totem-plugin-viewer.c:1469
5555 +#: ../src/totem-object.c:2535 ../src/totem-object.c:2537
5556 +#: ../browser-plugin/totem-plugin-viewer.c:1466
5557 msgid "An error occurred"
5558 msgstr "Wystąpił błąd"
5560 -#: ../src/totem-object.c:4107
5561 -#: ../src/totem-object.c:4109
5562 +#: ../src/totem-object.c:4114 ../src/totem-object.c:4116
5563 msgid "Previous Chapter/Movie"
5564 msgstr "Poprzedni rozdział/film"
5566 -#: ../src/totem-object.c:4116
5567 -#: ../src/totem-object.c:4118
5568 +#: ../src/totem-object.c:4123 ../src/totem-object.c:4125
5569 msgid "Play / Pause"
5570 msgstr "Odtwarza/wstrzymuje"
5572 -#: ../src/totem-object.c:4126
5573 -#: ../src/totem-object.c:4128
5574 +#: ../src/totem-object.c:4133 ../src/totem-object.c:4135
5575 msgid "Next Chapter/Movie"
5576 msgstr "Następny rozdział/film"
5578 #. Translators: this is the tooltip text for the fullscreen button in the controls box in Totem's main window.
5579 #. Translators: this is the accessibility text for the fullscreen button in the controls box in Totem's main window.
5580 -#: ../src/totem-object.c:4140
5581 -#: ../src/totem-object.c:4142
5582 +#: ../src/totem-object.c:4147 ../src/totem-object.c:4149
5583 msgid "Fullscreen"
5584 msgstr "Pełny ekran"
5586 -#: ../src/totem-object.c:4273
5587 +#: ../src/totem-object.c:4280
5588 msgid "Totem could not startup."
5589 msgstr "Nie można uruchomić programu Totem."
5591 -#: ../src/totem-open-location.c:179
5592 +#: ../src/totem-open-location.c:182
5593 msgid "Open Location..."
5594 msgstr "Otwarcie położenia"
5596 @@ -1402,76 +1463,62 @@ msgid "Can't enqueue and replace at the same time"
5597 msgstr "Nie można równocześnie dodać do kolejki i zamienić pliku"
5599 #. By extension entry
5600 -#: ../src/totem-playlist.c:157
5601 +#: ../src/totem-playlist.c:161
5602 msgid "MP3 ShoutCast playlist"
5603 msgstr "Lista odtwarzania ShoutCast MP3"
5605 -#: ../src/totem-playlist.c:158
5606 +#: ../src/totem-playlist.c:162
5607 msgid "MP3 audio (streamed)"
5608 msgstr "Dźwięk MP3 (strumień)"
5610 -#: ../src/totem-playlist.c:159
5611 +#: ../src/totem-playlist.c:163
5612 msgid "MP3 audio (streamed, DOS format)"
5613 msgstr "Dźwięk MP3 (strumień, format DOS)"
5615 -#: ../src/totem-playlist.c:160
5616 +#: ../src/totem-playlist.c:164
5617 msgid "XML Shareable Playlist"
5618 msgstr "Współdzielona lista odtwarzania XML"
5620 #. This is "Title 3", where title is a DVD title
5621 #. * Note: NOT a DVD chapter
5622 -#: ../src/totem-playlist.c:359
5623 +#: ../src/totem-playlist.c:363
5624 #, c-format
5625 msgid "Title %d"
5626 msgstr "Tytuł %d"
5628 -#: ../src/totem-playlist.c:458
5629 +#: ../src/totem-playlist.c:462
5630 msgid "Could not save the playlist"
5631 msgstr "Nie można zapisać listy odtwarzania"
5633 -#: ../src/totem-playlist.c:1033
5634 +#: ../src/totem-playlist.c:1037
5635 msgid "Save Playlist"
5636 msgstr "Zapis listy odtwarzania"
5638 #. translators: Playlist is the default saved playlist filename,
5639 #. * without the suffix
5640 -#: ../src/totem-playlist.c:1045
5641 -#: ../src/totem-sidebar.c:140
5642 +#: ../src/totem-playlist.c:1049 ../src/totem-sidebar.c:140
5643 msgid "Playlist"
5644 msgstr "Lista odtwarzania"
5646 -#: ../src/totem-playlist.c:1862
5647 +#: ../src/totem-playlist.c:1869
5648 #, c-format
5649 msgid "The playlist '%s' could not be parsed. It might be damaged."
5650 msgstr "Nie można przetworzyć listy odtwarzania \"%s\". Może być uszkodzona."
5652 -#: ../src/totem-playlist.c:1863
5653 +#: ../src/totem-playlist.c:1870
5654 msgid "Playlist error"
5655 msgstr "Błąd listy odtwarzania"
5657 -#: ../src/totem-preferences.c:66
5658 -msgid "Enable visual effects?"
5659 -msgstr "Włączyć efekty wizualne?"
5661 -#: ../src/totem-preferences.c:68
5662 -msgid ""
5663 -"It seems you are running Totem remotely.\n"
5664 -"Are you sure you want to enable the visual effects?"
5665 -msgstr ""
5666 -"Prawdopodobnie program Totem jest uruchomiony zdalnie.\n"
5667 -"Na pewno włączyć efekty wizualne?"
5669 -#: ../src/totem-preferences.c:332
5670 +#: ../src/totem-preferences.c:295
5671 msgid "Preferences"
5672 msgstr "Preferencje"
5674 -#: ../src/totem-preferences.c:490
5675 +#: ../src/totem-preferences.c:451
5676 msgid "Select Subtitle Font"
5677 msgstr "Wybór czcionki napisów"
5679 #. FIXME this should be setting an error?
5680 -#: ../src/totem-properties-main.c:114
5681 -#: ../src/totem-properties-view.c:83
5682 +#: ../src/totem-properties-main.c:114 ../src/totem-properties-view.c:83
5683 #: ../src/totem-properties-view.c:91
5684 msgid "Audio/Video"
5685 msgstr "Dźwięk/obraz"
5686 @@ -1486,15 +1533,13 @@ msgid "%s (Streaming)"
5687 msgstr "%s (strumień)"
5689 #. Elapsed / Total Length
5690 -#: ../src/totem-statusbar.c:140
5691 -#: ../src/totem-time-label.c:64
5692 +#: ../src/totem-statusbar.c:140 ../src/totem-time-label.c:64
5693 #, c-format
5694 msgid "%s / %s"
5695 msgstr "%s / %s"
5697 #. Seeking to Time / Total Length
5698 -#: ../src/totem-statusbar.c:143
5699 -#: ../src/totem-time-label.c:67
5700 +#: ../src/totem-statusbar.c:143 ../src/totem-time-label.c:67
5701 #, c-format
5702 msgid "Seek to %s / %s"
5703 msgstr "Przechodzenie do %s / %s"
5704 @@ -1525,10 +1570,8 @@ msgstr "%s, %d %%"
5705 msgid "Current Locale"
5706 msgstr "Bieżące ustawienia lokalne"
5708 -#: ../src/totem-subtitle-encoding.c:159
5709 -#: ../src/totem-subtitle-encoding.c:161
5710 -#: ../src/totem-subtitle-encoding.c:163
5711 -#: ../src/totem-subtitle-encoding.c:165
5712 +#: ../src/totem-subtitle-encoding.c:159 ../src/totem-subtitle-encoding.c:161
5713 +#: ../src/totem-subtitle-encoding.c:163 ../src/totem-subtitle-encoding.c:165
5714 msgid "Arabic"
5715 msgstr "Arabskie"
5717 @@ -1536,8 +1579,7 @@ msgstr "Arabskie"
5718 msgid "Armenian"
5719 msgstr "Armeńskie"
5721 -#: ../src/totem-subtitle-encoding.c:171
5722 -#: ../src/totem-subtitle-encoding.c:173
5723 +#: ../src/totem-subtitle-encoding.c:171 ../src/totem-subtitle-encoding.c:173
5724 #: ../src/totem-subtitle-encoding.c:175
5725 msgid "Baltic"
5726 msgstr "Bałtyckie"
5727 @@ -1546,22 +1588,17 @@ msgstr "Bałtyckie"
5728 msgid "Celtic"
5729 msgstr "Celtyckie"
5731 -#: ../src/totem-subtitle-encoding.c:181
5732 -#: ../src/totem-subtitle-encoding.c:183
5733 -#: ../src/totem-subtitle-encoding.c:185
5734 -#: ../src/totem-subtitle-encoding.c:187
5735 +#: ../src/totem-subtitle-encoding.c:181 ../src/totem-subtitle-encoding.c:183
5736 +#: ../src/totem-subtitle-encoding.c:185 ../src/totem-subtitle-encoding.c:187
5737 msgid "Central European"
5738 msgstr "Środkowoeuropejskie"
5740 -#: ../src/totem-subtitle-encoding.c:190
5741 -#: ../src/totem-subtitle-encoding.c:192
5742 -#: ../src/totem-subtitle-encoding.c:194
5743 -#: ../src/totem-subtitle-encoding.c:196
5744 +#: ../src/totem-subtitle-encoding.c:190 ../src/totem-subtitle-encoding.c:192
5745 +#: ../src/totem-subtitle-encoding.c:194 ../src/totem-subtitle-encoding.c:196
5746 msgid "Chinese Simplified"
5747 msgstr "Chińskie uproszczone"
5749 -#: ../src/totem-subtitle-encoding.c:199
5750 -#: ../src/totem-subtitle-encoding.c:201
5751 +#: ../src/totem-subtitle-encoding.c:199 ../src/totem-subtitle-encoding.c:201
5752 #: ../src/totem-subtitle-encoding.c:203
5753 msgid "Chinese Traditional"
5754 msgstr "Chińskie tradycyjne"
5755 @@ -1570,12 +1607,9 @@ msgstr "Chińskie tradycyjne"
5756 msgid "Croatian"
5757 msgstr "Chorwackie"
5759 -#: ../src/totem-subtitle-encoding.c:209
5760 -#: ../src/totem-subtitle-encoding.c:211
5761 -#: ../src/totem-subtitle-encoding.c:213
5762 -#: ../src/totem-subtitle-encoding.c:215
5763 -#: ../src/totem-subtitle-encoding.c:217
5764 -#: ../src/totem-subtitle-encoding.c:219
5765 +#: ../src/totem-subtitle-encoding.c:209 ../src/totem-subtitle-encoding.c:211
5766 +#: ../src/totem-subtitle-encoding.c:213 ../src/totem-subtitle-encoding.c:215
5767 +#: ../src/totem-subtitle-encoding.c:217 ../src/totem-subtitle-encoding.c:219
5768 msgid "Cyrillic"
5769 msgstr "Cyrylica"
5771 @@ -1583,8 +1617,7 @@ msgstr "Cyrylica"
5772 msgid "Cyrillic/Russian"
5773 msgstr "Cyrylica/rosyjskie"
5775 -#: ../src/totem-subtitle-encoding.c:225
5776 -#: ../src/totem-subtitle-encoding.c:227
5777 +#: ../src/totem-subtitle-encoding.c:225 ../src/totem-subtitle-encoding.c:227
5778 msgid "Cyrillic/Ukrainian"
5779 msgstr "Cyrylica/ukraińskie"
5781 @@ -1592,8 +1625,7 @@ msgstr "Cyrylica/ukraińskie"
5782 msgid "Georgian"
5783 msgstr "Gruzińskie"
5785 -#: ../src/totem-subtitle-encoding.c:233
5786 -#: ../src/totem-subtitle-encoding.c:235
5787 +#: ../src/totem-subtitle-encoding.c:233 ../src/totem-subtitle-encoding.c:235
5788 #: ../src/totem-subtitle-encoding.c:237
5789 msgid "Greek"
5790 msgstr "Greckie"
5791 @@ -1606,10 +1638,8 @@ msgstr "Gudżarati"
5792 msgid "Gurmukhi"
5793 msgstr "Gurmukhi"
5795 -#: ../src/totem-subtitle-encoding.c:246
5796 -#: ../src/totem-subtitle-encoding.c:248
5797 -#: ../src/totem-subtitle-encoding.c:250
5798 -#: ../src/totem-subtitle-encoding.c:252
5799 +#: ../src/totem-subtitle-encoding.c:246 ../src/totem-subtitle-encoding.c:248
5800 +#: ../src/totem-subtitle-encoding.c:250 ../src/totem-subtitle-encoding.c:252
5801 msgid "Hebrew"
5802 msgstr "Hebrajskie"
5804 @@ -1625,16 +1655,13 @@ msgstr "Hindi"
5805 msgid "Icelandic"
5806 msgstr "Islandzkie"
5808 -#: ../src/totem-subtitle-encoding.c:264
5809 -#: ../src/totem-subtitle-encoding.c:266
5810 +#: ../src/totem-subtitle-encoding.c:264 ../src/totem-subtitle-encoding.c:266
5811 #: ../src/totem-subtitle-encoding.c:268
5812 msgid "Japanese"
5813 msgstr "Japońskie"
5815 -#: ../src/totem-subtitle-encoding.c:271
5816 -#: ../src/totem-subtitle-encoding.c:273
5817 -#: ../src/totem-subtitle-encoding.c:275
5818 -#: ../src/totem-subtitle-encoding.c:277
5819 +#: ../src/totem-subtitle-encoding.c:271 ../src/totem-subtitle-encoding.c:273
5820 +#: ../src/totem-subtitle-encoding.c:275 ../src/totem-subtitle-encoding.c:277
5821 msgid "Korean"
5822 msgstr "Koreańskie"
5824 @@ -1646,8 +1673,7 @@ msgstr "Nordyckie"
5825 msgid "Persian"
5826 msgstr "Perskie"
5828 -#: ../src/totem-subtitle-encoding.c:286
5829 -#: ../src/totem-subtitle-encoding.c:288
5830 +#: ../src/totem-subtitle-encoding.c:286 ../src/totem-subtitle-encoding.c:288
5831 msgid "Romanian"
5832 msgstr "Rumuńskie"
5834 @@ -1659,31 +1685,24 @@ msgstr "Południowoeuropejskie"
5835 msgid "Thai"
5836 msgstr "Tajskie"
5838 -#: ../src/totem-subtitle-encoding.c:297
5839 -#: ../src/totem-subtitle-encoding.c:299
5840 -#: ../src/totem-subtitle-encoding.c:301
5841 -#: ../src/totem-subtitle-encoding.c:303
5842 +#: ../src/totem-subtitle-encoding.c:297 ../src/totem-subtitle-encoding.c:299
5843 +#: ../src/totem-subtitle-encoding.c:301 ../src/totem-subtitle-encoding.c:303
5844 msgid "Turkish"
5845 msgstr "Tureckie"
5847 -#: ../src/totem-subtitle-encoding.c:306
5848 -#: ../src/totem-subtitle-encoding.c:308
5849 -#: ../src/totem-subtitle-encoding.c:310
5850 -#: ../src/totem-subtitle-encoding.c:312
5851 +#: ../src/totem-subtitle-encoding.c:306 ../src/totem-subtitle-encoding.c:308
5852 +#: ../src/totem-subtitle-encoding.c:310 ../src/totem-subtitle-encoding.c:312
5853 #: ../src/totem-subtitle-encoding.c:314
5854 msgid "Unicode"
5855 msgstr "Unikod"
5857 -#: ../src/totem-subtitle-encoding.c:317
5858 -#: ../src/totem-subtitle-encoding.c:319
5859 -#: ../src/totem-subtitle-encoding.c:321
5860 -#: ../src/totem-subtitle-encoding.c:323
5861 +#: ../src/totem-subtitle-encoding.c:317 ../src/totem-subtitle-encoding.c:319
5862 +#: ../src/totem-subtitle-encoding.c:321 ../src/totem-subtitle-encoding.c:323
5863 #: ../src/totem-subtitle-encoding.c:325
5864 msgid "Western"
5865 msgstr "Zachodnie"
5867 -#: ../src/totem-subtitle-encoding.c:328
5868 -#: ../src/totem-subtitle-encoding.c:330
5869 +#: ../src/totem-subtitle-encoding.c:328 ../src/totem-subtitle-encoding.c:330
5870 #: ../src/totem-subtitle-encoding.c:332
5871 msgid "Vietnamese"
5872 msgstr "Wietnamskie"
5873 @@ -1695,7 +1714,7 @@ msgstr "Brak adresu URI nagrania wideo"
5874 #. Translators: The first string is "Filename" (as translated); the second is an actual filename.
5875 #. The third string is "Resolution" (as translated); the fourth and fifth are screenshot height and width, respectively.
5876 #. The sixth string is "Duration" (as translated); the seventh is the movie duration in words.
5877 -#: ../src/totem-video-thumbnailer.c:679
5878 +#: ../src/totem-video-thumbnailer.c:689
5879 #, c-format
5880 msgid ""
5881 "<b>%s</b>: %s\n"
5882 @@ -1706,45 +1725,43 @@ msgstr ""
5883 "<b>%s</b>: %d×%d\n"
5884 "<b>%s</b>: %s"
5886 -#: ../src/totem-video-thumbnailer.c:680
5887 +#: ../src/totem-video-thumbnailer.c:690
5888 msgid "Filename"
5889 msgstr "Nazwa pliku"
5891 -#: ../src/totem-video-thumbnailer.c:682
5892 +#: ../src/totem-video-thumbnailer.c:692
5893 msgid "Resolution"
5894 msgstr "Rozdzielczość"
5896 -#: ../src/totem-video-thumbnailer.c:685
5897 +#: ../src/totem-video-thumbnailer.c:695
5898 msgid "Duration"
5899 msgstr "Czas trwania"
5901 -#: ../src/totem-uri.c:502
5902 -#: ../src/plugins/chapters/totem-chapters.c:1000
5903 +#: ../src/totem-uri.c:504 ../src/plugins/chapters/totem-chapters.c:998
5904 msgid "All files"
5905 msgstr "Wszystkie pliki"
5907 -#: ../src/totem-uri.c:507
5908 -#: ../src/plugins/chapters/totem-chapters.c:997
5909 +#: ../src/totem-uri.c:509 ../src/plugins/chapters/totem-chapters.c:995
5910 msgid "Supported files"
5911 msgstr "Obsługiwane pliki"
5913 -#: ../src/totem-uri.c:519
5914 +#: ../src/totem-uri.c:521
5915 msgid "Audio files"
5916 msgstr "Pliki dźwiękowe"
5918 -#: ../src/totem-uri.c:527
5919 +#: ../src/totem-uri.c:529
5920 msgid "Video files"
5921 msgstr "Pliki wideo"
5923 -#: ../src/totem-uri.c:537
5924 +#: ../src/totem-uri.c:539
5925 msgid "Subtitle files"
5926 msgstr "Pliki napisów"
5928 -#: ../src/totem-uri.c:589
5929 +#: ../src/totem-uri.c:591
5930 msgid "Select Text Subtitles"
5931 msgstr "Wybór pliku napisów"
5933 -#: ../src/totem-uri.c:652
5934 +#: ../src/totem-uri.c:654
5935 msgid "Select Movies or Playlists"
5936 msgstr "Wybór nagrań wideo lub list odtwarzania"
5938 @@ -1760,122 +1777,175 @@ msgid ""
5939 "Run '%s --help' to see a full list of available command line options.\n"
5940 msgstr ""
5941 "%s\n"
5942 -"Wykonanie polecenia \"%s --help\" wyświetli pełną listę dostępnych opcji wiersza poleceń.\n"
5943 +"Wykonanie polecenia \"%s --help\" wyświetli pełną listę dostępnych opcji "
5944 +"wiersza poleceń.\n"
5946 -#: ../src/totem.c:254
5947 -#: ../src/totem.c:263
5948 -#: ../browser-plugin/totem-plugin-viewer.c:666
5949 -#: ../browser-plugin/totem-plugin-viewer.c:1864
5950 +#: ../src/totem.c:254 ../src/totem.c:263
5951 +#: ../browser-plugin/totem-plugin-viewer.c:663
5952 +#: ../browser-plugin/totem-plugin-viewer.c:1861
5953 msgid "Totem Movie Player"
5954 msgstr "Odtwarzacz filmów Totem"
5956 -#: ../src/totem.c:255
5957 -#: ../browser-plugin/totem-plugin-viewer.c:2305
5958 +#: ../src/totem.c:255 ../browser-plugin/totem-plugin-viewer.c:2302
5959 msgid "Could not initialize the thread-safe libraries."
5960 msgstr "Nie można zainicjować bibliotek bezpiecznych dla wątków."
5962 #: ../src/totem.c:255
5963 msgid "Verify your system installation. Totem will now exit."
5964 -msgstr "Proszę sprawdzić poprawność instalacji systemu. Działanie programu Totem zostanie teraz zakończone."
5965 +msgstr ""
5966 +"Proszę sprawdzić poprawność instalacji systemu. Działanie programu Totem "
5967 +"zostanie teraz zakończone."
5969 -#: ../src/backend/bacon-video-widget-gst-0.10.c:1848
5970 +#: ../src/backend/bacon-video-widget-gst-0.10.c:1850
5971 msgid "Password requested for RTSP server"
5972 msgstr "Zażądano hasła dla serwera RTSP"
5974 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3120
5975 #: ../src/backend/bacon-video-widget-gst-0.10.c:3124
5976 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3128
5977 #, c-format
5978 msgid "Audio Track #%d"
5979 msgstr "Ścieżka dźwiękowa #%d"
5981 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3152
5982 #: ../src/backend/bacon-video-widget-gst-0.10.c:3156
5983 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3160
5984 #, c-format
5985 msgid "Subtitle #%d"
5986 msgstr "Napisy #%d"
5988 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3565
5989 -msgid "The requested audio output was not found. Please select another audio output in the Multimedia Systems Selector."
5990 -msgstr "Żądane wyjście dźwięku nie zostało odnalezione. Proszę wybrać inne wyjście dźwięku w oknie Wyboru systemu multimediów."
5991 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3569
5992 +msgid ""
5993 +"The requested audio output was not found. Please select another audio output "
5994 +"in the Multimedia Systems Selector."
5995 +msgstr ""
5996 +"Żądane wyjście dźwięku nie zostało odnalezione. Proszę wybrać inne wyjście "
5997 +"dźwięku w oknie Wyboru systemu multimediów."
5999 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3570
6000 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3574
6001 msgid "Location not found."
6002 msgstr "Nie odnaleziono położenia."
6004 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3574
6005 -msgid "Could not open location; you might not have permission to open the file."
6006 -msgstr "Nie można otworzyć położenia. Użytkownik może nie mieć uprawnień do otwarcia pliku."
6007 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3578
6008 +msgid ""
6009 +"Could not open location; you might not have permission to open the file."
6010 +msgstr ""
6011 +"Nie można otworzyć położenia. Użytkownik może nie mieć uprawnień do otwarcia "
6012 +"pliku."
6014 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3585
6015 -msgid "The video output is in use by another application. Please close other video applications, or select another video output in the Multimedia Systems Selector."
6016 -msgstr "Wyjście wideo jest używane przez inny program. Proszę zamknąć inne programy wideo lub wybrać inne wyjście wideo w oknie Wyboru systemu multimediów."
6017 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3589
6018 +msgid ""
6019 +"The video output is in use by another application. Please close other video "
6020 +"applications, or select another video output in the Multimedia Systems "
6021 +"Selector."
6022 +msgstr ""
6023 +"Wyjście wideo jest używane przez inny program. Proszę zamknąć inne programy "
6024 +"wideo lub wybrać inne wyjście wideo w oknie Wyboru systemu multimediów."
6026 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3591
6027 -msgid "The audio output is in use by another application. Please select another audio output in the Multimedia Systems Selector. You may want to consider using a sound server."
6028 -msgstr "Wyjście dźwięku jest używane przez inny program. Proszę wybrać inne wyjście dźwięku w oknie Wyboru systemu multimediów. Możesz rozważyć również użycie serwera dźwięku."
6029 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3595
6030 +msgid ""
6031 +"The audio output is in use by another application. Please select another "
6032 +"audio output in the Multimedia Systems Selector. You may want to consider "
6033 +"using a sound server."
6034 +msgstr ""
6035 +"Wyjście dźwięku jest używane przez inny program. Proszę wybrać inne wyjście "
6036 +"dźwięku w oknie Wyboru systemu multimediów. Możesz rozważyć również użycie "
6037 +"serwera dźwięku."
6039 #. should be exactly one missing thing (source or converter)
6040 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3609
6041 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3615
6042 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3613
6043 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3619
6044 #, c-format
6045 msgid "The playback of this movie requires a %s plugin which is not installed."
6046 -msgstr "Odtworzenie tego nagrania wideo wymaga wtyczki %s, która nie jest zainstalowana."
6047 +msgstr ""
6048 +"Odtworzenie tego nagrania wideo wymaga wtyczki %s, która nie jest "
6049 +"zainstalowana."
6051 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3616
6052 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3620
6053 #, c-format
6054 msgid ""
6055 -"The playback of this movie requires the following decoders which are not installed:\n"
6056 +"The playback of this movie requires the following decoders which are not "
6057 +"installed:\n"
6058 "\n"
6059 "%s"
6060 msgstr ""
6061 -"Odtworzenie tego nagrania wideo wymaga następujących dekoderów, które nie są zainstalowane:\n"
6062 +"Odtworzenie tego nagrania wideo wymaga następujących dekoderów, które nie są "
6063 +"zainstalowane:\n"
6064 "\n"
6065 "%s"
6067 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3641
6068 -msgid "Cannot play this file over the network. Try downloading it to disk first."
6069 -msgstr "Nie można odtworzyć pliku przez sieć. Proszę spróbować najpierw pobrać plik na dysk."
6070 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3645
6071 +msgid ""
6072 +"Cannot play this file over the network. Try downloading it to disk first."
6073 +msgstr ""
6074 +"Nie można odtworzyć pliku przez sieć. Proszę spróbować najpierw pobrać plik "
6075 +"na dysk."
6077 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3713
6078 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3717
6079 msgid "Media file could not be played."
6080 msgstr "Nie można odtworzyć pliku multimediów."
6082 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6004
6083 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6008
6084 msgid "Surround"
6085 msgstr "Przestrzenny"
6087 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6006
6088 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6010
6089 msgid "Mono"
6090 msgstr "Mono"
6092 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6353
6093 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6357
6094 msgid "Too old version of GStreamer installed."
6095 msgstr "Zainstalowana wersja biblioteki GStreamer jest za stara."
6097 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6360
6098 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6364
6099 msgid "Media contains no supported video streams."
6100 msgstr "Plik multimediów zawiera nieobsługiwany strumień wideo."
6102 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6845
6103 -msgid "Failed to create a GStreamer play object. Please check your GStreamer installation."
6104 -msgstr "Utworzenie obiektu odtwarzania GStreamer się nie powiodło. Proszę sprawdzić poprawność instalacji biblioteki GStreamer."
6105 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6847
6106 +msgid ""
6107 +"Failed to create a GStreamer play object. Please check your GStreamer "
6108 +"installation."
6109 +msgstr ""
6110 +"Utworzenie obiektu odtwarzania GStreamer się nie powiodło. Proszę sprawdzić "
6111 +"poprawność instalacji biblioteki GStreamer."
6113 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6956
6114 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7091
6115 -msgid "Failed to open video output. It may not be available. Please select another video output in the Multimedia Systems Selector."
6116 -msgstr "Otwarcie wyjścia wideo się nie powiodło. Może być ono niedostępne. Proszę wybrać inne wyjście wideo w oknie Wyboru systemu multimediów."
6117 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6958
6118 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7093
6119 +msgid ""
6120 +"Failed to open video output. It may not be available. Please select another "
6121 +"video output in the Multimedia Systems Selector."
6122 +msgstr ""
6123 +"Otwarcie wyjścia wideo się nie powiodło. Może być ono niedostępne. Proszę "
6124 +"wybrać inne wyjście wideo w oknie Wyboru systemu multimediów."
6126 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6968
6127 -msgid "Could not find the video output. You may need to install additional GStreamer plugins, or select another video output in the Multimedia Systems Selector."
6128 -msgstr "Nie można odnaleźć wyjścia wideo. Może być wymagana instalacja dodatkowych wtyczek biblioteki GStreamer, lub należy wybrać inne wyjście wideo w oknie Wyboru systemu multimediów."
6129 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6970
6130 +msgid ""
6131 +"Could not find the video output. You may need to install additional "
6132 +"GStreamer plugins, or select another video output in the Multimedia Systems "
6133 +"Selector."
6134 +msgstr ""
6135 +"Nie można odnaleźć wyjścia wideo. Może być wymagana instalacja dodatkowych "
6136 +"wtyczek biblioteki GStreamer, lub należy wybrać inne wyjście wideo w oknie "
6137 +"Wyboru systemu multimediów."
6139 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7003
6140 -msgid "Failed to open audio output. You may not have permission to open the sound device, or the sound server may not be running. Please select another audio output in the Multimedia Systems Selector."
6141 -msgstr "Otwarcie wyjścia dźwięku się nie powiodło. Użytkownik może nie mieć uprawnień do urządzenia dźwiękowego albo nie jest uruchomiony serwer dźwięku. Proszę wybrać inne wyjście dźwięku w oknie Wyboru systemu multimediów."
6142 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7005
6143 +msgid ""
6144 +"Failed to open audio output. You may not have permission to open the sound "
6145 +"device, or the sound server may not be running. Please select another audio "
6146 +"output in the Multimedia Systems Selector."
6147 +msgstr ""
6148 +"Otwarcie wyjścia dźwięku się nie powiodło. Użytkownik może nie mieć "
6149 +"uprawnień do urządzenia dźwiękowego albo nie jest uruchomiony serwer "
6150 +"dźwięku. Proszę wybrać inne wyjście dźwięku w oknie Wyboru systemu "
6151 +"multimediów."
6153 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7023
6154 -msgid "Could not find the audio output. You may need to install additional GStreamer plugins, or select another audio output in the Multimedia Systems Selector."
6155 -msgstr "Nie można odnaleźć wyjścia dźwięku. Może być wymagana instalacja dodatkowych wtyczek biblioteki GStreamer, lub należy wybrać inne wyjście dźwięku w oknie Wyboru systemu multimediów."
6156 +#: ../src/backend/bacon-video-widget-gst-0.10.c:7025
6157 +msgid ""
6158 +"Could not find the audio output. You may need to install additional "
6159 +"GStreamer plugins, or select another audio output in the Multimedia Systems "
6160 +"Selector."
6161 +msgstr ""
6162 +"Nie można odnaleźć wyjścia dźwięku. Może być wymagana instalacja dodatkowych "
6163 +"wtyczek biblioteki GStreamer, lub należy wybrać inne wyjście dźwięku w oknie "
6164 +"Wyboru systemu multimediów."
6166 #. hour:minutes:seconds
6167 #. Translators: This is a time format, like "9:05:02" for 9
6168 @@ -1883,8 +1953,7 @@ msgstr "Nie można odnaleźć wyjścia dźwięku. Może być wymagana instalacja
6169 #. * the separator that your locale uses or use "%Id" instead
6170 #. * of "%d" if your locale uses localized digits.
6172 -#: ../src/backend/video-utils.c:125
6173 -#: ../src/backend/video-utils.c:142
6174 +#: ../src/backend/video-utils.c:91 ../src/backend/video-utils.c:108
6175 #, c-format
6176 msgctxt "long time format"
6177 msgid "%d:%02d:%02d"
6178 @@ -1896,13 +1965,13 @@ msgstr "%d:%02d:%02d"
6179 #. * separator that your locale uses or use "%Id" instead of
6180 #. * "%d" if your locale uses localized digits.
6182 -#: ../src/backend/video-utils.c:134
6183 +#: ../src/backend/video-utils.c:100
6184 #, c-format
6185 msgctxt "short time format"
6186 msgid "%d:%02d"
6187 msgstr "%d:%02d"
6189 -#: ../src/backend/video-utils.c:172
6190 +#: ../src/backend/video-utils.c:138
6191 #, c-format
6192 msgid "%d hour"
6193 msgid_plural "%d hours"
6194 @@ -1910,7 +1979,7 @@ msgstr[0] "%d godzina"
6195 msgstr[1] "%d godziny"
6196 msgstr[2] "%d godzin"
6198 -#: ../src/backend/video-utils.c:174
6199 +#: ../src/backend/video-utils.c:140
6200 #, c-format
6201 msgid "%d minute"
6202 msgid_plural "%d minutes"
6203 @@ -1918,7 +1987,7 @@ msgstr[0] "%d minuta"
6204 msgstr[1] "%d minuty"
6205 msgstr[2] "%d minut"
6207 -#: ../src/backend/video-utils.c:177
6208 +#: ../src/backend/video-utils.c:143
6209 #, c-format
6210 msgid "%d second"
6211 msgid_plural "%d seconds"
6212 @@ -1927,19 +1996,19 @@ msgstr[1] "%d sekundy"
6213 msgstr[2] "%d sekund"
6215 #. hour:minutes:seconds
6216 -#: ../src/backend/video-utils.c:183
6217 +#: ../src/backend/video-utils.c:149
6218 #, c-format
6219 msgid "%s %s %s"
6220 msgstr "%s %s %s"
6222 #. minutes:seconds
6223 -#: ../src/backend/video-utils.c:186
6224 +#: ../src/backend/video-utils.c:152
6225 #, c-format
6226 msgid "%s %s"
6227 msgstr "%s %s"
6229 #. seconds
6230 -#: ../src/backend/video-utils.c:189
6231 +#: ../src/backend/video-utils.c:155
6232 #, c-format
6233 msgid "%s"
6234 msgstr "%s"
6235 @@ -1950,7 +2019,8 @@ msgstr "Bemused"
6237 #: ../src/plugins/bemused/bemused.plugin.in.h:2
6238 msgid "Control Totem through a mobile phone with a Bemused client"
6239 -msgstr "Obsługa programu Totem przez telefon komórkowy za pomocą klienta Bemused"
6240 +msgstr ""
6241 +"Obsługa programu Totem przez telefon komórkowy za pomocą klienta Bemused"
6243 #. Translators: the parameter is a number used to identify this playlist entry
6244 #: ../src/plugins/bemused/totem-bemused.c:171
6245 @@ -2015,7 +2085,7 @@ msgid "Video Disc Recorder"
6246 msgstr "Nagrywarka płyt wideo"
6248 #: ../src/plugins/chapters/chapters.plugin.in.h:1
6249 -#: ../src/plugins/chapters/totem-chapters.c:1139
6250 +#: ../src/plugins/chapters/totem-chapters.c:1137
6251 msgid "Chapters"
6252 msgstr "Rozdziały"
6254 @@ -2088,61 +2158,65 @@ msgstr ""
6255 "<b>Tytuł: </b>%s\n"
6256 "<b>Czas rozpoczęcia: </b>%s"
6258 -#: ../src/plugins/chapters/totem-chapters.c:330
6259 +#: ../src/plugins/chapters/totem-chapters.c:328
6260 msgid "Error while reading file with chapters"
6261 msgstr "Błąd podczas odczytywania pliku z rozdziałami"
6263 -#: ../src/plugins/chapters/totem-chapters.c:545
6264 +#: ../src/plugins/chapters/totem-chapters.c:543
6265 msgid "Chapter with the same time already exists"
6266 msgstr "Rozdział o tym samym czasie już istnieje"
6268 -#: ../src/plugins/chapters/totem-chapters.c:546
6269 +#: ../src/plugins/chapters/totem-chapters.c:544
6270 msgid "Try another name or remove an existing chapter."
6271 msgstr "Należy wprowadzić inną nazwę lub usunąć istniejący rozdział."
6273 -#: ../src/plugins/chapters/totem-chapters.c:719
6274 +#: ../src/plugins/chapters/totem-chapters.c:717
6275 msgid "Error while writing file with chapters"
6276 msgstr "Błąd podczas zapisywania pliku z rozdziałami"
6278 -#: ../src/plugins/chapters/totem-chapters.c:844
6279 +#: ../src/plugins/chapters/totem-chapters.c:842
6280 msgid "Error occurred while saving chapters"
6281 msgstr "Wystąpił błąd podczas zapisywania rozdziałów"
6283 -#: ../src/plugins/chapters/totem-chapters.c:845
6284 -msgid "Please check you have permission to write to the folder containing the movie."
6285 -msgstr "Proszę sprawdzić, czy użytkownik ma uprawnienia do zapisu w katalogu zawierającym film."
6286 +#: ../src/plugins/chapters/totem-chapters.c:843
6287 +msgid ""
6288 +"Please check you have permission to write to the folder containing the movie."
6289 +msgstr ""
6290 +"Proszę sprawdzić, czy użytkownik ma uprawnienia do zapisu w katalogu "
6291 +"zawierającym film."
6293 -#: ../src/plugins/chapters/totem-chapters.c:978
6294 +#: ../src/plugins/chapters/totem-chapters.c:976
6295 msgid "Open Chapter File"
6296 msgstr "Otwórz plik rozdziałów"
6298 -#: ../src/plugins/chapters/totem-chapters.c:1095
6299 +#: ../src/plugins/chapters/totem-chapters.c:1093
6300 msgid "Chapter Screenshot"
6301 msgstr "Zrzut ekranu rozdziału"
6303 -#: ../src/plugins/chapters/totem-chapters.c:1106
6304 +#: ../src/plugins/chapters/totem-chapters.c:1104
6305 msgid "Chapter Title"
6306 msgstr "Tytuł rozdziału"
6308 -#: ../src/plugins/chapters/totem-chapters.c:1184
6309 +#: ../src/plugins/chapters/totem-chapters.c:1182
6310 msgid "Save changes to chapter list before closing?"
6311 msgstr "Zapisać zmiany przed zamknięciem?"
6313 #. Translators: close Totem without saving changes to the chapter list of the current movie.
6314 -#: ../src/plugins/chapters/totem-chapters.c:1189
6315 +#: ../src/plugins/chapters/totem-chapters.c:1187
6316 msgid "Close without Saving"
6317 msgstr "Zamknij bez zapisywania"
6319 #. Translators: save changes to the chapter list of the current movie before closing Totem.
6320 -#: ../src/plugins/chapters/totem-chapters.c:1191
6321 +#: ../src/plugins/chapters/totem-chapters.c:1189
6322 msgid "Save"
6323 msgstr "Zapisz"
6325 -#: ../src/plugins/chapters/totem-chapters.c:1194
6326 +#: ../src/plugins/chapters/totem-chapters.c:1192
6327 msgid "If you don't save, changes to the chapter list will be lost."
6328 -msgstr "Jeśli nie zostanie zapisane, to zmiany w liście rozdziałów zostaną utracone."
6329 +msgstr ""
6330 +"Jeśli nie zostanie zapisane, to zmiany w liście rozdziałów zostaną utracone."
6332 -#: ../src/plugins/chapters/totem-cmml-parser.c:559
6333 +#: ../src/plugins/chapters/totem-cmml-parser.c:651
6334 msgid "Failed to parse CMML file"
6335 msgstr "Przetworzenie pliku CMML się nie powiodło"
6337 @@ -2151,7 +2225,7 @@ msgstr "Przetworzenie pliku CMML się nie powiodło"
6338 msgid "Delete"
6339 msgstr "Usuń"
6341 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:116
6342 +#: ../src/plugins/coherence_upnp/coherence_upnp.py:117
6343 #: ../src/plugins/coherence_upnp/coherence_upnp.plugin.in.h:2
6344 msgid "Coherence DLNA/UPnP Client"
6345 msgstr "Klient DLNA/UPnP Coherence"
6346 @@ -2165,25 +2239,21 @@ msgid "D-Bus Service"
6347 msgstr "Usługa D-Bus"
6349 #: ../src/plugins/dbus-service/dbus-service.plugin.in.h:2
6350 -msgid "Plugin for sending notifications of currently playing movies to the D-Bus subsystem."
6351 -msgstr "Wtyczka do wysyłania powiadomień o obecnie odtwarzanych nagraniach wideo do podsystemu D-Bus."
6352 +msgid ""
6353 +"Plugin for sending notifications of currently playing movies to the D-Bus "
6354 +"subsystem."
6355 +msgstr ""
6356 +"Wtyczka do wysyłania powiadomień o obecnie odtwarzanych nagraniach wideo do "
6357 +"podsystemu D-Bus."
6359 -#: ../src/plugins/galago/galago.plugin.in.h:1
6360 +#: ../src/plugins/im-status/totem-im-status.plugin.in.h:1
6361 msgid "Instant Messenger status"
6362 msgstr "Stan komunikatora"
6364 -#: ../src/plugins/galago/galago.plugin.in.h:2
6365 +#: ../src/plugins/im-status/totem-im-status.plugin.in.h:2
6366 msgid "Set your Instant Messenger status to away when a movie is playing"
6367 msgstr "Ustawienie stanu komunikatora na \"Zajęty\" podczas odtwarzania filmu"
6369 -#: ../src/plugins/galago/totem-galago.c:117
6370 -msgid "Error loading Galago plugin"
6371 -msgstr "Błąd podczas wczytywania wtyczki Galago"
6373 -#: ../src/plugins/galago/totem-galago.c:117
6374 -msgid "Could not connect to the Galago daemon."
6375 -msgstr "Nie można połączyć się z usługą Galago."
6377 #: ../src/plugins/gromit/gromit.plugin.in.h:1
6378 msgid "Gromit Annotations"
6379 msgstr "Adnotacje Gromit"
6380 @@ -2198,36 +2268,46 @@ msgstr "Plik wykonywalny gromit nie został odnaleziony."
6382 #. Add the interface to Totem's sidebar
6383 #: ../src/plugins/iplayer/iplayer.plugin.in.h:1
6384 -#: ../src/plugins/iplayer/iplayer.py:41
6385 +#: ../src/plugins/iplayer/iplayer.py:42
6386 msgid "BBC iPlayer"
6387 msgstr "BBC iPlayer"
6389 #: ../src/plugins/iplayer/iplayer.plugin.in.h:2
6390 msgid "Stream BBC programs from the last 7 days from the BBC iPlayer service."
6391 -msgstr "Odtwarzanie strumieniowe programów BBC z ostatnich 7 dni z usługi BBC iPlayer (dostępne wyłącznie w Wielkiej Brytanii)."
6392 +msgstr ""
6393 +"Odtwarzanie strumieniowe programów BBC z ostatnich 7 dni z usługi BBC "
6394 +"iPlayer (dostępne wyłącznie w Wielkiej Brytanii)."
6396 -#: ../src/plugins/iplayer/iplayer.py:66
6397 +#: ../src/plugins/iplayer/iplayer.py:67
6398 msgid "Error listing channel categories"
6399 msgstr "Błąd podczas pobierania listy kategorii kanałów"
6401 -#: ../src/plugins/iplayer/iplayer.py:66
6402 -msgid "There was an unknown error getting the list of television channels available on BBC iPlayer."
6403 -msgstr "Wystąpił nieznany błąd podczas uzyskiwania listy kanałów telewizyjnych dostępnych na BBC iPlayer."
6404 +#: ../src/plugins/iplayer/iplayer.py:67
6405 +msgid ""
6406 +"There was an unknown error getting the list of television channels available "
6407 +"on BBC iPlayer."
6408 +msgstr ""
6409 +"Wystąpił nieznany błąd podczas uzyskiwania listy kanałów telewizyjnych "
6410 +"dostępnych na BBC iPlayer."
6412 #. Append a dummy child row so that the expander's visible; we can
6413 #. then queue off the expander to load the programme listing for this category
6414 -#: ../src/plugins/iplayer/iplayer.py:74
6415 +#: ../src/plugins/iplayer/iplayer.py:75
6416 msgid "Loading…"
6417 msgstr "Wczytywanie…"
6419 #. Translators: the "programme feed" is the list of TV shows available to watch online
6420 -#: ../src/plugins/iplayer/iplayer.py:119
6421 +#: ../src/plugins/iplayer/iplayer.py:120
6422 msgid "Error getting programme feed"
6423 msgstr "Błąd podczas uzyskiwania danych programu"
6425 -#: ../src/plugins/iplayer/iplayer.py:119
6426 -msgid "There was an error getting the list of programmes for this channel and category combination."
6427 -msgstr "Wystąpił błąd podczas pobierania listy programów tego połączenia kanału i kategorii."
6428 +#: ../src/plugins/iplayer/iplayer.py:120
6429 +msgid ""
6430 +"There was an error getting the list of programmes for this channel and "
6431 +"category combination."
6432 +msgstr ""
6433 +"Wystąpił błąd podczas pobierania listy programów tego połączenia kanału i "
6434 +"kategorii."
6436 #: ../src/plugins/iplayer/iplayer2.py:299
6437 msgid "<no reason given>"
6438 @@ -2277,47 +2357,49 @@ msgid "_Open Jamendo Album Page in Browser"
6439 msgstr "_Otwórz w stronę albumu Jamendo w przeglądarce WWW"
6441 #: ../src/plugins/jamendo/jamendo.plugin.in.h:1
6442 -#: ../src/plugins/jamendo/jamendo.py:127
6443 +#: ../src/plugins/jamendo/jamendo.py:128
6444 msgid "Jamendo"
6445 msgstr "Jamendo"
6447 #: ../src/plugins/jamendo/jamendo.plugin.in.h:2
6448 -msgid "Listen to the large collection of Creative Commons licensed music on Jamendo."
6449 -msgstr "Umożliwia odsłuchiwanie dużego zbioru muzyki na licencji Creative Commons z Jamendo."
6450 +msgid ""
6451 +"Listen to the large collection of Creative Commons licensed music on Jamendo."
6452 +msgstr ""
6453 +"Umożliwia odsłuchiwanie dużego zbioru muzyki na licencji Creative Commons z "
6454 +"Jamendo."
6456 #: ../src/plugins/jamendo/jamendo.py:58
6457 msgid "You need to install the Python simplejson module."
6458 msgstr "Należy zainstalować moduł języka Python simplejson."
6460 -#: ../src/plugins/jamendo/jamendo.py:260
6461 -#: ../src/plugins/jamendo/jamendo.py:273
6462 -#: ../src/plugins/jamendo/jamendo.py:297
6463 +#: ../src/plugins/jamendo/jamendo.py:261 ../src/plugins/jamendo/jamendo.py:274
6464 +#: ../src/plugins/jamendo/jamendo.py:298
6465 #, python-format
6466 msgid "Artist: %s"
6467 msgstr "Wykonawca: %s"
6469 #. Translators: this is the release date of an album in Python strptime format
6470 -#: ../src/plugins/jamendo/jamendo.py:266
6471 +#: ../src/plugins/jamendo/jamendo.py:267
6472 msgid "%Y-%m-%d"
6473 msgstr "%d-%m-%Y"
6475 #. Translators: this is the release time of an album in Python strftime format
6476 -#: ../src/plugins/jamendo/jamendo.py:268
6477 +#: ../src/plugins/jamendo/jamendo.py:269
6478 #, python-format
6479 msgid "%x"
6480 msgstr "%x"
6482 -#: ../src/plugins/jamendo/jamendo.py:274
6483 +#: ../src/plugins/jamendo/jamendo.py:275
6484 #, python-format
6485 msgid "Genre: %s"
6486 msgstr "Gatunek: %s"
6488 -#: ../src/plugins/jamendo/jamendo.py:275
6489 +#: ../src/plugins/jamendo/jamendo.py:276
6490 #, python-format
6491 msgid "Released on: %s"
6492 msgstr "Data wydania: %s"
6494 -#: ../src/plugins/jamendo/jamendo.py:276
6495 +#: ../src/plugins/jamendo/jamendo.py:277
6496 #, python-format
6497 msgid "License: %s"
6498 msgstr "Licencja: %s"
6499 @@ -2325,26 +2407,26 @@ msgstr "Licencja: %s"
6500 #. track title
6501 #. Translators: this is the title of a track in Python format
6502 #. (first argument is the track number, second is the track title)
6503 -#: ../src/plugins/jamendo/jamendo.py:289
6504 +#: ../src/plugins/jamendo/jamendo.py:290
6505 #, python-format
6506 msgid "%02d. %s"
6507 msgstr "%02d. %s"
6509 -#: ../src/plugins/jamendo/jamendo.py:296
6510 +#: ../src/plugins/jamendo/jamendo.py:297
6511 #, python-format
6512 msgid "Album: %s"
6513 msgstr "Album: %s"
6515 -#: ../src/plugins/jamendo/jamendo.py:298
6516 +#: ../src/plugins/jamendo/jamendo.py:299
6517 #, python-format
6518 msgid "Duration: %s"
6519 msgstr "Czas trwania: %s"
6521 -#: ../src/plugins/jamendo/jamendo.py:355
6522 +#: ../src/plugins/jamendo/jamendo.py:356
6523 msgid "Fetching albums, please wait…"
6524 msgstr "Pobieranie albumów, proszę czekać…"
6526 -#: ../src/plugins/jamendo/jamendo.py:410
6527 +#: ../src/plugins/jamendo/jamendo.py:411
6528 #, python-format
6529 msgid ""
6530 "Failed to connect to Jamendo server.\n"
6531 @@ -2353,24 +2435,24 @@ msgstr ""
6532 "Połączenie z serwerem Jamendo się nie powiodło.\n"
6533 "%s."
6535 -#: ../src/plugins/jamendo/jamendo.py:412
6536 +#: ../src/plugins/jamendo/jamendo.py:413
6537 #, python-format
6538 msgid "The Jamendo server returned code %s."
6539 msgstr "Serwer Jamendo zwrócił kod %s."
6541 -#: ../src/plugins/jamendo/jamendo.py:416
6542 +#: ../src/plugins/jamendo/jamendo.py:417
6543 msgid "An error occurred while fetching albums."
6544 msgstr "Wystąpił błąd podczas pobierania albumów."
6546 #. Translators: time formatting (in Python strftime format) for the Jamendo plugin
6547 #. for times longer than an hour
6548 -#: ../src/plugins/jamendo/jamendo.py:618
6549 +#: ../src/plugins/jamendo/jamendo.py:620
6550 msgid "%H:%M:%S"
6551 msgstr "%H:%M:%S"
6553 #. Translators: time formatting (in Python strftime format) for the Jamendo plugin
6554 #. for times shorter than an hour
6555 -#: ../src/plugins/jamendo/jamendo.py:621
6556 +#: ../src/plugins/jamendo/jamendo.py:623
6557 msgid "%M:%S"
6558 msgstr "%M:%S"
6560 @@ -2381,7 +2463,7 @@ msgstr "%M:%S"
6561 #. Compared to:
6562 #. http://www.jamendo.com/en/album/4818
6563 #. If Jamendo doesn't support your language, *do not translate this string*!
6564 -#: ../src/plugins/jamendo/jamendo.py:671
6565 +#: ../src/plugins/jamendo/jamendo.py:673
6566 msgid "en"
6567 msgstr "pl"
6569 @@ -2394,8 +2476,11 @@ msgid "Number of results per page"
6570 msgstr "Liczba wyników na stronie"
6572 #: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:3
6573 -msgid "The number of Jamendo search results to display in each page of results."
6574 -msgstr "Liczba wyników wyszukiwania w serwisie Jamendo wyświetlanych na każdej stronie."
6575 +msgid ""
6576 +"The number of Jamendo search results to display in each page of results."
6577 +msgstr ""
6578 +"Liczba wyników wyszukiwania w serwisie Jamendo wyświetlanych na każdej "
6579 +"stronie."
6581 #: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:4
6582 msgid "The preferred audio format to download tracks from Jamendo in."
6583 @@ -2456,35 +2541,35 @@ msgstr "Nie można połączyć się ze stroną OpenSubtitles"
6584 msgid "No results found"
6585 msgstr "Brak wyników"
6587 -#: ../src/plugins/opensubtitles/opensubtitles.py:374
6588 +#: ../src/plugins/opensubtitles/opensubtitles.py:376
6589 msgid "Subtitles"
6590 msgstr "Napisy"
6592 #. translators comment:
6593 #. This is the file-type of the subtitle file detected
6594 -#: ../src/plugins/opensubtitles/opensubtitles.py:380
6595 +#: ../src/plugins/opensubtitles/opensubtitles.py:382
6596 msgid "Format"
6597 msgstr "Format"
6599 #. translators comment:
6600 #. This is a rating of the quality of the subtitle
6601 -#: ../src/plugins/opensubtitles/opensubtitles.py:385
6602 +#: ../src/plugins/opensubtitles/opensubtitles.py:387
6603 msgid "Rating"
6604 msgstr "Ocena"
6606 -#: ../src/plugins/opensubtitles/opensubtitles.py:426
6607 +#: ../src/plugins/opensubtitles/opensubtitles.py:428
6608 msgid "_Download Movie Subtitles…"
6609 msgstr "_Pobierz napisy do filmu..."
6611 -#: ../src/plugins/opensubtitles/opensubtitles.py:427
6612 +#: ../src/plugins/opensubtitles/opensubtitles.py:429
6613 msgid "Download movie subtitles from OpenSubtitles"
6614 msgstr "Pobiera napisy do filmów z serwisu OpenSubtitles"
6616 -#: ../src/plugins/opensubtitles/opensubtitles.py:486
6617 +#: ../src/plugins/opensubtitles/opensubtitles.py:488
6618 msgid "Searching subtitles…"
6619 msgstr "Wyszukiwanie napisów…"
6621 -#: ../src/plugins/opensubtitles/opensubtitles.py:544
6622 +#: ../src/plugins/opensubtitles/opensubtitles.py:546
6623 msgid "Downloading the subtitles…"
6624 msgstr "Pobieranie napisów…"
6626 @@ -2502,7 +2587,8 @@ msgstr "Zawsze na wierzchu"
6628 #: ../src/plugins/ontop/ontop.plugin.in.h:2
6629 msgid "Keep the main window on top when playing a movie"
6630 -msgstr "Utrzymywanie głównego okna ponad innymi podczas odtwarzania nagrania wideo"
6631 +msgstr ""
6632 +"Utrzymywanie głównego okna ponad innymi podczas odtwarzania nagrania wideo"
6634 #: ../src/plugins/properties/totem-movie-properties.c:128
6635 msgid "Properties"
6636 @@ -2510,8 +2596,18 @@ msgstr "Właściwości"
6638 #: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:2
6639 #, no-c-format
6640 -msgid "A format string used to build the network service name used when publishing playlists over the network. The following format placeholders can be used: • %a: the program name as returned by g_get_application_name() • %h: the machine's host name in title case • %u: the user's login name in title case • %U: the user's real name • %%: the percent sign"
6641 -msgstr "Ciąg formatu użyty do stworzenia nazwy usługi sieciowej podczas publikowania list odtwarzania przez sieć. Można użyć następujących symboli zastępczych: • %a: nazwa programu zwracana przez g_get_application_name() • %h: nazwa komputera (jak nazwy własne) • %u: login użytkownika (jak nazwy własne) • %U: imię i nazwisko użytkownika • %%: znak procentu"
6642 +msgid ""
6643 +"A format string used to build the network service name used when publishing "
6644 +"playlists over the network. The following format placeholders can be used: • "
6645 +"%a: the program name as returned by g_get_application_name() • %h: the "
6646 +"machine's host name in title case • %u: the user's login name in title case "
6647 +"• %U: the user's real name • %%: the percent sign"
6648 +msgstr ""
6649 +"Ciąg formatu użyty do stworzenia nazwy usługi sieciowej podczas publikowania "
6650 +"list odtwarzania przez sieć. Można użyć następujących symboli zastępczych: • "
6651 +"%a: nazwa programu zwracana przez g_get_application_name() • %h: nazwa "
6652 +"komputera (jak nazwy własne) • %u: login użytkownika (jak nazwy własne) • "
6653 +"%U: imię i nazwisko użytkownika • %%: znak procentu"
6655 #: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:3
6656 msgid "Format for network service name"
6657 @@ -2522,8 +2618,11 @@ msgid "Publisher protocol to use"
6658 msgstr "Użyty protokół publikowania"
6660 #: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:5
6661 -msgid "The transport protocol to use when publishing playlists over the network."
6662 -msgstr "Użyty protokół przesyłania podczas publikowania list odtwarzania przesyłanych przez sieć."
6663 +msgid ""
6664 +"The transport protocol to use when publishing playlists over the network."
6665 +msgstr ""
6666 +"Użyty protokół przesyłania podczas publikowania list odtwarzania "
6667 +"przesyłanych przez sieć."
6669 #. Translators: computers on the local network which are publishing their playlists over the network
6670 #: ../src/plugins/publish/totem-publish.c:552
6671 @@ -2558,8 +2657,13 @@ msgid "Use _encrypted transport protocol (HTTPS)"
6672 msgstr "_Szyfrowanie protokołu przesyłania (HTTPS)"
6674 #: ../src/plugins/pythonconsole/org.gnome.totem.plugins.pythonconsole.gschema.xml.in.in.h:1
6675 -msgid "A password to protect the rpdb2 server for debugging Totem from unauthorized remote access. If this is empty, a default of 'totem' will be used."
6676 -msgstr "Hasło ochrony serwera rpdb2 podczas nieupoważnionego zdalnego debugowania programu Totem. W przypadku opuszczenia pola użyte zostanie hasło domyślne \"totem\"."
6677 +msgid ""
6678 +"A password to protect the rpdb2 server for debugging Totem from unauthorized "
6679 +"remote access. If this is empty, a default of 'totem' will be used."
6680 +msgstr ""
6681 +"Hasło ochrony serwera rpdb2 podczas nieupoważnionego zdalnego debugowania "
6682 +"programu Totem. W przypadku opuszczenia pola użyte zostanie hasło domyślne "
6683 +"\"totem\"."
6685 #: ../src/plugins/pythonconsole/org.gnome.totem.plugins.pythonconsole.gschema.xml.in.in.h:2
6686 msgid "rpdb2 password"
6687 @@ -2587,8 +2691,8 @@ msgstr "Film"
6688 msgid "Movie stream"
6689 msgstr "Strumień wideo"
6691 -#: ../src/plugins/screensaver/totem-screensaver.c:112
6692 -#: ../browser-plugin/totem-plugin-viewer.c:1964
6693 +#: ../src/plugins/screensaver/totem-screensaver.c:116
6694 +#: ../browser-plugin/totem-plugin-viewer.c:1961
6695 msgid "Playing a movie"
6696 msgstr "Odtwarzanie filmu"
6698 @@ -2668,7 +2772,8 @@ msgstr "Program Totem nie może pobrać zrzutu ekranu tego wideo."
6700 #: ../src/plugins/screenshot/totem-screenshot-plugin.c:95
6701 msgid "This is not supposed to happen; please file a bug report."
6702 -msgstr "Ta sytuacja nie powinna mieć miejsca. Proszę wypełnić zgłoszenie błędu."
6703 +msgstr ""
6704 +"Ta sytuacja nie powinna mieć miejsca. Proszę wypełnić zgłoszenie błędu."
6706 #: ../src/plugins/screenshot/totem-screenshot-plugin.c:197
6707 msgid "Take _Screenshot..."
6708 @@ -2814,8 +2919,12 @@ msgid "Error Searching for Videos"
6709 msgstr "Błąd podczas wyszukiwania nagrań wideo"
6711 #: ../src/plugins/youtube/totem-youtube.c:425
6712 -msgid "The response from the server could not be understood. Please check you are running the latest version of libgdata."
6713 -msgstr "Odpowiedź z serwera była niezrozumiała. Proszę się upewnić, że zainstalowana jest najnowsza wersja biblioteki libgdata."
6714 +msgid ""
6715 +"The response from the server could not be understood. Please check you are "
6716 +"running the latest version of libgdata."
6717 +msgstr ""
6718 +"Odpowiedź z serwera była niezrozumiała. Proszę się upewnić, że zainstalowana "
6719 +"jest najnowsza wersja biblioteki libgdata."
6721 #. Update the UI
6722 #: ../src/plugins/youtube/totem-youtube.c:618
6723 @@ -2840,8 +2949,12 @@ msgid "Video Format Not Supported"
6724 msgstr "Nieobsługiwany format wideo"
6726 #: ../src/plugins/youtube/totem-youtube.c:799
6727 -msgid "This video is not available in any formats which Totem supports. Would you like to open it in your web browser instead?"
6728 -msgstr "Plik wideo jest niedostępny w formatach obsługiwanych przez program Totem. Otworzyć w przeglądarce?"
6729 +msgid ""
6730 +"This video is not available in any formats which Totem supports. Would you "
6731 +"like to open it in your web browser instead?"
6732 +msgstr ""
6733 +"Plik wideo jest niedostępny w formatach obsługiwanych przez program Totem. "
6734 +"Otworzyć w przeglądarce?"
6736 #: ../browser-plugin/totem-plugin-viewer.c:431
6737 msgid "No URI to play"
6738 @@ -2850,31 +2963,33 @@ msgstr "Brak adresu URI do odtworzenia"
6739 #. translators: this is:
6740 #. * Open With ApplicationName
6741 #. * as in nautilus' right-click menu
6742 -#: ../browser-plugin/totem-plugin-viewer.c:1104
6743 +#: ../browser-plugin/totem-plugin-viewer.c:1101
6744 #, c-format
6745 msgid "_Open with \"%s\""
6746 msgstr "_Otwórz za pomocą \"%s\""
6748 -#: ../browser-plugin/totem-plugin-viewer.c:1155
6749 +#: ../browser-plugin/totem-plugin-viewer.c:1152
6750 #, c-format
6751 msgid "Browser Plugin using %s"
6752 msgstr "Wtyczka przeglądarki używa %s"
6754 -#: ../browser-plugin/totem-plugin-viewer.c:1160
6755 +#: ../browser-plugin/totem-plugin-viewer.c:1157
6756 msgid "Totem Browser Plugin"
6757 msgstr "Wtyczka przeglądarki programu Totem"
6759 -#: ../browser-plugin/totem-plugin-viewer.c:2198
6760 +#: ../browser-plugin/totem-plugin-viewer.c:2195
6761 msgid "No playlist or playlist empty"
6762 msgstr "Brak listy odtwarzania lub lista jest pusta"
6764 -#: ../browser-plugin/totem-plugin-viewer.c:2289
6765 +#: ../browser-plugin/totem-plugin-viewer.c:2286
6766 msgid "Movie browser plugin"
6767 msgstr "Wtyczka przeglądarki nagrań wideo"
6769 -#: ../browser-plugin/totem-plugin-viewer.c:2305
6770 +#: ../browser-plugin/totem-plugin-viewer.c:2302
6771 msgid "Verify your system installation. The Totem plugin will now exit."
6772 -msgstr "Proszę sprawdzić poprawność instalacji systemu. Działanie wtyczki programu Totem zostanie teraz zakończone."
6773 +msgstr ""
6774 +"Proszę sprawdzić poprawność instalacji systemu. Działanie wtyczki programu "
6775 +"Totem zostanie teraz zakończone."
6777 #: ../src/plugins/pythonconsole/pythonconsole.plugin.in.h:1
6778 msgid "Interactive Python console."
6779 @@ -2884,40 +2999,43 @@ msgstr "Interaktywna konsola języka Python."
6780 msgid "Python Console"
6781 msgstr "Konsola języka Python"
6783 -#: ../src/plugins/pythonconsole/pythonconsole.py:85
6784 +#: ../src/plugins/pythonconsole/pythonconsole.py:86
6785 msgid "Python Console Menu"
6786 msgstr "Menu konsoli języka Python"
6788 -#: ../src/plugins/pythonconsole/pythonconsole.py:88
6789 +#: ../src/plugins/pythonconsole/pythonconsole.py:89
6790 msgid "_Python Console"
6791 msgstr "_Konsola języka Python"
6793 -#: ../src/plugins/pythonconsole/pythonconsole.py:89
6794 +#: ../src/plugins/pythonconsole/pythonconsole.py:90
6795 msgid "Show Totem's Python console"
6796 msgstr "Wyświetla konsolę języka Python programu Totem"
6798 -#: ../src/plugins/pythonconsole/pythonconsole.py:94
6799 +#: ../src/plugins/pythonconsole/pythonconsole.py:95
6800 msgid "Python Debugger"
6801 msgstr "Debuger języka Python"
6803 -#: ../src/plugins/pythonconsole/pythonconsole.py:95
6804 +#: ../src/plugins/pythonconsole/pythonconsole.py:96
6805 msgid "Enable remote Python debugging with rpdb2"
6806 -msgstr "Włączenie zdalnego debugowania języka Python za pomocą biblioteki rpdb2"
6807 +msgstr ""
6808 +"Włączenie zdalnego debugowania języka Python za pomocą biblioteki rpdb2"
6810 -#: ../src/plugins/pythonconsole/pythonconsole.py:116
6811 +#: ../src/plugins/pythonconsole/pythonconsole.py:117
6812 #, python-format
6813 -msgid ""
6814 -"You can access the Totem.Object through 'totem_object' :\\n"
6815 -"%s"
6816 +msgid "You can access the Totem.Object through 'totem_object' :\\n%s"
6817 msgstr ""
6818 -"Dostęp do obiektu Totem.Object można uzyskać przez \"totem_object\":\\n"
6819 -"%s"
6820 +"Dostęp do obiektu Totem.Object można uzyskać przez \"totem_object\":\\n%s"
6822 -#: ../src/plugins/pythonconsole/pythonconsole.py:120
6823 +#: ../src/plugins/pythonconsole/pythonconsole.py:121
6824 msgid "Totem Python Console"
6825 msgstr "Konsola języka Python dla programu Totem"
6827 -#: ../src/plugins/pythonconsole/pythonconsole.py:129
6828 -msgid "After you press OK, Totem will wait until you connect to it with winpdb or rpdb2. If you have not set a debugger password in DConf, it will use the default password ('totem')."
6829 -msgstr "Po naciśnięciu przycisku OK program Totem poczeka na połączenie z winpdb lub rpdb2. Jeśli hasło debugowania nie zostało ustawione w DConf, to zostanie użyte domyślne hasło (\"totem\")."
6831 +#: ../src/plugins/pythonconsole/pythonconsole.py:130
6832 +msgid ""
6833 +"After you press OK, Totem will wait until you connect to it with winpdb or "
6834 +"rpdb2. If you have not set a debugger password in DConf, it will use the "
6835 +"default password ('totem')."
6836 +msgstr ""
6837 +"Po naciśnięciu przycisku OK program Totem poczeka na połączenie z winpdb lub "
6838 +"rpdb2. Jeśli hasło debugowania nie zostało ustawione w DConf, to zostanie "
6839 +"użyte domyślne hasło (\"totem\")."
6840 diff --git a/po/ug.po b/po/ug.po
6841 index aaafcb7..76ea2a1 100644
6842 --- a/po/ug.po
6843 +++ b/po/ug.po
6844 @@ -2,14 +2,15 @@
6845 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
6846 # This file is distributed under the same license as the PACKAGE package.
6847 # Abduxukur Abdurixit <abduxukur.abdurixit@t-systems.ch>, 2005
6849 +# Sahran <sahran.ug@gmail.com>, 2011
6850 # I just made up the Plural-Forms here so that it passed msgfmt.
6851 msgid ""
6852 msgstr ""
6853 "Project-Id-Version: totem\n"
6854 -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=totem&component=general\n"
6855 -"POT-Creation-Date: 2011-03-08 12:34+0000\n"
6856 -"PO-Revision-Date: \n"
6857 +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
6858 +"product=totem&keywords=I18N+L10N&component=general\n"
6859 +"POT-Creation-Date: 2011-08-13 16:51+0000\n"
6860 +"PO-Revision-Date: 2011-08-08 17:37+0600\n"
6861 "Last-Translator: Sahran <sahran.ug@gmail.com>\n"
6862 "Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
6863 "MIME-Version: 1.0\n"
6864 @@ -47,11 +48,11 @@ msgstr "چىقىرىۋەت"
6866 #: ../data/playlist.ui.h:6
6867 msgid "Remove file from playlist"
6868 -msgstr "قويۇش تىزىملىكىدىن چىقىرىۋېتىش"
6869 +msgstr "قويۇش تىزىمىدىن چىقىرىۋەت"
6871 #: ../data/playlist.ui.h:7
6872 msgid "Save Playlist..."
6873 -msgstr "قويۇش تىزىملىكىنى ساقلاش..."
6874 +msgstr "قويۇش تىزىمىنى ساقلا…"
6876 #: ../data/playlist.ui.h:8 ../data/totem.ui.h:77
6877 msgid "Select a file to use for text subtitles"
6878 @@ -59,25 +60,25 @@ msgstr "ئېكران خېتىگە ئىشلىتىدىغان ھۆججەتنى تا
6880 #: ../data/playlist.ui.h:9 ../data/video-list.ui.h:4
6881 msgid "_Copy Location"
6882 -msgstr "ئادرېسنى كۆچۈرۈش(_C)"
6883 +msgstr "ئادرېسنى كۆچۈر(_C)"
6885 #: ../data/playlist.ui.h:10
6886 msgid "_Remove"
6887 msgstr "ئۆچۈر(_R)"
6889 -#: ../data/playlist.ui.h:11 ../data/totem.ui.h:145
6890 +#: ../data/playlist.ui.h:11 ../data/totem.ui.h:141
6891 msgid "_Select Text Subtitles..."
6892 msgstr "ئېكران خەت تېكىستىنى تاللا(_S)…"
6894 #. Channels
6895 #: ../data/properties.ui.h:1
6896 -#: ../src/properties/bacon-video-widget-properties.c:175
6897 +#: ../src/properties/bacon-video-widget-properties.c:140
6898 msgid "0 Channels"
6899 msgstr "0 قانال"
6901 #. Sample rate
6902 #: ../data/properties.ui.h:2
6903 -#: ../src/properties/bacon-video-widget-properties.c:173
6904 +#: ../src/properties/bacon-video-widget-properties.c:138
6905 msgid "0 Hz"
6906 msgstr "0 Hz"
6908 @@ -90,7 +91,8 @@ msgid "0 kbps"
6909 msgstr "0 kbps"
6911 #. 0 seconds
6912 -#: ../data/properties.ui.h:5 ../src/backend/video-utils.c:158
6913 +#: ../data/properties.ui.h:5
6914 +#: ../src/properties/bacon-video-widget-properties.c:176
6915 msgid "0 seconds"
6916 msgstr "0 سېكۇنت"
6918 @@ -107,20 +109,20 @@ msgid "Artist:"
6919 msgstr "ئورۇنلىغۇچى:"
6921 #: ../data/properties.ui.h:9 ../data/totem.ui.h:23
6922 -#: ../src/totem-properties-view.c:89
6923 +#: ../src/totem-properties-view.c:254
6924 msgid "Audio"
6925 msgstr "ئۈن"
6927 #. Audio Codec
6928 #: ../data/properties.ui.h:10
6929 -#: ../src/properties/bacon-video-widget-properties.c:171
6930 +#: ../src/properties/bacon-video-widget-properties.c:136
6931 msgctxt "Audio codec"
6932 msgid "N/A"
6933 msgstr "ئۇچۇر يوق"
6935 #: ../data/properties.ui.h:11
6936 msgid "Bitrate:"
6937 -msgstr "بىت تېزلىكى:"
6938 +msgstr "بىت نىسبىتى:"
6940 #: ../data/properties.ui.h:12
6941 msgid "Channels:"
6942 @@ -135,26 +137,30 @@ msgid "Comment:"
6943 msgstr "ئىزاھات:"
6945 #: ../data/properties.ui.h:15
6946 +msgid "Container:"
6947 +msgstr "قاچا:"
6949 +#: ../data/properties.ui.h:16
6950 msgid "Dimensions:"
6951 msgstr "ئۆلچىمى:"
6953 -#: ../data/properties.ui.h:16
6954 +#: ../data/properties.ui.h:17
6955 msgid "Duration:"
6956 msgstr "ۋاقتى:"
6958 -#: ../data/properties.ui.h:17
6959 +#: ../data/properties.ui.h:18
6960 msgid "Framerate:"
6961 msgstr "سۈرەت تېزلىكى"
6963 -#: ../data/properties.ui.h:18 ../data/totem.ui.h:41
6964 +#: ../data/properties.ui.h:19 ../data/totem.ui.h:41
6965 msgid "General"
6966 msgstr "ئادەتتىكى"
6968 -#: ../data/properties.ui.h:19
6969 +#: ../data/properties.ui.h:20
6970 msgid "Sample rate:"
6971 msgstr "ئەۋرىشكە ئېلىش نىسبىتى:"
6973 -#: ../data/properties.ui.h:20
6974 +#: ../data/properties.ui.h:21
6975 msgid "Title:"
6976 msgstr "ماۋزۇ"
6978 @@ -162,27 +168,29 @@ msgstr "ماۋزۇ"
6979 #. Artist
6980 #. Album
6981 #. Year
6982 -#: ../data/properties.ui.h:21
6983 -#: ../src/properties/bacon-video-widget-properties.c:145
6984 -#: ../src/properties/bacon-video-widget-properties.c:147
6985 -#: ../src/properties/bacon-video-widget-properties.c:149
6986 -#: ../src/properties/bacon-video-widget-properties.c:151
6987 +#. Container
6988 +#: ../data/properties.ui.h:22
6989 +#: ../src/properties/bacon-video-widget-properties.c:107
6990 +#: ../src/properties/bacon-video-widget-properties.c:109
6991 +#: ../src/properties/bacon-video-widget-properties.c:111
6992 +#: ../src/properties/bacon-video-widget-properties.c:113
6993 +#: ../src/properties/bacon-video-widget-properties.c:119
6994 msgid "Unknown"
6995 msgstr "نامەلۇم"
6997 -#: ../data/properties.ui.h:22 ../data/totem.ui.h:104
6998 -#: ../src/totem-properties-view.c:85
6999 +#: ../data/properties.ui.h:23 ../data/totem.ui.h:104
7000 +#: ../src/totem-properties-view.c:256
7001 msgid "Video"
7002 msgstr "سىن"
7004 #. Video Codec
7005 -#: ../data/properties.ui.h:23
7006 -#: ../src/properties/bacon-video-widget-properties.c:160
7007 +#: ../data/properties.ui.h:24
7008 +#: ../src/properties/bacon-video-widget-properties.c:124
7009 msgctxt "Video codec"
7010 msgid "N/A"
7011 msgstr "ئۇچۇر يوق"
7013 -#: ../data/properties.ui.h:24
7014 +#: ../data/properties.ui.h:25
7015 msgid "Year:"
7016 msgstr "يىلى:"
7018 @@ -191,13 +199,12 @@ msgid "Add the video to the playlist"
7019 msgstr "سىننى قويۇش تىزىملىكىگە قوشىدۇ"
7021 #: ../data/video-list.ui.h:3 ../src/totem-dnd-menu.c:97
7022 -#: ../src/plugins/jamendo/jamendo.ui.h:9
7023 msgid "_Add to Playlist"
7024 msgstr "قويۇش تىزىملىكىگە قوش"
7026 #. Title
7027 #: ../data/totem.desktop.in.in.in.h:1 ../data/totem.ui.h:53
7028 -#: ../src/totem-object.c:1667
7029 +#: ../src/totem-object.c:1663
7030 msgid "Movie Player"
7031 msgstr "كىنو قويغۇچ"
7033 @@ -290,7 +297,6 @@ msgid "About this application"
7034 msgstr "بۇ پروگرامما ھەققىدە"
7036 #: ../data/totem.ui.h:22
7037 -#| msgid "Auto"
7038 msgctxt "Aspect ratio"
7039 msgid "Auto"
7040 msgstr "ئاپتوماتىك"
7041 @@ -325,7 +331,7 @@ msgstr "باغلىنىش تېزلىكى(_S)"
7043 #: ../data/totem.ui.h:31
7044 msgid "Decrease volume"
7045 -msgstr "ئاۋازنى كىچىكلىتىش"
7046 +msgstr "ئاۋازنى تۈۋەنلەت"
7048 #: ../data/totem.ui.h:32
7049 msgid "Disable _deinterlacing of interlaced videos"
7050 @@ -333,7 +339,7 @@ msgstr "قۇر ئاتلاپ كۆرسىتىدىغان سىندا قۇرمۇ-قۇ
7052 #: ../data/totem.ui.h:33
7053 msgid "Disable screensaver when playing "
7054 -msgstr "قويۇۋاتقاندا ئېكران قوغداشنى ئىناۋەتسىز قىلىش "
7055 +msgstr "قويۇۋاتقاندا ئېكران قوغداشنى چەكلە "
7057 #. Tab label in the Preferences dialogue
7058 #: ../data/totem.ui.h:35
7059 @@ -342,7 +348,7 @@ msgstr "كۆرسەتكۈچ"
7061 #: ../data/totem.ui.h:36
7062 msgid "Eject the current disc"
7063 -msgstr "نۆۋەتتىكى دىسكىنى چىقىرىش"
7064 +msgstr "نۆۋەتتىكى دىسكىنى قاڭقىت"
7066 #: ../data/totem.ui.h:37
7067 msgid "External Chapters"
7068 @@ -351,31 +357,31 @@ msgstr "باشقا بۆلەكلەر"
7069 #. Audio visualization dimensions
7070 #: ../data/totem.ui.h:39
7071 msgid "Extra Large"
7072 -msgstr "بەكلا چوڭ"
7073 +msgstr "زىيادە چوڭ"
7075 #: ../data/totem.ui.h:40
7076 msgid "Fit Window to Movie"
7077 -msgstr "كۆزنەكنى كىنوغا توغرىلاش"
7078 +msgstr "كۆزنەكنى كىنوغا ماسلاشتۇر"
7080 #: ../data/totem.ui.h:42
7081 msgid "Go to the DVD menu"
7082 -msgstr "نىڭ تاللاش جەدۋىلىگە بېرىش DVD"
7083 +msgstr "DVD تىزىملىكىگە يۆتكەل"
7085 #: ../data/totem.ui.h:43
7086 msgid "Go to the angle menu"
7087 -msgstr "بۇلۇڭلۇق تاللاش جەدۋىلىگە بېرىش"
7088 +msgstr "بۇلۇڭلۇق تىزىملىككە يۆتكەل"
7090 #: ../data/totem.ui.h:44
7091 msgid "Go to the audio menu"
7092 -msgstr "ئاۋاز تاللاش جەدۋىلىگە بېرىش"
7093 +msgstr "ئۈن تىزىملىكىگە يۆتكەل"
7095 #: ../data/totem.ui.h:45
7096 msgid "Go to the chapter menu"
7097 -msgstr "بۆلۈم تاللاش جەدۋىلىگە بېرىش"
7098 +msgstr "بۆلۈم تىزىملىكىگە يۆتكەل"
7100 #: ../data/totem.ui.h:46
7101 msgid "Go to the title menu"
7102 -msgstr "ئىسىم تاللاش جەدۋىلىگە بېرىش"
7103 +msgstr "ماۋزۇ تىزىملىكىگە يۆتكەل"
7105 #: ../data/totem.ui.h:47
7106 msgid "Help contents"
7107 @@ -383,7 +389,7 @@ msgstr "ياردەم ھۆججىتى"
7109 #: ../data/totem.ui.h:48
7110 msgid "Increase volume"
7111 -msgstr "ئاۋازنى چوڭايتىش"
7112 +msgstr "ئاۋازنى يۇقىرىلات"
7114 #: ../data/totem.ui.h:49
7115 msgid "Intranet/LAN"
7116 @@ -396,7 +402,7 @@ msgstr "چوڭراق"
7118 #: ../data/totem.ui.h:52
7119 msgid "Load _chapter files when movie is loaded"
7120 -msgstr "كىنونى ئوقۇۋاتقاندا بۆلەك ھۆججەتلىرىنى ئوقۇ(_C)"
7121 +msgstr "كىنونى يۈكلەۋاتقاندا بۆلەك ھۆججەتلىرىنى يۈكلە(_C)"
7123 #: ../data/totem.ui.h:54
7124 msgid "Networking"
7125 @@ -413,7 +419,7 @@ msgstr "نورمال"
7127 #: ../data/totem.ui.h:58
7128 msgid "Open _Location..."
7129 -msgstr "ئادرېسنى ئېچىش...(_L)"
7130 +msgstr "ئورۇننى ئاچ(_L)…"
7132 #: ../data/totem.ui.h:59
7133 msgid "Open a file"
7134 @@ -421,7 +427,7 @@ msgstr "ھۆججەت ئاچىدۇ"
7136 #: ../data/totem.ui.h:60
7137 msgid "Open a non-local file"
7138 -msgstr "يەرلىك بولمىغان ھۆججەتنى ئېچىش"
7139 +msgstr "يەرلىك بولمىغان ھۆججەتنى ئاچ"
7141 #: ../data/totem.ui.h:61
7142 msgid "Play / P_ause"
7143 @@ -437,7 +443,7 @@ msgstr "قويۇش"
7145 #: ../data/totem.ui.h:64
7146 msgid "Plugins..."
7147 -msgstr "قىستۇرمىلار..."
7148 +msgstr "قىستۇرمىلار…"
7150 #: ../data/totem.ui.h:65
7151 msgid "Prefere_nces"
7152 @@ -449,7 +455,7 @@ msgstr "ئالدىنقى بۆلەك ياكى كىنو"
7154 #: ../data/totem.ui.h:67
7155 msgid "Quit the program"
7156 -msgstr "پروگراممىدىن چېكىنىdu"
7157 +msgstr "پروگراممىدىن چېكىنىدۇ"
7159 #: ../data/totem.ui.h:68
7160 msgid "Reset to _Defaults"
7161 @@ -457,23 +463,23 @@ msgstr "كۆڭۈلدىكىگە قايتۇر(_D)"
7163 #: ../data/totem.ui.h:69
7164 msgid "Resize _1:1"
7165 -msgstr "1:1 گە ئۆزگەرتىش(_1)"
7166 +msgstr "_1:1 گە ئۆزگەرت"
7168 #: ../data/totem.ui.h:70
7169 msgid "Resize _2:1"
7170 -msgstr "2:1 گە ئۆزگەرتىش(_2)"
7171 +msgstr "_2:1 گە ئۆزگەرت"
7173 #: ../data/totem.ui.h:71
7174 msgid "Resize to double the original video size"
7175 -msgstr "ئەسلىدىكىسىنىڭ ھەسسىسىگە ئۆزگەرتىش"
7176 +msgstr "ئەسلىدىكىسىنىڭ ئىككى ھەسسىسگە ئۆزگەرت"
7178 #: ../data/totem.ui.h:72
7179 msgid "Resize to half the original video size"
7180 -msgstr "ئەسلىدىكىسىنىڭ يېرىمىغا ئۆزگەرتىش"
7181 +msgstr "ئەسلىدىكىسىنىڭ يېرىمىغا ئۆزگەرت"
7183 #: ../data/totem.ui.h:73
7184 msgid "Resize to the original video size"
7185 -msgstr "ئەسلىدىكىسىگە ئۆخشاش قىلىپ ئۆزگەرتىش"
7186 +msgstr "ئەسلىدىكىسىگە ئۆزگەرت"
7188 #: ../data/totem.ui.h:74
7189 msgid "S_idebar"
7190 @@ -481,7 +487,7 @@ msgstr "يان بالداق(_I)"
7192 #: ../data/totem.ui.h:75
7193 msgid "S_ubtitles"
7194 -msgstr "كىنونىڭ ئاستىدىكى خېتى(_U)"
7195 +msgstr "ئېكران خېتى(_U)"
7197 #: ../data/totem.ui.h:76
7198 msgid "Sat_uration:"
7199 @@ -489,11 +495,11 @@ msgstr ":تويۇنۇش دەرىجىسى(_U)"
7201 #: ../data/totem.ui.h:78
7202 msgid "Set the repeat mode"
7203 -msgstr "قايتىلاش شەكلىنى بەلگىلەش"
7204 +msgstr "قايتىلاش شەكلىنى تەڭشە"
7206 #: ../data/totem.ui.h:79
7207 msgid "Set the shuffle mode"
7208 -msgstr "خالىغان تەرتىپتە قويۇش شەكلىنى بەلگىلەش"
7209 +msgstr "خالىغان تەرتىپتە قويۇش شەكلىنى تەڭشە"
7211 #: ../data/totem.ui.h:80
7212 msgid "Sets 16:9 (widescreen) aspect ratio"
7213 @@ -501,7 +507,7 @@ msgstr "كەڭلىك-ئېگىزلىك نىسبىتىنى 16:9(كەڭ ئېكرا
7215 #: ../data/totem.ui.h:81
7216 msgid "Sets 2.11:1 (DVB) aspect ratio"
7217 -msgstr "كەڭلىك-ئېگىزلىك نىسبىتىنى (DVD) 2.11:1 گە تەڭشەش"
7218 +msgstr "كەڭلىك-ئېگىزلىك نىسبىتىنى (DVB) 2.11:1 گە تەڭشەش"
7220 #: ../data/totem.ui.h:82
7221 msgid "Sets 4:3 (TV) aspect ratio"
7222 @@ -517,31 +523,31 @@ msgstr "كەڭلىك-ئېگىزلىك نىسبىتىنى تۆت چاسىغا ت
7224 #: ../data/totem.ui.h:85
7225 msgid "Show _Controls"
7226 -msgstr "كونتروللىغۇچنى كۆرسىتىش(_C)"
7227 +msgstr "كونتىروللىغۇچنى كۆرسەت(_C)"
7229 #: ../data/totem.ui.h:86
7230 msgid "Show _visual effects when an audio file is played"
7231 -msgstr "ئاۋاز ھۆججىتىنى قويۇۋاتقاندا كۆرۈش ئۈنۈمىنى كۆرسىتىش(_V)"
7232 +msgstr "ئاۋاز ھۆججىتىنى قويۇۋاتقاندا كۆرۈنۈش ئۈنۈمىنى كۆرسەت(_V)"
7234 #: ../data/totem.ui.h:87
7235 msgid "Show controls"
7236 -msgstr "كونتروللىغۇچنى كۆرسىتىش"
7237 +msgstr "كونتىروللىغۇچنى كۆرسەت"
7239 #: ../data/totem.ui.h:88
7240 msgid "Show or hide the sidebar"
7241 -msgstr "يان بالداقنى كۆرسىتىش ياكى يوشۇرۇش"
7242 +msgstr "يان بالداقنى كۆرسەت ياكى يوشۇر"
7244 #: ../data/totem.ui.h:89
7245 msgid "Shuff_le Mode"
7246 -msgstr "قالايمىقان قويۇش شەكلى(_L)"
7247 +msgstr "تەرتىپسىز قويۇش شەكلى(_l)"
7249 #: ../data/totem.ui.h:90
7250 msgid "Skip _Backwards"
7251 -msgstr "تېز ئارقىغا ياندۇرۇش(_B)"
7252 +msgstr "تېز ئارقىغا ياندۇر(_B)"
7254 #: ../data/totem.ui.h:91
7255 msgid "Skip _Forward"
7256 -msgstr "تېز ئالدىغا ماڭدۇرۇش(_F)"
7257 +msgstr "تېز ئالدىغا ماڭدۇر(_F)"
7259 #: ../data/totem.ui.h:92
7260 msgid "Skip backwards"
7261 @@ -559,7 +565,8 @@ msgstr "تۆت چاسا"
7262 msgid "Start playing files from last position"
7263 msgstr "ھۆججەتلەرنى ئەڭ ئاخىرقى قېتىم كۆرگەندە كەلگەن ئورۇندىن باشاپ قويىدۇ."
7265 -#: ../data/totem.ui.h:96 ../src/backend/bacon-video-widget-gst-0.10.c:6008
7266 +#: ../data/totem.ui.h:96 ../src/totem-properties-view.c:214
7267 +#: ../src/backend/bacon-video-widget-gst-0.10.c:5551
7268 msgid "Stereo"
7269 msgstr "ستېرېئو"
7271 @@ -605,161 +612,145 @@ msgstr ":كۆرۈنۈش ئۈنۈمىنىڭ چوڭلۇقى(_S):"
7273 #: ../data/totem.ui.h:109
7274 msgid "Volume _Down"
7275 -msgstr "ئاۋازىنى پەسەيتىش(_D)"
7276 +msgstr "ئاۋازىنى تۆۋەنلەت(_D)"
7278 #: ../data/totem.ui.h:110
7279 msgid "Volume _Up"
7280 -msgstr "ئاۋازىنى كۆتۈرۈش(_U)"
7281 +msgstr "ئاۋازىنى يۇقىرىلات(_U)"
7283 #: ../data/totem.ui.h:111
7284 msgid "Zoom In"
7285 msgstr "چوڭايت"
7287 #: ../data/totem.ui.h:112
7288 -msgid "Zoom Out"
7289 -msgstr "كىچىكلىتىش"
7291 -#: ../data/totem.ui.h:113
7292 -msgid "Zoom Reset"
7293 -msgstr "چوڭ-كىچىكلىكىنى ئەسلىگە كەلتۈرۈش"
7295 -#: ../data/totem.ui.h:114
7296 msgid "Zoom in"
7297 msgstr "چوڭايت"
7299 -#: ../data/totem.ui.h:115
7300 -msgid "Zoom out"
7301 -msgstr "كىچىكلەت"
7303 -#: ../data/totem.ui.h:116
7304 -msgid "Zoom reset"
7305 -msgstr "چوڭ-كىچىكلىكىنى ئەسلىگە كەلتۈرۈش"
7307 -#: ../data/totem.ui.h:117
7308 +#: ../data/totem.ui.h:113
7309 msgid "_About"
7310 msgstr "ھەققىدە(_A)"
7312 -#: ../data/totem.ui.h:118
7313 +#: ../data/totem.ui.h:114
7314 msgid "_Angle Menu"
7315 -msgstr "بۇلۇڭلۇق تاللاش تىزىملىكى(_A)"
7316 +msgstr "بۇلۇڭلۇق تىزىملىك(_A)"
7318 -#: ../data/totem.ui.h:119
7319 +#: ../data/totem.ui.h:115
7320 msgid "_Aspect Ratio"
7321 msgstr "ئېگىز-كەڭلىك نىسبىتى(_A)"
7323 -#: ../data/totem.ui.h:120
7324 +#: ../data/totem.ui.h:116
7325 msgid "_Audio output type:"
7326 msgstr "ئاۋاز چىقىش شەكلى(_A):"
7328 -#: ../data/totem.ui.h:121
7329 +#: ../data/totem.ui.h:117
7330 msgid "_Brightness:"
7331 msgstr ":يورۇقلۇقى(_B)"
7333 -#: ../data/totem.ui.h:122
7334 +#: ../data/totem.ui.h:118
7335 msgid "_Chapter Menu"
7336 msgstr "بۆلەك مۇندەرىجىسى(_C)"
7338 -#: ../data/totem.ui.h:123
7339 +#: ../data/totem.ui.h:119
7340 msgid "_Clear Playlist"
7341 msgstr "قويۇش تىزىملىكىنى تازىلا(_C)"
7343 -#: ../data/totem.ui.h:124
7344 +#: ../data/totem.ui.h:120
7345 msgid "_Contents"
7346 msgstr "مەزمۇنلار(_C)"
7348 -#: ../data/totem.ui.h:125
7349 +#: ../data/totem.ui.h:121
7350 msgid "_DVD Menu"
7351 -msgstr "نىڭ مۇندەرىجىسى DVD(_D)"
7352 +msgstr "_DVD تىزىملىكى"
7354 -#: ../data/totem.ui.h:126
7355 +#: ../data/totem.ui.h:122
7356 msgid "_Edit"
7357 msgstr "تەھرىر(_E)"
7359 -#: ../data/totem.ui.h:127
7360 +#: ../data/totem.ui.h:123
7361 msgid "_Eject"
7362 -msgstr "دىسكىنى چىقىرىش(_E)"
7363 +msgstr "قاڭقىت(_E)"
7365 -#: ../data/totem.ui.h:128
7366 +#: ../data/totem.ui.h:124
7367 msgid "_Encoding:"
7368 msgstr "كودلاش(_E):"
7370 -#: ../data/totem.ui.h:129
7371 +#: ../data/totem.ui.h:125
7372 msgid "_Font:"
7373 msgstr "فونت(_F):"
7375 -#: ../data/totem.ui.h:130
7376 +#: ../data/totem.ui.h:126
7377 msgid "_Fullscreen"
7378 msgstr "تولۇق ئېكران( _F)"
7380 -#: ../data/totem.ui.h:131
7381 +#: ../data/totem.ui.h:127
7382 msgid "_Go"
7383 msgstr "يۆتكەل(_G)"
7385 -#: ../data/totem.ui.h:132
7386 +#: ../data/totem.ui.h:128
7387 msgid "_Help"
7388 msgstr "ياردەم(_H)"
7390 -#: ../data/totem.ui.h:133
7391 +#: ../data/totem.ui.h:129
7392 msgid "_Hue:"
7393 msgstr "رەڭ تەڭشەش(_H):"
7395 -#: ../data/totem.ui.h:134
7396 +#: ../data/totem.ui.h:130
7397 msgid "_Languages"
7398 msgstr "تىل(_L)"
7400 -#: ../data/totem.ui.h:135
7401 +#: ../data/totem.ui.h:131
7402 msgid "_Load subtitle files when movie is loaded"
7403 -msgstr "كىنونى ئوقۇۋاتقاندا خەت ھۆججەتلىرىنى ئوقۇ(_C)"
7404 +msgstr "كىنونى يۈكلەۋاتقاندا ئېكران خېتىنى ئۆزلۈكىدىن يۈكلە(_C)"
7406 -#: ../data/totem.ui.h:136
7407 +#: ../data/totem.ui.h:132
7408 msgid "_Movie"
7409 msgstr "كىنو(_M)"
7411 -#: ../data/totem.ui.h:137
7412 +#: ../data/totem.ui.h:133
7413 msgid "_Next Chapter/Movie"
7414 -msgstr "كېيىنكى بۆلەك / كىنو(_N)"
7415 +msgstr "كېيىنكى بۆلەك/كىنو(_N)"
7417 -#: ../data/totem.ui.h:138
7418 +#: ../data/totem.ui.h:134
7419 msgid "_Open..."
7420 msgstr "ئاچ(_O)…"
7422 -#: ../data/totem.ui.h:139
7423 +#: ../data/totem.ui.h:135
7424 msgid "_Previous Chapter/Movie"
7425 -msgstr "ئالدىنقى بۆلەك / كىنو(_P)"
7426 +msgstr "ئالدىنقى بۆلەك/كىنو(_P)"
7428 -#: ../data/totem.ui.h:140
7429 +#: ../data/totem.ui.h:136
7430 msgid "_Properties"
7431 msgstr "خاسلىق(_P)"
7433 -#: ../data/totem.ui.h:141
7434 +#: ../data/totem.ui.h:137
7435 msgid "_Quit"
7436 msgstr "چېكىن(_Q)"
7438 -#: ../data/totem.ui.h:142
7439 +#: ../data/totem.ui.h:138
7440 msgid "_Repeat Mode"
7441 msgstr "قايتىلاش شەكلى(_R)"
7443 -#: ../data/totem.ui.h:143
7444 +#: ../data/totem.ui.h:139
7445 msgid "_Resize 1:2"
7446 -msgstr "چوڭ-كىچىكلىكىنى 1:2 گە ئۆزگەرتىش(_R)"
7447 +msgstr "چوڭ-كىچىكلىكىنى 1:2 گە ئۆزگەرت(_R)"
7449 -#: ../data/totem.ui.h:144
7450 +#: ../data/totem.ui.h:140
7451 msgid "_Resize the window when a new video is loaded"
7452 msgstr "يېڭى كىنونى ئوقۇغاندا كۆزنەك چوڭلۇقىنى ئۆزگەرت(_R)"
7454 -#: ../data/totem.ui.h:146
7455 +#: ../data/totem.ui.h:142
7456 msgid "_Sound"
7457 msgstr "ئاۋاز(_S)"
7459 -#: ../data/totem.ui.h:147
7460 +#: ../data/totem.ui.h:143
7461 msgid "_Title Menu"
7462 -msgstr "ئىسىملىك تاللاش تىزىملىكى(_T)"
7463 +msgstr "ماۋزۇ تىزىملىكى(_T)"
7465 -#: ../data/totem.ui.h:148
7466 +#: ../data/totem.ui.h:144
7467 msgid "_Type of visualization:"
7468 msgstr "كۆرۈنۈش ئۈنۈمى تىپى(_T):"
7470 -#: ../data/totem.ui.h:149
7471 +#: ../data/totem.ui.h:145
7472 msgid "_View"
7473 msgstr "كۆرۈنۈش(_V)"
7475 @@ -781,19 +772,23 @@ msgstr "ئۈن قويغاندا ئېكران قوغدىغۇچقا يول قوي"
7476 msgid ""
7477 "Allow the screensaver to activate when playing audio. Disable if you have "
7478 "monitor-powered speakers."
7479 -msgstr "ئۈن قويغاندا ئېكران قوغدىغۇچقا يول قوي. ئەگەر ئېكران توك تەمىنلەيدىغان ياڭراتقۇ ئىشلەتسىڭىز چەكلەڭ."
7480 +msgstr ""
7481 +"ئۈن قويغاندا ئېكران قوغدىغۇچقا يول قوي. ئەگەر ئېكران توك تەمىنلەيدىغان "
7482 +"ياڭراتقۇ ئىشلەتسىڭىز چەكلەڭ."
7484 #: ../data/org.gnome.totem.gschema.xml.in.in.h:5
7485 msgid ""
7486 "Amount of data to buffer for network streams before starting to display the "
7487 "stream (in seconds)."
7488 -msgstr "تور ئاقما ۋاسىتە باشلىنىشتىن ئىلگىرىكى غەملەيدىغان سانلىق مەلۇمات(سېكۇنت)"
7489 +msgstr ""
7490 +"تور ئاقما ۋاسىتە باشلىنىشتىن ئىلگىرىكى غەملەيدىغان سانلىق مەلۇمات(سېكۇنت)"
7492 #: ../data/org.gnome.totem.gschema.xml.in.in.h:6
7493 msgid ""
7494 "Approximate network connection speed, used to select quality on media over "
7495 "the network."
7496 -msgstr "تەخمىنەن تور سۈرئىتى، تور ئاقما ۋاسىتىنىڭ سۈپىتىنى تاللاشقا ئىشلىتىلىدۇ."
7497 +msgstr ""
7498 +"تەخمىنەن تور سۈرئىتى، تور ئاقما ۋاسىتىنىڭ سۈپىتىنى تاللاشقا ئىشلىتىلىدۇ."
7500 #: ../data/org.gnome.totem.gschema.xml.in.in.h:7
7501 msgid "Default location for the \"Open...\" dialogs"
7502 @@ -803,7 +798,8 @@ msgstr "«ئاچ» كۆزنىكىدىكى كۆڭۈلدىكى ئادرېس"
7503 msgid ""
7504 "Default location for the \"Open...\" dialogs. Default is the current "
7505 "directory."
7506 -msgstr "«ئاچ» كۆزنىكىدىكى كۆڭۈلدىكى ئادرېس. ھازىرقى مۇندەرىجە كۆڭۈلدىكى ئادرېستۇر."
7507 +msgstr ""
7508 +"«ئاچ» كۆزنىكىدىكى كۆڭۈلدىكى ئادرېس. ھازىرقى مۇندەرىجە كۆڭۈلدىكى ئادرېستۇر."
7510 #: ../data/org.gnome.totem.gschema.xml.in.in.h:9
7511 msgid "Default location for the \"Take Screenshot\" dialogs"
7512 @@ -813,7 +809,9 @@ msgstr "«ئېكران كۆرۈنۈشىنى رەسىمگە ئال» كۆزنىك
7513 msgid ""
7514 "Default location for the \"Take Screenshot\" dialogs. Default is the "
7515 "Pictures directory."
7516 -msgstr "«ئېكران كۆرۈنۈشىنى رەسىمگە ئال» كۆزنىكىدىكى كۆڭۈلدىكى ئادرې. ھازىرقى مۇندەرىجە كۆڭۈلدىكى ئادرېستۇر."
7517 +msgstr ""
7518 +"«ئېكران كۆرۈنۈشىنى رەسىمگە ئال» كۆزنىكىدىكى كۆڭۈلدىكى ئادرې. ھازىرقى "
7519 +"مۇندەرىجە كۆڭۈلدىكى ئادرېستۇر."
7521 #: ../data/org.gnome.totem.gschema.xml.in.in.h:11
7522 msgid "Encoding character set for subtitle."
7523 @@ -919,7 +917,9 @@ msgstr "قايتا قويۇش ماتورىنىڭ سازلاش ئىقتىدارى
7524 msgid ""
7525 "Whether to remember the position of played audio/video files when pausing or "
7526 "closing them"
7527 -msgstr "ئۈن/سىن ھۆججىتىنى ۋاقىتلىق توختاتقان ياكى ياپقاندا قويۇش ئورنىنى ئەستە تۇتامدۇ يوق"
7528 +msgstr ""
7529 +"ئۈن/سىن ھۆججىتىنى ۋاقىتلىق توختاتقان ياكى ياپقاندا قويۇش ئورنىنى ئەستە "
7530 +"تۇتامدۇ يوق"
7532 #: ../data/uri.ui.h:1
7533 msgid "Enter the _address of the file you would like to open:"
7534 @@ -960,41 +960,44 @@ msgstr "URI پۈتۈكنى 'Type=Link' ئۈستەلئۈستى تۈرىگە يو
7535 msgid "Not a launchable item"
7536 msgstr "ئىجراچان تۈر ئەمەس"
7538 -#: ../src/eggfileformatchooser.c:235
7539 +#: ../src/eggfileformatchooser.c:240
7540 #, c-format
7541 msgid "File _Format: %s"
7542 msgstr "ھۆججەت فورماتى(_F): %s"
7544 -#: ../src/eggfileformatchooser.c:374
7545 +#: ../src/eggfileformatchooser.c:379
7546 msgid "All Files"
7547 msgstr "ھەممە ھۆججەتلەر"
7549 -#: ../src/eggfileformatchooser.c:375
7550 +#: ../src/eggfileformatchooser.c:380
7551 msgid "All Supported Files"
7552 msgstr "قوللايدىغان ھەممە ھۆججەتلەر"
7554 -#: ../src/eggfileformatchooser.c:384
7555 +#: ../src/eggfileformatchooser.c:389
7556 msgid "By Extension"
7557 msgstr "كېڭەيتىلمە ئاتى بويىچە"
7559 -#: ../src/eggfileformatchooser.c:399
7560 +#: ../src/eggfileformatchooser.c:404
7561 msgid "File Format"
7562 msgstr "ھۆججەت فورماتى"
7564 -#: ../src/eggfileformatchooser.c:417
7565 +#: ../src/eggfileformatchooser.c:422
7566 msgid "Extension(s)"
7567 msgstr "كېڭەيتىلمە(لەر)"
7569 #. Translators: the parameter is a filename
7570 -#: ../src/eggfileformatchooser.c:652
7571 +#: ../src/eggfileformatchooser.c:657
7572 #, c-format
7573 msgid ""
7574 "The program was not able to find out the file format you want to use for `%"
7575 "s'. Please make sure to use a known extension for that file or manually "
7576 "choose a file format from the list below."
7577 -msgstr "پروگرامما سىز قوللانماقچى بولغان `%s' تاللانمىنىڭ ھۆججەت فورماتىنى تاپالمىدى. ھۆججەتكە مەلۇملۇق فورمات ئىشلىتىلگەننى جەزملەڭ ياكى تۆۋەندىكى تىزىملىكتىن ھۆججەت فورماتىدىن بىرنى قولدا تاللاڭ"
7578 +msgstr ""
7579 +"پروگرامما سىز قوللانماقچى بولغان `%s' تاللانمىنىڭ ھۆججەت فورماتىنى "
7580 +"تاپالمىدى. ھۆججەتكە مەلۇملۇق فورمات ئىشلىتىلگەننى جەزملەڭ ياكى تۆۋەندىكى "
7581 +"تىزىملىكتىن ھۆججەت فورماتىدىن بىرنى قولدا تاللاڭ"
7583 -#: ../src/eggfileformatchooser.c:659
7584 +#: ../src/eggfileformatchooser.c:664
7585 msgid "File format not recognized"
7586 msgstr "ھۆججەت فورماتىنى تونۇيالمىدى"
7588 @@ -1008,7 +1011,7 @@ msgstr "سەپلىمە ساقلانغان ھۆججەتنى بەلگىلە"
7590 #: ../src/eggsmclient.c:229
7591 msgid "FILE"
7592 -msgstr "FILE"
7593 +msgstr "ھۆججەت"
7595 #: ../src/eggsmclient.c:232
7596 msgid "Specify session management ID"
7597 @@ -1020,64 +1023,73 @@ msgstr "ID"
7599 #: ../src/eggsmclient.c:253
7600 msgid "Session management options:"
7601 -msgstr "ئەڭگىمە باشقۇرغۇ تاللانمىلىرى:"
7602 +msgstr "ئەڭگىمە باشقۇرغۇچ تاللانمىلىرى:"
7604 #: ../src/eggsmclient.c:254
7605 msgid "Show session management options"
7606 -msgstr "ئەڭگىمە باشقۇرغۇ تاللانمىلىرى كۆرسەت"
7607 +msgstr "ئەڭگىمە باشقۇرغۇچ تاللانمىلىرىنى كۆرسەت"
7609 #. Dimensions
7610 -#: ../src/properties/bacon-video-widget-properties.c:158
7611 +#: ../src/properties/bacon-video-widget-properties.c:122
7612 msgctxt "Dimensions"
7613 msgid "N/A"
7614 msgstr "ئۇچۇر يوق"
7616 -#: ../src/properties/bacon-video-widget-properties.c:163
7617 -#: ../src/properties/bacon-video-widget-properties.c:240
7618 +#: ../src/properties/bacon-video-widget-properties.c:127
7619 msgctxt "Video bit rate"
7620 msgid "N/A"
7621 msgstr "ئۇچۇر يوق"
7623 -#: ../src/properties/bacon-video-widget-properties.c:166
7624 -#: ../src/properties/bacon-video-widget-properties.c:250
7625 +#: ../src/properties/bacon-video-widget-properties.c:130
7626 +#: ../src/properties/bacon-video-widget-properties.c:240
7627 msgctxt "Frame rate"
7628 msgid "N/A"
7629 msgstr "ئۇچۇر يوق"
7631 -#: ../src/properties/bacon-video-widget-properties.c:169
7632 -#: ../src/properties/bacon-video-widget-properties.c:273
7633 +#: ../src/properties/bacon-video-widget-properties.c:134
7634 msgctxt "Audio bit rate"
7635 msgid "N/A"
7636 msgstr "ئۇچۇر يوق"
7638 -#: ../src/properties/bacon-video-widget-properties.c:237
7639 +#: ../src/properties/bacon-video-widget-properties.c:156
7640 #, c-format
7641 -msgid "%d x %d"
7642 -msgstr "%d x %d"
7643 +msgid "%d hour"
7644 +msgid_plural "%d hours"
7645 +msgstr[0] "%d سائەت"
7647 -#: ../src/properties/bacon-video-widget-properties.c:240
7648 -#: ../src/properties/bacon-video-widget-properties.c:273
7649 +#: ../src/properties/bacon-video-widget-properties.c:158
7650 #, c-format
7651 -msgid "%d kbps"
7652 -msgstr "%d kbps"
7653 +msgid "%d minute"
7654 +msgid_plural "%d minutes"
7655 +msgstr[0] "%d مىنۇت"
7657 -#: ../src/properties/bacon-video-widget-properties.c:247
7658 +#: ../src/properties/bacon-video-widget-properties.c:161
7659 #, c-format
7660 -msgid "%d frame per second"
7661 -msgid_plural "%d frames per second"
7662 -msgstr[0] "%d كاندۇك(بىر سېكۇنتتىكى)"
7663 +msgid "%d second"
7664 +msgid_plural "%d seconds"
7665 +msgstr[0] "%d سېكۇنت"
7667 -#: ../src/properties/bacon-video-widget-properties.c:276
7668 +#. 5 hours 2 minutes 12 seconds
7669 +#: ../src/properties/bacon-video-widget-properties.c:167
7670 #, c-format
7671 -msgid "%d Hz"
7672 -msgstr "%d Hz"
7673 +msgctxt "time"
7674 +msgid "%s %s %s"
7675 +msgstr "%s %s %s"
7677 -#: ../src/properties/bacon-video-widget-properties.c:276
7678 -msgctxt "Sample rate"
7679 -msgid "N/A"
7680 -msgstr "ئۇچۇر يوق"
7681 +#. 2 minutes 12 seconds
7682 +#: ../src/properties/bacon-video-widget-properties.c:170
7683 +#, c-format
7684 +msgctxt "time"
7685 +msgid "%s %s"
7686 +msgstr "%s %s"
7688 -#: ../src/totem-audio-preview.c:82
7689 +#: ../src/properties/bacon-video-widget-properties.c:237
7690 +#, c-format
7691 +msgid "%d frame per second"
7692 +msgid_plural "%d frames per second"
7693 +msgstr[0] "%d كاندۇك(بىر سېكۇنتتىكى)"
7695 +#: ../src/totem-audio-preview.c:166
7696 msgid "Audio Preview"
7697 msgstr "ئۈننى ئالدىن كۆرۈش"
7699 @@ -1093,61 +1105,74 @@ msgstr "ھازىر قوي(_P)"
7700 msgid "Cancel"
7701 msgstr "ۋاز كەچ"
7703 -#: ../src/totem-fullscreen.c:619
7704 +#: ../src/totem-fullscreen.c:621
7705 msgid "No File"
7706 msgstr "ھۆججەت يوق"
7708 -#: ../src/totem-interface.c:180 ../src/totem-interface.c:223
7709 +#: ../src/totem-interface.c:181 ../src/totem-interface.c:224
7710 #, c-format
7711 msgid "Couldn't load the '%s' interface. %s"
7712 msgstr "«%s» دېگەن ئارايۈزنى ئوقۇغىلى بولمىدى. %s"
7714 -#: ../src/totem-interface.c:180
7715 +#: ../src/totem-interface.c:181
7716 msgid "The file does not exist."
7717 msgstr "ھۆججەت مەۋجۇت ئەمەس."
7719 -#: ../src/totem-interface.c:182 ../src/totem-interface.c:184
7720 -#: ../src/totem-interface.c:225 ../src/totem-interface.c:227
7721 +#: ../src/totem-interface.c:183 ../src/totem-interface.c:185
7722 +#: ../src/totem-interface.c:226 ../src/totem-interface.c:228
7723 msgid "Make sure that Totem is properly installed."
7724 msgstr "Totem نىڭ توغرا ئورنىتىلغانلىقىنى جەزملەڭ."
7726 -#: ../src/totem-interface.c:346
7727 +#: ../src/totem-interface.c:347
7728 msgid ""
7729 "Totem is free software; you can redistribute it and/or modify it under the "
7730 "terms of the GNU General Public License as published by the Free Software "
7731 "Foundation; either version 2 of the License, or (at your option) any later "
7732 "version."
7733 -msgstr "Totem ئەركىن يۇمشاق دېتال؛ سىز ئەركىن يۇمشاق دېتال فوندى تارقاتقان GNU ئادەتتىكى ئاممىۋى ئىجازەتنامىسىنىڭ ماددىلىرىغا ئاساسەن ئۇنى ئەركىن تارقىتىپ ياكى ئۆزگەرتسىڭىز بولىدۇ؛ ئىجازەتنامىنىڭ ئىككىنچى نەشرى ياكى ئۇنىڭدىن كېيىنكى نەشرىنى ئىشلىتىڭ."
7734 +msgstr ""
7735 +"Totem ئەركىن يۇمشاق دېتال؛ سىز ئەركىن يۇمشاق دېتال فوندى تارقاتقان GNU "
7736 +"ئادەتتىكى ئاممىۋى ئىجازەتنامىسىنىڭ ماددىلىرىغا ئاساسەن ئۇنى ئەركىن تارقىتىپ "
7737 +"ياكى ئۆزگەرتسىڭىز بولىدۇ؛ ئىجازەتنامىنىڭ ئىككىنچى نەشرى ياكى ئۇنىڭدىن "
7738 +"كېيىنكى نەشرىنى ئىشلىتىڭ."
7740 -#: ../src/totem-interface.c:350
7741 +#: ../src/totem-interface.c:351
7742 msgid ""
7743 "Totem is distributed in the hope that it will be useful, but WITHOUT ANY "
7744 "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
7745 "FOR A PARTICULAR PURPOSE. See the GNU General Public License for more "
7746 "details."
7747 -msgstr "Totem نى تارقىتىشنىڭ مەقسىتى ئۇنىڭ سىزگە كېرەكلىك بولۇشى ئۈچۈن، ئەمما ئۇنىڭ ھېچقانداق كاپالىتى يوق؛ ئۇنى ئىشلىتىپ كېلىپ چىققان ھەر قانداق بىۋاسىتە ياكى ۋاسىتىلىك ئاقىۋەتكە ھېچقانداق مەسئۇلىيەتنى ئۈستىگە ئالمايمىز. GNU ئادەتتىكى ئاممىۋى ئىجازەت كېلىشىمىدىكى تەپسىلاتنى كۆرۈڭ."
7748 +msgstr ""
7749 +"Totem نى تارقىتىشنىڭ مەقسىتى ئۇنىڭ سىزگە كېرەكلىك بولۇشى ئۈچۈن، ئەمما ئۇنىڭ "
7750 +"ھېچقانداق كاپالىتى يوق؛ ئۇنى ئىشلىتىپ كېلىپ چىققان ھەر قانداق بىۋاسىتە ياكى "
7751 +"ۋاسىتىلىك ئاقىۋەتكە ھېچقانداق مەسئۇلىيەتنى ئۈستىگە ئالمايمىز. GNU ئادەتتىكى "
7752 +"ئاممىۋى ئىجازەت كېلىشىمىدىكى تەپسىلاتنى كۆرۈڭ."
7754 -#: ../src/totem-interface.c:354
7755 +#: ../src/totem-interface.c:355
7756 msgid ""
7757 "You should have received a copy of the GNU General Public License along with "
7758 "Totem; if not, write to the Free Software Foundation, Inc., 59 Temple Place, "
7759 "Suite 330, Boston, MA 02111-1307 USA"
7760 -msgstr "سىز Totem بىلەن بىللە GNU ئادەتتىكى ئاممىۋى ئىجازەت كېلىشىمىنىڭ كۆچۈرۈلمىسىدىن بىر نۇسخا تاپشۇرۇۋالىسىز؛ ئەگەر تاپشۇرۇۋالمىغان بولسىڭىز ئەركىن يۇمشاق دېتال ۋەخپىسىگە خەت يېزىڭ. مەنزىل: the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301 USA"
7761 +msgstr ""
7762 +"سىز Totem بىلەن بىللە GNU ئادەتتىكى ئاممىۋى ئىجازەت كېلىشىمىنىڭ "
7763 +"كۆچۈرۈلمىسىدىن بىر نۇسخا تاپشۇرۇۋالىسىز؛ ئەگەر تاپشۇرۇۋالمىغان بولسىڭىز "
7764 +"ئەركىن يۇمشاق دېتال ۋەخپىسىگە خەت يېزىڭ. مەنزىل: the Free Software "
7765 +"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301 USA"
7767 -#: ../src/totem-interface.c:357
7768 +#: ../src/totem-interface.c:358
7769 msgid ""
7770 "Totem contains an exception to allow the use of proprietary GStreamer "
7771 "plugins."
7772 -msgstr "GStreamer ئىشلىتىشكە يول قويىدىغان مەخسۇس قىستۇرمىنىڭ مۇستەسناسىنى Totem ئۆز ئىچىگە ئالىدۇ"
7773 +msgstr ""
7774 +"GStreamer ئىشلىتىشكە يول قويىدىغان مەخسۇس قىستۇرمىنىڭ مۇستەسناسىنى Totem ئۆز "
7775 +"ئىچىگە ئالىدۇ"
7777 #. Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD
7778 -#: ../src/totem-menu.c:192
7779 +#: ../src/totem-menu.c:190
7780 msgid "None"
7781 msgstr "يوق"
7783 #. Translators: an entry in the "Languages" menu, used to choose the audio language of a DVD
7784 -#: ../src/totem-menu.c:197
7785 -#| msgid "Auto"
7786 +#: ../src/totem-menu.c:195
7787 msgctxt "Language"
7788 msgid "Auto"
7789 msgstr "ئاپتوماتىك"
7790 @@ -1155,191 +1180,198 @@ msgstr "ئاپتوماتىك"
7791 #. Translators:
7792 #. * This is not a JPEG image, but a disc image, for example,
7793 #. * an ISO file
7794 -#: ../src/totem-menu.c:739
7795 +#: ../src/totem-menu.c:765
7796 #, c-format
7797 msgid "Play Image '%s'"
7798 msgstr "سۈرەت «%s» نى قويىدۇ"
7800 -#: ../src/totem-menu.c:742 ../src/totem-menu.c:825
7801 +#: ../src/totem-menu.c:768 ../src/totem-menu.c:851
7802 #, c-format
7803 msgid "device%d"
7804 -msgstr "ئۈسكىنە %d"
7805 +msgstr "ئۈسكۈنە %d"
7807 -#: ../src/totem-menu.c:822
7808 +#: ../src/totem-menu.c:848
7809 #, c-format
7810 msgid "Play Disc '%s'"
7811 msgstr "دىسكا «%s» نى قويۇش"
7813 #. This lists the back-end type and version, such as
7814 #. * Movie Player using GStreamer 0.10.1
7815 -#: ../src/totem-menu.c:1173
7816 +#: ../src/totem-menu.c:1189
7817 #, c-format
7818 msgid "Movie Player using %s"
7819 msgstr "%s نى ئىشلىتىدىغان كىنو قويغۇچ"
7821 -#: ../src/totem-menu.c:1177
7822 +#: ../src/totem-menu.c:1193
7823 msgid "Copyright © 2002-2009 Bastien Nocera"
7824 msgstr "نەشر ھوقۇقى © 2002-2009 Bastien Nocera"
7826 -#: ../src/totem-menu.c:1182 ../browser-plugin/totem-plugin-viewer.c:1163
7827 +#: ../src/totem-menu.c:1198
7828 msgid "translator-credits"
7829 -msgstr "Gheyret Kenji <gheyret@gmail.com>\n"
7830 -"Sahran<sahran@live.com>\n"
7831 -"Muhemmed Erdem <misran_erdem@hotmail.com>"
7832 +msgstr ""
7833 +"Gheyret Kenji <gheyret@gmail.com>\n"
7834 +"Sahran<sahran@live.com>"
7836 -#: ../src/totem-menu.c:1186
7837 +#: ../src/totem-menu.c:1202
7838 msgid "Totem Website"
7839 msgstr "Totem تورتۇراسى"
7841 -#: ../src/totem-menu.c:1220
7842 +#: ../src/totem-menu.c:1236
7843 msgid "Configure Plugins"
7844 msgstr "قسىتۇرمىلارنى سەپلەش"
7846 #. Translators: %s is the totem version number
7847 -#: ../src/totem-object.c:473
7848 +#: ../src/totem-object.c:471
7849 #, c-format
7850 msgid "Totem %s"
7851 msgstr "Totem %s"
7853 -#: ../src/totem-object.c:1047 ../browser-plugin/totem-plugin-viewer.c:368
7854 +#: ../src/totem-object.c:1043 ../browser-plugin/totem-plugin-viewer.c:366
7855 msgid "Playing"
7856 msgstr "قويۇۋاتىدۇ"
7858 -#: ../src/totem-object.c:1049 ../src/totem-options.c:52
7859 +#: ../src/totem-object.c:1045 ../src/totem-options.c:52
7860 msgid "Pause"
7861 msgstr "ۋاقىتلىق توختا"
7863 -#: ../src/totem-object.c:1054 ../browser-plugin/totem-plugin-viewer.c:364
7864 +#: ../src/totem-object.c:1050 ../browser-plugin/totem-plugin-viewer.c:362
7865 msgid "Paused"
7866 msgstr "ۋاقىتلىق توختىدى"
7868 -#. Translators: this refers to a media file
7869 -#: ../src/totem-object.c:1056 ../src/totem-object.c:1066
7870 +#: ../src/totem-object.c:1052 ../src/totem-object.c:1062
7871 #: ../src/totem-options.c:51
7872 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:84
7873 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:96
7874 msgid "Play"
7875 msgstr "قوي"
7877 -#: ../src/totem-object.c:1061 ../src/totem-object.c:1659
7878 -#: ../src/totem-statusbar.c:115 ../browser-plugin/totem-plugin-viewer.c:352
7879 +#: ../src/totem-object.c:1057 ../src/totem-object.c:1655
7880 +#: ../src/totem-statusbar.c:115 ../browser-plugin/totem-plugin-viewer.c:350
7881 msgid "Stopped"
7882 msgstr "توختىدى"
7884 -#: ../src/totem-object.c:1142 ../src/totem-object.c:1169
7885 -#: ../src/totem-object.c:1797 ../src/totem-object.c:1960
7886 +#: ../src/totem-object.c:1138 ../src/totem-object.c:1165
7887 +#: ../src/totem-object.c:1795 ../src/totem-object.c:1959
7888 #, c-format
7889 msgid "Totem could not play '%s'."
7890 msgstr "Totem «%s» نى قويالمىدى"
7892 -#: ../src/totem-object.c:1246
7893 +#: ../src/totem-object.c:1242
7894 #, c-format
7895 msgid ""
7896 "Totem could not play this media (%s) although a plugin is present to handle "
7897 "it."
7898 -msgstr "گەرچە ئۇنى بىر تەرەپ قىلىدىغان قىستۇرما بولسىمۇ، بۇ ۋاسىتە (%s)نى Totem قويالمىدى."
7899 +msgstr ""
7900 +"گەرچە ئۇنى بىر تەرەپ قىلىدىغان قىستۇرما بولسىمۇ، بۇ ۋاسىتە (%s)نى Totem "
7901 +"قويالمىدى."
7903 -#: ../src/totem-object.c:1247
7904 +#: ../src/totem-object.c:1243
7905 msgid ""
7906 "You might want to check that a disc is present in the drive and that it is "
7907 "correctly configured."
7908 -msgstr "قوزغاتقۇچنىڭ ئىچىدە دىسكا بار-يوقلىغىنى ۋە توغرا تەڭشەلگەنلىكىنى تەكشۈرۈپ كۆرۈڭ"
7909 +msgstr ""
7910 +"قوزغاتقۇچنىڭ ئىچىدە دىسكا بار-يوقلىغىنى ۋە توغرا تەڭشەلگەنلىكىنى تەكشۈرۈپ "
7911 +"كۆرۈڭ"
7913 -#: ../src/totem-object.c:1255
7914 +#: ../src/totem-object.c:1251
7915 msgid "More information about media plugins"
7916 msgstr "ۋەسىتە قسىتۇرمىلىرى ھەققىدە تېخىمۇ كۆپ ئۇچۇر"
7918 -#: ../src/totem-object.c:1256
7919 +#: ../src/totem-object.c:1252
7920 msgid ""
7921 "Please install the necessary plugins and restart Totem to be able to play "
7922 "this media."
7923 msgstr "Totem دا بۇ ۋاسىتىنى قويۇش ئۈچۈن زۆرۈر بولغان قىستۇرمىلارنى ئورنىتىڭ."
7925 -#: ../src/totem-object.c:1258
7926 +#: ../src/totem-object.c:1254
7927 #, c-format
7928 msgid ""
7929 "Totem cannot play this type of media (%s) because it does not have the "
7930 "appropriate plugins to be able to read from the disc."
7931 -msgstr "Totem دا دىسكىدىكى بۇ خىل ۋاسىتە(%s)نى ئوقۇيالايدىغان مۇۋاپىق قسىتۇرما بولمىغاچقا، بۇ خىلدىكى ۋاسىتىنى قويغىلى بولمايدۇ."
7932 +msgstr ""
7933 +"Totem دا دىسكىدىكى بۇ خىل ۋاسىتە(%s)نى ئوقۇيالايدىغان مۇۋاپىق قسىتۇرما "
7934 +"بولمىغاچقا، بۇ خىلدىكى ۋاسىتىنى قويغىلى بولمايدۇ."
7936 -#: ../src/totem-object.c:1260
7937 +#: ../src/totem-object.c:1256
7938 #, c-format
7939 msgid ""
7940 "Totem cannot play this type of media (%s) because you do not have the "
7941 "appropriate plugins to handle it."
7942 -msgstr "Totem دا بۇ خىل ۋاسىتە(%s)نى بىر تەرەپ قىلىدىغان مۇۋاپىق قسىتۇرما بولمىغاچقا، بۇ خىلدىكى ۋاسىتىنى قويغىلى بولمايدۇ."
7943 +msgstr ""
7944 +"Totem دا بۇ خىل ۋاسىتە(%s)نى بىر تەرەپ قىلىدىغان مۇۋاپىق قسىتۇرما "
7945 +"بولمىغاچقا، بۇ خىلدىكى ۋاسىتىنى قويغىلى بولمايدۇ."
7947 -#: ../src/totem-object.c:1263
7948 +#: ../src/totem-object.c:1259
7949 #, c-format
7950 msgid "Totem cannot play this type of media (%s) because it is not supported."
7951 -msgstr "Totem دا بۇ خىل ۋاسىتە(%s)نى تېخى بىر تەرەپ قىلغىلى بولمىغاچقا، بۇ خىلدىكى ۋاسىتىنى قويغىلى بولمايدۇ."
7952 +msgstr ""
7953 +"Totem دا بۇ خىل ۋاسىتە(%s)نى تېخى بىر تەرەپ قىلغىلى بولمىغاچقا، بۇ خىلدىكى "
7954 +"ۋاسىتىنى قويغىلى بولمايدۇ."
7956 -#: ../src/totem-object.c:1264
7957 +#: ../src/totem-object.c:1260
7958 msgid "Please insert another disc to play back."
7959 msgstr "قويۇش ئۈچۈن باغشقا دىسكا سېلىڭ."
7961 -#: ../src/totem-object.c:1300
7962 +#: ../src/totem-object.c:1296
7963 msgid "Totem was not able to play this disc."
7964 msgstr "Totem بۇ دىسكىنى قويالمىدى."
7966 -#: ../src/totem-object.c:1301 ../src/totem-object.c:4278
7967 +#: ../src/totem-object.c:1297 ../src/totem-object.c:4225
7968 msgid "No reason."
7969 msgstr "سەۋەبسىز."
7971 -#: ../src/totem-object.c:1315
7972 +#: ../src/totem-object.c:1311
7973 msgid "Totem does not support playback of Audio CDs"
7974 msgstr "Totem تېخى ئۈن CDs نى قويالمايدۇ"
7976 -#: ../src/totem-object.c:1316
7977 +#: ../src/totem-object.c:1312
7978 msgid "Please consider using a music player or a CD extractor to play this CD"
7979 msgstr "مۇزىكا قويغۇ ياكى باشقا CD ئايرىغۇ ئارقىلىق مەزكۇر CD نى قويۇڭ"
7981 -#: ../src/totem-object.c:1803
7982 +#: ../src/totem-object.c:1801
7983 msgid "No error message"
7984 msgstr "خاتالىق ئۇچۇرى يوق"
7986 -#: ../src/totem-object.c:2195
7987 +#: ../src/totem-object.c:2150
7988 msgid "Totem could not display the help contents."
7989 msgstr "Totem ياردەم مۇندەرىجىسىنى كۆرسىتەلمەيدۇ"
7991 -#: ../src/totem-object.c:2533 ../src/totem-object.c:2535
7992 -#: ../browser-plugin/totem-plugin-viewer.c:1466
7993 +#: ../src/totem-object.c:2489 ../src/totem-object.c:2491
7994 +#: ../browser-plugin/totem-plugin-viewer.c:1410
7995 msgid "An error occurred"
7996 msgstr "خاتالىق كۆرۈلدى"
7998 -#: ../src/totem-object.c:4112 ../src/totem-object.c:4114
7999 +#: ../src/totem-object.c:4060 ../src/totem-object.c:4062
8000 msgid "Previous Chapter/Movie"
8001 -msgstr "ئالدىنقى بۆلەك / كىنو"
8002 +msgstr "ئالدىنقى بۆلەك/كىنو"
8004 -#: ../src/totem-object.c:4121 ../src/totem-object.c:4123
8005 +#: ../src/totem-object.c:4069 ../src/totem-object.c:4071
8006 msgid "Play / Pause"
8007 -msgstr "قويۇش/توختىتىش"
8008 +msgstr "قوي/ۋاقىتلىق توختا"
8010 -#: ../src/totem-object.c:4131 ../src/totem-object.c:4133
8011 +#: ../src/totem-object.c:4079 ../src/totem-object.c:4081
8012 msgid "Next Chapter/Movie"
8013 -msgstr "كېيىنكى بۆلەك / كىنو"
8014 +msgstr "كېيىنكى بۆلەك/كىنو"
8016 #. Translators: this is the tooltip text for the fullscreen button in the controls box in Totem's main window.
8017 #. Translators: this is the accessibility text for the fullscreen button in the controls box in Totem's main window.
8018 -#: ../src/totem-object.c:4145 ../src/totem-object.c:4147
8019 +#: ../src/totem-object.c:4093 ../src/totem-object.c:4095
8020 msgid "Fullscreen"
8021 msgstr "پۈتۈن ئېكران"
8023 -#: ../src/totem-object.c:4278
8024 +#: ../src/totem-object.c:4225
8025 msgid "Totem could not startup."
8026 -msgstr "قوزغالمىدى Totem"
8027 +msgstr "Totem قوزغالمىدى."
8029 -#: ../src/totem-open-location.c:179
8030 +#: ../src/totem-open-location.c:182
8031 msgid "Open Location..."
8032 msgstr "ئېچىش ئورنى…"
8034 #: ../src/totem-options.c:49
8035 msgid "Enable debug"
8036 -msgstr "سازلاشنى ئىناۋەتلىك قىلىش"
8037 +msgstr "سازلاشنى قوزغات"
8039 #: ../src/totem-options.c:50
8040 msgid "Play/Pause"
8041 -msgstr "قويۇش/توختىتىش"
8042 +msgstr "قوي/ۋاقىتلىق توختا"
8044 #: ../src/totem-options.c:53
8045 msgid "Next"
8046 @@ -1351,40 +1383,37 @@ msgstr "ئالدىنقى"
8048 #: ../src/totem-options.c:55
8049 msgid "Seek Forwards"
8050 -msgstr "ئالدىغا قاراپ ئىزدەش"
8051 +msgstr "تېز ئالدىغا"
8053 #: ../src/totem-options.c:56
8054 msgid "Seek Backwards"
8055 -msgstr "كەينىگە قاراپ ئىزدەش"
8056 +msgstr "تېز كەينىگە"
8058 #: ../src/totem-options.c:57
8059 msgid "Volume Up"
8060 -msgstr "ئاۋازنى يۇقىرىلىتىش"
8061 +msgstr "ئاۋازنى يۇقىرىلات"
8063 #: ../src/totem-options.c:58
8064 msgid "Volume Down"
8065 -msgstr "ئاۋازنى تۆۋەنلىتىش"
8066 +msgstr "ئاۋازنى تۆۋەنلەت"
8068 #: ../src/totem-options.c:59
8069 msgid "Mute sound"
8070 -msgstr "ئۈنسىزلەش"
8071 +msgstr "ئۈنسىز"
8073 #: ../src/totem-options.c:60
8074 msgid "Toggle Fullscreen"
8075 -msgstr "پۈتۈن ئېكران شەكلىگە ئالمىشىش"
8076 +msgstr "پۈتۈن ئېكرانغا ئالماش"
8078 #: ../src/totem-options.c:61
8079 msgid "Show/Hide Controls"
8080 -msgstr "كونتروللىغۇچنى كۆرسىتىش/يوشۇرۇش"
8081 +msgstr "كونتروللىغۇچنى كۆرسەت/يوشۇر"
8083 #: ../src/totem-options.c:62
8084 msgid "Quit"
8085 msgstr "چېكىن"
8087 -#. Translators: this refers to a media file
8088 #: ../src/totem-options.c:63
8089 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:87
8090 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:99
8091 msgid "Enqueue"
8092 msgstr "رەتكە قوش"
8094 @@ -1410,51 +1439,52 @@ msgid "Can't enqueue and replace at the same time"
8095 msgstr "ئوخشاش بىر ۋاقىتتا قاتارغا كىرىپ ھەم ئالماشتۇرالمايدۇ"
8097 #. By extension entry
8098 -#: ../src/totem-playlist.c:157
8099 +#: ../src/totem-playlist.c:161
8100 msgid "MP3 ShoutCast playlist"
8101 msgstr "MP3 ShoutCast قويۇش تىزىملىكى"
8103 -#: ../src/totem-playlist.c:158
8104 +#: ../src/totem-playlist.c:162
8105 msgid "MP3 audio (streamed)"
8106 msgstr "MP3 ئۈن (ئېقىم)"
8108 -#: ../src/totem-playlist.c:159
8109 +#: ../src/totem-playlist.c:163
8110 msgid "MP3 audio (streamed, DOS format)"
8111 msgstr "MP3 ئۈن (ئېقىم، DOS فورماتى)"
8113 -#: ../src/totem-playlist.c:160
8114 +#: ../src/totem-playlist.c:164
8115 msgid "XML Shareable Playlist"
8116 msgstr "XML ھەمبەھىرلىگىلى بولىدىغان قويۇش تىزىملىكى"
8118 #. This is "Title 3", where title is a DVD title
8119 #. * Note: NOT a DVD chapter
8120 -#: ../src/totem-playlist.c:359
8121 +#: ../src/totem-playlist.c:347
8122 #, c-format
8123 msgid "Title %d"
8124 msgstr "ماۋزۇ %d"
8126 -#: ../src/totem-playlist.c:458
8127 +#: ../src/totem-playlist.c:446
8128 msgid "Could not save the playlist"
8129 -msgstr "قويۇش تىزىملىكىنى ساقلىغىلى بولمىدى"
8130 +msgstr "قويۇش تىزىمىنى ساقلىغىلى بولمىدى"
8132 -#: ../src/totem-playlist.c:1033
8133 +#: ../src/totem-playlist.c:1021
8134 msgid "Save Playlist"
8135 -msgstr "قويۇش تىزىملىكى ساقلاش"
8136 +msgstr "قويۇش تىزىمى ساقلاش"
8138 #. translators: Playlist is the default saved playlist filename,
8139 #. * without the suffix
8140 -#: ../src/totem-playlist.c:1045 ../src/totem-sidebar.c:140
8141 +#: ../src/totem-playlist.c:1033 ../src/totem-playlist.c:1264
8142 +#: ../src/totem-sidebar.c:142
8143 msgid "Playlist"
8144 msgstr "قويۇش تىزىملىكى"
8146 -#: ../src/totem-playlist.c:1862
8147 +#: ../src/totem-playlist.c:1857
8148 #, c-format
8149 msgid "The playlist '%s' could not be parsed. It might be damaged."
8150 msgstr "قويۇش تىزىملىكى«%s»نى تەھلىل قىلغىلى بولمىدى. بۇزۇلغان بولۇشى مۇمكىن."
8152 -#: ../src/totem-playlist.c:1863
8153 +#: ../src/totem-playlist.c:1858
8154 msgid "Playlist error"
8155 -msgstr "قويۇش تىزىملىكى خاتالىقى"
8156 +msgstr "قويۇش تىزىمى خاتالىقى"
8158 #: ../src/totem-preferences.c:295
8159 msgid "Preferences"
8160 @@ -1464,12 +1494,61 @@ msgstr "مايىللىق"
8161 msgid "Select Subtitle Font"
8162 msgstr "ئاستىدىكى خېتىنىڭ فونتىنى تاللاش"
8164 -#. FIXME this should be setting an error?
8165 -#: ../src/totem-properties-main.c:114 ../src/totem-properties-view.c:83
8166 -#: ../src/totem-properties-view.c:91
8167 +#: ../src/totem-properties-main.c:115 ../src/totem-properties-view.c:252
8168 msgid "Audio/Video"
8169 msgstr "ئاۋاز/سۈرەت"
8171 +#: ../src/totem-properties-view.c:117
8172 +msgid "N/A"
8173 +msgstr "ئۇچۇر يوق"
8175 +#: ../src/totem-properties-view.c:146
8176 +#: ../src/plugins/properties/totem-movie-properties.c:152
8177 +#: ../src/plugins/properties/totem-movie-properties.c:163
8178 +msgctxt "Stream bit rate"
8179 +msgid "N/A"
8180 +msgstr "ئۇچۇر يوق"
8182 +#: ../src/totem-properties-view.c:149
8183 +#: ../src/plugins/properties/totem-movie-properties.c:152
8184 +#: ../src/plugins/properties/totem-movie-properties.c:163
8185 +#, c-format
8186 +msgid "%d kbps"
8187 +msgstr "%d kbps"
8189 +#: ../src/totem-properties-view.c:166
8190 +#: ../src/plugins/properties/totem-movie-properties.c:149
8191 +#, c-format
8192 +msgid "%d x %d"
8193 +msgstr "%d x %d"
8195 +#: ../src/totem-properties-view.c:195
8196 +#: ../src/plugins/properties/totem-movie-properties.c:166
8197 +#, c-format
8198 +msgid "%d Hz"
8199 +msgstr "%d Hz"
8201 +#: ../src/totem-properties-view.c:202
8202 +#: ../src/plugins/properties/totem-movie-properties.c:166
8203 +msgctxt "Sample rate"
8204 +msgid "N/A"
8205 +msgstr "ئۇچۇر يوق"
8207 +#: ../src/totem-properties-view.c:210
8208 +#: ../src/backend/bacon-video-widget-gst-0.10.c:5547
8209 +msgid "Surround"
8210 +msgstr "ئايلانما ئاۋاز"
8212 +#: ../src/totem-properties-view.c:212
8213 +#: ../src/backend/bacon-video-widget-gst-0.10.c:5549
8214 +msgid "Mono"
8215 +msgstr "يەككە يوللۇق ئاۋاز"
8217 +#: ../src/totem-properties-view.c:222
8218 +msgctxt "Number of audio channels"
8219 +msgid "N/A"
8220 +msgstr "ئۇچۇر يوق"
8222 #: ../src/totem-statusbar.c:110
8223 msgid "0:00 / 0:00"
8224 msgstr "0:00 / 0:00"
8225 @@ -1489,7 +1568,7 @@ msgstr "%s / %s"
8226 #: ../src/totem-statusbar.c:143 ../src/totem-time-label.c:67
8227 #, c-format
8228 msgid "Seek to %s / %s"
8229 -msgstr "%s / %s گىچە ئىزدەش"
8230 +msgstr "%s / %s گىچە ئىزدە"
8232 #: ../src/totem-statusbar.c:239
8233 msgid "Buffering"
8234 @@ -1654,62 +1733,63 @@ msgstr "غەربچە"
8235 msgid "Vietnamese"
8236 msgstr "ۋىيېتنامچە"
8238 -#: ../src/totem-video-list.c:329
8239 +#: ../src/totem-video-list.c:330
8240 msgid "No video URI"
8241 msgstr "سىن URI ئى يوق"
8243 #. Translators: The first string is "Filename" (as translated); the second is an actual filename.
8244 #. The third string is "Resolution" (as translated); the fourth and fifth are screenshot height and width, respectively.
8245 #. The sixth string is "Duration" (as translated); the seventh is the movie duration in words.
8246 -#: ../src/totem-video-thumbnailer.c:686
8247 +#: ../src/totem-video-thumbnailer.c:872
8248 #, c-format
8249 msgid ""
8250 "<b>%s</b>: %s\n"
8251 "<b>%s</b>: %d×%d\n"
8252 "<b>%s</b>: %s"
8253 -msgstr "<b>%s</b>: %s\n"
8254 +msgstr ""
8255 +"<b>%s</b>: %s\n"
8256 "<b>%s</b>: %d×%d\n"
8257 "<b>%s</b>: %s"
8259 -#: ../src/totem-video-thumbnailer.c:687
8260 +#: ../src/totem-video-thumbnailer.c:873
8261 msgid "Filename"
8262 msgstr "ھۆججەت ئاتى"
8264 -#: ../src/totem-video-thumbnailer.c:689
8265 +#: ../src/totem-video-thumbnailer.c:875
8266 msgid "Resolution"
8267 msgstr "ئېنىقلىق"
8269 -#: ../src/totem-video-thumbnailer.c:692
8270 +#: ../src/totem-video-thumbnailer.c:878
8271 msgid "Duration"
8272 msgstr "ۋاقتى"
8274 -#: ../src/totem-uri.c:502 ../src/plugins/chapters/totem-chapters.c:998
8275 +#: ../src/totem-uri.c:504 ../src/plugins/chapters/totem-chapters.c:998
8276 msgid "All files"
8277 msgstr "ھەممە ھۆججەتلەر"
8279 -#: ../src/totem-uri.c:507 ../src/plugins/chapters/totem-chapters.c:995
8280 +#: ../src/totem-uri.c:509 ../src/plugins/chapters/totem-chapters.c:995
8281 msgid "Supported files"
8282 msgstr "ئىشلەتكىلى بولىدىغان ھۆججەتلەر"
8284 -#: ../src/totem-uri.c:519
8285 +#: ../src/totem-uri.c:521
8286 msgid "Audio files"
8287 -msgstr "ئۈن ھۆججەتلىرى"
8288 +msgstr "ئۈن ھۆججەتلەر"
8290 -#: ../src/totem-uri.c:527
8291 +#: ../src/totem-uri.c:529
8292 msgid "Video files"
8293 -msgstr "سىن ھۆججەتلىرى"
8294 +msgstr "سىن ھۆججەتلەر"
8296 -#: ../src/totem-uri.c:537
8297 +#: ../src/totem-uri.c:539
8298 msgid "Subtitle files"
8299 -msgstr "ئېكران خەت ھۆججەتلىرى"
8300 +msgstr "ئېكران خەت ھۆججەتلەر"
8302 -#: ../src/totem-uri.c:589
8303 +#: ../src/totem-uri.c:591
8304 msgid "Select Text Subtitles"
8305 msgstr "ئېكران خەت تېكىستىنى تاللاش"
8307 -#: ../src/totem-uri.c:652
8308 +#: ../src/totem-uri.c:654
8309 msgid "Select Movies or Playlists"
8310 -msgstr "كىنو ياكى قويۇش تىزىملىكىنى تاللاش"
8311 +msgstr "كىنو ياكى قويۇش تىزىمىنى تاللاش"
8313 #. Options parsing
8314 #: ../src/totem.c:201
8315 @@ -1721,16 +1801,17 @@ msgstr "- كىنو ۋە نەغمىلەرنى قويۇش"
8316 msgid ""
8317 "%s\n"
8318 "Run '%s --help' to see a full list of available command line options.\n"
8319 -msgstr "%s\n"
8320 -"'%s --help' ئىجرا قىلىپ بۇيرۇق قۇرىنىڭ تولۇق تاللانما تىزىملىكىنى كۆرۈڭ\n"
8321 +msgstr ""
8322 +"%s\n"
8323 +"'%s --help' ئىجرا قىلىپ بۇيرۇق قۇرىنىڭ تولۇق تاللانما تىزىمىنى كۆرۈڭ.\n"
8325 #: ../src/totem.c:254 ../src/totem.c:263
8326 -#: ../browser-plugin/totem-plugin-viewer.c:663
8327 -#: ../browser-plugin/totem-plugin-viewer.c:1861
8328 +#: ../browser-plugin/totem-plugin-viewer.c:661
8329 +#: ../browser-plugin/totem-plugin-viewer.c:1786
8330 msgid "Totem Movie Player"
8331 msgstr "Totem كىنو قويغۇچ"
8333 -#: ../src/totem.c:255 ../browser-plugin/totem-plugin-viewer.c:2302
8334 +#: ../src/totem.c:255 ../browser-plugin/totem-plugin-viewer.c:2233
8335 msgid "Could not initialize the thread-safe libraries."
8336 msgstr "thread-safe فۇنكسىيە ئامبارلىرىنى دەسلەپلەشتۈرگىلى بولمىدى."
8338 @@ -1738,127 +1819,111 @@ msgstr "thread-safe فۇنكسىيە ئامبارلىرىنى دەسلەپلەش
8339 msgid "Verify your system installation. Totem will now exit."
8340 msgstr "سىستېما"
8342 -#: ../src/backend/bacon-video-widget-gst-0.10.c:1848
8343 +#: ../src/backend/bacon-video-widget-gst-0.10.c:1579
8344 msgid "Password requested for RTSP server"
8345 msgstr "RTSP مۇلازىمېتىرغا ئىم زۆرۈر"
8347 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3120
8348 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3124
8349 +#: ../src/backend/bacon-video-widget-gst-0.10.c:2836
8350 +#: ../src/backend/bacon-video-widget-gst-0.10.c:2840
8351 #, c-format
8352 msgid "Audio Track #%d"
8353 msgstr "ئاۋاز يولى #%d"
8355 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3152
8356 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3156
8357 +#: ../src/backend/bacon-video-widget-gst-0.10.c:2868
8358 +#: ../src/backend/bacon-video-widget-gst-0.10.c:2872
8359 #, c-format
8360 msgid "Subtitle #%d"
8361 msgstr "ئېكران خېتى #%d"
8363 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3565
8364 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3276
8365 msgid ""
8366 "The requested audio output was not found. Please select another audio output "
8367 "in the Multimedia Systems Selector."
8368 -msgstr "ئىلتىماس قىلغان ئۈن چىقىرىشنى تاپالمىدى. كۆپ ۋاسىتە تاللىغۇچتىن باشقا ئۈن چىقىرىشنى تاللاڭ."
8369 +msgstr ""
8370 +"ئىلتىماس قىلغان ئۈن چىقىرىشنى تاپالمىدى. كۆپ ۋاسىتە تاللىغۇچتىن باشقا ئۈن "
8371 +"چىقىرىشنى تاللاڭ."
8373 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3570
8374 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3281
8375 msgid "Location not found."
8376 msgstr "ئورۇن(ئادرېس) تېپىلمىدى."
8378 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3574
8379 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3285
8380 msgid ""
8381 "Could not open location; you might not have permission to open the file."
8382 -msgstr "ئورۇن(ئادرېس) تېپىلمىدى. سىزنىڭ بۇ ھۆججەتنى قويۇش ھوقۇقىڭىز يوقتەك قىلىدۇ"
8383 +msgstr ""
8384 +"ئورۇن(ئادرېس) تېپىلمىدى. سىزنىڭ بۇ ھۆججەتنى قويۇش ھوقۇقىڭىز يوقتەك قىلىدۇ"
8386 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3585
8387 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3296
8388 msgid ""
8389 "The video output is in use by another application. Please close other video "
8390 "applications, or select another video output in the Multimedia Systems "
8391 "Selector."
8392 -msgstr "سىننى چىقىرىدىغان ئۈسكىنىنى باشقا پروگرامما ئىشلىتىۋېتىپتۇ. شۇ پروگراممىنى ئاخىرلاشتۇرۇڭ ياكى Multimedia Systems Selector دىن باشقا ئۈسكىنە تاللاڭ."
8393 +msgstr ""
8394 +"سىننى چىقىرىدىغان ئۈسكىنىنى باشقا پروگرامما ئىشلىتىۋېتىپتۇ. شۇ پروگراممىنى "
8395 +"ئاخىرلاشتۇرۇڭ ياكى Multimedia Systems Selector دىن باشقا ئۈسكىنە تاللاڭ."
8397 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3591
8398 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3302
8399 msgid ""
8400 "The audio output is in use by another application. Please select another "
8401 "audio output in the Multimedia Systems Selector. You may want to consider "
8402 "using a sound server."
8403 -msgstr "ئۈننى چىقىرىدىغان ئۈسكىنىنى باشقا پروگرامما ئىشلىتىۋېتىپتۇ. شۇ پروگراممىنى ئاخىرلاشتۇرۇڭ ياكى Multimedia Systems Selector دىن باشقا ئۈسكىنە تاللاڭ.سىز يەنە ئۈن مۇلازىمېتىرىنى ئىشلىتىشنى ئويلىشىپ كۆرسىڭىزمۇ بولىدۇ."
8404 +msgstr ""
8405 +"ئۈننى چىقىرىدىغان ئۈسكىنىنى باشقا پروگرامما ئىشلىتىۋېتىپتۇ. شۇ پروگراممىنى "
8406 +"ئاخىرلاشتۇرۇڭ ياكى Multimedia Systems Selector دىن باشقا ئۈسكىنە تاللاڭ.سىز "
8407 +"يەنە ئۈن مۇلازىمېتىرىنى ئىشلىتىشنى ئويلىشىپ كۆرسىڭىزمۇ بولىدۇ."
8409 #. should be exactly one missing thing (source or converter)
8410 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3609
8411 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3615
8412 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3320
8413 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3326
8414 #, c-format
8415 msgid "The playback of this movie requires a %s plugin which is not installed."
8416 -msgstr "بۇ كىنونى قويۇش ئۈچۈن تېخى ئورنىتىلمىغان قىستۇرما %s كېرەك بولىدۇ."
8418 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3616
8419 -#, c-format
8420 -msgid ""
8421 +msgid_plural ""
8422 "The playback of this movie requires the following decoders which are not "
8423 "installed:\n"
8424 "\n"
8425 "%s"
8426 -msgstr "بۇ كىنونى قويۇش ئۈچۈن تېخى ئورنىتىلمىغان تۆۋەندىكى يەشكۈچلەر كېرەك بولىدۇ:\n"
8427 +msgstr[0] ""
8428 +"بۇ كىنونى قويۇش ئۈچۈن تېخى ئورنىتىلمىغان تۆۋەندىكى يەشكۈچلەر كېرەك بولىدۇ:\n"
8429 "\n"
8430 "%s"
8432 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3641
8433 +#: ../src/backend/bacon-video-widget-gst-0.10.c:3352
8434 msgid ""
8435 "Cannot play this file over the network. Try downloading it to disk first."
8436 -msgstr "بۇ ھۆججەتنى توردا تۇرۇپ قويغىلى بولمىدى. ئاۋۋال دىسكىغا چۈشۈرۈپ سىناپ بېقىڭ."
8438 -#: ../src/backend/bacon-video-widget-gst-0.10.c:3713
8439 -msgid "Media file could not be played."
8440 -msgstr "ۋاسىتە ھۆججىتىنى قويغىلى بولمىدى."
8442 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6004
8443 -msgid "Surround"
8444 -msgstr "ئايلانما ئاۋاز"
8446 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6006
8447 -msgid "Mono"
8448 -msgstr "يەككە يوللۇق ئاۋاز"
8450 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6353
8451 -msgid "Too old version of GStreamer installed."
8452 -msgstr "GStreamer بەكلا كونا نەشرى ئورنىتىلغان."
8453 +msgstr ""
8454 +"بۇ ھۆججەتنى توردا تۇرۇپ قويغىلى بولمىدى. ئاۋۋال دىسكىغا چۈشۈرۈپ سىناپ بېقىڭ."
8456 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6360
8457 +#: ../src/backend/bacon-video-widget-gst-0.10.c:5834
8458 msgid "Media contains no supported video streams."
8459 msgstr "ۋاسىتەدە تېخى ئىشلەتكىلى بولمايدىغان(قوللىمايدىغان) ئېقىم بار ئىكەن."
8461 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6843
8462 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6008
8463 msgid ""
8464 "Failed to create a GStreamer play object. Please check your GStreamer "
8465 "installation."
8466 -msgstr "GStreamer قويۇش نەڭىنى قۇرۇش مەغلۇپ بولدى. GStreamer نىڭ ئورنىتىلىش ئەھۋالىنى تەكشۈرۈڭ."
8468 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6954
8469 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7089
8470 -msgid ""
8471 -"Failed to open video output. It may not be available. Please select another "
8472 -"video output in the Multimedia Systems Selector."
8473 -msgstr "سىن چىقىرىش ئۈسكۈنىسىنى ئېچىش مەغلۇپ بولدى. ئۇ يوق بولۇشى مۇمكىن. Multimedia Systems Selector دىن باشقا بىر سىن چىقىرىش ئۈسكۈنىسىنى تاللاڭ."
8475 -#: ../src/backend/bacon-video-widget-gst-0.10.c:6966
8476 -msgid ""
8477 -"Could not find the video output. You may need to install additional "
8478 -"GStreamer plugins, or select another video output in the Multimedia Systems "
8479 -"Selector."
8480 -msgstr "سىن چىقىرىش ئۈسكۈنىسى تېپىلمىدى. سىز GStreamer قسىتۇرمىسىنى ئورنىتىشىڭىز ياكى Multimedia Systems Selector دىن باشقا بىر سىن چىقىرىش ئۈسكۈنىسىنى تاللىشىڭىز زۆرۈر."
8481 +msgstr ""
8482 +"GStreamer قويۇش نەڭىنى قۇرۇش مەغلۇپ بولدى. GStreamer نىڭ ئورنىتىلىش "
8483 +"ئەھۋالىنى تەكشۈرۈڭ."
8485 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7001
8486 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6128
8487 msgid ""
8488 "Failed to open audio output. You may not have permission to open the sound "
8489 "device, or the sound server may not be running. Please select another audio "
8490 "output in the Multimedia Systems Selector."
8491 -msgstr "ئۈن چىقىرىش ئۈسكۈنىسى ئېچىش مەغلۇپ بولدى. سىزنىڭ ئۈن ئۈسكۈنىسىنى ئېچىش ھوقۇقىڭىز يوقتەك قىلىدۇ ياكى ئۈن مۇلازىمېتىرى ئىجرا قىلىنمىغاندەك قىلىدۇ. Multimedia Systems Selector دىن باشقا ئۈن چىقىرىش ئۈسكۈنىسىنى تاللاڭ."
8492 +msgstr ""
8493 +"ئۈن چىقىرىش ئۈسكۈنەسى ئېچىش مەغلۇپ بولدى. سىزنىڭ ئۈن ئۈسكۈنەسىنى ئېچىش "
8494 +"ھوقۇقىڭىز يوقتەك قىلىدۇ ياكى ئۈن مۇلازىمېتىرى ئىجرا قىلىنمىغاندەك قىلىدۇ. "
8495 +"كۆپ ۋاسىتە سىستېما تاللىغۇچتىن باشقا ئۈن چىقىرىش ئۈسكۈنەسىنى تاللاڭ."
8497 -#: ../src/backend/bacon-video-widget-gst-0.10.c:7021
8498 +#: ../src/backend/bacon-video-widget-gst-0.10.c:6148
8499 msgid ""
8500 "Could not find the audio output. You may need to install additional "
8501 "GStreamer plugins, or select another audio output in the Multimedia Systems "
8502 "Selector."
8503 -msgstr "ئۈن چىقىرىش ئۈسكۈنىسى تېپىلمىدى. سىز GStreamer قسىتۇرمىسىنى ئورنىتىشىڭىز ياكى Multimedia Systems Selector دىن باشقا بىر ئۈن چىقىرىش ئۈسكۈنىسىنى تاللىشىڭىز زۆرۈر."
8504 +msgstr ""
8505 +"ئۈن چىقىرىش ئۈسكۈنەسى تېپىلمىدى. سىز GStreamer قسىتۇرمىسىنى ئورنىتىشىڭىز "
8506 +"ياكى كۆپ ۋاسىتە سىستېما تاللىغۇچتىن باشقا بىر ئۈن چىقىرىش ئۈسكۈنەسىنى "
8507 +"تاللىشىڭىز زۆرۈر."
8509 #. hour:minutes:seconds
8510 #. Translators: This is a time format, like "9:05:02" for 9
8511 @@ -1866,7 +1931,7 @@ msgstr "ئۈن چىقىرىش ئۈسكۈنىسى تېپىلمىدى. سىز GStr
8512 #. * the separator that your locale uses or use "%Id" instead
8513 #. * of "%d" if your locale uses localized digits.
8515 -#: ../src/backend/video-utils.c:91 ../src/backend/video-utils.c:108
8516 +#: ../src/backend/video-utils.c:91 ../src/plugins/skipto/totem-time-entry.c:57
8517 #, c-format
8518 msgctxt "long time format"
8519 msgid "%d:%02d:%02d"
8520 @@ -1884,42 +1949,6 @@ msgctxt "short time format"
8521 msgid "%d:%02d"
8522 msgstr "%d:%02d"
8524 -#: ../src/backend/video-utils.c:138
8525 -#, c-format
8526 -msgid "%d hour"
8527 -msgid_plural "%d hours"
8528 -msgstr[0] "%d سائەت"
8530 -#: ../src/backend/video-utils.c:140
8531 -#, c-format
8532 -msgid "%d minute"
8533 -msgid_plural "%d minutes"
8534 -msgstr[0] "%d مىنۇت"
8536 -#: ../src/backend/video-utils.c:143
8537 -#, c-format
8538 -msgid "%d second"
8539 -msgid_plural "%d seconds"
8540 -msgstr[0] "%d سېكۇنت"
8542 -#. hour:minutes:seconds
8543 -#: ../src/backend/video-utils.c:149
8544 -#, c-format
8545 -msgid "%s %s %s"
8546 -msgstr "%s %s %s"
8548 -#. minutes:seconds
8549 -#: ../src/backend/video-utils.c:152
8550 -#, c-format
8551 -msgid "%s %s"
8552 -msgstr "%s %s"
8554 -#. seconds
8555 -#: ../src/backend/video-utils.c:155
8556 -#, c-format
8557 -msgid "%s"
8558 -msgstr "%s"
8560 #: ../src/plugins/bemused/bemused.plugin.in.h:1
8561 msgid "Bemused"
8562 msgstr "Bemused"
8563 @@ -1945,7 +1974,7 @@ msgstr "Totem Bemused مۇلازىمېتىرىنىڭ 1.0 نەشرى"
8565 #: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:65
8566 msgid "_Create Video Disc..."
8567 -msgstr "سىن دىسكا ياساش(_C)..."
8568 +msgstr "سىن دىسكا ياسا(_C)…"
8570 #: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:66
8571 msgid "Create a video DVD or a (S)VCD from the currently opened movie"
8572 @@ -1953,7 +1982,7 @@ msgstr "ھازىرقى ئوچۇق كىنونى ئىشلىتىپ DVD ياكى (S)
8574 #: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:68
8575 msgid "Copy Vide_o DVD..."
8576 -msgstr "سىن DVDنى كۆچۈر(_O)..."
8577 +msgstr "سىن DVDنى كۆچۈر(_O)…"
8579 #: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:69
8580 msgid "Copy the currently playing video DVD"
8581 @@ -1961,7 +1990,7 @@ msgstr "ھازىر قويۇۋاتقان سىن DVD نى كۆچۈرىدۇ"
8583 #: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:71
8584 msgid "Copy (S)VCD..."
8585 -msgstr "(S)VCD كۆچۈر..."
8586 +msgstr "‎(S)VCD كۆچۈر…"
8588 #: ../src/plugins/brasero-disc-recorder/totem-disc-recorder.c:72
8589 msgid "Copy the currently playing (S)VCD"
8590 @@ -1991,67 +2020,55 @@ msgid "Video Disc Recorder"
8591 msgstr "سىن دىسكا خاتىرىلىگۈچ"
8593 #: ../src/plugins/chapters/chapters.plugin.in.h:1
8594 -#: ../src/plugins/chapters/totem-chapters.c:1137
8595 +#: ../src/plugins/chapters/totem-chapters.c:1139
8596 msgid "Chapters"
8597 msgstr "باپلار"
8599 #: ../src/plugins/chapters/chapters.plugin.in.h:2
8600 -#| msgid "Next chapter or movie"
8601 msgid "Support chapter markers in movies."
8602 msgstr "كىنولاردا باپ بەلگىسىنى قوللايدۇ."
8604 #: ../src/plugins/chapters/chapters-edit.ui.h:1
8605 -#| msgid "Enter new name for a chapter:"
8606 msgid "Name for new chapter:"
8607 msgstr "يېڭى باپنىڭ ئاتى:"
8609 #: ../src/plugins/chapters/chapters-list.ui.h:1
8610 -#| msgid "Load chapters..."
8611 msgid "Add Chapter..."
8612 -msgstr "باب قوشۇش..."
8613 +msgstr "باب قوش…"
8615 #: ../src/plugins/chapters/chapters-list.ui.h:2
8616 -#| msgid "Chapters"
8617 msgid "Add New Chapters"
8618 msgstr "يېڭى بابلارنى قوشۇش"
8620 #: ../src/plugins/chapters/chapters-list.ui.h:3
8621 -#| msgid "Next chapter or movie"
8622 msgid "Create a new chapter list for the movie"
8623 msgstr "كىنوغا يېڭى باب تىزىمى قوشىدۇ"
8625 #: ../src/plugins/chapters/chapters-list.ui.h:4
8626 -#| msgid "Go to chapter"
8627 msgid "Go to Chapter"
8628 msgstr "باپقا يۆتكەل"
8630 #: ../src/plugins/chapters/chapters-list.ui.h:5
8631 -#| msgid "Go to the chapter menu"
8632 msgid "Go to the chapter in the movie"
8633 msgstr "كىنودىكى كۆرسىتىلگەن باپقا يۆتكىلىدۇ"
8635 #: ../src/plugins/chapters/chapters-list.ui.h:6
8636 -#| msgid "Load chapters..."
8637 msgid "Load Chapters..."
8638 -msgstr "باپلارنى ئوقۇش..."
8639 +msgstr "باپلارنى يۈكلە…"
8641 #: ../src/plugins/chapters/chapters-list.ui.h:7
8642 -#| msgid "Load chapters from external file"
8643 msgid "Load chapters from an external CMML file"
8644 msgstr "سىرتقى CMML ھۆججىتىدىن باپلارنى ئوقۇيدۇ"
8646 #: ../src/plugins/chapters/chapters-list.ui.h:8
8647 -#| msgid "No chapters data"
8648 msgid "No chapter data"
8649 msgstr "باب سانلىق-مەلۇماتلىرى يوق"
8651 #: ../src/plugins/chapters/chapters-list.ui.h:9
8652 -#| msgid "Chapters"
8653 msgid "Remove Chapter"
8654 msgstr "باب ئۆچۈر"
8656 #: ../src/plugins/chapters/chapters-list.ui.h:10
8657 -#| msgid "Remove chapter from the list"
8658 msgid "Remove the chapter from the list"
8659 msgstr "تىزىمدىن باپلارنى ئۆچۈرىدۇ"
8661 @@ -2060,12 +2077,10 @@ msgid "Save Changes"
8662 msgstr "ئۆزگەرتكەننى ساقلا"
8664 #: ../src/plugins/chapters/chapters-list.ui.h:12
8665 -#| msgid "Go to chapter"
8666 msgid "_Go to Chapter"
8667 -msgstr "باپقا تۆتكەل(_G)"
8668 +msgstr "بابقا يۆتكەل(_G)"
8670 #: ../src/plugins/chapters/chapters-list.ui.h:13
8671 -#| msgid "_Remove"
8672 msgid "_Remove Chapter"
8673 msgstr "باپنى چىقىرىۋەت(_R)"
8675 @@ -2074,7 +2089,8 @@ msgstr "باپنى چىقىرىۋەت(_R)"
8676 msgid ""
8677 "<b>Title: </b>%s\n"
8678 "<b>Start time: </b>%s"
8679 -msgstr "<b>ماۋزۇ: </b>%s\n"
8680 +msgstr ""
8681 +"<b>ماۋزۇ: </b>%s\n"
8682 "<b>باشلىنىش ۋاقتى: </b>%s"
8684 #: ../src/plugins/chapters/totem-chapters.c:328
8685 @@ -2086,7 +2102,6 @@ msgid "Chapter with the same time already exists"
8686 msgstr "ئوخشاش ۋاقىتتىكى بۆلەك مەۋجۇت"
8688 #: ../src/plugins/chapters/totem-chapters.c:544
8689 -#| msgid "Try another name or remove an existing chapter"
8690 msgid "Try another name or remove an existing chapter."
8691 msgstr "باشقا نامدا سىناپ كۆرۈڭ ياكى بارىنى چىقىرىۋېتىڭ."
8693 @@ -2104,67 +2119,71 @@ msgid ""
8694 msgstr "كىنو بار مۇندەرىجىگە يېزىش ھوقۇقىڭىز بارمىكەن تەكشۈرۈپ كۆرۈڭ."
8696 #: ../src/plugins/chapters/totem-chapters.c:976
8697 -#| msgid "Open Chapters File"
8698 msgid "Open Chapter File"
8699 -msgstr "باب ھۆججىتىنى ئېچىش"
8700 +msgstr "باب ھۆججەتنى ئاچ"
8702 #: ../src/plugins/chapters/totem-chapters.c:1093
8703 -#| msgid "Save Screenshot"
8704 msgid "Chapter Screenshot"
8705 msgstr "باپنىڭ ئېكران كۆرۈنۈشى"
8707 #: ../src/plugins/chapters/totem-chapters.c:1104
8708 -#| msgid "Open Chapters File"
8709 msgid "Chapter Title"
8710 msgstr "باب ماۋزۇسى"
8712 -#: ../src/plugins/chapters/totem-chapters.c:1182
8713 +#: ../src/plugins/chapters/totem-chapters.c:1184
8714 msgid "Save changes to chapter list before closing?"
8715 msgstr "تاقاشتىن بۇرۇن ئۆزگىرىشلەرنى باب تىزىمىغا ساقلىسۇنمۇ؟"
8717 #. Translators: close Totem without saving changes to the chapter list of the current movie.
8718 -#: ../src/plugins/chapters/totem-chapters.c:1187
8719 -#| msgid "Continue without"
8720 +#: ../src/plugins/chapters/totem-chapters.c:1189
8721 msgid "Close without Saving"
8722 msgstr "ساقلىماي تاقا"
8724 #. Translators: save changes to the chapter list of the current movie before closing Totem.
8725 -#: ../src/plugins/chapters/totem-chapters.c:1189
8726 -#| msgid "Square"
8727 +#: ../src/plugins/chapters/totem-chapters.c:1191
8728 msgid "Save"
8729 msgstr "ساقلا"
8731 -#: ../src/plugins/chapters/totem-chapters.c:1192
8732 +#: ../src/plugins/chapters/totem-chapters.c:1194
8733 msgid "If you don't save, changes to the chapter list will be lost."
8734 msgstr "ساقلىمىسىڭىز باب تىزىمىدىكى ئۆزگىرىشلەر يوقايدۇ."
8736 -#: ../src/plugins/chapters/totem-cmml-parser.c:642
8737 +#: ../src/plugins/chapters/totem-cmml-parser.c:651
8738 msgid "Failed to parse CMML file"
8739 msgstr "CMML ھۆججىتىنى تەھلىل قىلىش مەغلۇپ بولدى"
8741 -#. Translators: this refers to a media file
8742 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:105
8743 -msgid "Delete"
8744 -msgstr "ئۆچۈر"
8746 -#: ../src/plugins/coherence_upnp/coherence_upnp.py:116
8747 -#: ../src/plugins/coherence_upnp/coherence_upnp.plugin.in.h:2
8748 -msgid "Coherence DLNA/UPnP Client"
8749 -msgstr "Coherence DLNA/UPnP خېرىدارى"
8751 -#: ../src/plugins/coherence_upnp/coherence_upnp.plugin.in.h:1
8752 -msgid "A DLNA/UPnP client for Totem powered by Coherence"
8753 -msgstr "Coherence قوللايدىغان Totem نىڭ DLNA/UPnP خېرىدارى"
8755 -#: ../src/plugins/dbus-service/dbus-service.plugin.in.h:1
8756 +#: ../src/plugins/dbusservice/dbusservice.plugin.in.h:1
8757 msgid "D-Bus Service"
8758 msgstr "D-Bus مۇلازىمىتى"
8760 -#: ../src/plugins/dbus-service/dbus-service.plugin.in.h:2
8761 +#: ../src/plugins/dbusservice/dbusservice.plugin.in.h:2
8762 msgid ""
8763 "Plugin for sending notifications of currently playing movies to the D-Bus "
8764 "subsystem."
8765 -msgstr "D-Bus تارماق سىستېمىغا نۆۋەتتە قويۇۋاتقان سىننىڭ ئۇقتۇرۇش قىستۇرمىسىنى يوللايدۇ."
8766 +msgstr ""
8767 +"D-Bus تارماق سىستېمىغا نۆۋەتتە قويۇۋاتقان سىننىڭ ئۇقتۇرۇش قىستۇرمىسىنى "
8768 +"يوللايدۇ."
8770 +#: ../src/plugins/dbusservice/dbusservice.py:213
8771 +#: ../src/plugins/dbusservice/dbusservice.py:243
8772 +#, python-format
8773 +msgid "The MediaPlayer2 object does not implement the ‘%s’ interface"
8774 +msgstr ""
8776 +#: ../src/plugins/dbusservice/dbusservice.py:222
8777 +#, python-format
8778 +msgid "The property ‘%s’ is not writeable."
8779 +msgstr ""
8781 +#: ../src/plugins/dbusservice/dbusservice.py:238
8782 +#, python-format
8783 +msgid "Unknown property ‘%s’ requested of a MediaPlayer 2 object"
8784 +msgstr ""
8786 +#: ../src/plugins/dbusservice/dbusservice.py:341
8787 +#, python-format
8788 +msgid "The URI ‘%s’ is not supported."
8789 +msgstr ""
8791 #: ../src/plugins/im-status/totem-im-status.plugin.in.h:1
8792 msgid "Instant Messenger status"
8793 @@ -2188,7 +2207,7 @@ msgstr "gromit ئىككىلىك سىستېمىدىكى ھۆججىتى تېپىل
8795 #. Add the interface to Totem's sidebar
8796 #: ../src/plugins/iplayer/iplayer.plugin.in.h:1
8797 -#: ../src/plugins/iplayer/iplayer.py:41
8798 +#: ../src/plugins/iplayer/iplayer.py:46
8799 msgid "BBC iPlayer"
8800 msgstr "BBC iPlayer"
8802 @@ -2196,206 +2215,46 @@ msgstr "BBC iPlayer"
8803 msgid "Stream BBC programs from the last 7 days from the BBC iPlayer service."
8804 msgstr "يېقىنقى 7 كۈندىكى BBC iPlayer مۇلازىمىتىنىڭ Stream BBC پروگراممىسى"
8806 -#: ../src/plugins/iplayer/iplayer.py:66
8807 +#: ../src/plugins/iplayer/iplayer.py:72
8808 msgid "Error listing channel categories"
8809 msgstr "قانال كاتېگورىيىسىنى كۆرۈۋاتقاندا خاتالىق كۆرۈلدى"
8811 -#: ../src/plugins/iplayer/iplayer.py:66
8812 +#: ../src/plugins/iplayer/iplayer.py:73
8813 msgid ""
8814 "There was an unknown error getting the list of television channels available "
8815 "on BBC iPlayer."
8816 -msgstr "BBC iPlayer دا ئىشلەتكىلى بولىدىغان تېلېۋىزىيە قاناللىرىنى قوبۇل قىلىۋاتقاندا نامەلۇم خاتالىق كۆرۈلدى."
8817 +msgstr ""
8818 +"BBC iPlayer دا ئىشلەتكىلى بولىدىغان تېلېۋىزىيە قاناللىرىنى قوبۇل "
8819 +"قىلىۋاتقاندا نامەلۇم خاتالىق كۆرۈلدى."
8821 #. Append a dummy child row so that the expander's visible; we can
8822 -#. then queue off the expander to load the programme listing for this category
8823 -#: ../src/plugins/iplayer/iplayer.py:74
8824 +#. then queue off the expander to load the programme listing for this
8825 +#. category
8826 +#: ../src/plugins/iplayer/iplayer.py:84
8827 msgid "Loading…"
8828 msgstr "يۈكلەۋاتىدۇ…"
8830 -#. Translators: the "programme feed" is the list of TV shows available to watch online
8831 -#: ../src/plugins/iplayer/iplayer.py:119
8832 +#. Translators: the "programme feed" is the list of TV shows
8833 +#. available to watch online
8834 +#: ../src/plugins/iplayer/iplayer.py:136
8835 msgid "Error getting programme feed"
8836 msgstr "پروگرامما مۇشتەرى تىزىملىكىگە ئېرىشىشتە خاتالىق كۆرۈلدى"
8838 -#: ../src/plugins/iplayer/iplayer.py:119
8839 +#: ../src/plugins/iplayer/iplayer.py:137
8840 msgid ""
8841 "There was an error getting the list of programmes for this channel and "
8842 "category combination."
8843 msgstr "بۇ قانال ۋە تۈرنىڭ تىزىملىكىگە ئېرىشىشتە خاتالىق كۆرۈلدى."
8845 -#: ../src/plugins/iplayer/iplayer2.py:299
8846 +#: ../src/plugins/iplayer/iplayer2.py:297
8847 msgid "<no reason given>"
8848 msgstr "<سەۋەبى يوق>"
8850 -#: ../src/plugins/iplayer/iplayer2.py:300
8851 +#: ../src/plugins/iplayer/iplayer2.py:298
8852 #, python-format
8853 msgid "Programme unavailable (\"%s\")"
8854 msgstr "پروگراممىنى ئىشلەتكىلى بولمايدۇ (\"%s\")"
8856 -#: ../src/plugins/jamendo/jamendo.ui.h:1
8857 -msgid "By artist"
8858 -msgstr "ئورۇنلىغۇچى"
8860 -#: ../src/plugins/jamendo/jamendo.ui.h:2
8861 -msgid "By tag"
8862 -msgstr "بەلگە بويىچە"
8864 -#: ../src/plugins/jamendo/jamendo.ui.h:3
8865 -msgid "Jamendo Album Page"
8866 -msgstr "Jamendo پلاستىنكا توپلام بېتى"
8868 -#: ../src/plugins/jamendo/jamendo.ui.h:4
8869 -msgid "Latest Releases"
8870 -msgstr "ئەڭ يېڭى تارقاتقىنى"
8872 -#: ../src/plugins/jamendo/jamendo.ui.h:5
8873 -msgid "Number of albums to _retrieve:"
8874 -msgstr "ئىزدەيدىغان پلاستىنكا توپلام سانى(_R):"
8876 -#: ../src/plugins/jamendo/jamendo.ui.h:6
8877 -msgid "Popular"
8878 -msgstr "ئاممىباب"
8880 -#: ../src/plugins/jamendo/jamendo.ui.h:7
8881 -msgid "Preferred audio _format:"
8882 -msgstr "ئالدىن تاللىنىدىغان ئۈن فورماتى(_F):"
8884 -#: ../src/plugins/jamendo/jamendo.ui.h:8
8885 -#: ../src/plugins/tracker/totem-tracker-widget.c:761
8886 -#: ../src/plugins/youtube/youtube.ui.h:2
8887 -msgid "Search Results"
8888 -msgstr "ئىزدەش نەتىجىسى"
8890 -#: ../src/plugins/jamendo/jamendo.ui.h:10
8891 -msgid "_Open Jamendo Album Page in Browser"
8892 -msgstr "توركۆرگۈدە Jamendo پلاستىنكا توپلام بېتىنى ئاچ(_O)"
8894 -#: ../src/plugins/jamendo/jamendo.plugin.in.h:1
8895 -#: ../src/plugins/jamendo/jamendo.py:127
8896 -msgid "Jamendo"
8897 -msgstr "Jamendo"
8899 -#: ../src/plugins/jamendo/jamendo.plugin.in.h:2
8900 -msgid ""
8901 -"Listen to the large collection of Creative Commons licensed music on Jamendo."
8902 -msgstr "Jamendo توپلىغان ئىجادىيەت ئاممىۋى ئىجازەتنامىسىدە تارقىتىلغان كۆپ مىقداردىكى نەغمىنى تىڭشاش."
8904 -#: ../src/plugins/jamendo/jamendo.py:58
8905 -msgid "You need to install the Python simplejson module."
8906 -msgstr "سىز Python simplejson بۆلىكىنى ئورنىتىشىڭىز زۆرۈر."
8908 -#: ../src/plugins/jamendo/jamendo.py:260 ../src/plugins/jamendo/jamendo.py:273
8909 -#: ../src/plugins/jamendo/jamendo.py:297
8910 -#, python-format
8911 -msgid "Artist: %s"
8912 -msgstr "سەنئەتكار: ‎%s"
8914 -#. Translators: this is the release date of an album in Python strptime format
8915 -#: ../src/plugins/jamendo/jamendo.py:266
8916 -msgid "%Y-%m-%d"
8917 -msgstr "%Y-%m-%d"
8919 -#. Translators: this is the release time of an album in Python strftime format
8920 -#: ../src/plugins/jamendo/jamendo.py:268
8921 -#, python-format
8922 -msgid "%x"
8923 -msgstr "%x"
8925 -#: ../src/plugins/jamendo/jamendo.py:274
8926 -#, python-format
8927 -msgid "Genre: %s"
8928 -msgstr "ئېقىم: %s"
8930 -#: ../src/plugins/jamendo/jamendo.py:275
8931 -#, python-format
8932 -msgid "Released on: %s"
8933 -msgstr "تارقىتىش تارىخى: %s"
8935 -#: ../src/plugins/jamendo/jamendo.py:276
8936 -#, python-format
8937 -msgid "License: %s"
8938 -msgstr "ئىجازەتنامە: %s"
8940 -#. track title
8941 -#. Translators: this is the title of a track in Python format
8942 -#. (first argument is the track number, second is the track title)
8943 -#: ../src/plugins/jamendo/jamendo.py:289
8944 -#, python-format
8945 -msgid "%02d. %s"
8946 -msgstr "%02d. %s"
8948 -#: ../src/plugins/jamendo/jamendo.py:296
8949 -#, python-format
8950 -msgid "Album: %s"
8951 -msgstr "پلاستىنكا توپلىمى: ‎%s"
8953 -#: ../src/plugins/jamendo/jamendo.py:298
8954 -#, python-format
8955 -msgid "Duration: %s"
8956 -msgstr "داۋاملاشقان ۋاقىت: %s"
8958 -#: ../src/plugins/jamendo/jamendo.py:355
8959 -#| msgid "Fetching albums, please wait..."
8960 -msgid "Fetching albums, please wait…"
8961 -msgstr "ئالبوملارنى ئوقۇۋاتىدۇ، سەل ساقلاڭ..."
8963 -#: ../src/plugins/jamendo/jamendo.py:410
8964 -#, python-format
8965 -msgid ""
8966 -"Failed to connect to Jamendo server.\n"
8967 -"%s."
8968 -msgstr "Jamendo مۇلازىمېتىرىغا باغلىنىش مەغلۇپ بولدى.\n"
8969 -"%s."
8971 -#: ../src/plugins/jamendo/jamendo.py:412
8972 -#, python-format
8973 -msgid "The Jamendo server returned code %s."
8974 -msgstr "Jamendo مۇلازىمېتىر قايتۇرغان كود %s."
8976 -#: ../src/plugins/jamendo/jamendo.py:416
8977 -msgid "An error occurred while fetching albums."
8978 -msgstr "پلاستىنكا توپلىمىغا ئېرىشىۋاتقاندا خاتالىق كۆرۈلدى."
8980 -#. Translators: time formatting (in Python strftime format) for the Jamendo plugin
8981 -#. for times longer than an hour
8982 -#: ../src/plugins/jamendo/jamendo.py:618
8983 -msgid "%H:%M:%S"
8984 -msgstr "%H:%M:%S"
8986 -#. Translators: time formatting (in Python strftime format) for the Jamendo plugin
8987 -#. for times shorter than an hour
8988 -#: ../src/plugins/jamendo/jamendo.py:621
8989 -msgid "%M:%S"
8990 -msgstr "%M:%S"
8992 -#. Translators: If Jamendo supports your language, replace "en" with the language code, enclosed
8993 -#. in slashes, used to view pages in your language on the Jamendo website. e.g. For French, "en"
8994 -#. would be translated to "fr", as Jamendo uses that in its URLs:
8995 -#. http://www.jamendo.com/fr/album/4818
8996 -#. Compared to:
8997 -#. http://www.jamendo.com/en/album/4818
8998 -#. If Jamendo doesn't support your language, *do not translate this string*!
8999 -#: ../src/plugins/jamendo/jamendo.py:671
9000 -msgid "en"
9001 -msgstr "ug"
9003 -#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:1
9004 -msgid "Audio format to download from Jamendo"
9005 -msgstr "Jamendo دىن چۈشۈرگەن ئۈن فورماتى"
9007 -#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:2
9008 -msgid "Number of results per page"
9009 -msgstr "بىر بەتتىكى نەتىجە سانى"
9011 -#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:3
9012 -msgid ""
9013 -"The number of Jamendo search results to display in each page of results."
9014 -msgstr "ھەر بىر بەتتە كۆرسىتىدىغان Jamendo ئىزدەش نەتىجىسىنىڭ سانى"
9016 -#: ../src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in.h:4
9017 -msgid "The preferred audio format to download tracks from Jamendo in."
9018 -msgstr "Jamendo دىن ئۈن چۈشۈرگەندە ئالدىن ئىشلىتىدىغان ئۈن فورماتى."
9020 #: ../src/plugins/lirc/lirc.plugin.in.h:1
9021 msgid "Infrared Remote Control"
9022 msgstr "ئىنفرا قىزىل نۇرلۇق تىزگىنەك"
9023 @@ -2417,14 +2276,10 @@ msgid "Download Movie Subtitles"
9024 msgstr "فىلىم يېزىقىنى چۈشۈرۈش"
9026 #: ../src/plugins/opensubtitles/opensubtitles.ui.h:2
9027 -msgid "Language"
9028 -msgstr "تىل"
9030 -#: ../src/plugins/opensubtitles/opensubtitles.ui.h:3
9031 msgid "Subtitle _language:"
9032 msgstr "ئېكران خەت تىلى(_l):"
9034 -#: ../src/plugins/opensubtitles/opensubtitles.ui.h:4
9035 +#: ../src/plugins/opensubtitles/opensubtitles.ui.h:3
9036 msgid "_Play with Subtitle"
9037 msgstr "ئېكران خېتى بىلەن قوي(_P)"
9039 @@ -2436,56 +2291,60 @@ msgstr "نۆۋەتتە قويۇۋاتقان كىنونىڭ ئىزدەيدۇ."
9040 msgid "Subtitle Downloader"
9041 msgstr "ئېكران خەت چۈشۈرگۈچ"
9043 -#: ../src/plugins/opensubtitles/opensubtitles.py:44
9044 -msgid "Brasilian Portuguese"
9045 +#: ../src/plugins/opensubtitles/opensubtitles.py:42
9046 +msgid "Brazilian Portuguese"
9047 msgstr "بىرازىلىيە پورتۇگالچە"
9049 -#: ../src/plugins/opensubtitles/opensubtitles.py:247
9050 -#: ../src/plugins/opensubtitles/opensubtitles.py:263
9051 -#: ../src/plugins/opensubtitles/opensubtitles.py:280
9052 -#: ../src/plugins/opensubtitles/opensubtitles.py:286
9053 +#: ../src/plugins/opensubtitles/opensubtitles.py:177
9054 +msgid "Searching for subtitles…"
9055 +msgstr "فىلىم يېزىقىنى ئىزدەۋاتىدۇ…"
9057 +#: ../src/plugins/opensubtitles/opensubtitles.py:225
9058 +#: ../src/plugins/opensubtitles/opensubtitles.py:644
9059 +msgid "Downloading the subtitles…"
9060 +msgstr "فىلىم يېزىقىنى چۈشۈرۈۋاتىدۇ…"
9062 +#: ../src/plugins/opensubtitles/opensubtitles.py:290
9063 msgid "Could not contact the OpenSubtitles website"
9064 msgstr "OpenSubtitles تورتۇراسى بىلەن ئالاقە قىلالمىدى."
9066 -#: ../src/plugins/opensubtitles/opensubtitles.py:268
9067 -msgid "No results found"
9068 -msgstr "نەتىجە يوق"
9069 +#: ../src/plugins/opensubtitles/opensubtitles.py:323
9070 +#: ../src/plugins/opensubtitles/opensubtitles.py:341
9071 +msgid "Could not contact the OpenSubtitles website."
9072 +msgstr "OpenSubtitles تور بېكەت بىلەن ئالاقە قىلالمىدى."
9074 +#: ../src/plugins/opensubtitles/opensubtitles.py:329
9075 +msgid "No results found."
9076 +msgstr "نەتىجە تېپىلمىدى."
9078 -#: ../src/plugins/opensubtitles/opensubtitles.py:374
9079 +#: ../src/plugins/opensubtitles/opensubtitles.py:477
9080 msgid "Subtitles"
9081 msgstr "ئاستىدىكى خېتى"
9083 #. translators comment:
9084 #. This is the file-type of the subtitle file detected
9085 -#: ../src/plugins/opensubtitles/opensubtitles.py:380
9086 +#: ../src/plugins/opensubtitles/opensubtitles.py:483
9087 msgid "Format"
9088 msgstr "فورمات"
9090 #. translators comment:
9091 #. This is a rating of the quality of the subtitle
9092 -#: ../src/plugins/opensubtitles/opensubtitles.py:385
9093 +#: ../src/plugins/opensubtitles/opensubtitles.py:488
9094 msgid "Rating"
9095 msgstr "دەرىجە"
9097 -#: ../src/plugins/opensubtitles/opensubtitles.py:426
9098 -#| msgid "Download Movie Subtitles"
9099 -msgid "_Download Movie Subtitles…"
9100 -msgstr "فىلىم يېزىقىنى چۈشۈرۈش(_M)…"
9102 -#: ../src/plugins/opensubtitles/opensubtitles.py:427
9103 +#: ../src/plugins/opensubtitles/opensubtitles.py:524
9104 msgid "Download movie subtitles from OpenSubtitles"
9105 msgstr "OpenSubtitles دىن فىلىم يېزىقىنى چۈشۈر"
9107 -#: ../src/plugins/opensubtitles/opensubtitles.py:486
9108 -#| msgid "Searching subtitles..."
9109 +#: ../src/plugins/opensubtitles/opensubtitles.py:526
9110 +msgid "_Download Movie Subtitles…"
9111 +msgstr "فىلىم يېزىقىنى چۈشۈرۈش(_M)…"
9113 +#: ../src/plugins/opensubtitles/opensubtitles.py:588
9114 msgid "Searching subtitles…"
9115 msgstr "فىلىم يېزىقىنى ئىزدەۋاتىدۇ…"
9117 -#: ../src/plugins/opensubtitles/opensubtitles.py:544
9118 -#| msgid "Downloading the subtitles..."
9119 -msgid "Downloading the subtitles…"
9120 -msgstr "فىلىم يېزىقىنى چۈشۈرۈۋاتىدۇ…"
9122 #: ../src/plugins/opensubtitles/org.gnome.totem.plugins.opensubtitles.gschema.xml.in.in.h:1
9123 msgid "Subtitle language"
9124 msgstr "ئېكران خەت تىلى"
9125 @@ -2496,13 +2355,13 @@ msgstr "ئىزدىگەن كىنو ئىشلىتىدىغان تىل."
9127 #: ../src/plugins/ontop/ontop.plugin.in.h:1
9128 msgid "Always On Top"
9129 -msgstr "دائىم چوققىدا تۇرۇش"
9130 +msgstr "ھەمىشە ئەڭ ئۈستىدە"
9132 #: ../src/plugins/ontop/ontop.plugin.in.h:2
9133 msgid "Keep the main window on top when playing a movie"
9134 msgstr "كىنو قويغاندا ئاساسىي كۆزنەك ئەڭ ئۈستىدە"
9136 -#: ../src/plugins/properties/totem-movie-properties.c:128
9137 +#: ../src/plugins/properties/totem-movie-properties.c:246
9138 msgid "Properties"
9139 msgstr "خاسلىق"
9141 @@ -2514,7 +2373,13 @@ msgid ""
9142 "%a: the program name as returned by g_get_application_name() • %h: the "
9143 "machine's host name in title case • %u: the user's login name in title case "
9144 "• %U: the user's real name • %%: the percent sign"
9145 -msgstr "توردا قويۇش تىزىملىكىنى تارقاتقاندا تور مۇلازىمېتىر ئاتىغا ئىشلىتىدىغان فورمات بەلگە تىزىقى. تۆۋەندىكى فورمات ئورۇن بەلگىسىنى ئىشلىتىشكە بولىدۇ: • %a: g_get_application_name() قايتۇرغان پروگرامما ئىسمى: %h: بۇ كومپيۇتېرنىڭ ئىسمى، چوڭ يېزىلىش شەكلىنى ئىشلىتىدۇ. %u: ئىشلەتكۈچى تىزىمغا كىرىش ئاتى، چوڭ يېزىلىش شەكلىنى ئىشلىتىدۇ.%U: ئىشلەتكۈچىنىڭ ھەقىقىي ئاتى • %%: پىرسەنت بەلگىسى"
9146 +msgstr ""
9147 +"توردا قويۇش تىزىملىكىنى تارقاتقاندا تور مۇلازىمېتىر ئاتىغا ئىشلىتىدىغان "
9148 +"فورمات بەلگە تىزىقى. تۆۋەندىكى فورمات ئورۇن بەلگىسىنى ئىشلىتىشكە بولىدۇ: • %"
9149 +"a: g_get_application_name() قايتۇرغان پروگرامما ئىسمى: %h: بۇ كومپيۇتېرنىڭ "
9150 +"ئىسمى، چوڭ يېزىلىش شەكلىنى ئىشلىتىدۇ. %u: ئىشلەتكۈچى تىزىمغا كىرىش ئاتى، چوڭ "
9151 +"يېزىلىش شەكلىنى ئىشلىتىدۇ.%U: ئىشلەتكۈچىنىڭ ھەقىقىي ئاتى • %%: پىرسەنت "
9152 +"بەلگىسى"
9154 #: ../src/plugins/publish/org.gnome.totem.plugins.publish.gschema.xml.in.in.h:3
9155 msgid "Format for network service name"
9156 @@ -2552,8 +2417,10 @@ msgid ""
9157 "The name used for announcing the playlist service on the network.\n"
9158 "All occurrences of the string <b>%u</b> will be replaced by your name,\n"
9159 "and <b>%h</b> will be replaced by your computer's host name."
9160 -msgstr "توردىكى قويۇش تىزىملىكى مۇلازىمىتىدە ئېلان قىلىدىغان ئات.\n"
9161 -"كۆرۈنگەن بارلىق ھەرپ تىزمىسى<b>%u</b> ئىسمىڭىزغا ئالماشتۇرۇلىدۇ ھەمدە <b>%h</b> ئىسمىڭىزغا ئالماشتۇرۇلىدۇ."
9162 +msgstr ""
9163 +"توردىكى قويۇش تىزىملىكى مۇلازىمىتىدە ئېلان قىلىدىغان ئات.\n"
9164 +"كۆرۈنگەن بارلىق ھەرپ تىزمىسى<b>%u</b> ئىسمىڭىزغا ئالماشتۇرۇلىدۇ ھەمدە <b>%h</"
9165 +"b> ئىسمىڭىزغا ئالماشتۇرۇلىدۇ."
9167 #: ../src/plugins/publish/publish-plugin.ui.h:6
9168 msgid "Use _encrypted transport protocol (HTTPS)"
9169 @@ -2563,12 +2430,31 @@ msgstr "شىفىرلانغان كېلىشىم ئىشلەتHTTPS(_E)"
9170 msgid ""
9171 "A password to protect the rpdb2 server for debugging Totem from unauthorized "
9172 "remote access. If this is empty, a default of 'totem' will be used."
9173 -msgstr "Totem نى سازلاشنىڭ ئالدىنى ئېلىشقا ئىشلىتىدىغان rpdb2 مۇلازىمېتىر ئىجازەت بېرىلمىگەن تور زىيارەت ئىمغا يولۇقتى. ئەگەر بوش قالدۇرۇلسا، كۆڭۈلدىكى ئەھۋالدا 'totem' ئىم سۈپىتىدە ئىشلىتىلىدۇ."
9174 +msgstr ""
9175 +"Totem نى سازلاشنىڭ ئالدىنى ئېلىشقا ئىشلىتىدىغان rpdb2 مۇلازىمېتىر ئىجازەت "
9176 +"بېرىلمىگەن تور زىيارەت ئىمغا يولۇقتى. ئەگەر بوش قالدۇرۇلسا، كۆڭۈلدىكى "
9177 +"ئەھۋالدا 'totem' ئىم سۈپىتىدە ئىشلىتىلىدۇ."
9179 #: ../src/plugins/pythonconsole/org.gnome.totem.plugins.pythonconsole.gschema.xml.in.in.h:2
9180 msgid "rpdb2 password"
9181 msgstr "rpdb2 ئىم"
9183 +#: ../src/plugins/rotation/rotation.plugin.in.h:1
9184 +msgid "Allows videos to be rotated if they're in the wrong orientation."
9185 +msgstr "ئەگەر سىننىڭ يۆنىلىشى خاتا بولسا ئايلاندۇرۇشقا يول قويىدۇ."
9187 +#: ../src/plugins/rotation/rotation.plugin.in.h:2
9188 +msgid "Rotation Plugin"
9189 +msgstr "ئايلاندۇرۇش قىستۇرمىسى"
9191 +#: ../src/plugins/rotation/totem-rotation-plugin.vala:60
9192 +msgid "_Rotate Clockwise"
9193 +msgstr "ئوڭغا ئايلاندۇر(_R)"
9195 +#: ../src/plugins/rotation/totem-rotation-plugin.vala:62
9196 +msgid "Rotate Counterc_lockwise"
9197 +msgstr "سولغا ئايلاندۇر(_L)"
9199 #: ../src/plugins/save-file/totem-save-file.c:63
9200 msgid "Save a Copy..."
9201 msgstr "نۇسخا ساقلا(_V)…"
9202 @@ -2591,8 +2477,8 @@ msgstr "كىنو"
9203 msgid "Movie stream"
9204 msgstr "كىنو ئېقىمى"
9206 -#: ../src/plugins/screensaver/totem-screensaver.c:112
9207 -#: ../browser-plugin/totem-plugin-viewer.c:1961
9208 +#: ../src/plugins/screensaver/totem-screensaver.c:116
9209 +#: ../browser-plugin/totem-plugin-viewer.c:1884
9210 msgid "Playing a movie"
9211 msgstr "كىنو قويىدۇ"
9213 @@ -2621,7 +2507,7 @@ msgid "_Name:"
9214 msgstr "ئاتى(_N):"
9216 #. Write the screenshot to the temporary file
9217 -#: ../src/plugins/screenshot/gnome-screenshot-widget.c:387
9218 +#: ../src/plugins/screenshot/gnome-screenshot-widget.c:385
9219 #: ../src/plugins/screenshot/totem-screenshot.c:64
9220 msgid "Screenshot.png"
9221 msgstr "Screenshot.png"
9222 @@ -2652,7 +2538,7 @@ msgstr "رەسىم توپلىمىنى \"%s\" غا ساقلا"
9224 #: ../src/plugins/screenshot/totem-screenshot.c:113
9225 msgid "There was an error saving the screenshot."
9226 -msgstr "تۇتۇلغان رەسىمنى ساقلاشتا خاتالىق كۆرۈلدى"
9227 +msgstr "ئېكران كەسمىسىنى ساقلاشتا خاتالىق كۆرۈلدى."
9229 #: ../src/plugins/screenshot/totem-screenshot.c:139
9230 msgid "Save Screenshot"
9231 @@ -2680,7 +2566,7 @@ msgstr "ئېكران كەسمىسى تۇت...(_S)"
9233 #: ../src/plugins/screenshot/totem-screenshot-plugin.c:197
9234 msgid "Take a screenshot"
9235 -msgstr "ئېكران كۆرۈنۈشىنى رەسىمگە ئال"
9236 +msgstr "ئېكران كەسمىسى تۇت"
9238 #: ../src/plugins/screenshot/totem-screenshot-plugin.c:198
9239 msgid "Create Screenshot _Gallery..."
9240 @@ -2707,71 +2593,20 @@ msgid "7"
9241 msgstr "7"
9243 #: ../src/plugins/skipto/totem-skipto.c:197
9244 -#| msgid "Skip to"
9245 msgid "Skip To"
9246 msgstr "ئاتلاش"
9248 #: ../src/plugins/skipto/totem-skipto-plugin.c:182
9249 -#| msgid "_Skip to..."
9250 msgid "_Skip To..."
9251 -msgstr "غا ئاتلاش(_S) …"
9252 +msgstr "غا ئاتلا(_S) …"
9254 #: ../src/plugins/skipto/totem-skipto-plugin.c:182
9255 msgid "Skip to a specific time"
9256 -msgstr "بەلگىلەنگەن ۋاقىتقا بېرىش"
9257 +msgstr "بەلگىلەنگەن ۋاقىتقا ئاتلا"
9259 #: ../src/plugins/skipto/skipto.ui.h:1
9260 msgid "_Skip to:"
9261 -msgstr "غا ئاتلاپ ئۆتۈش(_S) ...."
9263 -#: ../src/plugins/tracker/totem-tracker-widget.c:587
9264 -#: ../src/plugins/tracker/totem-tracker-widget.c:676
9265 -msgid "Could not connect to Tracker"
9266 -msgstr "Tracker غا باغلىنالمىدى"
9268 -#: ../src/plugins/tracker/totem-tracker-widget.c:594
9269 -msgid "No results"
9270 -msgstr "نەتىجە يوق"
9272 -#. Translators:
9273 -#. * This is used to show which items are listed in the
9274 -#. * list view, for example:
9275 -#. *
9276 -#. * Showing 10-20 of 128 matches
9277 -#. *
9278 -#. * This is similar to what web searches use, eg.
9279 -#. * Google on the top-right of their search results
9280 -#. * page show:
9281 -#. *
9282 -#. * Personalized Results 1 - 10 of about 4,130,000 for foobar
9283 -#. *
9285 -#: ../src/plugins/tracker/totem-tracker-widget.c:618
9286 -#, c-format
9287 -msgid "Showing %i - %i of %i match"
9288 -msgid_plural "Showing %i - %i of %i matches"
9289 -msgstr[0] "كۆرسەتكىنى %i - %i، جەمئىي %i"
9291 -#: ../src/plugins/tracker/totem-tracker-widget.c:823
9292 -msgid "Page"
9293 -msgstr "بەت"
9295 -#: ../src/plugins/tracker/totem-tracker.c:65
9296 -#: ../src/plugins/tracker/tracker.plugin.in.h:1
9297 -msgid "Local Search"
9298 -msgstr "يەرلىك ئىزدەش"
9300 -#: ../src/plugins/thumbnail/thumbnail.plugin.in.h:1
9301 -msgid "Set the window icon to the thumbnail of the playing movie"
9302 -msgstr "كۆزنەك سىنبەلگىسىنى قويۇۋاتقان كىنونىڭ كىچىك سۈرىتىگە تەڭشە"
9304 -#: ../src/plugins/thumbnail/thumbnail.plugin.in.h:2
9305 -msgid "Thumbnail"
9306 -msgstr "كىچىك سۈرەت"
9308 -#: ../src/plugins/tracker/tracker.plugin.in.h:2
9309 -msgid "Search for local videos using Tracker"
9310 -msgstr "Tracker ئىشلىتىپ يەرلىك سىن ئىزدە"
9311 +msgstr "ئاتلاش ئورنى(_S):"
9313 #: ../src/plugins/youtube/youtube.plugin.in.h:1
9314 msgid "A plugin to let you browse YouTube videos."
9315 @@ -2785,12 +2620,16 @@ msgstr "YouTube كۆرگۈ"
9316 msgid "Related Videos"
9317 msgstr "مۇناسىۋەتلىك سىنلار"
9319 +#: ../src/plugins/youtube/youtube.ui.h:2
9320 +msgid "Search Results"
9321 +msgstr "ئىزدەش نەتىجىسى"
9323 #: ../src/plugins/youtube/youtube.ui.h:3
9324 msgid "Videos"
9325 msgstr "سىنلار"
9327 #: ../src/plugins/youtube/totem-youtube.c:144
9328 -#: ../src/plugins/youtube/totem-youtube.c:803
9329 +#: ../src/plugins/youtube/totem-youtube.c:819
9330 msgid "_Open in Web Browser"
9331 msgstr "توركۆرگۈدە ئاچ(_O)"
9333 @@ -2819,68 +2658,65 @@ msgstr "سىن ئىزدەۋاتقاندا خاتالىق كۆرۈلدى"
9334 msgid ""
9335 "The response from the server could not be understood. Please check you are "
9336 "running the latest version of libgdata."
9337 -msgstr "مۇلازىمېتىر قايتۇرغان جاۋابنى چۈشىنەلمىدى. libgdata نىڭ ئەڭ يېڭى نەشرىنى ئىشلىتىۋاتقانلىقىڭىزنى تەكشۈرۈڭ."
9338 +msgstr ""
9339 +"مۇلازىمېتىر قايتۇرغان جاۋابنى چۈشىنەلمىدى. libgdata نىڭ ئەڭ يېڭى نەشرىنى "
9340 +"ئىشلىتىۋاتقانلىقىڭىزنى تەكشۈرۈڭ."
9342 #. Update the UI
9343 -#: ../src/plugins/youtube/totem-youtube.c:618
9344 +#: ../src/plugins/youtube/totem-youtube.c:630
9345 msgid "Fetching search results…"
9346 -msgstr "ئىزدەش نەتىجىسىنى ئوقۇۋاتىدۇ..."
9347 +msgstr "ئىزدەش نەتىجىلىرىگە ئېرىشىۋاتىدۇ…"
9349 #. Update the UI
9350 -#: ../src/plugins/youtube/totem-youtube.c:680
9351 +#: ../src/plugins/youtube/totem-youtube.c:696
9352 msgid "Fetching related videos…"
9353 -msgstr "مۇناسىۋەتلىك سىنلارنى ئوقۇۋاتىدۇ..."
9354 +msgstr "مۇناسىۋەتلىك سىنلارغا ئېرىشىۋاتىدۇ…"
9356 -#: ../src/plugins/youtube/totem-youtube.c:732
9357 +#: ../src/plugins/youtube/totem-youtube.c:748
9358 msgid "Error Opening Video in Web Browser"
9359 msgstr "سىننى توركۆرگۈدە ئېچىۋاتقاندا خاتالىق كۆرۈلدى"
9361 -#: ../src/plugins/youtube/totem-youtube.c:752
9362 +#: ../src/plugins/youtube/totem-youtube.c:768
9363 msgid "Fetching more videos…"
9364 -msgstr "تېخى جىق سىنلارنى ئوقۇۋاتىدۇ..."
9365 +msgstr "تېخىمۇ كۆپ سىنلارغا ئېرىشىۋاتىدۇ…"
9367 -#: ../src/plugins/youtube/totem-youtube.c:797
9368 +#: ../src/plugins/youtube/totem-youtube.c:813
9369 msgid "Video Format Not Supported"
9370 msgstr "سىن فورماتىنى قوللىمايدۇ"
9372 -#: ../src/plugins/youtube/totem-youtube.c:799
9373 +#: ../src/plugins/youtube/totem-youtube.c:815
9374 msgid ""
9375 "This video is not available in any formats which Totem supports. Would you "
9376 "like to open it in your web browser instead?"
9377 -msgstr "بۇ سىننىڭ فورماتى Totem قوللايدىغان ھېچقانداق فورماتتا ئەمەس ئىكەن. شۇڭا ئۇنى توركۆرگۈدە ئېچىپ باقامسىز؟"
9378 +msgstr ""
9379 +"بۇ سىننىڭ فورماتى Totem قوللايدىغان ھېچقانداق فورماتتا ئەمەس ئىكەن. شۇڭا "
9380 +"ئۇنى توركۆرگۈدە ئېچىپ باقامسىز؟"
9382 -#: ../browser-plugin/totem-plugin-viewer.c:431
9383 +#: ../browser-plugin/totem-plugin-viewer.c:429
9384 msgid "No URI to play"
9385 msgstr "قويىدىغان URI يوق"
9387 #. translators: this is:
9388 #. * Open With ApplicationName
9389 #. * as in nautilus' right-click menu
9390 -#: ../browser-plugin/totem-plugin-viewer.c:1101
9391 +#: ../browser-plugin/totem-plugin-viewer.c:1100
9392 #, c-format
9393 msgid "_Open with \"%s\""
9394 msgstr "«%s»دا ئاچ(_O)"
9396 -#: ../browser-plugin/totem-plugin-viewer.c:1152
9397 -#, c-format
9398 -msgid "Browser Plugin using %s"
9399 -msgstr "%s نى ئىشلىتىۋاتقان كىنو قويغۇچ"
9401 -#: ../browser-plugin/totem-plugin-viewer.c:1157
9402 -msgid "Totem Browser Plugin"
9403 -msgstr "Totem توركۆرگۈ قىستۇرمىسى"
9405 -#: ../browser-plugin/totem-plugin-viewer.c:2195
9406 +#: ../browser-plugin/totem-plugin-viewer.c:2123
9407 msgid "No playlist or playlist empty"
9408 msgstr "قويۇش تىزىملىكى يوق ياكى قويۇش تىزىملىكى قۇرۇق"
9410 -#: ../browser-plugin/totem-plugin-viewer.c:2286
9411 +#: ../browser-plugin/totem-plugin-viewer.c:2217
9412 msgid "Movie browser plugin"
9413 msgstr "كىنو كۆرگۈ قىستۇرمىسى"
9415 -#: ../browser-plugin/totem-plugin-viewer.c:2302
9416 +#: ../browser-plugin/totem-plugin-viewer.c:2233
9417 msgid "Verify your system installation. The Totem plugin will now exit."
9418 -msgstr "سىستېمىڭىزنىڭ ئورنىتىلىش ئەھۋالىنى تەكشۈرۈپ كۆرۈڭ. Totem قىستۇرمىسى ھازىر ئاخىرلىشىدۇ."
9419 +msgstr ""
9420 +"سىستېمىڭىزنىڭ ئورنىتىلىش ئەھۋالىنى تەكشۈرۈپ كۆرۈڭ. Totem قىستۇرمىسى ھازىر "
9421 +"ئاخىرلىشىدۇ."
9423 #: ../src/plugins/pythonconsole/pythonconsole.plugin.in.h:1
9424 msgid "Interactive Python console."
9425 @@ -2890,41 +2726,261 @@ msgstr "ئۆزئارا تەسىرلىشىدىغان Python كونترول سۇ
9426 msgid "Python Console"
9427 msgstr "Python كونترول سۇپىسى"
9429 -#: ../src/plugins/pythonconsole/pythonconsole.py:85
9430 +#: ../src/plugins/pythonconsole/pythonconsole.py:88
9431 msgid "Python Console Menu"
9432 msgstr "Python كونترول سۇپا تىزىملىكى"
9434 -#: ../src/plugins/pythonconsole/pythonconsole.py:88
9435 +#: ../src/plugins/pythonconsole/pythonconsole.py:93
9436 msgid "_Python Console"
9437 msgstr "Python كونترول سۇپىسى(_P)"
9439 -#: ../src/plugins/pythonconsole/pythonconsole.py:89
9440 +#: ../src/plugins/pythonconsole/pythonconsole.py:94
9441 msgid "Show Totem's Python console"
9442 msgstr "Totem نىڭ Python كونترول سۇپىسىنى كۆرسەت"
9444 -#: ../src/plugins/pythonconsole/pythonconsole.py:94
9445 +#: ../src/plugins/pythonconsole/pythonconsole.py:100
9446 msgid "Python Debugger"
9447 msgstr "Python سازلىغۇچ"
9449 -#: ../src/plugins/pythonconsole/pythonconsole.py:95
9450 +#: ../src/plugins/pythonconsole/pythonconsole.py:101
9451 msgid "Enable remote Python debugging with rpdb2"
9452 msgstr "rpdb2 ئىشلىتىپ يىراقتىن Python سازلاشنى قوزغات"
9454 -#: ../src/plugins/pythonconsole/pythonconsole.py:116
9455 +#. pylint: disable-msg=E1101
9456 +#: ../src/plugins/pythonconsole/pythonconsole.py:125
9457 #, python-format
9458 msgid "You can access the Totem.Object through 'totem_object' :\\n%s"
9459 msgstr "سىز 'totem_object' ئارقىلىق Totem نەڭنى زىيارەت قىلالايسىز:\\n%s"
9461 -#: ../src/plugins/pythonconsole/pythonconsole.py:120
9462 +#: ../src/plugins/pythonconsole/pythonconsole.py:129
9463 msgid "Totem Python Console"
9464 msgstr "Totem Python كونترول سۇپىسى"
9466 -#: ../src/plugins/pythonconsole/pythonconsole.py:129
9467 +#: ../src/plugins/pythonconsole/pythonconsole.py:139
9468 msgid ""
9469 "After you press OK, Totem will wait until you connect to it with winpdb or "
9470 "rpdb2. If you have not set a debugger password in DConf, it will use the "
9471 "default password ('totem')."
9472 -msgstr "جەزملە چېكىلگەندىن كېيىن، Totem سىزنىڭ winpdb ياكى rpdb2 غا باغلانغۇچە كۈتىدۇ. ئەگەر سىز DConf دا سازلىغۇچ ئىمنى تەڭشىمىگەن بولسىڭىز، كۆڭۈلدىكى ئىم ('totem')نى ئىشلىتىدۇ."
9473 +msgstr ""
9474 +"جەزملە چېكىلگەندىن كېيىن، Totem سىزنىڭ winpdb ياكى rpdb2 غا باغلانغۇچە "
9475 +"كۈتىدۇ. ئەگەر سىز DConf دا سازلىغۇچ ئىمنى تەڭشىمىگەن بولسىڭىز، كۆڭۈلدىكى ئىم "
9476 +"('totem')نى ئىشلىتىدۇ."
9478 +#: ../src/plugins/grilo/grilo.plugin.in.h:1
9479 +msgid "A plugin to let you browse media content from various sources."
9480 +msgstr ""
9481 +"بۇ قىستۇرما سىزنىڭ ۋاسىتە مەزمۇنىنى ھەر خىل مەنبەلەردىن كۆز يۈگۈرتۈشىڭىزگە "
9482 +"يول قويىدۇ."
9484 +#: ../src/plugins/grilo/grilo.plugin.in.h:2
9485 +msgid "Grilo Browser"
9486 +msgstr "Grilo كۆرگۈ"
9488 +#: ../src/plugins/grilo/totem-grilo.c:452
9489 +msgid "Browse Error"
9490 +msgstr "كۆز يۈگۈرتۈش خاتالىقى"
9492 +#: ../src/plugins/grilo/totem-grilo.c:599
9493 +msgid "Search Error"
9494 +msgstr "ئىزدەش خاتالىقى"
9496 +#: ../src/plugins/grilo/totem-grilo.c:1219 ../src/plugins/grilo/grilo.ui.h:1
9497 +msgid "Browse"
9498 +msgstr "كۆز يۈگۈرت"
9500 +#: ../src/plugins/grilo/totem-grilo.c:1285 ../src/plugins/grilo/grilo.ui.h:2
9501 +msgid "Search"
9502 +msgstr "ئىزدە"
9504 +#~ msgid "Browser Plugin using %s"
9505 +#~ msgstr "%s نى ئىشلىتىۋاتقان كىنو قويغۇچ"
9507 +#~ msgid "Totem Browser Plugin"
9508 +#~ msgstr "Totem توركۆرگۈ قىستۇرمىسى"
9510 +#~ msgid "%s"
9511 +#~ msgstr "%s"
9513 +#~ msgid "By artist"
9514 +#~ msgstr "سەنئەتكار بويىچە"
9516 +#~ msgid "By tag"
9517 +#~ msgstr "بەلگە بويىچە"
9519 +#~ msgid "Jamendo Album Page"
9520 +#~ msgstr "Jamendo پلاستىنكا توپلام بېتى"
9522 +#~ msgid "Latest Releases"
9523 +#~ msgstr "ئەڭ يېڭى تارقاتقىنى"
9525 +#~ msgid "Number of albums to _retrieve:"
9526 +#~ msgstr "ئىزدەيدىغان پلاستىنكا توپلام سانى(_R):"
9528 +#~ msgid "Popular"
9529 +#~ msgstr "ئاممىباب"
9531 +#~ msgid "Preferred audio _format:"
9532 +#~ msgstr "ئالدىن تاللىنىدىغان ئۈن فورماتى(_F):"
9534 +#~ msgid "_Open Jamendo Album Page in Browser"
9535 +#~ msgstr "توركۆرگۈدە Jamendo پلاستىنكا توپلام بېتىنى ئاچ(_O)"
9537 +#~ msgid "Jamendo"
9538 +#~ msgstr "Jamendo"
9540 +#~ msgid ""
9541 +#~ "Listen to the large collection of Creative Commons licensed music on "
9542 +#~ "Jamendo."
9543 +#~ msgstr ""
9544 +#~ "Jamendo توپلىغان ئىجادىيەت ئاممىۋى ئىجازەتنامىسىدە تارقىتىلغان كۆپ "
9545 +#~ "مىقداردىكى نەغمىنى تىڭشاش."
9547 +#~ msgid "You need to install the Python simplejson module."
9548 +#~ msgstr "سىز Python simplejson بۆلىكىنى ئورنىتىشىڭىز زۆرۈر."
9550 +#~ msgid "Artist: %s"
9551 +#~ msgstr "سەنئەتكار: ‎%s"
9553 +#~ msgid "%Y-%m-%d"
9554 +#~ msgstr "%Y-%m-%d"
9556 +#~ msgid "%x"
9557 +#~ msgstr "%x"
9559 +#~ msgid "Genre: %s"
9560 +#~ msgstr "ئېقىم: %s"
9562 +#~ msgid "Released on: %s"
9563 +#~ msgstr "تارقىتىش تارىخى: %s"
9565 +#~ msgid "License: %s"
9566 +#~ msgstr "ئىجازەتنامە: %s"
9568 +#~ msgid "%02d. %s"
9569 +#~ msgstr "%02d. %s"
9571 +#~ msgid "Album: %s"
9572 +#~ msgstr "پلاستىنكا توپلىمى: ‎%s"
9574 +#~ msgid "Duration: %s"
9575 +#~ msgstr "داۋاملاشقان ۋاقىت: %s"
9577 +#~ msgid "Fetching albums, please wait…"
9578 +#~ msgstr "ئالبوملارنى ئوقۇۋاتىدۇ، سەل ساقلاڭ..."
9580 +#~ msgid ""
9581 +#~ "Failed to connect to Jamendo server.\n"
9582 +#~ "%s."
9583 +#~ msgstr ""
9584 +#~ "Jamendo مۇلازىمېتىرىغا باغلىنىش مەغلۇپ بولدى.\n"
9585 +#~ "%s."
9587 +#~ msgid "The Jamendo server returned code %s."
9588 +#~ msgstr "Jamendo مۇلازىمېتىر قايتۇرغان كود %s."
9590 +#~ msgid "An error occurred while fetching albums."
9591 +#~ msgstr "پلاستىنكا توپلىمىغا ئېرىشىۋاتقاندا خاتالىق كۆرۈلدى."
9593 +#~ msgid "%H:%M:%S"
9594 +#~ msgstr "%H:%M:%S"
9596 +#~ msgid "%M:%S"
9597 +#~ msgstr "%M:%S"
9599 +#~ msgid "en"
9600 +#~ msgstr "ug"
9602 +#~ msgid "Audio format to download from Jamendo"
9603 +#~ msgstr "Jamendo دىن چۈشۈرگەن ئۈن فورماتى"
9605 +#~ msgid "Number of results per page"
9606 +#~ msgstr "بىر بەتتىكى نەتىجە سانى"
9608 +#~ msgid ""
9609 +#~ "The number of Jamendo search results to display in each page of results."
9610 +#~ msgstr "ھەر بىر بەتتە كۆرسىتىدىغان Jamendo ئىزدەش نەتىجىسىنىڭ سانى"
9612 +#~ msgid "The preferred audio format to download tracks from Jamendo in."
9613 +#~ msgstr "Jamendo دىن ئۈن چۈشۈرگەندە ئالدىن ئىشلىتىدىغان ئۈن فورماتى."
9615 +#~ msgid "Could not connect to Tracker"
9616 +#~ msgstr "Tracker غا باغلىنالمىدى"
9618 +#~ msgid "No results"
9619 +#~ msgstr "نەتىجە يوق"
9621 +#~ msgid "Showing %i - %i of %i match"
9622 +#~ msgid_plural "Showing %i - %i of %i matches"
9623 +#~ msgstr[0] "كۆرسەتكىنى %i - %i، جەمئىي %i"
9625 +#~ msgid "Page"
9626 +#~ msgstr "بەت"
9628 +#~ msgid "Search for local videos using Tracker"
9629 +#~ msgstr "Tracker ئىشلىتىپ يەرلىك سىن ئىزدە"
9631 +#~ msgid "Zoom Out"
9632 +#~ msgstr "كىچىكلىتىش"
9634 +#~ msgid "Zoom Reset"
9635 +#~ msgstr "چوڭ-كىچىكلىكىنى ئەسلىگە كەلتۈرۈش"
9637 +#~ msgid "Zoom out"
9638 +#~ msgstr "كىچىكلەت"
9640 +#~ msgid "Zoom reset"
9641 +#~ msgstr "چوڭ-كىچىكلىكىنى ئەسلىگە كەلتۈرۈش"
9643 +#~ msgid ""
9644 +#~ "The playback of this movie requires the following decoders which are not "
9645 +#~ "installed:\n"
9646 +#~ "\n"
9647 +#~ "%s"
9648 +#~ msgstr ""
9649 +#~ "بۇ كىنونى قويۇش ئۈچۈن تېخى ئورنىتىلمىغان تۆۋەندىكى يەشكۈچلەر كېرەك "
9650 +#~ "بولىدۇ:\n"
9651 +#~ "\n"
9652 +#~ "%s"
9654 +#~ msgid "Media file could not be played."
9655 +#~ msgstr "ۋاسىتە ھۆججىتىنى قويغىلى بولمىدى."
9657 +#~ msgid "Too old version of GStreamer installed."
9658 +#~ msgstr "GStreamer بەكلا كونا نەشرى ئورنىتىلغان."
9660 +#~ msgid ""
9661 +#~ "Failed to open video output. It may not be available. Please select "
9662 +#~ "another video output in the Multimedia Systems Selector."
9663 +#~ msgstr ""
9664 +#~ "سىن چىقىرىش ئۈسكۈنىسىنى ئېچىش مەغلۇپ بولدى. ئۇ يوق بولۇشى مۇمكىن. "
9665 +#~ "Multimedia Systems Selector دىن باشقا بىر سىن چىقىرىش ئۈسكۈنىسىنى تاللاڭ."
9667 +#~ msgid ""
9668 +#~ "Could not find the video output. You may need to install additional "
9669 +#~ "GStreamer plugins, or select another video output in the Multimedia "
9670 +#~ "Systems Selector."
9671 +#~ msgstr ""
9672 +#~ "سىن چىقىرىش ئۈسكۈنىسى تېپىلمىدى. سىز GStreamer قسىتۇرمىسىنى ئورنىتىشىڭىز "
9673 +#~ "ياكى Multimedia Systems Selector دىن باشقا بىر سىن چىقىرىش ئۈسكۈنىسىنى "
9674 +#~ "تاللىشىڭىز زۆرۈر."
9676 +#~ msgid "Delete"
9677 +#~ msgstr "ئۆچۈر"
9679 +#~ msgid "Coherence DLNA/UPnP Client"
9680 +#~ msgstr "Coherence DLNA/UPnP خېرىدارى"
9682 +#~ msgid "A DLNA/UPnP client for Totem powered by Coherence"
9683 +#~ msgstr "Coherence قوللايدىغان Totem نىڭ DLNA/UPnP خېرىدارى"
9685 +#~ msgid "Language"
9686 +#~ msgstr "تىل"
9688 +#~ msgid "Set the window icon to the thumbnail of the playing movie"
9689 +#~ msgstr "كۆزنەك سىنبەلگىسىنى قويۇۋاتقان كىنونىڭ كىچىك سۈرىتىگە تەڭشە"
9691 +#~ msgid "Thumbnail"
9692 +#~ msgstr "كىچىك سۈرەت"
9694 #~ msgid "Enable visual effects?"
9695 #~ msgstr "كۆرۈنۈش ئۈنۈمىنى قوزغىتامدۇ؟"
9696 @@ -2948,9 +3004,6 @@ msgstr "جەزملە چېكىلگەندىن كېيىن، Totem سىزنىڭ winp
9697 #~ msgid "Could not get name and thumbnail for %s: %s"
9698 #~ msgstr "%s نىڭ ئاتى ۋە كىچىك سۈرەتكە ئېرىشەلمىدى: %s"
9700 -#~ msgid "File Error"
9701 -#~ msgstr "ھۆججەت خاتالىقى"
9703 #~ msgid "Error Looking Up Video URI"
9704 #~ msgstr "سىن URI نى ئىزدەۋاتقاندا خاتالىق كۆرۈلدى"
9706 @@ -3180,9 +3233,6 @@ msgstr "جەزملە چېكىلگەندىن كېيىن، Totem سىزنىڭ winp
9707 #~ msgid "This movie could not be opened."
9708 #~ msgstr "بۇ كىنونى ئاچقىلى بولمىدى"
9710 -#~ msgid "Generic Error."
9711 -#~ msgstr "دائىم كۆرۈلىدىغان خاتالىق"
9713 #~ msgid "This movie is a still image. You can open it with an image viewer."
9714 #~ msgstr "بۇ كىنو بولسا بىر سىتاتىك رەسىم. ئۇنى سۈرەت كۆرگۈچ بىلەن كۆرەلەيسىز"
9716 diff --git a/src/Makefile.am b/src/Makefile.am
9717 index b82d938..0672900 100644
9718 --- a/src/Makefile.am
9719 +++ b/src/Makefile.am
9720 @@ -1,6 +1,6 @@
9721 SUBDIRS = backend properties . plugins
9723 -bin_PROGRAMS = totem totem-video-thumbnailer totem-video-indexer totem-audio-preview
9724 +bin_PROGRAMS = totem totem-video-thumbnailer totem-audio-preview
9725 lib_LTLIBRARIES = libtotem.la
9726 noinst_LTLIBRARIES = libtotem_player.la
9728 @@ -259,25 +259,6 @@ test_properties_page_LDADD = \
9729 $(NAUTILUS_LIBS)
9730 endif # HAVE_NAUTILUS
9732 -# Totem Video Indexer
9733 -totem_video_indexer_SOURCES = \
9734 - totem-video-indexer.c \
9735 - totem-resources.c \
9736 - totem-resources.h
9738 -totem_video_indexer_CPPFLAGS = \
9739 - -I$(top_builddir)/data \
9740 - -DG_LOG_DOMAIN=\""TotemVideoIndexer"\" \
9741 - $(AM_CPPFLAGS)
9743 -totem_video_indexer_CFLAGS = \
9744 - $(DEPENDENCY_CFLAGS) \
9745 - $(AM_CFLAGS)
9747 -totem_video_indexer_LDADD = \
9748 - backend/libbaconvideowidget.la \
9749 - $(DEPENDENCY_LIBS)
9751 # Totem Audio Preview for Nautilus
9752 totem_audio_preview_SOURCES = \
9753 totem-audio-preview.c \
9754 diff --git a/src/backend/bacon-video-widget-gst-0.10.c b/src/backend/bacon-video-widget-gst-0.10.c
9755 index bea7283..57a6ed1 100644
9756 --- a/src/backend/bacon-video-widget-gst-0.10.c
9757 +++ b/src/backend/bacon-video-widget-gst-0.10.c
9758 @@ -3113,7 +3113,7 @@ get_lang_list_for_type (BaconVideoWidget * bvw, const gchar * type_name)
9759 gchar *lc = NULL, *cd = NULL;
9761 gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lc);
9762 - gst_tag_list_get_string (tags, GST_TAG_CODEC, &lc);
9763 + gst_tag_list_get_string (tags, GST_TAG_CODEC, &cd);
9765 if (lc) {
9766 ret = g_list_prepend (ret, lc);
9767 @@ -3145,7 +3145,7 @@ get_lang_list_for_type (BaconVideoWidget * bvw, const gchar * type_name)
9768 gchar *lc = NULL, *cd = NULL;
9770 gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lc);
9771 - gst_tag_list_get_string (tags, GST_TAG_CODEC, &lc);
9772 + gst_tag_list_get_string (tags, GST_TAG_CODEC, &cd);
9774 if (lc) {
9775 ret = g_list_prepend (ret, lc);
9776 diff --git a/src/plugins/Makefile.plugins b/src/plugins/Makefile.plugins
9777 index 6b7ab07..c670c65 100644
9778 --- a/src/plugins/Makefile.plugins
9779 +++ b/src/plugins/Makefile.plugins
9780 @@ -26,3 +26,22 @@ plugin_ldflags = \
9782 plugin_libadd = \
9783 $(top_builddir)/src/libtotem.la
9785 +# Checking rules for Python plugins
9786 +# Execute pylint on all the requisite files individually, returning non-zero
9787 +# iff any of the calls to pylint returned non-zero.
9788 +check-pylint: $(plugin_PYTHON)
9789 + @exitstatus=0; \
9790 + for py in $^; do \
9791 + pylint -i y -d C0111 -d W0511 $$py; \
9793 + newexitstatus=$$?; \
9794 + if [ $$exitstatus == 0 ]; then \
9795 + exitstatus=$$newexitstatus; \
9796 + fi; \
9797 + done; \
9798 + exit $$exitstatus
9800 +check: check-pylint
9802 +.PHONY: check-pylint
9803 diff --git a/src/plugins/bemused/totem-bemused.c b/src/plugins/bemused/totem-bemused.c
9804 index 584b4d3..c51a0ee 100644
9805 --- a/src/plugins/bemused/totem-bemused.c
9806 +++ b/src/plugins/bemused/totem-bemused.c
9807 @@ -655,7 +655,8 @@ sdp_svc_add_spp(u_int8_t port,
9809 /* Connect to the local SDP server, register the service record */
9810 session = sdp_connect (BDADDR_ANY, BDADDR_LOCAL, 0);
9811 - sdp_record_register (session, &record, 0);
9812 + if (session != NULL)
9813 + sdp_record_register (session, &record, 0);
9815 /* Cleanup */
9816 sdp_data_free (channel);
9817 diff --git a/src/plugins/chapters/totem-chapters.c b/src/plugins/chapters/totem-chapters.c
9818 index 1b5a9d7..e71c8c7 100644
9819 --- a/src/plugins/chapters/totem-chapters.c
9820 +++ b/src/plugins/chapters/totem-chapters.c
9821 @@ -1131,6 +1131,7 @@ impl_activate (PeasActivatable *plugin)
9822 main_box = gtk_vbox_new (FALSE, 6);
9823 gtk_box_pack_start (GTK_BOX (main_box), cplugin->priv->list_box, TRUE, TRUE, 0);
9824 gtk_box_pack_start (GTK_BOX (main_box), cplugin->priv->load_box, TRUE, TRUE, 0);
9825 + gtk_widget_show_all (main_box);
9827 set_no_data_visible (TRUE, FALSE, cplugin);
9829 diff --git a/src/plugins/coherence_upnp/Makefile.am b/src/plugins/coherence_upnp/Makefile.am
9830 deleted file mode 100644
9831 index 36adfea..0000000
9832 --- a/src/plugins/coherence_upnp/Makefile.am
9833 +++ /dev/null
9834 @@ -1,8 +0,0 @@
9835 -include $(top_srcdir)/src/plugins/Makefile.plugins
9837 -plugindir = $(PLUGINDIR)/coherence_upnp
9838 -plugin_PYTHON = coherence_upnp.py
9840 -plugin_in_files = coherence_upnp.plugin.in
9842 --include $(top_srcdir)/git.mk
9843 diff --git a/src/plugins/coherence_upnp/coherence_upnp.plugin.in b/src/plugins/coherence_upnp/coherence_upnp.plugin.in
9844 deleted file mode 100644
9845 index 1266707..0000000
9846 --- a/src/plugins/coherence_upnp/coherence_upnp.plugin.in
9847 +++ /dev/null
9848 @@ -1,9 +0,0 @@
9849 -[Plugin]
9850 -Loader=python
9851 -Module=coherence_upnp
9852 -IAge=1
9853 -_Name=Coherence DLNA/UPnP Client
9854 -_Description=A DLNA/UPnP client for Totem powered by Coherence
9855 -Authors=Frank Scholz <coherence@beebits.net>
9856 -Copyright=Copyright © 2008 Frank Scholz
9857 -Website=http://coherence.beebits.net/
9858 diff --git a/src/plugins/coherence_upnp/coherence_upnp.py b/src/plugins/coherence_upnp/coherence_upnp.py
9859 deleted file mode 100644
9860 index d785830..0000000
9861 --- a/src/plugins/coherence_upnp/coherence_upnp.py
9862 +++ /dev/null
9863 @@ -1,125 +0,0 @@
9864 -# -*- coding: utf-8 -*-
9866 -# Licensed under the MIT license
9867 -# http://opensource.org/licenses/mit-license.php
9869 -# Copyright 2008, Frank Scholz <coherence@beebits.net>
9871 -from gi.repository import Peas
9872 -from gi.repository import Gtk
9873 -from gi.repository import Totem
9875 -from coherence.ui.av_widgets import TreeWidget
9876 -from coherence.ui.av_widgets import UDN_COLUMN,UPNP_CLASS_COLUMN,SERVICE_COLUMN
9878 -gettext.textdomain("totem")
9880 -D_ = gettext.dgettext
9881 -_ = gettext.gettext
9883 -class UPnPClient(gobject.GObject, Peas.Activatable):
9884 - __gtype_name__ = 'UPnPClient'
9886 - object = gobject.property(type = gobject.GObject)
9888 - def __init__ (self):
9889 - self.totem_object = None
9890 - self.ui = TreeWidget()
9891 - self.ui.window.set_shadow_type(gtk.SHADOW_IN)
9892 - self.ui.cb_item_right_click = self.button_pressed
9893 - self.ui.window.show_all()
9894 - selection = self.ui.treeview.get_selection()
9895 - selection.set_mode(gtk.SELECTION_MULTIPLE)
9897 - def button_pressed(self, widget, event):
9898 - if event.button == 3:
9899 - x = int(event.x)
9900 - y = int(event.y)
9901 - try:
9902 - row_path,column,_,_ = self.ui.treeview.get_path_at_pos(x, y)
9903 - selection = self.ui.treeview.get_selection()
9904 - if not selection.path_is_selected(row_path):
9905 - self.ui.treeview.set_cursor(row_path,column,False)
9906 - print "button_pressed", row_path, (row_path[0],)
9907 - iter = self.ui.store.get_iter((row_path[0],))
9908 - udn, = self.ui.store.get(iter,UDN_COLUMN)
9909 - iter = self.ui.store.get_iter(row_path)
9910 - upnp_class,url = self.ui.store.get(iter,UPNP_CLASS_COLUMN,SERVICE_COLUMN)
9911 - print udn, upnp_class, url
9912 - if(not upnp_class.startswith('object.container') and
9913 - not upnp_class == 'root'):
9914 - self.create_item_context(has_delete=self.ui.device_has_action(udn,'ContentDirectory','DestroyObject'))
9915 - self.context.popup(None,None,None,event.button,event.time)
9916 - return 1
9917 - except TypeError:
9918 - pass
9919 - return 1
9921 - def create_item_context(self,has_delete=False):
9922 - """ create context menu for right click in treeview item"""
9924 - def action(menu, text):
9925 - selection = self.ui.treeview.get_selection()
9926 - model, selected_rows = selection.get_selected_rows()
9927 - if text == 'item.delete':
9928 - for row_path in selected_rows:
9929 - self.ui.destroy_object(row_path)
9930 - return
9931 - if(len(selected_rows) > 0 and
9932 - text ==' item.play'):
9933 - row_path = selected_rows.pop(0)
9934 - iter = self.ui.store.get_iter(row_path)
9935 - url, = self.ui.store.get(iter,SERVICE_COLUMN)
9936 - self.totem_object.action_remote(totem.REMOTE_COMMAND_REPLACE,url)
9937 - self.totem_object.action_remote(totem.REMOTE_COMMAND_PLAY,url)
9938 - for row_path in selected_rows:
9939 - iter = self.ui.store.get_iter(row_path)
9940 - url, = self.ui.store.get(iter,SERVICE_COLUMN)
9941 - self.totem_object.action_remote(totem.REMOTE_COMMAND_ENQUEUE,url)
9942 - self.totem_object.action_remote(totem.REMOTE_COMMAND_PLAY,url)
9944 - if not hasattr(self, 'context_no_delete'):
9945 - self.context_no_delete = gtk.Menu()
9946 - # Translators: this refers to a media file
9947 - play_menu = gtk.MenuItem(_(u"Play"))
9948 - play_menu.connect("activate", action, 'item.play')
9949 - # Translators: this refers to a media file
9950 - enqueue_menu = gtk.MenuItem(_(u"Enqueue"))
9951 - enqueue_menu.connect("activate", action, 'item.enqueue')
9952 - self.context_no_delete.append(play_menu)
9953 - self.context_no_delete.append(enqueue_menu)
9954 - self.context_no_delete.show_all()
9956 - if not hasattr(self, 'context_with_delete'):
9957 - self.context_with_delete = gtk.Menu()
9958 - # Translators: this refers to a media file
9959 - play_menu = gtk.MenuItem(_(u"Play"))
9960 - play_menu.connect("activate", action, 'item.play')
9961 - # Translators: this refers to a media file
9962 - enqueue_menu = gtk.MenuItem(_(u"Enqueue"))
9963 - enqueue_menu.connect("activate", action, 'item.enqueue')
9964 - self.context_with_delete.append(play_menu)
9965 - self.context_with_delete.append(enqueue_menu)
9966 - self.context_with_delete.append(gtk.SeparatorMenuItem())
9967 - # Translators: this refers to a media file
9968 - menu = gtk.MenuItem(_(u"Delete"))
9969 - menu.connect("activate", action, 'item.delete')
9970 - self.context_with_delete.append(menu)
9971 - self.context_with_delete.show_all()
9973 - if has_delete:
9974 - self.context = self.context_with_delete
9975 - else:
9976 - self.context = self.context_no_delete
9978 - def do_activate (self):
9979 - self.totem_object = self.object
9980 - self.totem_object.add_sidebar_page ("upnp-coherence", _(u"Coherence DLNA/UPnP Client"), self.ui.window)
9982 - def load_and_play(url):
9983 - self.totem_object.add_to_playlist_and_play (url, '', True)
9985 - self.ui.cb_item_dbl_click = load_and_play
9987 - def do_deactivate (self):
9988 - self.totem_object.remove_sidebar_page ("upnp-coherence")
9989 diff --git a/src/plugins/dbus-service/Makefile.am b/src/plugins/dbus-service/Makefile.am
9990 deleted file mode 100644
9991 index 7aa7652..0000000
9992 --- a/src/plugins/dbus-service/Makefile.am
9993 +++ /dev/null
9994 @@ -1,8 +0,0 @@
9995 -include $(top_srcdir)/src/plugins/Makefile.plugins
9997 -plugindir = $(PLUGINDIR)/dbus
9998 -plugin_PYTHON = dbus-service.py
10000 -plugin_in_files = dbus-service.plugin.in
10002 --include $(top_srcdir)/git.mk
10003 diff --git a/src/plugins/dbus-service/dbus-service.plugin.in b/src/plugins/dbus-service/dbus-service.plugin.in
10004 deleted file mode 100644
10005 index 7400fbe..0000000
10006 --- a/src/plugins/dbus-service/dbus-service.plugin.in
10007 +++ /dev/null
10008 @@ -1,9 +0,0 @@
10009 -[Plugin]
10010 -Loader=python
10011 -Module=dbus-service
10012 -IAge=1
10013 -_Name=D-Bus Service
10014 -_Description=Plugin for sending notifications of currently playing movies to the D-Bus subsystem.
10015 -Authors=Lucky <lucky1.data@gmail.com>, Philip Withnall <philip@tecnocode.co.uk>
10016 -Copyright=Copyright © 2009 Lucky, Philip Withnall
10017 -Website=http://projects.gnome.org/totem/
10018 diff --git a/src/plugins/dbus-service/dbus-service.py b/src/plugins/dbus-service/dbus-service.py
10019 deleted file mode 100644
10020 index 7d96ffa..0000000
10021 --- a/src/plugins/dbus-service/dbus-service.py
10022 +++ /dev/null
10023 @@ -1,291 +0,0 @@
10024 -## Totem D-Bus plugin
10025 -## Copyright (C) 2009 Lucky <lucky1.data@gmail.com>
10026 -## Copyright (C) 2009 Philip Withnall <philip@tecnocode.co.uk>
10028 -## This program is free software; you can redistribute it and/or modify
10029 -## it under the terms of the GNU General Public License as published by
10030 -## the Free Software Foundation; either version 2 of the License, or
10031 -## (at your option) any later version.
10033 -## This program is distributed in the hope that it will be useful,
10034 -## but WITHOUT ANY WARRANTY; without even the implied warranty of
10035 -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10036 -## GNU General Public License for more details.
10038 -## You should have received a copy of the GNU General Public License
10039 -## along with this program; if not, write to the Free Software
10040 -## Foundation, Inc., 51 Franklin St, Fifth Floor,
10041 -## Boston, MA 02110-1301 USA.
10043 -## Sunday 13th May 2007: Bastien Nocera: Add exception clause.
10044 -## See license_change file for details.
10046 -import gobject
10047 -from gi.repository import Peas
10048 -from gi.repository import Gtk
10049 -from gi.repository import Totem
10050 -import dbus, dbus.service
10051 -from dbus.mainloop.glib import DBusGMainLoop
10053 -class dbusservice(gobject.GObject, Peas.Activatable):
10054 - __gtype_name__ = 'dbusservice'
10056 - object = gobject.property(type = gobject.GObject)
10058 - def do_activate(self):
10059 - DBusGMainLoop(set_as_default = True)
10061 - name = dbus.service.BusName ('org.mpris.Totem', bus = dbus.SessionBus ())
10062 - self.root = Root (name, self.object)
10063 - self.player = Player (name, self.object)
10064 - self.track_list = TrackList (name, self.object)
10066 - def do_deactivate(self):
10067 - self.root.disconnect() # ensure we don't leak our paths on the bus
10068 - self.player.disconnect()
10069 - self.track_list.disconnect()
10071 -class Root (dbus.service.Object):
10072 - def __init__(self, name, totem):
10073 - dbus.service.Object.__init__ (self, name, '/')
10074 - self.totem = totem
10076 - def disconnect(self):
10077 - self.remove_from_connection(None, None)
10079 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='s')
10080 - def Identity(self):
10081 - return self.totem.get_version()
10083 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='')
10084 - def Quit(self):
10085 - self.totem.action_exit()
10087 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='(qq)')
10088 - def MprisVersion(self):
10089 - return dbus.Struct((dbus.UInt16(1), dbus.UInt16(0)), signature='(qq)')
10091 -class Player(dbus.service.Object):
10092 - def __init__(self, name, totem):
10093 - dbus.service.Object.__init__(self, name, '/Player')
10094 - self.totem = totem
10096 - self.null_metadata = {"year" : "", "tracknumber" : "", "location" : "",
10097 - "title" : "", "album" : "", "time" : "", "genre" : "", "artist" : ""}
10098 - self.old_metadata = self.null_metadata.copy()
10099 - self.current_metadata = self.null_metadata.copy()
10100 - self.old_caps = 64 # at startup, we can only support a playlist
10101 - self.old_status = (2, 0, 0, 0) # startup state
10103 - totem.connect("metadata-updated", self.do_update_metadata)
10104 - totem.connect("notify::playing", self.do_notify)
10105 - totem.connect("notify::seekable", self.do_notify)
10106 - totem.connect("notify::current-mrl", self.do_notify)
10108 - def do_update_metadata(self, totem, artist, title, album, num):
10109 - self.current_metadata = self.null_metadata.copy()
10110 - if title:
10111 - self.current_metadata["title"] = title
10112 - if artist:
10113 - self.current_metadata["artist"] = artist
10114 - if album:
10115 - self.current_metadata["album"] = album
10116 - if num:
10117 - self.current_metadata["tracknumber"] = num
10119 - if totem.is_playing():
10120 - self.track_change(self.current_metadata)
10122 - def do_notify(self, totem, status):
10123 - if totem.is_playing():
10124 - self.track_change(self.current_metadata)
10125 - else:
10126 - self.track_change(self.null_metadata)
10128 - status = self.calculate_status()
10129 - if status != self.old_status:
10130 - self.status_change(status)
10132 - caps = self.calculate_caps()
10133 - if caps != self.old_caps:
10134 - self.caps_change(caps)
10136 - def calculate_status(self):
10137 - if self.totem.is_playing():
10138 - playing_status = 0
10139 - elif self.totem.is_paused():
10140 - playing_status = 1
10141 - else:
10142 - playing_status = 2
10144 - if self.totem.action_remote_get_setting(Totem.RemoteSetting.SHUFFLE):
10145 - shuffle_status = 1
10146 - else:
10147 - shuffle_status = 0
10149 - if self.totem.action_remote_get_setting(Totem.RemoteSetting.REPEAT):
10150 - repeat_status = 1
10151 - else:
10152 - repeat_status = 0
10154 - return (
10155 - dbus.Int32(playing_status), # 0 = Playing, 1 = Paused, 2 = Stopped
10156 - dbus.Int32(self.totem.action_remote_get_setting(Totem.RemoteSetting.SHUFFLE)), # 0 = Playing linearly , 1 = Playing randomly
10157 - dbus.Int32(0), # 0 = Go to the next element once the current has finished playing , 1 = Repeat the current element
10158 - dbus.Int32(self.totem.action_remote_get_setting(Totem.RemoteSetting.REPEAT)) # 0 = Stop playing once the last element has been played, 1 = Never give up playing
10161 - def calculate_caps(self):
10162 - caps = 64 # we can always have a playlist
10163 - playlist_length = self.totem.get_playlist_length()
10164 - playlist_pos = self.totem.get_playlist_pos()
10166 - if playlist_pos < playlist_length - 1:
10167 - caps |= 1 << 0 # go next
10168 - if playlist_pos > 0:
10169 - caps |= 1 << 1 # go previous
10170 - if playlist_length > 0:
10171 - caps |= 1 << 2 # pause
10172 - caps |= 1 << 3 # play
10173 - if self.totem.is_seekable():
10174 - caps |= 1 << 4 # seek
10175 - if self.current_metadata != self.null_metadata:
10176 - caps |= 1 << 5 # get metadata
10178 - return caps
10180 - def track_change(self, metadata):
10181 - if self.old_metadata != metadata:
10182 - self.old_metadata = metadata.copy()
10183 - self.TrackChange(metadata)
10185 - def status_change(self, status):
10186 - if self.old_status != status:
10187 - self.old_status = status
10188 - self.StatusChange(status)
10190 - def caps_change(self, caps):
10191 - if self.old_caps != caps:
10192 - self.old_caps = caps
10193 - self.CapsChange(caps)
10195 - def disconnect(self):
10196 - self.TrackChange(self.null_metadata)
10197 - self.remove_from_connection(None, None)
10199 - @dbus.service.signal(dbus_interface = "org.freedesktop.MediaPlayer", signature='a{sv}')
10200 - def TrackChange(self, metadata):
10201 - pass
10203 - @dbus.service.signal(dbus_interface = "org.freedesktop.MediaPlayer", signature='(iiii)')
10204 - def StatusChange(self, status):
10205 - pass
10207 - @dbus.service.signal(dbus_interface = "org.freedesktop.MediaPlayer", signature='i')
10208 - def CapsChange(self, caps):
10209 - pass
10211 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='')
10212 - def Next(self):
10213 - self.totem.action_next()
10215 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='')
10216 - def Prev(self):
10217 - self.totem.action_previous()
10219 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='')
10220 - def Pause(self):
10221 - self.totem.action_play_pause()
10223 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='')
10224 - def Stop(self):
10225 - self.totem.action_stop()
10227 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='')
10228 - def Play(self):
10229 - # If playing : rewind to the beginning of current track, else : start playing.
10230 - if self.totem.is_playing():
10231 - self.totem.action_seek_time(0, False)
10232 - else:
10233 - self.totem.action_play()
10235 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='b', out_signature='')
10236 - def Repeat(self, value):
10237 - pass # we don't support repeating individual tracks
10239 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='(iiii)')
10240 - def GetStatus(self):
10241 - status = self.calculate_status()
10242 - self.old_status = status
10243 - return dbus.Struct(status, signature='(iiii)')
10245 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='a{sv}')
10246 - def GetMetadata(self):
10247 - return self.current_metadata
10249 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='i')
10250 - def GetCaps(self):
10251 - caps = self.calculate_caps()
10252 - self.old_caps = caps
10253 - return caps
10255 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='i', out_signature='')
10256 - def VolumeSet(self, volume):
10257 - self.totem.action_volume(volume / 100.0)
10259 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='i')
10260 - def VolumeGet(self):
10261 - return dbus.Int32(self.totem.get_volume() * 100)
10263 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='i', out_signature='')
10264 - def PositionSet(self, position):
10265 - self.totem.action_seek_time(position, False)
10267 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='i')
10268 - def PositionGet(self):
10269 - return dbus.Int32(self.totem.props.current_time)
10271 -class TrackList(dbus.service.Object):
10272 - def __init__(self, name, totem):
10273 - dbus.service.Object.__init__(self, name, '/TrackList')
10274 - self.totem = totem
10276 - def disconnect(self):
10277 - self.remove_from_connection(None, None)
10279 - @dbus.service.signal(dbus_interface = "org.freedesktop.MediaPlayer", signature='i')
10280 - def TrackListChange(self, length):
10281 - # TODO: we can't implement this until TotemPlaylist is exposed in the Python API
10282 - pass
10284 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='i', out_signature='a{sv}')
10285 - def GetMetadata(self, pos):
10286 - # Since the API doesn't currently exist in Totem to get the rest of the metadata, we can only return the title
10287 - return { "title" : self.totem.get_title_at_playlist_pos(pos) }
10289 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='i')
10290 - def GetCurrentTrack(self):
10291 - return self.totem.get_playlist_pos()
10293 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='', out_signature='i')
10294 - def GetLength(self):
10295 - return self.totem.get_playlist_length()
10297 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='sb', out_signature='i')
10298 - def AddTrack(self, uri, play_immediately):
10299 - # We can't currently support !play_immediately
10300 - self.totem.add_to_playlist_and_play(str(uri), '', True)
10301 - return 0
10303 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='i', out_signature='')
10304 - def DelTrack(self, pos):
10305 - # TODO: we need TotemPlaylist exposed by the Python API for this
10306 - pass
10308 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='b', out_signature='')
10309 - def SetLoop(self, loop):
10310 - self.totem.action_remote_set_setting(Totem.RemoteSetting.REPEAT, loop)
10312 - @dbus.service.method(dbus_interface='org.freedesktop.MediaPlayer', in_signature='b', out_signature='')
10313 - def SetRandom(self, random):
10314 - self.totem.action_remote_set_setting(Totem.RemoteSetting.SHUFFLE, random)
10315 diff --git a/src/plugins/dbusservice/Makefile.am b/src/plugins/dbusservice/Makefile.am
10316 new file mode 100644
10317 index 0000000..ede3339
10318 --- /dev/null
10319 +++ b/src/plugins/dbusservice/Makefile.am
10320 @@ -0,0 +1,8 @@
10321 +include $(top_srcdir)/src/plugins/Makefile.plugins
10323 +plugindir = $(PLUGINDIR)/dbus
10324 +plugin_PYTHON = dbusservice.py
10326 +plugin_in_files = dbusservice.plugin.in
10328 +-include $(top_srcdir)/git.mk
10329 diff --git a/src/plugins/dbusservice/dbusservice.plugin.in b/src/plugins/dbusservice/dbusservice.plugin.in
10330 new file mode 100644
10331 index 0000000..6a9b9f2
10332 --- /dev/null
10333 +++ b/src/plugins/dbusservice/dbusservice.plugin.in
10334 @@ -0,0 +1,9 @@
10335 +[Plugin]
10336 +Loader=python
10337 +Module=dbusservice
10338 +IAge=1
10339 +_Name=D-Bus Service
10340 +_Description=Plugin for sending notifications of currently playing movies to the D-Bus subsystem.
10341 +Authors=Lucky <lucky1.data@gmail.com>, Philip Withnall <philip@tecnocode.co.uk>
10342 +Copyright=Copyright © 2009 Lucky, Philip Withnall
10343 +Website=http://projects.gnome.org/totem/
10344 diff --git a/src/plugins/dbusservice/dbusservice.py b/src/plugins/dbusservice/dbusservice.py
10345 new file mode 100644
10346 index 0000000..83b96d1
10347 --- /dev/null
10348 +++ b/src/plugins/dbusservice/dbusservice.py
10349 @@ -0,0 +1,346 @@
10350 +# -*- coding: utf-8 -*-
10352 +## Totem D-Bus plugin
10353 +## Copyright (C) 2009 Lucky <lucky1.data@gmail.com>
10354 +## Copyright (C) 2009 Philip Withnall <philip@tecnocode.co.uk>
10356 +## This program is free software; you can redistribute it and/or modify
10357 +## it under the terms of the GNU General Public License as published by
10358 +## the Free Software Foundation; either version 2 of the License, or
10359 +## (at your option) any later version.
10361 +## This program is distributed in the hope that it will be useful,
10362 +## but WITHOUT ANY WARRANTY; without even the implied warranty of
10363 +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10364 +## GNU General Public License for more details.
10366 +## You should have received a copy of the GNU General Public License
10367 +## along with this program; if not, write to the Free Software
10368 +## Foundation, Inc., 51 Franklin St, Fifth Floor,
10369 +## Boston, MA 02110-1301 USA.
10371 +## Sunday 13th May 2007: Bastien Nocera: Add exception clause.
10372 +## See license_change file for details.
10374 +import gettext
10375 +from gi.repository import GObject, Peas, Totem # pylint: disable-msg=E0611
10376 +import dbus, dbus.service
10377 +from dbus.mainloop.glib import DBusGMainLoop
10379 +gettext.textdomain ("totem")
10380 +_ = gettext.gettext
10382 +class DbusService (GObject.Object, Peas.Activatable):
10383 + __gtype_name__ = 'DbusService'
10385 + object = GObject.property (type = GObject.Object)
10387 + def __init__ (self):
10388 + GObject.Object.__init__ (self)
10390 + self.root = None
10392 + def do_activate (self):
10393 + DBusGMainLoop (set_as_default = True)
10395 + name = dbus.service.BusName ('org.mpris.MediaPlayer2.totem',
10396 + bus = dbus.SessionBus ())
10397 + self.root = Root (name, self.object)
10399 + def do_deactivate (self):
10400 + # Ensure we don't leak our paths on the bus
10401 + self.root.disconnect ()
10403 +class Root (dbus.service.Object): # pylint: disable-msg=R0923,R0904
10404 + def __init__ (self, name, totem):
10405 + dbus.service.Object.__init__ (self, name, '/org/mpris/MediaPlayer2')
10406 + self.totem = totem
10408 + self.null_metadata = {
10409 + 'year' : '', 'tracknumber' : '', 'location' : '',
10410 + 'title' : '', 'album' : '', 'time' : '', 'genre' : '',
10411 + 'artist' : ''
10413 + self.current_metadata = self.null_metadata.copy ()
10414 + self.current_position = 0
10416 + totem.connect ('metadata-updated', self.__do_update_metadata)
10417 + totem.connect ('notify::playing', self.__do_notify_playing)
10418 + totem.connect ('notify::seekable', self.__do_notify_seekable)
10419 + totem.connect ('notify::current-mrl', self.__do_notify_current_mrl)
10420 + totem.connect ('notify::current-time', self.__do_notify_current_time)
10422 + def disconnect (self):
10423 + self.totem.disconnect_by_func (self.__do_notify_current_time)
10424 + self.totem.disconnect_by_func (self.__do_notify_current_mrl)
10425 + self.totem.disconnect_by_func (self.__do_notify_seekable)
10426 + self.totem.disconnect_by_func (self.__do_notify_playing)
10427 + self.totem.disconnect_by_func (self.__do_update_metadata)
10429 + self.__do_update_metadata (self.totem, '', '', '', 0)
10431 + self.remove_from_connection (None, None)
10433 + def __calculate_playback_status (self):
10434 + if self.totem.is_playing ():
10435 + return 'Playing'
10436 + elif self.totem.is_paused ():
10437 + return 'Paused'
10438 + else:
10439 + return 'Stopped'
10441 + def __calculate_metadata (self):
10442 + metadata = {
10443 + 'mpris:trackid': dbus.String (self.totem.props.current_mrl,
10444 + variant_level = 1),
10445 + 'mpris:length': dbus.Int64 (
10446 + self.totem.props.stream_length * 1000L,
10447 + variant_level = 1),
10450 + if self.current_metadata['title'] != '':
10451 + metadata['xesam:title'] = dbus.String (
10452 + self.current_metadata['title'], variant_level = 1)
10454 + if self.current_metadata['artist'] != '':
10455 + metadata['xesam:artist'] = dbus.Array (
10456 + [ self.current_metadata['artist'] ], variant_level = 1)
10458 + if self.current_metadata['album'] != '':
10459 + metadata['xesam:album'] = dbus.String (
10460 + self.current_metadata['album'], variant_level = 1)
10462 + if self.current_metadata['tracknumber'] != '':
10463 + metadata['xesam:trackNumber'] = dbus.Int32 (
10464 + self.current_metadata['tracknumber'], variant_level = 1)
10466 + return metadata
10468 + def __do_update_metadata (self, totem, artist, # pylint: disable-msg=R0913
10469 + title, album, num):
10470 + self.current_metadata = self.null_metadata.copy ()
10471 + if title:
10472 + self.current_metadata['title'] = title
10473 + if artist:
10474 + self.current_metadata['artist'] = artist
10475 + if album:
10476 + self.current_metadata['album'] = album
10477 + if num:
10478 + self.current_metadata['tracknumber'] = num
10480 + self.PropertiesChanged ('org.mpris.MediaPlayer2.Player',
10481 + { 'Metadata': self.__calculate_metadata () }, [])
10483 + def __do_notify_playing (self, totem, prop):
10484 + self.PropertiesChanged ('org.mpris.MediaPlayer2.Player',
10485 + { 'PlaybackStatus': self.__calculate_playback_status () }, [])
10487 + def __do_notify_current_mrl (self, totem, prop):
10488 + self.PropertiesChanged ('org.mpris.MediaPlayer2.Player', {
10489 + 'CanPlay': (self.totem.props.current_mrl != None),
10490 + 'CanPause': (self.totem.props.current_mrl != None),
10491 + 'CanSeek': (self.totem.props.current_mrl != None and
10492 + self.totem.props.seekable),
10493 + }, [])
10495 + def __do_notify_seekable (self, totem, prop):
10496 + self.PropertiesChanged ('org.mpris.MediaPlayer2.Player', {
10497 + 'CanSeek': (self.totem.props.current_mrl != None and
10498 + self.totem.props.seekable),
10499 + }, [])
10501 + def __do_notify_current_time (self, totem, prop):
10502 + # Only notify of seeks if we've skipped more than 3 seconds
10503 + if abs (totem.props.current_time - self.current_position) > 3:
10504 + self.Seeked (totem.props.current_time * 1000L)
10506 + self.current_position = totem.props.current_time
10508 + # org.freedesktop.DBus.Properties interface
10509 + @dbus.service.method (dbus_interface = dbus.PROPERTIES_IFACE,
10510 + in_signature = 'ss', # pylint: disable-msg=C0103
10511 + out_signature = 'v')
10512 + def Get (self, interface_name, property_name):
10513 + return self.GetAll (interface_name)[property_name]
10515 + @dbus.service.method (dbus_interface = dbus.PROPERTIES_IFACE,
10516 + in_signature = 's', # pylint: disable-msg=C0103
10517 + out_signature = 'a{sv}')
10518 + def GetAll (self, interface_name):
10519 + if interface_name == 'org.mpris.MediaPlayer2':
10520 + return {
10521 + 'CanQuit': True,
10522 + 'CanRaise': True,
10523 + 'HasTrackList': False,
10524 + 'Identity': self.totem.get_version (),
10525 + 'DesktopEntry': 'totem',
10526 + 'SupportedUriSchemes': self.totem.get_supported_uri_schemes (),
10527 + 'SupportedMimeTypes': self.totem.get_supported_content_types (),
10529 + elif interface_name == 'org.mpris.MediaPlayer2.Player':
10530 + # Loop status (we don't support Track)
10531 + if self.totem.action_remote_get_setting (
10532 + Totem.RemoteSetting.REPEAT):
10533 + loop_status = 'Playlist'
10534 + else:
10535 + loop_status = 'None'
10537 + # Shuffle
10538 + shuffle = self.totem.action_remote_get_setting (
10539 + Totem.RemoteSetting.SHUFFLE)
10541 + return {
10542 + 'PlaybackStatus': self.__calculate_playback_status (),
10543 + 'LoopStatus': loop_status, # TODO: Notifications
10544 + 'Rate': 1.0,
10545 + 'MinimumRate': 1.0,
10546 + 'MaximumRate': 1.0,
10547 + 'Shuffle': shuffle, # TODO: Notifications
10548 + 'Metadata': self.__calculate_metadata (),
10549 + 'Volume': self.totem.get_volume (), # TODO: Notifications
10550 + 'Position': self.totem.props.current_time * 1000L,
10551 + 'CanGoNext': True, # TODO
10552 + 'CanGoPrevious': True, # TODO
10553 + 'CanPlay': (self.totem.props.current_mrl != None),
10554 + 'CanPause': (self.totem.props.current_mrl != None),
10555 + 'CanSeek': (self.totem.props.current_mrl != None and
10556 + self.totem.props.seekable),
10557 + 'CanControl': True,
10560 + raise dbus.exceptions.DBusException (
10561 + 'org.mpris.MediaPlayer2.UnknownInterface',
10562 + _(u'The MediaPlayer2 object does not implement the ‘%s’ interface')
10563 + % interface_name)
10565 + @dbus.service.method (dbus_interface = dbus.PROPERTIES_IFACE,
10566 + in_signature = 'ssv') # pylint: disable-msg=C0103
10567 + def Set (self, interface_name, property_name, new_value):
10568 + if interface_name == 'org.mpris.MediaPlayer2':
10569 + raise dbus.exceptions.DBusException (
10570 + 'org.mpris.MediaPlayer2.ReadOnlyProperty',
10571 + _(u'The property ‘%s’ is not writeable.'))
10572 + elif interface_name == 'org.mpris.MediaPlayer2.Player':
10573 + if property_name == 'LoopStatus':
10574 + self.totem.action_remote_set_setting (
10575 + Totem.RemoteSetting.REPEAT, (new_value == 'Playlist'))
10576 + elif property_name == 'Rate':
10577 + # Ignore, since we don't support setting the rate
10578 + pass
10579 + elif property_name == 'Shuffle':
10580 + self.totem.action_remote_set_setting (
10581 + Totem.RemoteSetting.SHUFFLE, new_value)
10582 + elif property_name == 'Volume':
10583 + self.totem.action_volume (new_value)
10585 + raise dbus.exceptions.DBusException (
10586 + 'org.mpris.MediaPlayer2.ReadOnlyProperty',
10587 + _(u'Unknown property ‘%s’ requested of a MediaPlayer 2 object')
10588 + % interface_name)
10590 + raise dbus.exceptions.DBusException (
10591 + 'org.mpris.MediaPlayer2.UnknownInterface',
10592 + _(u'The MediaPlayer2 object does not implement the ‘%s’ interface')
10593 + % interface_name)
10595 + @dbus.service.signal (dbus_interface = dbus.PROPERTIES_IFACE,
10596 + signature = 'sa{sv}as') # pylint: disable-msg=C0103
10597 + def PropertiesChanged (self, interface_name, changed_properties,
10598 + invalidated_properties):
10599 + pass
10601 + # org.mpris.MediaPlayer2 interface
10602 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2',
10603 + in_signature = '', # pylint: disable-msg=C0103
10604 + out_signature = '')
10605 + def Raise (self):
10606 + main_window = self.totem.get_main_window ()
10607 + main_window.present ()
10609 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2',
10610 + in_signature = '', # pylint: disable-msg=C0103
10611 + out_signature = '')
10612 + def Quit (self):
10613 + self.totem.action_exit ()
10615 + # org.mpris.MediaPlayer2.Player interface
10616 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10617 + in_signature = '', # pylint: disable-msg=C0103
10618 + out_signature = '')
10619 + def Next (self):
10620 + if self.totem.is_playing () or self.totem.is_paused ():
10621 + return
10623 + self.totem.action_next ()
10625 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10626 + in_signature = '', # pylint: disable-msg=C0103
10627 + out_signature = '')
10628 + def Previous (self):
10629 + if self.totem.is_playing () or self.totem.is_paused ():
10630 + return
10632 + self.totem.action_previous ()
10634 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10635 + in_signature = '', # pylint: disable-msg=C0103
10636 + out_signature = '')
10637 + def Pause (self):
10638 + self.totem.action_pause ()
10640 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10641 + in_signature = '', # pylint: disable-msg=C0103
10642 + out_signature = '')
10643 + def PlayPause (self):
10644 + self.totem.action_play_pause ()
10646 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10647 + in_signature = '', # pylint: disable-msg=C0103
10648 + out_signature = '')
10649 + def Stop (self):
10650 + self.totem.action_stop ()
10652 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10653 + in_signature = '', # pylint: disable-msg=C0103
10654 + out_signature = '')
10655 + def Play (self):
10656 + # If playing or no track loaded: do nothing,
10657 + # else: start playing.
10658 + if self.totem.is_playing () or self.totem.props.current_mrl == None:
10659 + return
10661 + self.totem.action_play ()
10663 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10664 + in_signature = 'x', # pylint: disable-msg=C0103
10665 + out_signature = '')
10666 + def Seek (self, offset):
10667 + self.totem.action_seek_relative (offset / 1000L, False)
10669 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10670 + in_signature = 'ox', # pylint: disable-msg=C0103
10671 + out_signature = '')
10672 + def SetPosition (self, track_id, position):
10673 + position = position / 1000L
10675 + # Bail if the position is not in the permitted range
10676 + if position < 0 or position > self.totem.props.stream_length:
10677 + return
10679 + self.totem.action_seek_time (position, False)
10681 + @dbus.service.method (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10682 + in_signature = 's', # pylint: disable-msg=C0103
10683 + out_signature = '')
10684 + def OpenUri (self, uri):
10685 + if self.totem.action_set_mrl (uri):
10686 + self.totem.action_play ()
10688 + raise dbus.exceptions.DBusException (
10689 + 'org.mpris.MediaPlayer2.InvalidUri',
10690 + _(u'The URI ‘%s’ is not supported.') % uri)
10692 + @dbus.service.signal (dbus_interface = 'org.mpris.MediaPlayer2.Player',
10693 + signature = 'x') # pylint: disable-msg=C0103
10694 + def Seeked (self, position):
10695 + pass
10696 diff --git a/src/plugins/grilo/Makefile.am b/src/plugins/grilo/Makefile.am
10697 new file mode 100644
10698 index 0000000..0efee37
10699 --- /dev/null
10700 +++ b/src/plugins/grilo/Makefile.am
10701 @@ -0,0 +1,27 @@
10702 +include $(top_srcdir)/src/plugins/Makefile.plugins
10704 +plugindir = $(PLUGINDIR)/grilo
10705 +plugin_LTLIBRARIES = libgrilo.la
10707 +plugin_in_files = grilo.plugin.in
10709 +uidir = $(plugindir)
10710 +ui_DATA = grilo.ui
10711 +EXTRA_DIST += $(ui_DATA)
10713 +confdir = $(plugindir)
10714 +conf_DATA = totem-grilo.conf
10715 +EXTRA_DIST += $(conf_DATA)
10717 +libgrilo_la_SOURCES = totem-grilo.c
10718 +libgrilo_la_LDFLAGS = $(plugin_ldflags)
10719 +libgrilo_la_LIBADD = \
10720 + $(plugin_libadd) \
10721 + $(LIBGRILO_LIBS)
10722 +libgrilo_la_CFLAGS = \
10723 + $(plugin_cflags) \
10724 + $(LIBGRILO_CFLAGS) \
10725 + -I $(top_srcdir)/src/backend
10727 +-include $(top_srcdir)/git.mk
10729 diff --git a/src/plugins/grilo/grilo.plugin.in b/src/plugins/grilo/grilo.plugin.in
10730 new file mode 100644
10731 index 0000000..bbc674c
10732 --- /dev/null
10733 +++ b/src/plugins/grilo/grilo.plugin.in
10734 @@ -0,0 +1,9 @@
10735 +[Plugin]
10736 +Module=grilo
10737 +Builtin=true
10738 +IAge=1
10739 +_Name=Grilo Browser
10740 +_Description=A plugin to let you browse media content from various sources.
10741 +Authors=Iago Toral Quiroga <itoral@igalia.com>, Juan A. Suarez Romero <jasuarez@igalia.com>
10742 +Copyright=Copyright © 2011 Igalia S.L.
10743 +Website=http://live.gnome.org/Grilo/
10744 diff --git a/src/plugins/grilo/grilo.ui b/src/plugins/grilo/grilo.ui
10745 new file mode 100644
10746 index 0000000..e3ecda7
10747 --- /dev/null
10748 +++ b/src/plugins/grilo/grilo.ui
10749 @@ -0,0 +1,199 @@
10750 +<?xml version="1.0" encoding="UTF-8"?>
10751 +<interface>
10752 + <!-- interface-requires gtk+ 3.0 -->
10753 + <object class="GtkAction" id="add-to-playlist">
10754 + <property name="label">Add to Playlist</property>
10755 + <property name="tooltip">add media to playlist</property>
10756 + <property name="stock_id">gtk-add</property>
10757 + </object>
10758 + <object class="GtkAction" id="copy-location">
10759 + <property name="label">Copy Location</property>
10760 + <property name="tooltip">copy media location</property>
10761 + <property name="stock_id">gtk-copy</property>
10762 + </object>
10763 + <object class="GtkAdjustment" id="gw_adj_max_items">
10764 + <property name="lower">1</property>
10765 + <property name="upper">10000</property>
10766 + <property name="value">300</property>
10767 + <property name="step_increment">5</property>
10768 + </object>
10769 + <object class="GtkTreeStore" id="gw_browse_store_results">
10770 + <columns>
10771 + <!-- column-name source -->
10772 + <column type="GObject"/>
10773 + <!-- column-name content -->
10774 + <column type="GObject"/>
10775 + <!-- column-name thumbnail -->
10776 + <column type="GdkPixbuf"/>
10777 + <!-- column-name is_prethumbnail -->
10778 + <column type="gboolean"/>
10779 + <!-- column-name description -->
10780 + <column type="gchararray"/>
10781 + <!-- column-name duration -->
10782 + <column type="gchararray"/>
10783 + <!-- column-name page -->
10784 + <column type="gint"/>
10785 + <!-- column-name remaining -->
10786 + <column type="gint"/>
10787 + </columns>
10788 + </object>
10789 + <object class="GtkScrolledWindow" id="gw_browse_window">
10790 + <property name="visible">True</property>
10791 + <property name="can_focus">True</property>
10792 + <property name="shadow_type">in</property>
10793 + <child>
10794 + <object class="GtkTreeView" id="gw_browse">
10795 + <property name="visible">True</property>
10796 + <property name="can_focus">True</property>
10797 + <property name="model">gw_browse_store_results</property>
10798 + <property name="enable_search">False</property>
10799 + <property name="search_column">4</property>
10800 + <child internal-child="selection">
10801 + <object class="GtkTreeSelection" id="treeview-selection1"/>
10802 + </child>
10803 + <child>
10804 + <object class="GtkTreeViewColumn" id="gw_browse_col_pix">
10805 + <property name="title" translatable="yes">Browse</property>
10806 + <child>
10807 + <object class="GtkCellRendererPixbuf" id="gw_browse_col_render_pix"/>
10808 + <attributes>
10809 + <attribute name="pixbuf">2</attribute>
10810 + </attributes>
10811 + </child>
10812 + <child>
10813 + <object class="GtkCellRendererText" id="gw_browse_col_render_desc"/>
10814 + <attributes>
10815 + <attribute name="markup">4</attribute>
10816 + </attributes>
10817 + </child>
10818 + <child>
10819 + <object class="GtkCellRendererText" id="gw_browse_col_render_dur"/>
10820 + <attributes>
10821 + <attribute name="text">5</attribute>
10822 + </attributes>
10823 + </child>
10824 + </object>
10825 + </child>
10826 + </object>
10827 + </child>
10828 + </object>
10829 + <object class="GtkVBox" id="gw_search">
10830 + <property name="visible">True</property>
10831 + <property name="can_focus">False</property>
10832 + <property name="border_width">6</property>
10833 + <property name="spacing">6</property>
10834 + <child>
10835 + <object class="GtkHBox" id="gw_combo_box">
10836 + <property name="visible">True</property>
10837 + <property name="can_focus">False</property>
10838 + <property name="spacing">6</property>
10839 + <child>
10840 + <object class="GtkLabel" id="gw_search_title">
10841 + <property name="visible">True</property>
10842 + <property name="can_focus">False</property>
10843 + <property name="label" translatable="yes">Search</property>
10844 + </object>
10845 + <packing>
10846 + <property name="expand">False</property>
10847 + <property name="fill">True</property>
10848 + <property name="position">0</property>
10849 + </packing>
10850 + </child>
10851 + <child>
10852 + <object class="GtkComboBox" id="gw_search_select_source">
10853 + <property name="visible">True</property>
10854 + <property name="can_focus">False</property>
10855 + <property name="model">gw_search_store_sources</property>
10856 + <child>
10857 + <object class="GtkCellRendererText" id="gw_search_source_col_name"/>
10858 + <attributes>
10859 + <attribute name="text">1</attribute>
10860 + </attributes>
10861 + </child>
10862 + </object>
10863 + <packing>
10864 + <property name="expand">True</property>
10865 + <property name="fill">True</property>
10866 + <property name="position">1</property>
10867 + </packing>
10868 + </child>
10869 + </object>
10870 + <packing>
10871 + <property name="expand">False</property>
10872 + <property name="fill">True</property>
10873 + <property name="position">0</property>
10874 + </packing>
10875 + </child>
10876 + <child>
10877 + <object class="GtkEntry" id="gw_search_text">
10878 + <property name="visible">True</property>
10879 + <property name="can_focus">True</property>
10880 + <property name="invisible_char">●</property>
10881 + <property name="activates_default">True</property>
10882 + <property name="shadow_type">etched-out</property>
10883 + <property name="caps_lock_warning">False</property>
10884 + </object>
10885 + <packing>
10886 + <property name="expand">False</property>
10887 + <property name="fill">True</property>
10888 + <property name="position">1</property>
10889 + </packing>
10890 + </child>
10891 + <child>
10892 + <object class="GtkScrolledWindow" id="gw_search_results_window">
10893 + <property name="visible">True</property>
10894 + <property name="can_focus">True</property>
10895 + <property name="shadow_type">in</property>
10896 + <child>
10897 + <object class="GtkIconView" id="gw_search_results_view">
10898 + <property name="visible">True</property>
10899 + <property name="can_focus">True</property>
10900 + <property name="model">gw_search_store_results</property>
10901 + <child>
10902 + <object class="GtkCellRendererPixbuf" id="gw_search_result_thumbnail"/>
10903 + <attributes>
10904 + <attribute name="pixbuf">2</attribute>
10905 + </attributes>
10906 + </child>
10907 + <child>
10908 + <object class="GtkCellRendererText" id="gw_search_result_description">
10909 + <property name="ellipsize">end</property>
10910 + <property name="scale">0.75</property>
10911 + </object>
10912 + <attributes>
10913 + <attribute name="markup">4</attribute>
10914 + </attributes>
10915 + </child>
10916 + </object>
10917 + </child>
10918 + </object>
10919 + <packing>
10920 + <property name="expand">True</property>
10921 + <property name="fill">True</property>
10922 + <property name="position">2</property>
10923 + </packing>
10924 + </child>
10925 + </object>
10926 + <object class="GtkListStore" id="gw_search_store_results">
10927 + <columns>
10928 + <!-- column-name source -->
10929 + <column type="GObject"/>
10930 + <!-- column-name content -->
10931 + <column type="GObject"/>
10932 + <!-- column-name thumbnail -->
10933 + <column type="GdkPixbuf"/>
10934 + <!-- column-name is_prethumbnail -->
10935 + <column type="gboolean"/>
10936 + <!-- column-name description -->
10937 + <column type="gchararray"/>
10938 + </columns>
10939 + </object>
10940 + <object class="GtkListStore" id="gw_search_store_sources">
10941 + <columns>
10942 + <!-- column-name source -->
10943 + <column type="GObject"/>
10944 + <!-- column-name name -->
10945 + <column type="gchararray"/>
10946 + </columns>
10947 + </object>
10948 +</interface>
10949 diff --git a/src/plugins/grilo/totem-grilo.c b/src/plugins/grilo/totem-grilo.c
10950 new file mode 100644
10951 index 0000000..e04d262
10952 --- /dev/null
10953 +++ b/src/plugins/grilo/totem-grilo.c
10954 @@ -0,0 +1,1431 @@
10955 +/* -*- Mode: C; indent-tabs-mode: t -*- */
10958 + * Copyright (C) 2010, 2011 Igalia S.L. <info@igalia.com>
10960 + * This program is free software; you can redistribute it and/or modify
10961 + * it under the terms of the GNU General Public License as published by
10962 + * the Free Software Foundation; either version 2 of the License, or
10963 + * (at your option) any later version.
10965 + * This program is distributed in the hope that it will be useful,
10966 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
10967 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10968 + * GNU General Public License for more details.
10970 + * You should have received a copy of the GNU General Public License
10971 + * along with this program; if not, write to the Free Software
10972 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
10974 + * The Totem project hereby grant permission for non-GPL compatible GStreamer
10975 + * plugins to be used and distributed together with GStreamer and Totem. This
10976 + * permission are above and beyond the permissions granted by the GPL license
10977 + * Totem is covered by.
10979 + * See license_change file for details.
10980 + */
10982 +#include "config.h"
10984 +#include <time.h>
10986 +#include <glib.h>
10987 +#include <glib-object.h>
10988 +#include <glib/gi18n-lib.h>
10989 +#include <grilo.h>
10991 +#include <libpeas/peas-extension-base.h>
10992 +#include <libpeas/peas-object-module.h>
10993 +#include <libpeas/peas-activatable.h>
10994 +#include <libpeas-gtk/peas-gtk-configurable.h>
10996 +#include <totem-plugin.h>
10997 +#include <totem-interface.h>
10998 +#include <totem-dirs.h>
10999 +#include <totem.h>
11001 +#include <video-utils.h>
11003 +#define TOTEM_TYPE_GRILO_PLUGIN \
11004 + (totem_grilo_plugin_get_type ())
11005 +#define TOTEM_GRILO_PLUGIN(o) \
11006 + (G_TYPE_CHECK_INSTANCE_CAST ((o), TOTEM_TYPE_GRILO_PLUGIN, TotemGriloPlugin))
11007 +#define TOTEM_GRILO_PLUGIN_CLASS(k) \
11008 + (G_TYPE_CHECK_CLASS_CAST((k), TOTEM_TYPE_GRILO_PLUGIN, TotemGriloPluginClass))
11009 +#define TOTEM_IS_GRILO_PLUGIN(o) \
11010 + (G_TYPE_CHECK_INSTANCE_TYPE ((o), TOTEM_TYPE_GRILO_PLUGIN))
11011 +#define TOTEM_IS_GRILO_PLUGIN_CLASS(k) \
11012 + (G_TYPE_CHECK_CLASS_TYPE ((k), TOTEM_TYPE_GRILO_PLUGIN))
11013 +#define TOTEM_GRILO_PLUGIN_GET_CLASS(o) \
11014 + (G_TYPE_INSTANCE_GET_CLASS ((o), TOTEM_TYPE_GRILO_PLUGIN, TotemGriloPluginClass))
11016 +#define GRILO_POPUP_MENU \
11017 + "<ui>" \
11018 + "<popup name=\"grilo-popup\">" \
11019 + "<menuitem name=\"add-to-playlist\" action=\"add-to-playlist\"/>" \
11020 + "<menuitem name=\"copy-location\" action=\"copy-location\"/>" \
11021 + "</popup>" \
11022 + "</ui>"
11024 +#define BROWSE_FLAGS (GRL_RESOLVE_FAST_ONLY | GRL_RESOLVE_IDLE_RELAY)
11025 +#define PAGE_SIZE 50
11026 +#define THUMB_SEARCH_SIZE 128
11027 +#define THUMB_BROWSE_SIZE 32
11028 +#define SCROLL_GET_MORE_LIMIT 0.8
11030 +#define TOTEM_GRILO_CONFIG_FILE "totem-grilo.conf"
11032 +const gchar *BLACKLIST_SOURCES[] = { "grl-filesystem",
11033 + "grl-bookmarks",
11034 + "grl-shoutcast",
11035 + "grl-flickr",
11036 + NULL };
11038 +typedef enum {
11039 + ICON_BOX = 0,
11040 + ICON_AUDIO,
11041 + ICON_VIDEO,
11042 + ICON_DEFAULT
11043 +} IconType;
11045 +typedef struct {
11046 + Totem *totem;
11048 + /* Current media selected in results*/
11049 + GrlMedia *selected_media;
11051 + /* Thumb cache to speed up loading: maps url strings to GdkPixbuf thumbnails */
11052 + GHashTable *cache_thumbnails;
11054 + /* Search related information */
11055 + GrlMediaSource *search_source;
11056 + guint search_id;
11057 + gint search_page;
11058 + gint search_remaining;
11059 + gchar *search_text;
11061 + /* Browser widgets */
11062 + GtkWidget *browser;
11063 + GtkTreeModel *browser_model;
11065 + /* Search widgets */
11066 + GtkWidget *search_entry;
11067 + GtkTreeModel *search_results_model;
11068 + GtkTreeModel *search_sources_model;
11069 + GtkWidget *search_sources_list;
11070 + GtkWidget *search_results_view;
11072 + /* Popup */
11073 + GtkUIManager *ui_manager;
11074 + GtkActionGroup *action_group;
11076 + /* Configuration */
11077 + guint max_items;
11078 +} TotemGriloPluginPrivate;
11080 +TOTEM_PLUGIN_REGISTER (TOTEM_TYPE_GRILO_PLUGIN, TotemGriloPlugin, totem_grilo_plugin)
11082 +typedef struct {
11083 + TotemGriloPlugin *totem_grilo;
11084 + GtkTreeRowReference *ref_parent;
11085 +} BrowseUserData;
11087 +typedef struct {
11088 + TotemGriloPlugin *totem_grilo;
11089 + GrlMedia *media;
11090 + GFile *file;
11091 + GtkTreeRowReference *reference;
11092 + gint thumb_size;
11093 +} SetThumbnailData;
11095 +enum {
11096 + SEARCH_MODEL_SOURCES_SOURCE = 0,
11097 + SEARCH_MODEL_SOURCES_NAME,
11100 +enum {
11101 + MODEL_RESULTS_SOURCE = 0,
11102 + MODEL_RESULTS_CONTENT,
11103 + MODEL_RESULTS_THUMBNAIL,
11104 + MODEL_RESULTS_IS_PRETHUMBNAIL,
11105 + MODEL_RESULTS_DESCRIPTION,
11106 + MODEL_RESULTS_DURATION,
11107 + MODEL_RESULTS_PAGE,
11108 + MODEL_RESULTS_REMAINING,
11111 +static void play (TotemGriloPlugin *self,
11112 + GrlMediaSource *source,
11113 + GrlMedia *media,
11114 + gboolean resolve_url);
11116 +static gchar *
11117 +get_description (GrlMedia *media)
11119 + const gchar *author;
11121 + author = grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_AUTHOR);
11122 + if (author == NULL) {
11123 + author = grl_data_get_string (GRL_DATA (media), GRL_METADATA_KEY_ARTIST);
11126 + if (author != NULL) {
11127 + return g_markup_printf_escaped ("<b>%s</b>\n%s",
11128 + grl_media_get_title (media),
11129 + author);
11130 + } else {
11131 + return g_markup_printf_escaped ("<b>%s</b>",
11132 + grl_media_get_title (media));
11136 +static GList *
11137 +browse_keys (void)
11139 + static GList *_browse_keys = NULL;
11141 + if (_browse_keys == NULL) {
11142 + _browse_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ARTIST,
11143 + GRL_METADATA_KEY_AUTHOR,
11144 + GRL_METADATA_KEY_DURATION,
11145 + GRL_METADATA_KEY_THUMBNAIL,
11146 + GRL_METADATA_KEY_URL,
11147 + GRL_METADATA_KEY_TITLE,
11148 + NULL);
11151 + return _browse_keys;
11154 +static GList *
11155 +search_keys (void)
11157 + static GList *_search_keys = NULL;
11159 + if (_search_keys == NULL) {
11160 + _search_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ARTIST,
11161 + GRL_METADATA_KEY_AUTHOR,
11162 + GRL_METADATA_KEY_THUMBNAIL,
11163 + GRL_METADATA_KEY_URL,
11164 + GRL_METADATA_KEY_TITLE,
11165 + NULL);
11168 + return _search_keys;
11171 +static GdkPixbuf *
11172 +load_icon (TotemGriloPlugin *self, IconType icon_type, gint thumb_size)
11174 + GdkScreen *screen;
11175 + GtkIconTheme *theme;
11177 + const gchar *icon_name[] = { GTK_STOCK_DIRECTORY,
11178 + "audio-x-generic",
11179 + "video-x-generic",
11180 + GTK_STOCK_FILE };
11182 + static GdkPixbuf *pixbuf[G_N_ELEMENTS(icon_name)] = { NULL };
11184 + if (pixbuf[icon_type] == NULL) {
11185 + screen = gtk_window_get_screen (totem_get_main_window (self->priv->totem));
11186 + theme = gtk_icon_theme_get_for_screen (screen);
11187 + pixbuf[icon_type] = gtk_icon_theme_load_icon (theme,
11188 + icon_name[icon_type],
11189 + thumb_size, 0, NULL);
11192 + if (pixbuf[icon_type] != NULL) {
11193 + return g_object_ref (pixbuf[icon_type]);
11194 + } else {
11195 + return NULL;
11199 +static GdkPixbuf *
11200 +get_icon (TotemGriloPlugin *self, GrlMedia *media, gint thumb_size)
11202 + if (GRL_IS_MEDIA_BOX (media)) {
11203 + return load_icon (self, ICON_BOX, thumb_size);
11204 + } else if (GRL_IS_MEDIA_AUDIO (media)) {
11205 + return load_icon (self, ICON_AUDIO, thumb_size);
11206 + } else if (GRL_IS_MEDIA_VIDEO (media)) {
11207 + return load_icon (self, ICON_VIDEO, thumb_size);
11208 + } else {
11209 + return load_icon (self, ICON_DEFAULT, thumb_size);
11213 +static void
11214 +get_stream_thumbnail_cb (GObject *source_object,
11215 + GAsyncResult *res,
11216 + gpointer user_data)
11218 + GFileInputStream *stream;
11219 + GdkPixbuf *thumbnail = NULL;
11220 + GtkTreeIter iter;
11221 + SetThumbnailData *thumb_data = (SetThumbnailData *) user_data;
11223 + stream = g_file_read_finish (thumb_data->file, res, NULL);
11224 + if (stream != NULL) {
11225 + thumbnail = gdk_pixbuf_new_from_stream_at_scale (G_INPUT_STREAM (stream),
11226 + thumb_data->thumb_size,
11227 + thumb_data->thumb_size,
11228 + TRUE, NULL, NULL);
11229 + g_object_unref (stream);
11232 + gtk_tree_model_get_iter (thumb_data->totem_grilo->priv->search_results_model,
11233 + &iter,
11234 + gtk_tree_row_reference_get_path (thumb_data->reference));
11236 + if (thumbnail) {
11237 + gtk_list_store_set (GTK_LIST_STORE (thumb_data->totem_grilo->priv->search_results_model),
11238 + &iter,
11239 + MODEL_RESULTS_THUMBNAIL, thumbnail,
11240 + -1);
11241 + /* Cache it */
11242 + g_hash_table_insert (thumb_data->totem_grilo->priv->cache_thumbnails,
11243 + g_file_get_uri (thumb_data->file),
11244 + thumbnail);
11247 + /* Free thumb data */
11248 + g_object_unref (thumb_data->totem_grilo);
11249 + g_object_unref (thumb_data->media);
11250 + g_object_unref (thumb_data->file);
11251 + gtk_tree_row_reference_free (thumb_data->reference);
11252 + g_slice_free (SetThumbnailData, thumb_data);
11255 +static void
11256 +set_thumbnail_async (TotemGriloPlugin *self, GrlMedia *media, GtkTreePath *path, gint thumb_size)
11258 + const gchar *url_thumb;
11259 + GFile *file_uri;
11260 + SetThumbnailData *thumb_data;
11261 + GdkPixbuf *thumbnail;
11262 + GtkTreeIter iter;
11264 + url_thumb = grl_media_get_thumbnail (media);
11265 + if (url_thumb != NULL) {
11266 + /* Check cache */
11267 + thumbnail = g_hash_table_lookup (self->priv->cache_thumbnails,
11268 + url_thumb);
11269 + if (thumbnail == NULL) {
11270 + /* Let's read the thumbnail stream and set the thumbnail */
11271 + file_uri = g_file_new_for_uri (url_thumb);
11272 + thumb_data = g_slice_new (SetThumbnailData);
11273 + thumb_data->totem_grilo = g_object_ref (self);
11274 + thumb_data->media = g_object_ref (media);
11275 + thumb_data->file = g_object_ref (file_uri);
11276 + thumb_data->reference = gtk_tree_row_reference_new (self->priv->search_results_model, path);
11277 + thumb_data->thumb_size = thumb_size;
11278 + g_file_read_async (file_uri, G_PRIORITY_DEFAULT, NULL,
11279 + get_stream_thumbnail_cb, thumb_data);
11280 + g_object_unref (file_uri);
11281 + } else {
11282 + /* Use cached thumbnail */
11283 + gtk_tree_model_get_iter (self->priv->search_results_model, &iter, path);
11284 + gtk_list_store_set (GTK_LIST_STORE (self->priv->search_results_model),
11285 + &iter,
11286 + MODEL_RESULTS_THUMBNAIL, thumbnail,
11287 + -1);
11289 + } else {
11290 + /* Keep the icon */
11291 + gtk_tree_model_get_iter (self->priv->search_results_model, &iter, path);
11292 + gtk_list_store_set (GTK_LIST_STORE (self->priv->search_results_model),
11293 + &iter,
11294 + MODEL_RESULTS_IS_PRETHUMBNAIL, FALSE,
11295 + -1);
11299 +static gboolean
11300 +update_search_thumbnails_idle (TotemGriloPlugin *self)
11302 + GtkTreePath *start_path;
11303 + GtkTreePath *end_path;
11304 + GrlMedia *media;
11305 + GtkTreeIter iter;
11306 + gboolean is_prethumbnail = FALSE;
11308 + if (gtk_icon_view_get_visible_range (GTK_ICON_VIEW (self->priv->search_results_view),
11309 + &start_path, &end_path)) {
11310 + for (;
11311 + gtk_tree_path_compare (start_path, end_path) <= 0;
11312 + gtk_tree_path_next (start_path)) {
11313 + if (gtk_tree_model_get_iter (self->priv->search_results_model, &iter, start_path) == FALSE) {
11314 + break;
11317 + gtk_tree_model_get (self->priv->search_results_model,
11318 + &iter,
11319 + MODEL_RESULTS_CONTENT, &media,
11320 + MODEL_RESULTS_IS_PRETHUMBNAIL, &is_prethumbnail,
11321 + -1);
11322 + if (is_prethumbnail) {
11323 + set_thumbnail_async (self, media, start_path, THUMB_SEARCH_SIZE);
11324 + gtk_list_store_set (GTK_LIST_STORE (self->priv->search_results_model),
11325 + &iter,
11326 + MODEL_RESULTS_IS_PRETHUMBNAIL, FALSE,
11327 + -1);
11330 + g_object_unref (media);
11332 + gtk_tree_path_free (start_path);
11333 + gtk_tree_path_free (end_path);
11336 + return FALSE;
11339 +static void
11340 +update_search_thumbnails (TotemGriloPlugin *self)
11342 + g_idle_add ((GSourceFunc) update_search_thumbnails_idle, self);
11345 +static void
11346 +show_sources (TotemGriloPlugin *self)
11348 + GList *sources, *source;
11349 + GtkTreeIter iter;
11350 + GrlPluginRegistry *registry;
11351 + const gchar *name;
11352 + GdkPixbuf *icon;
11354 + registry = grl_plugin_registry_get_default ();
11355 + sources = grl_plugin_registry_get_sources_by_operations (registry,
11356 + GRL_OP_BROWSE,
11357 + FALSE);
11359 + for (source = sources; source ; source = g_list_next (source)) {
11360 + icon = load_icon (self, ICON_BOX, THUMB_BROWSE_SIZE);
11361 + name = grl_metadata_source_get_name (GRL_METADATA_SOURCE (source->data));
11362 + gtk_tree_store_append (GTK_TREE_STORE (self->priv->browser_model), &iter, NULL);
11363 + gtk_tree_store_set (GTK_TREE_STORE (self->priv->browser_model),
11364 + &iter,
11365 + MODEL_RESULTS_SOURCE, source->data,
11366 + MODEL_RESULTS_CONTENT, NULL,
11367 + MODEL_RESULTS_DESCRIPTION, name,
11368 + MODEL_RESULTS_THUMBNAIL, icon,
11369 + MODEL_RESULTS_IS_PRETHUMBNAIL, FALSE,
11370 + -1);
11371 + if (icon != NULL) {
11372 + g_object_unref (icon);
11375 + g_list_free (sources);
11378 +static void
11379 +browse_cb (GrlMediaSource *source,
11380 + guint browse_id,
11381 + GrlMedia *media,
11382 + guint remaining,
11383 + gpointer user_data,
11384 + const GError *error)
11386 + gchar *description;
11387 + gchar *pretty_duration;
11388 + gint duration;
11389 + GtkTreeIter iter;
11390 + GdkPixbuf *thumbnail;
11391 + BrowseUserData *bud;
11392 + TotemGriloPlugin *self;
11393 + GtkTreeIter parent;
11394 + GtkTreePath *path;
11395 + GtkWindow *window;
11396 + gint remaining_expected;
11398 + bud = (BrowseUserData *) user_data;
11399 + self = bud->totem_grilo;
11401 + if (error != NULL &&
11402 + g_error_matches (error,
11403 + GRL_CORE_ERROR,
11404 + GRL_CORE_ERROR_OPERATION_CANCELLED) == FALSE) {
11405 + window = totem_get_main_window (self->priv->totem);
11406 + totem_interface_error (_("Browse Error"), error->message, window);
11409 + if (media != NULL) {
11410 + gtk_tree_model_get_iter (self->priv->browser_model, &parent, gtk_tree_row_reference_get_path (bud->ref_parent));
11411 + gtk_tree_model_get (self->priv->browser_model, &parent,
11412 + MODEL_RESULTS_REMAINING, &remaining_expected,
11413 + -1);
11414 + remaining_expected--;
11415 + gtk_tree_store_set (GTK_TREE_STORE (self->priv->browser_model), &parent,
11416 + MODEL_RESULTS_REMAINING, &remaining_expected,
11417 + -1);
11418 + /* Filter images */
11419 + if (GRL_IS_MEDIA_IMAGE (media) == FALSE) {
11420 + thumbnail = get_icon (self, media, THUMB_BROWSE_SIZE);
11421 + description = get_description (media);
11422 + duration = grl_media_get_duration (media);
11423 + if (duration > 0) {
11424 + pretty_duration = totem_time_to_string (duration * 1000);
11425 + } else {
11426 + pretty_duration = NULL;
11429 + gtk_tree_store_append (GTK_TREE_STORE (self->priv->browser_model), &iter, &parent);
11430 + gtk_tree_store_set (GTK_TREE_STORE (self->priv->browser_model),
11431 + &iter,
11432 + MODEL_RESULTS_SOURCE, source,
11433 + MODEL_RESULTS_CONTENT, media,
11434 + MODEL_RESULTS_THUMBNAIL, thumbnail,
11435 + MODEL_RESULTS_IS_PRETHUMBNAIL, TRUE,
11436 + MODEL_RESULTS_DESCRIPTION, description,
11437 + MODEL_RESULTS_DURATION, pretty_duration,
11438 + -1);
11440 + if (thumbnail != NULL) {
11441 + g_object_unref (thumbnail);
11443 + g_free (description);
11444 + g_free (pretty_duration);
11446 + path = gtk_tree_model_get_path (self->priv->browser_model, &parent);
11447 + gtk_tree_view_expand_row (GTK_TREE_VIEW (self->priv->browser), path, FALSE);
11448 + gtk_tree_view_columns_autosize (GTK_TREE_VIEW (self->priv->browser));
11449 + gtk_tree_path_free (path);
11452 + g_object_unref (media);
11455 + if (remaining == 0) {
11456 + gtk_tree_row_reference_free (bud->ref_parent);
11457 + g_object_unref (bud->totem_grilo);
11458 + g_slice_free (BrowseUserData, bud);
11462 +static void
11463 +browse (TotemGriloPlugin *self,
11464 + GtkTreePath *path,
11465 + GrlMediaSource *source,
11466 + GrlMedia *container,
11467 + gint page)
11469 + if (source != NULL) {
11470 + BrowseUserData *bud = g_slice_new (BrowseUserData);
11471 + bud->totem_grilo = g_object_ref (self);
11472 + bud->ref_parent = gtk_tree_row_reference_new (self->priv->browser_model, path);
11473 + grl_media_source_browse (source,
11474 + container,
11475 + browse_keys (),
11476 + (page - 1) * PAGE_SIZE, PAGE_SIZE,
11477 + BROWSE_FLAGS,
11478 + browse_cb,
11479 + bud);
11480 + } else {
11481 + show_sources (self);
11485 +static void
11486 +resolve_url_cb (GrlMediaSource *source,
11487 + guint op_id,
11488 + GrlMedia *media,
11489 + gpointer user_data,
11490 + const GError *error)
11492 + if (error != NULL) {
11493 + g_warning ("Failed to resolve URL for media: %s", error->message);
11494 + return;
11497 + play (TOTEM_GRILO_PLUGIN (user_data), source, media, FALSE);
11500 +static void
11501 +play (TotemGriloPlugin *self,
11502 + GrlMediaSource *source,
11503 + GrlMedia *media,
11504 + gboolean resolve_url)
11506 + const gchar *url;
11508 + url = grl_media_get_url (media);
11509 + if (url != NULL) {
11510 + totem_add_to_playlist_and_play (self->priv->totem, url,
11511 + grl_media_get_title (media),
11512 + TRUE);
11513 + return;
11516 + /* If url is a slow key, then we need to full resolve it */
11517 + if (resolve_url) {
11518 + const GList *slow_keys;
11519 + GList *url_keys;
11520 + slow_keys = grl_metadata_source_slow_keys (GRL_METADATA_SOURCE (source));
11521 + if (g_list_find ((GList *) slow_keys, GRL_METADATA_KEY_URL) != NULL) {
11522 + url_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, NULL);
11523 + grl_media_source_metadata (source, media, url_keys, 0, resolve_url_cb, self);
11524 + g_list_free (url_keys);
11525 + return;
11529 + g_warning ("Current element has no URL to play");
11532 +static void
11533 +search_cb (GrlMediaSource *source,
11534 + guint search_id,
11535 + GrlMedia *media,
11536 + guint remaining,
11537 + gpointer user_data,
11538 + const GError *error)
11540 + gchar *description;
11541 + GtkTreeIter iter;
11542 + GdkPixbuf *thumbnail;
11543 + GtkWindow *window;
11544 + TotemGriloPlugin *self;
11546 + self = TOTEM_GRILO_PLUGIN (user_data);
11548 + if (error != NULL &&
11549 + g_error_matches (error,
11550 + GRL_CORE_ERROR,
11551 + GRL_CORE_ERROR_OPERATION_CANCELLED) == FALSE) {
11552 + window = totem_get_main_window (self->priv->totem);
11553 + totem_interface_error (_("Search Error"), error->message, window);
11556 + if (media != NULL) {
11557 + self->priv->search_remaining--;
11558 + /* Filter images */
11559 + if (GRL_IS_MEDIA_IMAGE (media) == FALSE) {
11560 + thumbnail = get_icon (self, media, THUMB_SEARCH_SIZE);
11561 + description = get_description (media);
11563 + gtk_list_store_append (GTK_LIST_STORE (self->priv->search_results_model), &iter);
11564 + gtk_list_store_set (GTK_LIST_STORE (self->priv->search_results_model),
11565 + &iter,
11566 + MODEL_RESULTS_SOURCE, source,
11567 + MODEL_RESULTS_CONTENT, media,
11568 + MODEL_RESULTS_THUMBNAIL, thumbnail,
11569 + MODEL_RESULTS_IS_PRETHUMBNAIL, TRUE,
11570 + MODEL_RESULTS_DESCRIPTION, description,
11571 + -1);
11573 + if (thumbnail != NULL) {
11574 + g_object_unref (thumbnail);
11576 + g_free (description);
11579 + g_object_unref (media);
11582 + if (remaining == 0) {
11583 + self->priv->search_id = 0;
11584 + gtk_widget_set_sensitive (self->priv->search_entry, TRUE);
11585 + update_search_thumbnails (self);
11589 +static void
11590 +search_more (TotemGriloPlugin *self)
11592 + gtk_widget_set_sensitive (self->priv->search_entry, FALSE);
11593 + self->priv->search_page++;
11594 + self->priv->search_remaining = PAGE_SIZE;
11595 + self->priv->search_id = grl_media_source_search (self->priv->search_source,
11596 + self->priv->search_text,
11597 + search_keys (),
11598 + (self->priv->search_page - 1) * PAGE_SIZE,
11599 + PAGE_SIZE,
11600 + BROWSE_FLAGS,
11601 + search_cb,
11602 + self);
11603 + if (self->priv->search_id == 0) {
11604 + search_cb (self->priv->search_source, 0, NULL, 0, self, NULL);
11608 +static void
11609 +search (TotemGriloPlugin *self, GrlMediaSource *source, const gchar *text)
11611 + gtk_list_store_clear (GTK_LIST_STORE (self->priv->search_results_model));
11612 + g_hash_table_remove_all (self->priv->cache_thumbnails);
11613 + gtk_widget_set_sensitive (self->priv->search_entry, FALSE);
11614 + self->priv->search_source = source;
11615 + g_free (self->priv->search_text);
11616 + self->priv->search_text = g_strdup (text);
11617 + self->priv->search_page = 0;
11618 + search_more (self);
11621 +static void
11622 +search_entry_changed_cb (GtkEntry *entry, TotemGriloPlugin *self)
11624 + if (g_strcmp0 (gtk_entry_get_text (entry), "") == 0) {
11625 + g_object_set (G_OBJECT (entry),
11626 + "secondary-icon-name", "edit-find-symbolic",
11627 + "secondary-icon-activatable", FALSE,
11628 + "secondary-icon-sensitive", FALSE,
11629 + NULL);
11630 + } else {
11631 + g_object_set (G_OBJECT (entry),
11632 + "secondary-icon-name", "edit-clear-symbolic",
11633 + "secondary-icon-activatable", TRUE,
11634 + "secondary-icon-sensitive", TRUE,
11635 + NULL);
11639 +static void
11640 +search_entry_activate_cb (GtkEntry *entry, TotemGriloPlugin *self)
11642 + GtkTreeIter iter;
11643 + GrlMediaSource *source = NULL;
11644 + const gchar *text;
11646 + if (gtk_widget_is_sensitive (self->priv->search_sources_list)) {
11647 + if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->priv->search_sources_list),
11648 + &iter)) {
11649 + gtk_tree_model_get (self->priv->search_sources_model, &iter,
11650 + SEARCH_MODEL_SOURCES_SOURCE, &source,
11651 + -1);
11655 + text = gtk_entry_get_text (GTK_ENTRY (self->priv->search_entry));
11656 + search (self, source, text);
11658 + if (source != NULL) {
11659 + g_object_unref (source);
11663 +static void
11664 +search_entry_clear_cb (GtkEntry *entry, TotemGriloPlugin *self)
11666 + gtk_entry_set_text (entry, "");
11669 +static void
11670 +browser_activated_cb (GtkTreeView *tree_view,
11671 + GtkTreePath *path,
11672 + GtkTreeViewColumn *column,
11673 + gpointer user_data)
11675 + gint remaining;
11676 + gint page;
11677 + GtkTreeModel *model;
11678 + GtkTreeIter iter;
11679 + GrlMedia *content;
11680 + GrlMediaSource *source;
11681 + TotemGriloPlugin *self = TOTEM_GRILO_PLUGIN (user_data);
11683 + model = gtk_tree_view_get_model (tree_view);
11684 + gtk_tree_model_get_iter (model, &iter, path);
11685 + gtk_tree_model_get (model, &iter,
11686 + MODEL_RESULTS_SOURCE, &source,
11687 + MODEL_RESULTS_CONTENT, &content,
11688 + MODEL_RESULTS_PAGE, &page,
11689 + MODEL_RESULTS_REMAINING, &remaining,
11690 + -1);
11692 + if (content != NULL &&
11693 + GRL_IS_MEDIA_BOX (content) == FALSE) {
11694 + play (self, source, content, TRUE);
11695 + goto free_data;
11698 + if (gtk_tree_model_iter_has_child (model, &iter)) {
11699 + if (gtk_tree_view_row_expanded (tree_view, path)) {
11700 + gtk_tree_view_collapse_row (tree_view, path);
11701 + gtk_tree_view_columns_autosize (GTK_TREE_VIEW (self->priv->browser));
11702 + } else {
11703 + gtk_tree_view_expand_row (tree_view, path, FALSE);
11705 + goto free_data;
11708 + if (remaining == 0) {
11709 + gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
11710 + MODEL_RESULTS_PAGE, ++page,
11711 + MODEL_RESULTS_REMAINING, PAGE_SIZE,
11712 + -1);
11713 + browse (self, path, source, content, page);
11716 + free_data:
11717 + if (source != NULL) {
11718 + g_object_unref (source);
11720 + if (content != NULL) {
11721 + g_object_unref (content);
11725 +static void
11726 +search_source_changed_cb (GtkComboBox *combo,
11727 + TotemGriloPlugin *self)
11729 + if (self->priv->search_id > 0) {
11730 + grl_operation_cancel (self->priv->search_id);
11731 + self->priv->search_id = 0;
11733 + gtk_list_store_clear (GTK_LIST_STORE (self->priv->search_results_model));
11736 +static void
11737 +search_activated_cb (GtkIconView *icon_view,
11738 + GtkTreePath *path,
11739 + gpointer user_data)
11741 + GtkTreeModel *model;
11742 + GtkTreeIter iter;
11743 + GrlMediaSource *source;
11744 + GrlMedia *content;
11746 + model = gtk_icon_view_get_model (icon_view);
11747 + gtk_tree_model_get_iter (model, &iter, path);
11748 + gtk_tree_model_get (model, &iter,
11749 + MODEL_RESULTS_SOURCE, &source,
11750 + MODEL_RESULTS_CONTENT, &content,
11751 + -1);
11753 + play (TOTEM_GRILO_PLUGIN (user_data), source, content, TRUE);
11755 + if (source != NULL) {
11756 + g_object_unref (source);
11759 + if (content != NULL) {
11760 + g_object_unref (content);
11764 +static gboolean
11765 +source_is_blacklisted (GrlMediaSource *source)
11767 + const gchar *id = grl_metadata_source_get_id (GRL_METADATA_SOURCE (source));
11768 + const gchar **s = BLACKLIST_SOURCES;
11770 + while (*s) {
11771 + if (g_strcmp0 (*s, id) == 0) {
11772 + return TRUE;
11774 + s++;
11777 + return FALSE;
11780 +static void
11781 +source_added_cb (GrlPluginRegistry *registry,
11782 + GrlMediaSource *source,
11783 + gpointer user_data)
11785 + const gchar *name;
11786 + gchar *description;
11787 + GdkPixbuf *icon;
11788 + TotemGriloPlugin *self;
11789 + GtkTreeIter iter;
11790 + GrlSupportedOps ops;
11792 + if (source_is_blacklisted (source)) {
11793 + grl_plugin_registry_unregister_source (registry,
11794 + GRL_MEDIA_PLUGIN (source),
11795 + NULL);
11796 + return;
11799 + self = TOTEM_GRILO_PLUGIN (user_data);
11800 + icon = load_icon (self, ICON_BOX, THUMB_BROWSE_SIZE);
11801 + name = grl_metadata_source_get_name (GRL_METADATA_SOURCE (source));
11802 + ops = grl_metadata_source_supported_operations (GRL_METADATA_SOURCE (source));
11803 + if (ops & GRL_OP_BROWSE) {
11804 + description = g_markup_printf_escaped ("<b>%s</b>", name);
11805 + gtk_tree_store_append (GTK_TREE_STORE (self->priv->browser_model), &iter, NULL);
11806 + gtk_tree_store_set (GTK_TREE_STORE (self->priv->browser_model),
11807 + &iter,
11808 + MODEL_RESULTS_SOURCE, source,
11809 + MODEL_RESULTS_CONTENT, NULL,
11810 + MODEL_RESULTS_DESCRIPTION, description,
11811 + MODEL_RESULTS_THUMBNAIL, icon,
11812 + MODEL_RESULTS_IS_PRETHUMBNAIL, TRUE,
11813 + -1);
11814 + g_free (description);
11816 + if (ops & GRL_OP_SEARCH) {
11817 + gtk_list_store_append (GTK_LIST_STORE (self->priv->search_sources_model), &iter);
11818 + gtk_list_store_set (GTK_LIST_STORE (self->priv->search_sources_model),
11819 + &iter,
11820 + SEARCH_MODEL_SOURCES_SOURCE, source,
11821 + SEARCH_MODEL_SOURCES_NAME, name,
11822 + -1);
11823 + /* Select one of them */
11824 + if (gtk_combo_box_get_active (GTK_COMBO_BOX (self->priv->search_sources_list)) == -1) {
11825 + gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->search_sources_list), 0);
11826 + gtk_widget_set_sensitive (self->priv->search_entry, TRUE);
11830 + if (icon != NULL) {
11831 + g_object_unref (icon);
11835 +static gboolean
11836 +remove_browse_result (GtkTreeModel *model,
11837 + GtkTreePath *path,
11838 + GtkTreeIter *iter,
11839 + gpointer user_data)
11841 + GrlMediaSource *removed_source = GRL_MEDIA_SOURCE (user_data);
11842 + GrlMediaSource *model_source;
11843 + gboolean same_source;
11845 + gtk_tree_model_get (model, iter,
11846 + MODEL_RESULTS_SOURCE, &model_source,
11847 + -1);
11849 + same_source = (model_source == removed_source);
11851 + if (same_source) {
11852 + gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
11855 + g_object_unref (model_source);
11857 + return same_source;
11860 +static gboolean
11861 +remove_searchable_source (GtkTreeModel *model,
11862 + GtkTreePath *path,
11863 + GtkTreeIter *iter,
11864 + gpointer user_data)
11866 + GrlMediaSource *removed_source = GRL_MEDIA_SOURCE (user_data);
11867 + GrlMediaSource *model_source;
11868 + gboolean same_source;
11870 + gtk_tree_model_get (model, iter,
11871 + MODEL_RESULTS_SOURCE, &model_source,
11872 + -1);
11874 + same_source = (model_source == removed_source);
11876 + if (same_source) {
11877 + gtk_list_store_remove (GTK_LIST_STORE (model), iter);
11880 + g_object_unref (model_source);
11882 + return same_source;
11885 +static void
11886 +source_removed_cb (GrlPluginRegistry *registry,
11887 + GrlMediaSource *source,
11888 + gpointer user_data)
11890 + GrlSupportedOps ops;
11891 + TotemGriloPlugin *self = TOTEM_GRILO_PLUGIN (user_data);
11893 + ops = grl_metadata_source_supported_operations (GRL_METADATA_SOURCE (source));
11895 + /* Remove source and content from browse results */
11896 + if (ops & GRL_OP_BROWSE) {
11897 + gtk_tree_model_foreach (self->priv->browser_model,
11898 + remove_browse_result,
11899 + source);
11902 + /* If current search results belongs to removed source, clear the results. In
11903 + any case, remove the source from the list of searchable sources */
11904 + if (ops & GRL_OP_SEARCH) {
11905 + if (self->priv->search_source == source) {
11906 + gtk_list_store_clear (GTK_LIST_STORE (self->priv->search_results_model));
11907 + self->priv->search_source = NULL;
11910 + gtk_tree_model_foreach (self->priv->search_sources_model,
11911 + remove_searchable_source,
11912 + source);
11914 + /* Select one if the selected source was removed */
11915 + if (gtk_combo_box_get_active (GTK_COMBO_BOX (self->priv->search_sources_list)) == -1) {
11916 + gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->search_sources_list), 0);
11921 +static void
11922 +load_grilo_plugins (TotemGriloPlugin *self)
11924 + GrlPluginRegistry *registry;
11925 + GError *error = NULL;
11927 + registry = grl_plugin_registry_get_default ();
11929 + g_signal_connect (registry, "source-added",
11930 + G_CALLBACK (source_added_cb), self);
11931 + g_signal_connect (registry, "source-removed",
11932 + G_CALLBACK (source_removed_cb), self);
11934 + if (grl_plugin_registry_load_all (registry, &error) == FALSE) {
11935 + g_warning ("Failed to load grilo plugins: %s", error->message);
11936 + g_error_free (error);
11940 +static gboolean
11941 +show_popup_menu (TotemGriloPlugin *self, GtkWidget *view, GdkEventButton *event)
11943 + GtkWidget *menu;
11944 + gint button = 0;
11945 + guint32 _time;
11946 + GtkAction *action;
11947 + GtkTreeSelection *sel_tree;
11948 + GList *sel_list = NULL;
11949 + GtkTreeModel *model;
11950 + GtkTreeIter iter;
11951 + GrlMediaSource *source;
11952 + const gchar *url = NULL;
11954 + if (view == self->priv->browser) {
11955 + /* Selection happened in browser view */
11956 + sel_tree = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
11958 + if (gtk_tree_selection_get_selected (sel_tree, &model, &iter) == FALSE) {
11959 + return FALSE;
11961 + } else {
11962 + /* Selection happened in search view */
11963 + sel_list = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (view));
11964 + if (!sel_list) {
11965 + return FALSE;
11968 + model = self->priv->search_results_model;
11970 + gtk_tree_model_get_iter (model,
11971 + &iter,
11972 + (GtkTreePath *) sel_list->data);
11974 + g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
11975 + g_list_free (sel_list);
11978 + /* Get rid of previously selected media */
11979 + if (self->priv->selected_media != NULL) {
11980 + g_object_unref (self->priv->selected_media);
11983 + gtk_tree_model_get (model, &iter,
11984 + MODEL_RESULTS_SOURCE, &source,
11985 + MODEL_RESULTS_CONTENT, &(self->priv->selected_media),
11986 + -1);
11988 + if (event != NULL) {
11989 + button = event->button;
11990 + _time = event->time;
11991 + } else {
11992 + _time = gtk_get_current_event_time ();
11995 + if (self->priv->selected_media != NULL) {
11996 + url = grl_media_get_url (self->priv->selected_media);
11999 + action = gtk_action_group_get_action (self->priv->action_group, "add-to-playlist");
12000 + gtk_action_set_sensitive (action, url != NULL);
12001 + action = gtk_action_group_get_action (self->priv->action_group, "copy-location");
12002 + gtk_action_set_sensitive (action, url != NULL);
12004 + menu = gtk_ui_manager_get_widget (self->priv->ui_manager, "/grilo-popup");
12005 + gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
12006 + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
12007 + button, _time);
12009 + if (source != NULL) {
12010 + g_object_unref (source);
12013 + return TRUE;
12016 +static gboolean
12017 +popup_menu_cb (GtkWidget *view, TotemGriloPlugin *self)
12019 + return show_popup_menu (self, view, NULL);
12022 +static gboolean
12023 +context_button_pressed_cb (GtkWidget *view,
12024 + GdkEventButton *event,
12025 + TotemGriloPlugin *self)
12027 + if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
12028 + return show_popup_menu (self, view, event);
12031 + return FALSE;
12034 +static gboolean
12035 +adjustment_over_limit (GtkAdjustment *adjustment)
12037 + if ((gtk_adjustment_get_value (adjustment) + gtk_adjustment_get_page_size (adjustment)) / gtk_adjustment_get_upper (adjustment) > SCROLL_GET_MORE_LIMIT) {
12038 + return TRUE;
12039 + } else {
12040 + return FALSE;
12044 +static void
12045 +adjustment_value_changed_cb (GtkAdjustment *adjustment,
12046 + TotemGriloPlugin *self)
12048 + update_search_thumbnails (self);
12050 + /* Do not get more results if search is in progress */
12051 + if (self->priv->search_id != 0) {
12052 + return;
12055 + /* Do not get more results if there are no more results to get :) */
12056 + if (self->priv->search_remaining > 0) {
12057 + return;
12060 + if (adjustment_over_limit (adjustment)) {
12061 + search_more (self);
12065 +static void
12066 +adjustment_changed_cb (GtkAdjustment *adjustment,
12067 + TotemGriloPlugin *self)
12069 + update_search_thumbnails (self);
12072 +static void
12073 +get_more_browse_results_cb (GtkAdjustment *adjustment,
12074 + TotemGriloPlugin *self)
12076 + GtkTreePath *start_path;
12077 + GtkTreePath *end_path;
12078 + GtkTreePath *parent_path;
12079 + GtkTreeIter iter;
12080 + GrlMediaSource *source;
12081 + GrlMedia *container;
12082 + gint page;
12083 + gint remaining;
12084 + gboolean stop_processing = FALSE;
12086 + if (adjustment_over_limit (adjustment) == FALSE) {
12087 + return;
12090 + if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (self->priv->browser),
12091 + &start_path, &end_path) == FALSE) {
12092 + return;
12095 + /* Start to check from last visible element, and check if its parent can get more elements */
12096 + while (gtk_tree_path_compare (start_path, end_path) <= 0 &&
12097 + stop_processing == FALSE) {
12098 + if (gtk_tree_path_get_depth (end_path) <= 1) {
12099 + goto continue_next;
12101 + parent_path = gtk_tree_path_copy (end_path);
12102 + if (gtk_tree_path_up (parent_path) == FALSE ||
12103 + gtk_tree_model_get_iter (self->priv->browser_model, &iter, parent_path) == FALSE) {
12104 + gtk_tree_path_free (parent_path);
12105 + goto continue_next;
12107 + gtk_tree_model_get (self->priv->browser_model,
12108 + &iter,
12109 + MODEL_RESULTS_SOURCE, &source,
12110 + MODEL_RESULTS_CONTENT, &container,
12111 + MODEL_RESULTS_PAGE, &page,
12112 + MODEL_RESULTS_REMAINING, &remaining,
12113 + -1);
12114 + /* Skip non-boxes (they can not be browsed) */
12115 + if (container != NULL &&
12116 + GRL_IS_MEDIA_BOX (container) == FALSE) {
12117 + goto free_elements;
12120 + /* In case of containers, check that more elements can be obtained */
12121 + if (remaining > 0) {
12122 + goto free_elements;
12125 + /* Continue browsing */
12126 + gtk_tree_store_set (GTK_TREE_STORE (self->priv->browser_model),
12127 + &iter,
12128 + MODEL_RESULTS_PAGE, ++page,
12129 + MODEL_RESULTS_REMAINING, PAGE_SIZE,
12130 + -1);
12131 + browse (self, parent_path, source, container, page);
12132 + stop_processing = TRUE;
12134 + free_elements:
12135 + if (source != NULL) {
12136 + g_object_unref (source);
12138 + if (container != NULL) {
12139 + g_object_unref (container);
12141 + if (parent_path) {
12142 + gtk_tree_path_free (parent_path);
12145 + continue_next:
12146 + stop_processing = stop_processing || (gtk_tree_path_prev (end_path) == FALSE);
12149 + gtk_tree_path_free (start_path);
12150 + gtk_tree_path_free (end_path);
12153 +static void
12154 +setup_sidebar_browse (TotemGriloPlugin *self,
12155 + GtkBuilder *builder)
12157 + self->priv->browser_model = GTK_TREE_MODEL (gtk_builder_get_object (builder, "gw_browse_store_results"));
12158 + self->priv->browser = GTK_WIDGET (gtk_builder_get_object (builder, "gw_browse"));
12160 + g_signal_connect (self->priv->browser, "row-activated",
12161 + G_CALLBACK (browser_activated_cb), self);
12162 + g_signal_connect (self->priv->browser, "popup-menu",
12163 + G_CALLBACK (popup_menu_cb), self);
12164 + g_signal_connect (self->priv->browser,
12165 + "button-press-event",
12166 + G_CALLBACK (context_button_pressed_cb), self);
12167 + g_signal_connect (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (self->priv->browser)),
12168 + "value_changed",
12169 + G_CALLBACK (get_more_browse_results_cb),
12170 + self);
12172 + totem_add_sidebar_page (self->priv->totem,
12173 + "grilo-browse", _("Browse"),
12174 + GTK_WIDGET (gtk_builder_get_object (builder, "gw_browse_window")));
12177 +static void
12178 +setup_sidebar_search (TotemGriloPlugin *self,
12179 + GtkBuilder *builder)
12181 + self->priv->search_results_model = GTK_TREE_MODEL (gtk_builder_get_object (builder, "gw_search_store_results"));
12182 + self->priv->search_sources_model = GTK_TREE_MODEL (gtk_builder_get_object (builder, "gw_search_store_sources"));
12183 + self->priv->search_sources_list = GTK_WIDGET (gtk_builder_get_object (builder, "gw_search_select_source"));
12184 + self->priv->search_results_view = GTK_WIDGET (gtk_builder_get_object (builder, "gw_search_results_view"));
12185 + self->priv->search_entry = GTK_WIDGET (gtk_builder_get_object (builder, "gw_search_text"));
12187 + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (self->priv->search_sources_model),
12188 + SEARCH_MODEL_SOURCES_NAME,
12189 + GTK_SORT_ASCENDING);
12191 + gtk_widget_set_sensitive (self->priv->search_entry, FALSE);
12193 + g_signal_connect (self->priv->search_sources_list,
12194 + "changed",
12195 + G_CALLBACK (search_source_changed_cb), self);
12197 + g_signal_connect (self->priv->search_results_view,
12198 + "item-activated",
12199 + G_CALLBACK (search_activated_cb),
12200 + self);
12201 + g_signal_connect (self->priv->search_results_view,
12202 + "popup-menu",
12203 + G_CALLBACK (popup_menu_cb), self);
12204 + g_signal_connect (self->priv->search_results_view,
12205 + "button-press-event",
12206 + G_CALLBACK (context_button_pressed_cb), self);
12207 + g_signal_connect (self->priv->search_entry,
12208 + "changed",
12209 + G_CALLBACK (search_entry_changed_cb), self);
12211 + g_signal_connect (self->priv->search_entry,
12212 + "activate",
12213 + G_CALLBACK (search_entry_activate_cb),
12214 + self);
12215 + g_signal_connect (self->priv->search_entry,
12216 + "icon-release",
12217 + G_CALLBACK (search_entry_clear_cb),
12218 + self);
12220 + g_object_set (G_OBJECT (self->priv->search_entry),
12221 + "secondary-icon-name", "edit-find-symbolic",
12222 + "secondary-icon-activatable", FALSE,
12223 + "secondary-icon-sensitive", FALSE,
12224 + NULL);
12226 + g_signal_connect (gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gtk_builder_get_object (builder,
12227 + "gw_search_results_window"))),
12228 + "value_changed",
12229 + G_CALLBACK (adjustment_value_changed_cb),
12230 + self);
12232 + g_signal_connect (gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (gtk_builder_get_object (builder,
12233 + "gw_search_results_window"))),
12234 + "changed",
12235 + G_CALLBACK (adjustment_changed_cb),
12236 + self);
12238 + totem_add_sidebar_page (self->priv->totem,
12239 + "grilo-search", _("Search"),
12240 + GTK_WIDGET (gtk_builder_get_object (builder, "gw_search")));
12243 +static void
12244 +add_to_pls_cb (GtkAction *action, TotemGriloPlugin *self)
12246 + totem_add_to_playlist_and_play (self->priv->totem,
12247 + grl_media_get_url (self->priv->selected_media),
12248 + grl_media_get_title (self->priv->selected_media),
12249 + TRUE);
12252 +static void
12253 +copy_location_cb (GtkAction *action, TotemGriloPlugin *self)
12255 + GtkClipboard *clip;
12256 + const gchar *url;
12258 + url = grl_media_get_url (self->priv->selected_media);
12259 + if (url != NULL) {
12260 + clip = gtk_clipboard_get_for_display (gdk_display_get_default (),
12261 + GDK_SELECTION_CLIPBOARD);
12262 + gtk_clipboard_set_text (clip, url, -1);
12263 + clip = gtk_clipboard_get_for_display (gdk_display_get_default (),
12264 + GDK_SELECTION_PRIMARY);
12265 + gtk_clipboard_set_text (clip, url, -1);
12269 +static void
12270 +setup_menus (TotemGriloPlugin *self,
12271 + GtkBuilder *builder)
12273 + GtkAction *action;
12274 + GError *error =NULL;
12276 + self->priv->ui_manager = gtk_ui_manager_new ();
12277 + self->priv->action_group = gtk_action_group_new ("grilo-action-group");
12279 + action = GTK_ACTION (gtk_builder_get_object (builder, "add-to-playlist"));
12280 + g_signal_connect (action, "activate", G_CALLBACK (add_to_pls_cb), self);
12281 + gtk_action_group_add_action_with_accel (self->priv->action_group, action, NULL);
12283 + action = GTK_ACTION (gtk_builder_get_object (builder, "copy-location"));
12284 + g_signal_connect (action, "activate", G_CALLBACK (copy_location_cb), self);
12285 + gtk_action_group_add_action_with_accel (self->priv->action_group, action, NULL);
12287 + gtk_ui_manager_insert_action_group (self->priv->ui_manager, self->priv->action_group, 1);
12288 + gtk_ui_manager_add_ui_from_string (self->priv->ui_manager,
12289 + GRILO_POPUP_MENU, -1, &error);
12290 + if (error != NULL) {
12291 + g_warning ("grilo-ui: Failed to create popup menu: %s", error->message);
12292 + g_error_free (error);
12293 + return;
12297 +static void
12298 +setup_ui (TotemGriloPlugin *self,
12299 + GtkBuilder *builder)
12301 + setup_sidebar_browse (self, builder);
12302 + setup_sidebar_search (self, builder);
12303 + setup_menus (self, builder);
12306 +static void
12307 +setup_config (TotemGriloPlugin *self)
12309 + gchar *config_file;
12310 + GrlPluginRegistry *registry = grl_plugin_registry_get_default ();
12312 + /* Setup system-wide plugins configuration */
12313 + config_file = totem_plugin_find_file ("grilo", TOTEM_GRILO_CONFIG_FILE);
12315 + if (g_file_test (config_file, G_FILE_TEST_EXISTS)) {
12316 + grl_plugin_registry_add_config_from_file (registry, config_file, NULL);
12318 + g_free (config_file);
12320 + /* Setup user-defined plugins configuration */
12321 + config_file = g_build_path (G_DIR_SEPARATOR_S,
12322 + g_get_user_config_dir (),
12323 + g_get_prgname (),
12324 + TOTEM_GRILO_CONFIG_FILE,
12325 + NULL);
12327 + if (g_file_test (config_file, G_FILE_TEST_EXISTS)) {
12328 + grl_plugin_registry_add_config_from_file (registry, config_file, NULL);
12330 + g_free (config_file);
12333 +static void
12334 +impl_activate (PeasActivatable *plugin)
12336 + GtkBuilder *builder;
12337 + GtkWindow *main_window;
12339 + TotemGriloPlugin *self = TOTEM_GRILO_PLUGIN (plugin);
12340 + TotemGriloPluginPrivate *priv = self->priv;
12341 + priv->totem = g_object_ref (g_object_get_data (G_OBJECT (plugin), "object"));
12342 + main_window = totem_get_main_window (priv->totem);
12343 + priv->cache_thumbnails = g_hash_table_new_full (g_str_hash,
12344 + g_str_equal,
12345 + g_free,
12346 + g_object_unref);
12348 + builder = totem_plugin_load_interface ("grilo", "grilo.ui", TRUE, main_window, self);
12349 + g_object_unref (main_window);
12350 + setup_ui (self, builder);
12351 + grl_init (0, NULL);
12352 + setup_config (self);
12353 + load_grilo_plugins (self);
12356 +static void
12357 +impl_deactivate (PeasActivatable *plugin)
12359 + TotemGriloPlugin *self = TOTEM_GRILO_PLUGIN (plugin);
12360 + GList *sources;
12361 + GList *s;
12362 + GrlPluginRegistry *registry;
12364 + totem_remove_sidebar_page (self->priv->totem, "grilo-browse");
12365 + totem_remove_sidebar_page (self->priv->totem, "grilo-search");
12367 + registry = grl_plugin_registry_get_default ();
12368 + g_signal_handlers_disconnect_by_func (registry, source_added_cb, self);
12369 + g_signal_handlers_disconnect_by_func (registry, source_removed_cb, self);
12371 + /* Shutdown all sources */
12372 + sources = grl_plugin_registry_get_sources (registry, FALSE);
12373 + for (s = sources; s; s = g_list_next (s)) {
12374 + grl_plugin_registry_unregister_source (registry,
12375 + GRL_MEDIA_PLUGIN (s->data),
12376 + NULL);
12378 + g_list_free (sources);
12380 + /* Empty results */
12381 + gtk_tree_store_clear (GTK_TREE_STORE (self->priv->browser_model));
12382 + gtk_list_store_clear (GTK_LIST_STORE (self->priv->search_results_model));
12384 + g_object_unref (self->priv->totem);
12386 diff --git a/src/plugins/grilo/totem-grilo.conf b/src/plugins/grilo/totem-grilo.conf
12387 new file mode 100644
12388 index 0000000..682bf9c
12389 --- /dev/null
12390 +++ b/src/plugins/grilo/totem-grilo.conf
12391 @@ -0,0 +1,6 @@
12392 +[grl-vimeo]
12393 +api-key = db924d3b7f1d5f3d6fdfeb4488ad01e2
12394 +api-secret = bef979d87f28ec47
12396 +[grl-youtube]
12397 +api-key = AI39si7Ix-bf9xRLx5PK1sjsG2FQjSHblunuaI8YvHdYbkV2BcgOemHE6Nzb9t6LaMsekofKGSwgAETzbo7OvL8L3vH4vrFaqw
12398 diff --git a/src/plugins/iplayer/iplayer.py b/src/plugins/iplayer/iplayer.py
12399 index 26baea0..de6c5a4 100644
12400 --- a/src/plugins/iplayer/iplayer.py
12401 +++ b/src/plugins/iplayer/iplayer.py
12402 @@ -1,233 +1,266 @@
12403 # -*- coding: utf-8 -*-
12405 import gettext
12406 -import gobject
12407 -from gi.repository import Peas
12408 -from gi.repository import Gtk
12409 -from gi.repository import Totem
12410 +from gi.repository import GObject, Peas, Totem # pylint: disable-msg=E0611
12411 import iplayer2
12412 import threading
12414 -gettext.textdomain("totem")
12415 +gettext.textdomain ("totem")
12417 D_ = gettext.dgettext
12418 _ = gettext.gettext
12420 -class IplayerPlugin (gobject.GObject, Peas.Activatable):
12421 - __gtype_name__ = 'IplayerPlugin'
12422 +class IplayerPlugin (GObject.Object, Peas.Activatable):
12423 + __gtype_name__ = 'IplayerPlugin'
12425 - object = gobject.property(type = gobject.GObject)
12426 + object = GObject.property (type = GObject.Object)
12428 - def __init__ (self):
12429 - self.debug = False
12430 - self.totem = None
12431 - self.programme_download_lock = threading.Lock ()
12432 + def __init__ (self):
12433 + GObject.Object.__init__ (self)
12435 - def do_activate (self):
12436 - self.totem = self.object
12437 - # Build the interface
12438 - builder = Totem.plugin_load_interface ("iplayer", "iplayer.ui", True, self.totem.get_main_window (), self)
12439 - container = builder.get_object ('iplayer_vbox')
12440 + self.debug = False
12441 + self.totem = None
12442 + self.programme_download_lock = threading.Lock ()
12444 - self.tv_tree_store = builder.get_object ('iplayer_programme_store')
12445 - programme_list = builder.get_object ('iplayer_programme_list')
12446 - programme_list.connect ('row-expanded', self._row_expanded_cb)
12447 - programme_list.connect ('row-activated', self._row_activated_cb)
12448 + self.tv_feed = None
12449 + self.tv_tree_store = None
12451 - container.show_all ()
12453 - self.tv = iplayer2.feed ('tv')
12455 - # Add the interface to Totem's sidebar
12456 - self.totem.add_sidebar_page ("iplayer", _(u"BBC iPlayer"), container)
12458 - # Get the channel category listings
12459 - self.populate_channel_list (self.tv, self.tv_tree_store)
12461 - def do_deactivate (self):
12462 - self.totem.remove_sidebar_page ("iplayer")
12464 - def populate_channel_list (self, feed, tree_store):
12465 - if self.debug:
12466 - print "Populating channel list…"
12468 - # Add all the channels as top-level rows in the tree store
12469 - channels = feed.channels ()
12470 - for channel_id, title in channels.items ():
12471 - parent_iter = tree_store.append (None, (title, channel_id, None))
12473 - # Add the channels' categories in a thread, since they each require a network request
12474 - parent_path = tree_store.get_path (parent_iter)
12475 - thread = PopulateChannelsThread (self, parent_path, feed, tree_store)
12476 - thread.start ()
12478 - def _populate_channel_list_cb (self, tree_store, parent_path, values):
12479 - # Callback from PopulateChannelsThread to add stuff to the tree store
12480 - if values == None:
12481 - self.totem.action_error (_(u'Error listing channel categories'), _(u'There was an unknown error getting the list of television channels available on BBC iPlayer.'))
12482 - return False
12484 - parent_iter = tree_store.get_iter (parent_path)
12485 - category_iter = tree_store.append (parent_iter, values)
12487 - # Append a dummy child row so that the expander's visible; we can
12488 - # then queue off the expander to load the programme listing for this category
12489 - tree_store.append (category_iter, [_(u'Loading…'), None, None])
12491 - return False
12493 - def _row_expanded_cb (self, tree_view, row_iter, path):
12494 - tree_model = tree_view.get_model ()
12496 - if self.debug:
12497 - print "_row_expanded_cb called."
12499 - # We only care about the category level (level 1), and only when
12500 - # it has the "Loading..." placeholder child row
12501 - if get_iter_level (tree_model, row_iter) != 1 or tree_model.iter_n_children (row_iter) != 1:
12502 - return
12504 - # Populate it with programmes asynchronously
12505 - self.populate_programme_list (self.tv, tree_model, row_iter)
12507 - def _row_activated_cb (self, tree_view, path, view_column):
12508 - tree_store = tree_view.get_model ()
12509 - tree_iter = tree_store.get_iter (path)
12510 - if tree_iter == None:
12511 - return
12513 - mrl = tree_store.get_value (tree_iter, 2)
12515 - # Only allow programme rows to be activated, not channel or category rows
12516 - if mrl == None:
12517 - return
12519 - # Add the programme to the playlist and play it
12520 - self.totem.add_to_playlist_and_play (mrl, tree_store.get_value (tree_iter, 0), True)
12522 - def populate_programme_list (self, feed, tree_store, category_iter):
12523 - if self.debug:
12524 - print "Populating programme list…"
12526 - category_path = tree_store.get_path (category_iter)
12527 - thread = PopulateProgrammesThread (self, feed, tree_store, category_path)
12528 - thread.start ()
12530 - def _populate_programme_list_cb (self, tree_store, category_path, values, remove_placeholder):
12531 - # Callback from PopulateProgrammesThread to add stuff to the tree store
12532 - if values == None:
12533 - # Translators: the "programme feed" is the list of TV shows available to watch online
12534 - self.totem.action_error (_(u'Error getting programme feed'), _(u'There was an error getting the list of programmes for this channel and category combination.'))
12535 - return False
12537 - category_iter = tree_store.get_iter (category_path)
12538 - if category_iter != None:
12539 - tree_store.append (category_iter, values)
12541 - # Remove the placeholder row
12542 - children = tree_store.iter_children (category_iter)
12543 - if remove_placeholder and children != None:
12544 - tree_store.remove (children)
12546 - return False
12547 + def do_activate (self):
12548 + self.totem = self.object
12549 + # Build the interface
12550 + builder = Totem.plugin_load_interface ("iplayer", "iplayer.ui", True,
12551 + self.totem.get_main_window (),
12552 + self)
12553 + container = builder.get_object ('iplayer_vbox')
12555 + self.tv_tree_store = builder.get_object ('iplayer_programme_store')
12556 + programme_list = builder.get_object ('iplayer_programme_list')
12557 + programme_list.connect ('row-expanded', self.__row_expanded_cb)
12558 + programme_list.connect ('row-activated', self.__row_activated_cb)
12560 + container.show_all ()
12562 + self.tv_feed = iplayer2.Feed ('tv')
12564 + # Add the interface to Totem's sidebar
12565 + self.totem.add_sidebar_page ("iplayer", _(u"BBC iPlayer"), container)
12567 + # Get the channel category listings
12568 + self._populate_channel_list (self.tv_feed, self.tv_tree_store)
12570 + def do_deactivate (self):
12571 + self.totem.remove_sidebar_page ("iplayer")
12573 + def _populate_channel_list (self, feed, tree_store):
12574 + if self.debug:
12575 + print "Populating channel list…"
12577 + # Add all the channels as top-level rows in the tree store
12578 + channels = feed.channels ()
12579 + for channel_id, title in channels.items ():
12580 + tree_store.append (None, (title, channel_id, None))
12582 + # Add the channels' categories in a thread, since they each require a
12583 + # network request
12584 + thread = PopulateChannelsThread (self.__populate_channel_list_cb,
12585 + feed, tree_store)
12586 + thread.start ()
12588 + def __populate_channel_list_cb (self, tree_store, parent_path, values):
12589 + # Callback from PopulateChannelsThread to add stuff to the tree store
12590 + if values == None:
12591 + self.totem.action_error (_(u'Error listing channel categories'),
12592 + _(u'There was an unknown error getting '\
12593 + 'the list of television channels '\
12594 + 'available on BBC iPlayer.'))
12595 + return False
12597 + parent_iter = tree_store.get_iter (parent_path)
12598 + category_iter = tree_store.append (parent_iter, values)
12600 + # Append a dummy child row so that the expander's visible; we can
12601 + # then queue off the expander to load the programme listing for this
12602 + # category
12603 + tree_store.append (category_iter, [_(u'Loading…'), None, None])
12605 + return False
12607 + def __row_expanded_cb (self, tree_view, row_iter, path):
12608 + tree_model = tree_view.get_model ()
12610 + if self.debug:
12611 + print "__row_expanded_cb called."
12613 + # We only care about the category level (level 1), and only when
12614 + # it has the "Loading..." placeholder child row
12615 + if (get_iter_level (tree_model, row_iter) != 1 or
12616 + tree_model.iter_n_children (row_iter) != 1):
12617 + return
12619 + # Populate it with programmes asynchronously
12620 + self._populate_programme_list (self.tv_feed, tree_model, row_iter)
12622 + def __row_activated_cb (self, tree_view, path, view_column):
12623 + tree_store = tree_view.get_model ()
12624 + tree_iter = tree_store.get_iter (path)
12625 + if tree_iter == None:
12626 + return
12628 + mrl = tree_store.get_value (tree_iter, 2)
12630 + # Only allow programme rows to be activated, not channel or category
12631 + # rows
12632 + if mrl == None:
12633 + return
12635 + # Add the programme to the playlist and play it
12636 + title = tree_store.get_value (tree_iter, 0)
12637 + self.totem.add_to_playlist_and_play (mrl, title, True)
12639 + def _populate_programme_list (self, feed, tree_store, category_iter):
12640 + if self.debug:
12641 + print "Populating programme list…"
12643 + category_path = tree_store.get_path (category_iter)
12644 + thread = PopulateProgrammesThread (self,
12645 + self.__populate_programme_list_cb,
12646 + feed, (tree_store, category_path))
12647 + thread.start ()
12649 + def __populate_programme_list_cb (self, tree_store, category_path, values,
12650 + remove_placeholder):
12651 + # Callback from PopulateProgrammesThread to add stuff to the tree store
12652 + if values == None:
12653 + # Translators: the "programme feed" is the list of TV shows
12654 + # available to watch online
12655 + self.totem.action_error (_(u'Error getting programme feed'),
12656 + _(u'There was an error getting the list '\
12657 + 'of programmes for this channel and '\
12658 + 'category combination.'))
12659 + return False
12661 + category_iter = tree_store.get_iter (category_path)
12662 + if category_iter != None:
12663 + tree_store.append (category_iter, values)
12665 + # Remove the placeholder row
12666 + children = tree_store.iter_children (category_iter)
12667 + if remove_placeholder and children != None:
12668 + tree_store.remove (children)
12670 + return False
12672 def get_iter_level (tree_model, tree_iter):
12673 - i = 0;
12674 - while True:
12675 - tree_iter = tree_model.iter_parent (tree_iter)
12676 - if tree_iter == None:
12677 - break
12678 - i += 1
12679 - return i
12680 + i = 0
12681 + while True:
12682 + tree_iter = tree_model.iter_parent (tree_iter)
12683 + if tree_iter == None:
12684 + break
12685 + i += 1
12686 + return i
12688 def category_name_to_id (category_name):
12689 - return category_name.lower ().replace (' ', '_').replace ('&', 'and')
12690 + return category_name.lower ().replace (' ', '_').replace ('&', 'and')
12692 class PopulateChannelsThread (threading.Thread):
12693 - # Class to populate the channel list from the Internet
12694 - def __init__ (self, plugin, parent_path, feed, tree_model):
12695 - self.plugin = plugin
12696 - self.feed = feed
12697 - self.tree_model = tree_model
12698 - threading.Thread.__init__ (self)
12700 - def run (self):
12701 - shown_error = False
12702 - tree_iter = self.tree_model.get_iter_first ()
12703 - while (tree_iter != None):
12704 - channel_id = self.tree_model.get_value (tree_iter, 1)
12705 - parent_path = self.tree_model.get_path (tree_iter)
12707 - try:
12708 - # Add this channel's categories as sub-rows
12709 - # We have to pass a path because the model could theoretically be modified
12710 - # while the idle function is waiting in the queue, invalidating an iter
12711 - for name, count in self.feed.get (channel_id).categories ():
12712 - category_id = category_name_to_id (name)
12713 - gobject.idle_add (self.plugin._populate_channel_list_cb, self.tree_model, parent_path, [name, category_id, None])
12714 - except:
12715 - # Only show the error once, rather than for each channel (it gets a bit grating)
12716 - if not shown_error:
12717 - gobject.idle_add (self.plugin._populate_channel_list_cb, self.tree_model, parent_path, None)
12718 - shown_error = True
12720 - tree_iter = self.tree_model.iter_next (tree_iter)
12721 + # Class to populate the channel list from the Internet
12722 + def __init__ (self, callback, feed, tree_model):
12723 + self.callback = callback
12724 + self.feed = feed
12725 + self.tree_model = tree_model
12726 + threading.Thread.__init__ (self)
12728 + def run (self):
12729 + shown_error = False
12730 + tree_iter = self.tree_model.get_iter_first ()
12731 + while (tree_iter != None):
12732 + channel_id = self.tree_model.get_value (tree_iter, 1)
12733 + parent_path = self.tree_model.get_path (tree_iter)
12735 + try:
12736 + # Add this channel's categories as sub-rows
12737 + # We have to pass a path because the model could theoretically
12738 + # be modified while the idle function is waiting in the queue,
12739 + # invalidating an iter
12740 + for name, _count in self.feed.get (channel_id).categories ():
12741 + category_id = category_name_to_id (name)
12742 + GObject.idle_add (self.callback,
12743 + self.tree_model, parent_path,
12744 + [name, category_id, None])
12745 + except StandardError:
12746 + # Only show the error once, rather than for each channel
12747 + # (it gets a bit grating)
12748 + if not shown_error:
12749 + GObject.idle_add (self.callback,
12750 + self.tree_model, parent_path, None)
12751 + shown_error = True
12753 + tree_iter = self.tree_model.iter_next (tree_iter)
12755 class PopulateProgrammesThread (threading.Thread):
12756 - # Class to populate the programme list for a channel/category combination from the Internet
12757 - def __init__ (self, plugin, feed, tree_model, category_path):
12758 - self.plugin = plugin
12759 - self.feed = feed
12760 - self.tree_model = tree_model
12761 - self.category_path = category_path
12762 - threading.Thread.__init__ (self)
12764 - def run (self):
12765 - self.plugin.programme_download_lock.acquire ()
12767 - category_iter = self.tree_model.get_iter (self.category_path)
12768 - if category_iter == None:
12769 - gobject.idle_add (self.plugin._populate_programme_list_cb, self.tree_model, self.category_path, None, False)
12770 - self.plugin.programme_download_lock.release ()
12771 - return
12773 - category_id = self.tree_model.get_value (category_iter, 1)
12774 - parent_iter = self.tree_model.iter_parent (category_iter)
12775 - channel_id = self.tree_model.get_value (parent_iter, 1)
12777 - # Retrieve the programmes and return them
12778 - feed = self.feed.get (channel_id).get (category_id)
12779 - if feed == None:
12780 - gobject.idle_add (self.plugin._populate_programme_list_cb, self.tree_model, self.category_path, None, False)
12781 - self.plugin.programme_download_lock.release ()
12782 - return
12784 - # Get the programmes
12785 - try:
12786 - programmes = feed.list ()
12787 - except:
12788 - gobject.idle_add (self.plugin._populate_programme_list_cb, self.tree_model, self.category_path, None, False)
12789 - self.plugin.programme_download_lock.release ()
12790 - return
12792 - # Add the programmes to the tree store
12793 - remove_placeholder = True
12794 - for programme in programmes:
12795 - programme_item = programme.programme
12797 - # Get the media, which gives the stream URI.
12798 - # We go for mobile quality, since the higher-quality streams are RTMP-only
12799 - # which isn't currently supported by GStreamer or xine
12800 - # TODO: Use higher-quality streams once http://bugzilla.gnome.org/show_bug.cgi?id=566604 is fixed
12801 - media = programme_item.get_media_for ('mobile')
12802 - if media == None:
12803 - # Not worth displaying an error in the interface for this
12804 - print "Programme has no HTTP streams"
12805 - continue
12807 - gobject.idle_add (self.plugin._populate_programme_list_cb, self.tree_model, self.category_path,
12808 - [programme.get_title (), programme.get_summary (), media.url],
12809 - remove_placeholder)
12810 - remove_placeholder = False
12812 - self.plugin.programme_download_lock.release ()
12813 + # Class to populate the programme list for a channel/category combination
12814 + # from the Internet
12815 + def __init__ (self, download_lock, callback, feed,
12816 + (tree_model, category_path)):
12817 + self.download_lock = download_lock
12818 + self.callback = callback
12819 + self.feed = feed
12820 + self.tree_model = tree_model
12821 + self.category_path = category_path
12822 + threading.Thread.__init__ (self)
12824 + def run (self):
12825 + self.download_lock.acquire ()
12827 + category_iter = self.tree_model.get_iter (self.category_path)
12828 + if category_iter == None:
12829 + GObject.idle_add (self.callback,
12830 + self.tree_model, self.category_path, None, False)
12831 + self.download_lock.release ()
12832 + return
12834 + category_id = self.tree_model.get_value (category_iter, 1)
12835 + parent_iter = self.tree_model.iter_parent (category_iter)
12836 + channel_id = self.tree_model.get_value (parent_iter, 1)
12838 + # Retrieve the programmes and return them
12839 + feed = self.feed.get (channel_id).get (category_id)
12840 + if feed == None:
12841 + GObject.idle_add (self.callback,
12842 + self.tree_model, self.category_path, None, False)
12843 + self.download_lock.release ()
12844 + return
12846 + # Get the programmes
12847 + try:
12848 + programmes = feed.list ()
12849 + except StandardError:
12850 + GObject.idle_add (self.callback,
12851 + self.tree_model, self.category_path, None, False)
12852 + self.download_lock.release ()
12853 + return
12855 + # Add the programmes to the tree store
12856 + remove_placeholder = True
12857 + for programme in programmes:
12858 + programme_item = programme.programme
12860 + # Get the media, which gives the stream URI.
12861 + # We go for mobile quality, since the higher-quality streams are
12862 + # RTMP-only which isn't currently supported by GStreamer or xine
12863 + # TODO: Use higher-quality streams once
12864 + # http://bugzilla.gnome.org/show_bug.cgi?id=566604 is fixed
12865 + media = programme_item.get_media_for ('mobile')
12866 + if media == None:
12867 + # Not worth displaying an error in the interface for this
12868 + print "Programme has no HTTP streams"
12869 + continue
12871 + GObject.idle_add (self.callback,
12872 + self.tree_model, self.category_path,
12873 + [programme.get_title (), programme.get_summary (),
12874 + media.url],
12875 + remove_placeholder)
12876 + remove_placeholder = False
12878 + self.download_lock.release ()
12879 diff --git a/src/plugins/iplayer/iplayer2.py b/src/plugins/iplayer/iplayer2.py
12880 index 6c5f3b4..5b71e69 100644
12881 --- a/src/plugins/iplayer/iplayer2.py
12882 +++ b/src/plugins/iplayer/iplayer2.py
12883 @@ -12,19 +12,18 @@ import gettext
12885 # external libs
12886 import httplib2
12887 -import feedparser
12888 import listparser
12889 from BeautifulSoup import BeautifulStoneSoup
12891 -gettext.textdomain("totem")
12892 +gettext.textdomain ("totem")
12894 D_ = gettext.dgettext
12895 _ = gettext.gettext
12897 -IMG_DIR = os.path.join(os.getcwd(), 'resources', 'media')
12898 +IMG_DIR = os.path.join (os.getcwd (), 'resources', 'media')
12900 #try:
12901 -# logging.basicConfig(
12902 +# logging.basicConfig (
12903 # filename='iplayer2.log',
12904 # filemode='w',
12905 # format='%(asctime)s %(levelname)4s %(message)s',
12906 @@ -32,40 +31,33 @@ IMG_DIR = os.path.join(os.getcwd(), 'resources', 'media')
12908 #except IOError:
12909 # #print "iplayer2 logging to stdout"
12910 -# logging.basicConfig(
12911 +# logging.basicConfig (
12912 # stream=sys.stdout,
12913 # level=logging.DEBUG,
12914 # format='iplayer2.py: %(asctime)s %(levelname)4s %(message)s',
12916 -# me want 2.5!!!
12917 -def any(iterable):
12918 - for element in iterable:
12919 - if element:
12920 - return True
12921 - return False
12924 # http://colinm.org/blog/on-demand-loading-of-flickr-photo-metadata
12925 # returns immediately for all previously-called functions
12926 -def call_once(fn):
12927 +def call_once (function):
12928 called_by = {}
12929 - def result(self):
12930 + def result (self):
12931 if self in called_by:
12932 return
12933 called_by[self] = True
12934 - fn(self)
12935 + function (self)
12936 return result
12938 # runs loader before decorated function
12939 -def loaded_by(loader):
12940 - def decorator(fn):
12941 - def result(self, *args, **kwargs):
12942 - loader(self)
12943 - return fn(self, *args, **kwargs)
12944 +def loaded_by (loader):
12945 + def decorator (function):
12946 + def result (self, *args, **kwargs):
12947 + loader (self)
12948 + return function (self, *args, **kwargs)
12949 return result
12950 return decorator
12952 -channels_tv_list = [
12953 +CHANNELS_TV_LIST = [
12954 ('bbc_one', 'BBC One'),
12955 ('bbc_two', 'BBC Two'),
12956 ('bbc_three', 'BBC Three'),
12957 @@ -77,8 +69,8 @@ channels_tv_list = [
12958 ('bbc_hd', 'BBC HD'),
12959 ('bbc_alba', 'BBC Alba'),
12961 -channels_tv = dict(channels_tv_list)
12962 -channels_national_radio_list = [
12963 +CHANNELS_TV = dict (CHANNELS_TV_LIST)
12964 +CHANNELS_NATIONAL_RADIO_LIST = [
12965 ('bbc_radio_one', 'Radio 1'),
12966 ('bbc_1xtra', '1 Xtra'),
12967 ('bbc_radio_two', 'Radio 2'),
12968 @@ -97,7 +89,7 @@ channels_national_radio_list = [
12969 ('bbc_world_service', 'World Service'),
12970 ('bbc_radio_nan_gaidheal', 'BBC nan Gaidheal')
12972 -channels_local_radio_list = [
12973 +CHANNELS_LOCAL_RADIO_LIST = [
12974 ('bbc_radio_cumbria', 'BBC Cumbria'),
12975 ('bbc_radio_newcastle', 'BBC Newcastle'),
12976 ('bbc_tees', 'BBC Tees'),
12977 @@ -139,57 +131,65 @@ channels_local_radio_list = [
12978 ('bbc_radio_guernsey', 'BBC Guernsey'),
12979 ('bbc_radio_jersey', 'BBC Jersey')
12981 -channels_logos = {
12982 - 'bbc_radio_cumbria': 'http://www.bbc.co.uk/englandcms/localradio/images/cumbria.gif',
12983 - 'bbc_radio_newcastle': 'http://www.bbc.co.uk/englandcms/localradio/images/newcastle.gif',
12984 - 'bbc_tees': 'http://www.bbc.co.uk/englandcms/localradio/images/tees.gif',
12985 - 'bbc_radio_lancashire': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_lancs.gif',
12986 - 'bbc_radio_merseyside': 'http://www.bbc.co.uk/englandcms/localradio/images/merseyside.gif',
12987 - 'bbc_radio_manchester': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
12988 - 'bbc_radio_leeds': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_leeds.gif',
12989 - 'bbc_radio_sheffield': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_sheffield.gif',
12990 - 'bbc_radio_york': 'http://www.bbc.co.uk/englandcms/localradio/images/york.gif',
12991 - 'bbc_radio_humberside': 'http://www.bbc.co.uk/radio/images/home/r-home-nation-regions.gif',
12992 - 'bbc_radio_lincolnshire': 'http://www.bbc.co.uk/englandcms/localradio/images/lincs.gif',
12993 - 'bbc_radio_nottingham': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
12994 - 'bbc_radio_leicester': 'http://www.bbc.co.uk/englandcms/localradio/images/leicester.gif',
12995 - 'bbc_radio_derby': 'http://www.bbc.co.uk/englandcms/derby/images/rh_nav170_derby.gif',
12996 - 'bbc_radio_stoke': 'http://www.bbc.co.uk/englandcms/localradio/images/stoke.gif',
12997 - 'bbc_radio_shropshire': 'http://www.bbc.co.uk/englandcms/localradio/images/shropshire.gif',
12998 - 'bbc_wm': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
12999 - 'bbc_radio_coventry_warwickshire': 'http://www.bbc.co.uk/englandcms/localradio/images/cov_warks.gif',
13000 - 'bbc_radio_hereford_worcester': 'http://www.bbc.co.uk/englandcms/localradio/images/hereford_worcester.gif',
13001 - 'bbc_radio_northampton': 'http://www.bbc.co.uk/englandcms/localradio/images/northampton.gif',
13002 - 'bbc_three_counties_radio': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_3counties.gif',
13003 - 'bbc_radio_cambridge': 'http://www.bbc.co.uk/englandcms/localradio/images/cambridgeshire.gif',
13004 - 'bbc_radio_norfolk': 'http://www.bbc.co.uk/englandcms/localradio/images/norfolk.gif',
13005 - 'bbc_radio_suffolk': 'http://www.bbc.co.uk/englandcms/localradio/images/suffolk.gif',
13006 - 'bbc_radio_essex': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_essex.gif',
13007 - 'bbc_london': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
13008 - 'bbc_radio_kent': 'http://www.bbc.co.uk/radio/images/home/r-home-nation-regions.gif',
13009 - 'bbc_southern_counties_radio': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
13010 - 'bbc_radio_oxford': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_oxford.gif',
13011 - 'bbc_radio_berkshire': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_berks.gif',
13012 - 'bbc_radio_solent': 'http://www.bbc.co.uk/englandcms/localradio/images/solent.gif',
13013 - 'bbc_radio_gloucestershire': 'http://www.bbc.co.uk/englandcms/localradio/images/gloucestershire.gif',
13014 - 'bbc_radio_swindon': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
13015 - 'bbc_radio_wiltshire': os.path.join(IMG_DIR, 'bbc_local_radio.png'),
13016 - 'bbc_radio_bristol': 'http://www.bbc.co.uk/englandcms/localradio/images/bristol.gif',
13017 - 'bbc_radio_somerset_sound': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_somerset.gif',
13018 - 'bbc_radio_devon': 'http://www.bbc.co.uk/englandcms/images/rh_nav170_devon.gif',
13019 - 'bbc_radio_cornwall': 'http://www.bbc.co.uk/englandcms/localradio/images/cornwall.gif',
13020 - 'bbc_radio_guernsey': 'http://www.bbc.co.uk/englandcms/localradio/images/guernsey.gif',
13021 - 'bbc_radio_jersey': 'http://www.bbc.co.uk/englandcms/localradio/images/jersey.gif'
13023 +LOGO_URI = 'http://www.bbc.co.uk/englandcms/'
13024 +CHANNELS_LOGOS = {
13025 + 'bbc_radio_cumbria': LOGO_URI + 'localradio/images/cumbria.gif',
13026 + 'bbc_radio_newcastle': LOGO_URI + 'localradio/images/newcastle.gif',
13027 + 'bbc_tees': LOGO_URI + 'localradio/images/tees.gif',
13028 + 'bbc_radio_lancashire': LOGO_URI + 'images/rh_nav170_lancs.gif',
13029 + 'bbc_radio_merseyside': LOGO_URI + 'localradio/images/merseyside.gif',
13030 + 'bbc_radio_manchester': os.path.join (IMG_DIR, 'bbc_local_radio.png'),
13031 + 'bbc_radio_leeds': LOGO_URI + 'images/rh_nav170_leeds.gif',
13032 + 'bbc_radio_sheffield': LOGO_URI + 'images/rh_nav170_sheffield.gif',
13033 + 'bbc_radio_york': LOGO_URI + 'localradio/images/york.gif',
13034 + 'bbc_radio_humberside': 'http://www.bbc.co.uk/radio/images/home/'\
13035 + 'r-home-nation-regions.gif',
13036 + 'bbc_radio_lincolnshire': LOGO_URI + 'localradio/images/lincs.gif',
13037 + 'bbc_radio_nottingham': os.path.join (IMG_DIR, 'bbc_local_radio.png'),
13038 + 'bbc_radio_leicester': LOGO_URI + 'localradio/images/leicester.gif',
13039 + 'bbc_radio_derby': LOGO_URI + 'derby/images/rh_nav170_derby.gif',
13040 + 'bbc_radio_stoke': LOGO_URI + 'localradio/images/stoke.gif',
13041 + 'bbc_radio_shropshire': LOGO_URI + 'localradio/images/shropshire.gif',
13042 + 'bbc_wm': os.path.join (IMG_DIR, 'bbc_local_radio.png'),
13043 + 'bbc_radio_coventry_warwickshire': LOGO_URI + 'localradio/images/'\
13044 + 'cov_warks.gif',
13045 + 'bbc_radio_hereford_worcester': LOGO_URI + 'localradio/images/'\
13046 + 'hereford_worcester.gif',
13047 + 'bbc_radio_northampton': LOGO_URI + 'localradio/images/northampton.gif',
13048 + 'bbc_three_counties_radio': LOGO_URI + 'images/rh_nav170_3counties.gif',
13049 + 'bbc_radio_cambridge': LOGO_URI + 'localradio/images/cambridgeshire.gif',
13050 + 'bbc_radio_norfolk': LOGO_URI + 'localradio/images/norfolk.gif',
13051 + 'bbc_radio_suffolk': LOGO_URI + 'localradio/images/suffolk.gif',
13052 + 'bbc_radio_essex': LOGO_URI + 'images/rh_nav170_essex.gif',
13053 + 'bbc_london': os.path.join (IMG_DIR, 'bbc_local_radio.png'),
13054 + 'bbc_radio_kent': 'http://www.bbc.co.uk/radio/images/home/'\
13055 + 'r-home-nation-regions.gif',
13056 + 'bbc_southern_counties_radio': os.path.join (IMG_DIR,
13057 + 'bbc_local_radio.png'),
13058 + 'bbc_radio_oxford': LOGO_URI + 'images/rh_nav170_oxford.gif',
13059 + 'bbc_radio_berkshire': LOGO_URI + 'images/rh_nav170_berks.gif',
13060 + 'bbc_radio_solent': LOGO_URI + 'localradio/images/solent.gif',
13061 + 'bbc_radio_gloucestershire': LOGO_URI + 'localradio/images/'\
13062 + 'gloucestershire.gif',
13063 + 'bbc_radio_swindon': os.path.join (IMG_DIR, 'bbc_local_radio.png'),
13064 + 'bbc_radio_wiltshire': os.path.join (IMG_DIR, 'bbc_local_radio.png'),
13065 + 'bbc_radio_bristol': LOGO_URI + 'localradio/images/bristol.gif',
13066 + 'bbc_radio_somerset_sound': LOGO_URI + 'images/rh_nav170_somerset.gif',
13067 + 'bbc_radio_devon': LOGO_URI + 'images/rh_nav170_devon.gif',
13068 + 'bbc_radio_cornwall': LOGO_URI + 'localradio/images/cornwall.gif',
13069 + 'bbc_radio_guernsey': LOGO_URI + 'localradio/images/guernsey.gif',
13070 + 'bbc_radio_jersey': LOGO_URI + 'localradio/images/jersey.gif'
13074 -channels_national_radio = dict(channels_national_radio_list)
13075 -channels_local_radio = dict(channels_local_radio_list)
13076 -channels_radio_list = channels_national_radio_list + channels_local_radio_list
13077 -channels_radio = dict(channels_radio_list)
13078 +CHANNELS_NATIONAL_RADIO = dict (CHANNELS_NATIONAL_RADIO_LIST)
13079 +CHANNELS_LOCAL_RADIO = dict (CHANNELS_LOCAL_RADIO_LIST)
13080 +CHANNELS_RADIO_LIST = CHANNELS_NATIONAL_RADIO_LIST + CHANNELS_LOCAL_RADIO_LIST
13081 +CHANNELS_RADIO = dict (CHANNELS_RADIO_LIST)
13083 -channels = dict(channels_tv_list + channels_radio_list)
13084 -categories_list = [
13085 +CHANNELS = dict (CHANNELS_TV_LIST + CHANNELS_RADIO_LIST)
13086 +CATEGORIES_LIST = [
13087 ('childrens', 'Children\'s'),
13088 ('comedy', 'Comedy'),
13089 ('drama', 'Drama'),
13090 @@ -205,158 +205,146 @@ categories_list = [
13091 ('scotland', 'Scotland'),
13092 ('wales', 'Wales')
13094 -categories = dict(categories_list)
13096 -live_radio_stations = {'Radio 1': 'http://www.bbc.co.uk/radio1/wm_asx/aod/radio1_hi.asx',
13097 - '1 Xtra': 'http://www.bbc.co.uk/1xtra/realmedia/1xtra_hi.asx',
13098 - 'Radio 2': 'http://www.bbc.co.uk/radio2/wm_asx/aod/radio2_hi.asx',
13099 - 'BBC 3': 'http://www.bbc.co.uk/radio3/wm_asx/aod/radio3_hi.asx',
13100 - 'BBC 4': 'http://www.bbc.co.uk/radio4/wm_asx/aod/radio4.asx',
13101 - '5 Live': 'http://www.bbc.co.uk/fivelive/live/live.asx',
13102 - '5 Live Sports Extra': 'http://www.bbc.co.uk/fivelive/live/live_sportsextra.asx',
13103 - '6 Music': 'http://www.bbc.co.uk/6music/ram/6music_hi.asx',
13104 - 'BBC 7': 'http://www.bbc.co.uk/bbc7/realplayer/bbc7_hi.asx',
13105 - 'Asian Network': 'http://www.bbc.co.uk/asiannetwork/rams/asiannet_hi.asx',
13106 - 'Radio Scotland': 'http://www.bbc.co.uk/scotland/radioscotland/media/radioscotland.ram',
13107 - 'World Service': 'http://www.bbc.co.uk/worldservice/meta/tx/nb/live_eneuk_au_nb.asx',
13108 - 'BBC nan Gaidheal': 'http://www.bbc.co.uk/scotland/alba/media/live/radio_ng.ram',
13109 - 'BBC London': 'http://www.bbc.co.uk/england/realmedia/live/localradio/london.ram',
13110 - 'BBC Berkshire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/radioberkshire.ram',
13111 - 'BBC Bristol': 'http://www.bbc.co.uk/england/realmedia/live/localradio/bristol.ram',
13112 - 'BBC Cambridgeshire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/cambridgeshire.ram',
13113 - 'BBC Cornwall': 'http://www.bbc.co.uk/england/realmedia/live/localradio/cornwall.ram',
13114 - 'BBC Cumbria': 'http://www.bbc.co.uk/england/realmedia/live/localradio/cumbria.ram',
13115 - 'BBC Derby': 'http://www.bbc.co.uk/england/realmedia/live/localradio/derby.ram',
13116 - 'BBC Devon': 'http://www.bbc.co.uk/england/realmedia/live/localradio/devon.ram',
13117 - 'BBC Essex': 'http://www.bbc.co.uk/england/realmedia/live/localradio/essex.ram',
13118 - 'BBC Gloucestershire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/gloucestershire.ram',
13119 - 'BBC Guernsey': 'http://www.bbc.co.uk/england/realmedia/live/localradio/guernsey.ram',
13120 - 'BBC Hereford/Worcester': 'http://www.bbc.co.uk/england/realmedia/live/localradio/herefordandworcester.ram',
13121 - 'BBC Humberside': 'http://www.bbc.co.uk/england/realmedia/live/localradio/humberside.ram',
13122 - 'BBC Jersey': 'http://www.bbc.co.uk/england/realmedia/live/localradio/jersey.ram',
13123 - 'BBC Kent': 'http://www.bbc.co.uk/england/realmedia/live/localradio/kent.ram',
13124 - 'BBC Lancashire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/lancashire.ram',
13125 - 'BBC Leeds': 'http://www.bbc.co.uk/england/realmedia/live/localradio/leeds.ram',
13126 - 'BBC Leicester': 'http://www.bbc.co.uk/england/realmedia/live/localradio/leicester.ram',
13127 - 'BBC Lincolnshire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/lincolnshire.ram',
13128 - 'BBC Manchester': 'http://www.bbc.co.uk/england/realmedia/live/localradio/manchester.ram',
13129 - 'BBC Merseyside': 'http://www.bbc.co.uk/england/realmedia/live/localradio/merseyside.ram',
13130 - 'BBC Newcastle': 'http://www.bbc.co.uk/england/realmedia/live/localradio/newcastle.ram',
13131 - 'BBC Norfolk': 'http://www.bbc.co.uk/england/realmedia/live/localradio/norfolk.ram',
13132 - 'BBC Northampton': 'http://www.bbc.co.uk/england/realmedia/live/localradio/northampton.ram',
13133 - 'BBC Nottingham': 'http://www.bbc.co.uk/england/realmedia/live/localradio/nottingham.ram',
13134 - 'BBC Oxford': 'http://www.bbc.co.uk/england/realmedia/live/localradio/radiooxford.ram',
13135 - 'BBC Sheffield': 'http://www.bbc.co.uk/england/realmedia/live/localradio/sheffield.ram',
13136 - 'BBC Shropshire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/shropshire.ram',
13137 - 'BBC Solent': 'http://www.bbc.co.uk/england/realmedia/live/localradio/solent.ram',
13138 - 'BBC Somerset Sound': 'http://www.bbc.co.uk/england/realmedia/live/localradio/somerset.ram',
13139 - 'BBC Southern Counties Radio': 'http://www.bbc.co.uk/england/realmedia/live/localradio/southerncounties.ram',
13140 - 'BBC Stoke': 'http://www.bbc.co.uk/england/realmedia/live/localradio/stoke.ram',
13141 - 'BBC Suffolk': 'http://www.bbc.co.uk/england/realmedia/live/localradio/suffolk.ram',
13142 - 'BBC Swindon': 'http://www.bbc.co.uk/england/realmedia/live/localradio/swindon.ram',
13143 - 'BBC Three Counties Radio': 'http://www.bbc.co.uk/england/realmedia/live/localradio/threecounties.ram',
13144 - 'BBC Wiltshire': 'http://www.bbc.co.uk/england/realmedia/live/localradio/wiltshire.ram',
13145 - 'BBC York': 'http://www.bbc.co.uk/england/realmedia/live/localradio/york.ram',
13146 - 'BBC WM': 'http://www.bbc.co.uk/england/realmedia/live/localradio/wm.ram',
13147 - 'BBC Cymru': 'http://www.bbc.co.uk/cymru/live/rc-live.ram',
13148 - 'Radio Foyle': 'http://www.bbc.co.uk/northernireland/realmedia/rf-live.ram',
13149 - 'BBC Scotland': 'http://www.bbc.co.uk/scotland/radioscotland/media/radioscotland.ram',
13150 - 'BBC nan Gaidheal': 'http://www.bbc.co.uk/scotland/alba/media/live/radio_ng.ram',
13151 - 'BBC Ulster': 'http://www.bbc.co.uk/ni/realmedia/ru-live.ram',
13152 - 'BBC Wales': 'http://www.bbc.co.uk/wales/live/rwg2.ram',
13153 - 'BBC Tees': 'http://www.bbc.co.uk/england/realmedia/live/localradio/cleveland.ram',
13155 -live_webcams = {'Radio 1': 'http://www.bbc.co.uk/radio1/webcam/images/live/webcam.jpg',
13156 - '1 Xtra': 'http://www.bbc.co.uk/1xtra/webcam/live/1xtraa.jpg',
13157 - 'Radio 2': 'http://www.bbc.co.uk/radio2/webcam/live/radio2.jpg',
13158 - '5 Live': 'http://www.bbc.co.uk/fivelive/inside/webcam/5Lwebcam1.jpg',
13159 - '6 Music': 'http://www.bbc.co.uk/6music/webcam/live/6music.jpg',
13160 - 'Asian Network': 'http://www.bbc.co.uk/asiannetwork/webcams/birmingham.jpg'}
13162 -rss_cache = {}
13164 -self_closing_tags = ['alternate', 'mediator']
13166 -http = httplib2.Http()
13168 -re_selfclose = re.compile('<([a-zA-Z0-9]+)( ?.*)/>', re.M | re.S)
13170 -def fix_selfclosing(xml):
13171 - return re_selfclose.sub('<\\1\\2></\\1>', xml)
13173 -def set_http_cache_dir(d):
13174 - fc = httplib2.FileCache(d)
13175 - http.cache = fc
13177 -def set_http_cache(c):
13178 - http.cache = c
13180 -class NoItemsError(Exception):
13181 - def __init__(self, reason=None):
13182 +CATEGORIES = dict (CATEGORIES_LIST)
13184 +ENGLAND_RADIO_URI = 'http://www.bbc.co.uk/england/'
13185 +LIVE_RADIO_STATIONS = {
13186 + 'Radio 1': 'http://www.bbc.co.uk/radio1/wm_asx/aod/radio1_hi.asx',
13187 + '1 Xtra': 'http://www.bbc.co.uk/1xtra/realmedia/1xtra_hi.asx',
13188 + 'Radio 2': 'http://www.bbc.co.uk/radio2/wm_asx/aod/radio2_hi.asx',
13189 + 'BBC 3': 'http://www.bbc.co.uk/radio3/wm_asx/aod/radio3_hi.asx',
13190 + 'BBC 4': 'http://www.bbc.co.uk/radio4/wm_asx/aod/radio4.asx',
13191 + '5 Live': 'http://www.bbc.co.uk/fivelive/live/live.asx',
13192 + '5 Live Sports Extra': 'http://www.bbc.co.uk/fivelive/live/'\
13193 + 'live_sportsextra.asx',
13194 + '6 Music': 'http://www.bbc.co.uk/6music/ram/6music_hi.asx',
13195 + 'BBC 7': 'http://www.bbc.co.uk/bbc7/realplayer/bbc7_hi.asx',
13196 + 'Asian Network': 'http://www.bbc.co.uk/asiannetwork/rams/asiannet_hi.asx',
13197 + 'Radio Scotland': 'http://www.bbc.co.uk/scotland/radioscotland/media/'\
13198 + 'radioscotland.ram',
13199 + 'World Service': 'http://www.bbc.co.uk/worldservice/meta/tx/nb/'\
13200 + 'live_eneuk_au_nb.asx',
13201 + 'BBC London': ENGLAND_RADIO_URI + 'london.ram',
13202 + 'BBC Berkshire': ENGLAND_RADIO_URI + 'radioberkshire.ram',
13203 + 'BBC Bristol': ENGLAND_RADIO_URI + 'bristol.ram',
13204 + 'BBC Cambridgeshire': ENGLAND_RADIO_URI + 'cambridgeshire.ram',
13205 + 'BBC Cornwall': ENGLAND_RADIO_URI + 'cornwall.ram',
13206 + 'BBC Cumbria': ENGLAND_RADIO_URI + 'cumbria.ram',
13207 + 'BBC Derby': ENGLAND_RADIO_URI + 'derby.ram',
13208 + 'BBC Devon': ENGLAND_RADIO_URI + 'devon.ram',
13209 + 'BBC Essex': ENGLAND_RADIO_URI + 'essex.ram',
13210 + 'BBC Gloucestershire': ENGLAND_RADIO_URI + 'gloucestershire.ram',
13211 + 'BBC Guernsey': ENGLAND_RADIO_URI + 'guernsey.ram',
13212 + 'BBC Hereford/Worcester': ENGLAND_RADIO_URI + 'herefordandworcester.ram',
13213 + 'BBC Humberside': ENGLAND_RADIO_URI + 'humberside.ram',
13214 + 'BBC Jersey': ENGLAND_RADIO_URI + 'jersey.ram',
13215 + 'BBC Kent': ENGLAND_RADIO_URI + 'kent.ram',
13216 + 'BBC Lancashire': ENGLAND_RADIO_URI + 'lancashire.ram',
13217 + 'BBC Leeds': ENGLAND_RADIO_URI + 'leeds.ram',
13218 + 'BBC Leicester': ENGLAND_RADIO_URI + 'leicester.ram',
13219 + 'BBC Lincolnshire': ENGLAND_RADIO_URI + 'lincolnshire.ram',
13220 + 'BBC Manchester': ENGLAND_RADIO_URI + 'manchester.ram',
13221 + 'BBC Merseyside': ENGLAND_RADIO_URI + 'merseyside.ram',
13222 + 'BBC Newcastle': ENGLAND_RADIO_URI + 'newcastle.ram',
13223 + 'BBC Norfolk': ENGLAND_RADIO_URI + 'norfolk.ram',
13224 + 'BBC Northampton': ENGLAND_RADIO_URI + 'northampton.ram',
13225 + 'BBC Nottingham': ENGLAND_RADIO_URI + 'nottingham.ram',
13226 + 'BBC Oxford': ENGLAND_RADIO_URI + 'radiooxford.ram',
13227 + 'BBC Sheffield': ENGLAND_RADIO_URI + 'sheffield.ram',
13228 + 'BBC Shropshire': ENGLAND_RADIO_URI + 'shropshire.ram',
13229 + 'BBC Solent': ENGLAND_RADIO_URI + 'solent.ram',
13230 + 'BBC Somerset Sound': ENGLAND_RADIO_URI + 'somerset.ram',
13231 + 'BBC Southern Counties Radio': ENGLAND_RADIO_URI + 'southerncounties.ram',
13232 + 'BBC Stoke': ENGLAND_RADIO_URI + 'stoke.ram',
13233 + 'BBC Suffolk': ENGLAND_RADIO_URI + 'suffolk.ram',
13234 + 'BBC Swindon': ENGLAND_RADIO_URI + 'swindon.ram',
13235 + 'BBC Three Counties Radio': ENGLAND_RADIO_URI + 'threecounties.ram',
13236 + 'BBC Wiltshire': ENGLAND_RADIO_URI + 'wiltshire.ram',
13237 + 'BBC York': ENGLAND_RADIO_URI + 'york.ram',
13238 + 'BBC WM': ENGLAND_RADIO_URI + 'wm.ram',
13239 + 'BBC Cymru': 'http://www.bbc.co.uk/cymru/live/rc-live.ram',
13240 + 'Radio Foyle': 'http://www.bbc.co.uk/northernireland/realmedia/rf-live.ram',
13241 + 'BBC Scotland': 'http://www.bbc.co.uk/scotland/radioscotland/media/'\
13242 + 'radioscotland.ram',
13243 + 'BBC nan Gaidheal': 'http://www.bbc.co.uk/scotland/alba/media/live/'\
13244 + 'radio_ng.ram',
13245 + 'BBC Ulster': 'http://www.bbc.co.uk/ni/realmedia/ru-live.ram',
13246 + 'BBC Wales': 'http://www.bbc.co.uk/wales/live/rwg2.ram',
13247 + 'BBC Tees': ENGLAND_RADIO_URI + 'cleveland.ram',
13250 +LIVE_WEBCAMS = {
13251 + 'Radio 1': 'http://www.bbc.co.uk/radio1/webcam/images/live/webcam.jpg',
13252 + '1 Xtra': 'http://www.bbc.co.uk/1xtra/webcam/live/1xtraa.jpg',
13253 + 'Radio 2': 'http://www.bbc.co.uk/radio2/webcam/live/radio2.jpg',
13254 + '5 Live': 'http://www.bbc.co.uk/fivelive/inside/webcam/5Lwebcam1.jpg',
13255 + '6 Music': 'http://www.bbc.co.uk/6music/webcam/live/6music.jpg',
13256 + 'Asian Network': 'http://www.bbc.co.uk/asiannetwork/webcams/birmingham.jpg'
13259 +RSS_CACHE = {}
13261 +SELF_CLOSING_TAGS = ['alternate', 'mediator']
13263 +HTTP_OBJECT = httplib2.Http ()
13265 +class NoItemsError (Exception):
13266 + def __init__ (self, reason=None):
13267 + Exception.__init__ (self)
13268 self.reason = reason
13270 - def __str__(self):
13271 + def __str__ (self):
13272 reason = self.reason or _(u'<no reason given>')
13273 return _(u'Programme unavailable ("%s")') % (reason)
13275 -class memoize(object):
13276 - def __init__(self, func):
13277 - self.func = func
13278 - self._cache = {}
13279 - def __call__(self, *args, **kwds):
13280 - key = args
13281 - if kwds:
13282 - items = kwds.items()
13283 - items.sort()
13284 - key = key + tuple(items)
13285 - if key in self._cache:
13286 - return self._cache[key]
13287 - self._cache[key] = result = self.func(*args, **kwds)
13288 - return result
13290 -def httpretrieve(url, filename):
13291 - _, data = http.request(url, 'GET')
13292 - f = open(filename, 'wb')
13293 - f.write(data)
13294 - f.close()
13296 -def httpget(url):
13297 - resp, data = http.request(url, 'GET')
13298 +def httpget (url):
13299 + _response, data = HTTP_OBJECT.request (url, 'GET')
13300 return data
13302 -def parse_entry_id(entry_id):
13303 +def parse_entry_id (entry_id):
13304 # tag:bbc.co.uk,2008:PIPS:b00808sc
13305 - r = re.compile('PIPS:([0-9a-z]{8})')
13306 - matches = r.findall(entry_id)
13307 - if not matches: return None
13308 + regexp = re.compile ('PIPS: ([0-9a-z]{8})')
13309 + matches = regexp.findall (entry_id)
13310 + if not matches:
13311 + return None
13312 return matches[0]
13314 -class media(object):
13315 - def __init__(self, item, media_node):
13316 +class Media (object):
13317 + def __init__ (self, item, media_node):
13318 self.item = item
13319 self.href = None
13320 self.kind = None
13321 self.method = None
13322 self.width, self.height = None, None
13323 - self.read_media_node(media_node)
13324 + self.__read_media_node (media_node)
13326 + self.mimetype = None
13327 + self.encoding = None
13328 + self.live = False
13329 + self.connection_href = None
13330 + self.connection_protocol = None
13331 + self.connection_method = None
13332 + self.connection_kind = None
13333 + self.connection_live = False
13335 @property
13336 - def url(self):
13337 + def url (self):
13338 if self.connection_method == 'resolve':
13339 - #logging.info("Resolving URL %s", self.connection_href)
13340 - page = urllib2.urlopen(self.connection_href)
13341 - page.close()
13342 - url = page.geturl()
13343 - #logging.info("URL resolved to %s", url)
13344 - return page.geturl()
13345 + #logging.info ("Resolving URL %s", self.connection_href)
13346 + page = urllib2.urlopen (self.connection_href)
13347 + page.close ()
13348 + url = page.geturl ()
13349 + #logging.info ("URL resolved to %s", url)
13350 + return url
13351 else:
13352 return self.connection_href
13354 @property
13355 - def application(self):
13356 + def application (self):
13358 The type of stream represented as a string.
13359 - i.e. 'captions', 'flashhigh', 'flashmed', 'flashwii', 'mobile', 'mp3' or 'real'
13360 + i.e. 'captions', 'flashhigh', 'flashmed', 'flashwii', 'mobile', 'mp3'
13361 + or 'real'
13363 tep = {}
13364 tep['captions', 'application/ttaf+xml', None, 'http'] = 'captions'
13365 @@ -366,29 +354,30 @@ class media(object):
13366 tep['video', 'video/mpeg', 'h264', 'http'] = 'mobile'
13367 tep['audio', 'audio/mpeg', 'mp3', 'rtmp'] = 'mp3'
13368 tep['audio', 'audio/real', 'real', 'http'] = 'real'
13369 - me = (self.kind, self.mimetype, self.encoding, self.connection_protocol)
13370 - return tep.get(me, None)
13371 + media = (self.kind, self.mimetype, self.encoding,
13372 + self.connection_protocol)
13373 + return tep.get (media, None)
13375 - def read_media_node(self, media, resolve=False):
13376 + def __read_media_node (self, media):
13378 Reads media info from a media XML node
13379 media: media node from BeautifulStoneSoup
13381 - self.kind = media.get('kind')
13382 - self.mimetype = media.get('type')
13383 - self.encoding = media.get('encoding')
13384 - self.width, self.height = media.get('width'), media.get('height')
13385 - self.live = media.get('live') == 'true'
13387 - conn = media.find('connection')
13388 - self.connection_kind = conn.get('kind')
13389 - self.connection_live = conn.get('live') == 'true'
13390 + self.kind = media.get ('kind')
13391 + self.mimetype = media.get ('type')
13392 + self.encoding = media.get ('encoding')
13393 + self.width, self.height = media.get ('width'), media.get ('height')
13394 + self.live = media.get ('live') == 'true'
13396 + conn = media.find ('connection')
13397 + self.connection_kind = conn.get ('kind')
13398 + self.connection_live = conn.get ('live') == 'true'
13399 self.connection_protocol = None
13400 self.connection_href = None
13401 self.connection_method = None
13403 if self.connection_kind in ['http', 'sis']: # http
13404 - self.connection_href = conn.get('href')
13405 + self.connection_href = conn.get ('href')
13406 self.connection_protocol = 'http'
13407 if self.mimetype == 'video/mp4' and self.encoding == 'h264':
13408 # iPhone, don't redirect or it goes to license failure page
13409 @@ -399,35 +388,41 @@ class media(object):
13410 self.connection_method = 'resolve'
13411 elif self.connection_kind in ['level3', 'akamai']: #rtmp
13412 self.connection_protocol = 'rtmp'
13413 - server = conn.get('server')
13414 - identifier = conn.get('identifier')
13415 + server = conn.get ('server')
13416 + identifier = conn.get ('identifier')
13418 if not self.connection_live:
13419 - #logging.error("No support for live streams!")
13420 - auth = conn.get('authstring')
13421 - params = dict(ip=server, server=server, auth=auth, identifier=identifier)
13422 - self.connection_href = "rtmp://%(ip)s:1935/ondemand?_fcs_vhost=%(server)s&auth=%(auth)s&aifp=v001&slist=%(identifier)s" % params
13423 + #logging.error ("No support for live streams!")
13424 + auth = conn.get ('authstring')
13425 + params = dict (ip=server, server=server, auth=auth,
13426 + identifier=identifier)
13427 + self.connection_href = "rtmp://%(ip)s:1935/ondemand"\
13428 + "?_fcs_vhost=%(server)s&auth=%(auth)s"\
13429 + "&aifp=v001"\
13430 + "&slist=%(identifier)s" % params
13431 #else:
13432 - # logging.error("connectionkind %s unknown", self.connection_kind)
13433 + # logging.error ("connectionkind %s unknown", self.connection_kind)
13435 #if self.connection_protocol:
13436 - # logging.info("conn protocol: %s - conn kind: %s - media type: %s - media encoding: %s" %
13437 - # (self.connection_protocol, self.connection_kind, self.mimetype, self.encoding))
13438 - # logging.info("conn href: %s", self.connection_href)
13439 + # logging.info ("conn protocol: %s - conn kind: %s - media type: "\
13440 + # "%s - media encoding: %s" %
13441 + # (self.connection_protocol, self.connection_kind,
13442 + # self.mimetype, self.encoding))
13443 + # logging.info ("conn href: %s", self.connection_href)
13445 @property
13446 - def programme(self):
13447 + def programme (self):
13448 return self.item.programme
13450 -class item(object):
13451 +class Item (object):
13453 - Represents an iPlayer programme item. Most programmes consist of 2 such items,
13454 - (1) the ident, and (2) the actual programme. The item specifies the properties
13455 - of the media available, such as whether it's a radio/TV programme, if it's live,
13456 - signed, etc.
13457 + Represents an iPlayer programme item. Most programmes consist of 2 such
13458 + items, (1) the ident, and (2) the actual programme. The item specifies the
13459 + properties of the media available, such as whether it's a radio/TV
13460 + programme, if it's live, signed, etc.
13463 - def __init__(self, programme, item_node):
13464 + def __init__ (self, programme, item_node):
13466 programme: a programme object that represents the 'parent' of this item.
13467 item_node: an XML &lt;item&gt; node representing this item.
13468 @@ -440,77 +435,83 @@ class item(object):
13469 self.alternate = None
13470 self.duration = ''
13471 self.medias = None
13472 - self.read_item_node(item_node)
13473 + self.group = None
13474 + self.kind = None
13475 + self.live = False
13476 + self.__read_item_node (item_node)
13478 - def read_item_node(self, node):
13479 + def __read_item_node (self, node):
13481 Reads the specified XML &lt;item&gt; node and sets this instance's
13482 properties.
13484 - self.kind = node.get('kind')
13485 - self.identifier = node.get('identifier')
13486 - #logging.info('Found item: %s, %s', self.kind, self.identifier)
13487 + self.kind = node.get ('kind')
13488 + self.identifier = node.get ('identifier')
13489 + #logging.info ('Found item: %s, %s', self.kind, self.identifier)
13490 if self.kind in ['programme', 'radioProgramme']:
13491 - self.live = node.get('live') == 'true'
13492 - #self.title = node.get('title')
13493 - self.group = node.get('group')
13494 - self.duration = node.get('duration')
13495 + self.live = node.get ('live') == 'true'
13496 + #self.title = node.get ('title')
13497 + self.group = node.get ('group')
13498 + self.duration = node.get ('duration')
13499 #self.broadcast = node.broadcast
13500 - self.service = node.service and node.service.get('id')
13501 - self.masterbrand = node.masterbrand and node.masterbrand.get('id')
13502 - self.alternate = node.alternate and node.alternate.get('id')
13503 + self.service = node.service and node.service.get ('id')
13504 + self.masterbrand = node.masterbrand and node.masterbrand.get ('id')
13505 + self.alternate = node.alternate and node.alternate.get ('id')
13506 self.guidance = node.guidance
13508 @property
13509 - def is_radio(self):
13510 + def is_radio (self):
13511 """ True if this stream is a radio programme. """
13512 return self.kind == 'radioProgramme'
13514 @property
13515 - def is_tv(self):
13516 + def is_tv (self):
13517 """ True if this stream is a TV programme. """
13518 return self.kind == 'programme'
13520 @property
13521 - def is_ident(self):
13522 + def is_ident (self):
13523 """ True if this stream is an ident. """
13524 return self.kind == 'ident'
13526 @property
13527 - def is_programme(self):
13528 + def is_programme (self):
13529 """ True if this stream is a programme (TV or Radio). """
13530 return self.is_radio or self.is_tv
13532 @property
13533 - def is_live(self):
13534 + def is_live (self):
13535 """ True if this stream is being broadcast live. """
13536 return self.live
13538 @property
13539 - def is_signed(self):
13540 + def is_signed (self):
13541 """ True if this stream is 'signed' for the hard-of-hearing. """
13542 return self.alternate == 'signed'
13544 @property
13545 - def mediaselector_url(self):
13546 - return "http://www.bbc.co.uk/mediaselector/4/mtis/stream/%s" % self.identifier
13547 + def mediaselector_url (self):
13548 + url = "http://www.bbc.co.uk/mediaselector/4/mtis/stream/%s"
13549 + return url % self.identifier
13551 @property
13552 - def media(self):
13553 + def media (self):
13555 Returns a list of all the media available for this item.
13557 - if self.medias: return self.medias
13558 + if self.medias:
13559 + return self.medias
13560 url = self.mediaselector_url
13561 - #logging.info("Stream XML URL: %s", str(url))
13562 - _, xml = http.request(url)
13563 - soup = BeautifulStoneSoup(xml, convertEntities = BeautifulStoneSoup.XML_ENTITIES)
13564 - medias = [media(self, m) for m in soup('media')]
13565 - #logging.info('Found media: %s', pformat(medias, indent=8))
13566 + #logging.info ("Stream XML URL: %s", str (url))
13567 + _response, xml = HTTP_OBJECT.request (url)
13568 + entities = BeautifulStoneSoup.XML_ENTITIES
13569 + soup = BeautifulStoneSoup (xml, convertEntities = entities)
13570 + medias = [Media (self, m) for m in soup ('media')]
13571 + #logging.info ('Found media: %s', pformat (medias, indent=8))
13572 self.medias = medias
13573 return medias
13575 - def get_media_for(self, application):
13576 + def get_media_for (self, application):
13578 Returns a media object for the given application type.
13580 @@ -519,250 +520,253 @@ class item(object):
13581 return None
13582 return medias[0]
13584 - def get_medias_for(self, applications):
13585 + def get_medias_for (self, applications):
13587 Returns a dictionary of media objects for the given application types.
13589 medias = [m for m in self.media if m.application in applications]
13590 - d = {}.fromkeys(applications)
13591 - for m in medias:
13592 - d[m.application] = m
13593 - return d
13594 + dictionary = {}.fromkeys (applications)
13595 + for media in medias:
13596 + dictionary[media.application] = media
13597 + return dictionary
13599 -class programme(object):
13600 +class Programme (object):
13602 - Represents an individual iPlayer programme, as identified by an 8-letter PID,
13603 - and contains the programme title, subtitle, broadcast time and list of playlist
13604 - items (e.g. ident and then the actual programme.)
13605 + Represents an individual iPlayer programme, as identified by an 8-letter
13606 + PID, and contains the programme title, subtitle, broadcast time and list of
13607 + playlist items (e.g. ident and then the actual programme.)
13610 - def __init__(self, pid):
13611 + def __init__ (self, pid):
13612 self.pid = pid
13613 self.meta = {}
13614 self._items = []
13615 self._related = []
13617 @call_once
13618 - def read_playlist(self):
13619 - #logging.info('Read playlist for %s...', self.pid)
13620 - self.parse_playlist(self.playlist)
13621 + def __read_playlist (self):
13622 + #logging.info ('Read playlist for %s...', self.pid)
13623 + self.__parse_playlist (self.playlist)
13625 - def get_playlist_xml(self):
13626 + def get_playlist_xml (self):
13627 """ Downloads and returns the XML for a PID from the iPlayer site. """
13628 try:
13629 url = self.playlist_url
13630 - #logging.info("Getting XML playlist at URL: %s", url)
13631 - r, xml = http.request(url, 'GET')
13632 + #logging.info ("Getting XML playlist at URL: %s", url)
13633 + _response, xml = HTTP_OBJECT.request (url, 'GET')
13634 return xml
13635 except SocketTimeoutError:
13636 - #logging.error("Timed out trying to download programme XML")
13637 + #logging.error ("Timed out trying to download programme XML")
13638 raise
13640 - def parse_playlist(self, xml):
13641 - #logging.info('Parsing playlist XML... %s', xml)
13642 - #xml.replace('<summary/>', '<summary></summary>')
13643 - #xml = fix_selfclosing(xml)
13644 + def __parse_playlist (self, xml):
13645 + #logging.info ('Parsing playlist XML... %s', xml)
13647 - soup = BeautifulStoneSoup(xml, selfClosingTags=self_closing_tags, convertEntities = BeautifulStoneSoup.XML_ENTITIES)
13648 + entities = BeautifulStoneSoup.XML_ENTITIES
13649 + soup = BeautifulStoneSoup (xml, selfClosingTags = SELF_CLOSING_TAGS,
13650 + convertEntities = entities)
13652 self.meta = {}
13653 self._items = []
13654 self._related = []
13656 - #logging.info(' Found programme: %s', soup.playlist.title.string)
13657 + #logging.info (' Found programme: %s', soup.playlist.title.string)
13658 self.meta['title'] = soup.playlist.title.string.encode ('utf-8')
13659 self.meta['summary'] = soup.playlist.summary.string.encode ('utf-8')
13660 self.meta['updated'] = soup.playlist.updated.string
13662 if soup.playlist.noitems:
13663 - #logging.info('No playlist items: %s', soup.playlist.noitems.get('reason'))
13664 - self.meta['reason'] = soup.playlist.noitems.get('reason')
13665 + #logging.info ('No playlist items: %s',
13666 + # soup.playlist.noitems.get ('reason'))
13667 + self.meta['reason'] = soup.playlist.noitems.get ('reason')
13669 - self._items = [item(self, i) for i in soup('item')]
13670 + self._items = [Item (self, i) for i in soup ('item')]
13671 #for i in self._items:
13672 # print i, i.alternate , " ",
13673 #print
13675 - rId = re.compile('concept_pid:([a-z0-9]{8})')
13676 - for link in soup('relatedlink'):
13677 + id_regexp = re.compile ('concept_pid: ([a-z0-9]{8})')
13678 + for link in soup ('relatedlink'):
13679 i = {}
13680 i['title'] = link.title.string
13681 #i['summary'] = item.summary # FIXME looks like a bug in BSS
13682 - i['pid'] = (rId.findall(link.id.string) or [None])[0]
13683 - i['programme'] = programme(i['pid'])
13684 - self._related.append(i)
13685 + i['pid'] = (id_regexp.findall (link.id.string) or [None])[0]
13686 + i['programme'] = Programme (i['pid'])
13687 + self._related.append (i)
13689 - def get_thumbnail(self, size='large', tvradio='tv'):
13690 + def get_thumbnail (self, size='large', tvradio='tv'):
13692 Returns the URL of a thumbnail.
13693 size: '640x360'/'biggest'/'largest' or '512x288'/'big'/'large' or None
13695 + url_format = "http://www.bbc.co.uk/iplayer/images/episode/%s_%d_%d.jpg"
13697 if size in ['640x360', '640x', 'x360', 'biggest', 'largest']:
13698 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_640_360.jpg" % (self.pid)
13699 + return url_format % (self.pid, 640, 360)
13700 elif size in ['512x288', '512x', 'x288', 'big', 'large']:
13701 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_512_288.jpg" % (self.pid)
13702 + return url_format % (self.pid, 512, 288)
13703 elif size in ['178x100', '178x', 'x100', 'small']:
13704 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_178_100.jpg" % (self.pid)
13705 + return url_format % (self.pid, 178, 100)
13706 elif size in ['150x84', '150x', 'x84', 'smallest']:
13707 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_150_84.jpg" % (self.pid)
13708 + return url_format % (self.pid, 150, 84)
13709 else:
13710 - return os.path.join(IMG_DIR, '%s.png' % tvradio)
13711 + return os.path.join (IMG_DIR, '%s.png' % tvradio)
13714 - def get_url(self):
13715 + def get_url (self):
13717 Returns the programmes episode page.
13719 return "http://www.bbc.co.uk/iplayer/episode/%s" % (self.pid)
13721 @property
13722 - def playlist_url(self):
13723 + def playlist_url (self):
13724 return "http://www.bbc.co.uk/iplayer/playlist/%s" % self.pid
13726 @property
13727 - def playlist(self):
13728 - return self.get_playlist_xml()
13729 + def playlist (self):
13730 + return self.get_playlist_xml ()
13732 - def get_updated(self):
13733 + def get_updated (self):
13734 return self.meta['updated']
13736 - @loaded_by(read_playlist)
13737 - def get_title(self):
13738 + @loaded_by (__read_playlist)
13739 + def get_title (self):
13740 return self.meta['title']
13742 - @loaded_by(read_playlist)
13743 - def get_summary(self):
13744 + @loaded_by (__read_playlist)
13745 + def get_summary (self):
13746 return self.meta['summary']
13748 - @loaded_by(read_playlist)
13749 - def get_related(self):
13750 + @loaded_by (__read_playlist)
13751 + def get_related (self):
13752 return self._related
13754 - @loaded_by(read_playlist)
13755 - def get_items(self):
13756 + @loaded_by (__read_playlist)
13757 + def get_items (self):
13758 if not self._items:
13759 - raise NoItemsError(self.meta['reason'])
13760 + raise NoItemsError (self.meta['reason'])
13761 return self._items
13763 @property
13764 - def programme(self):
13765 + def programme (self):
13766 for i in self.items:
13767 if i.is_programme:
13768 return i
13769 return None
13771 - title = property(get_title)
13772 - summary = property(get_summary)
13773 - updated = property(get_updated)
13774 - thumbnail = property(get_thumbnail)
13775 - related = property(get_related)
13776 - items = property(get_items)
13777 + title = property (get_title)
13778 + summary = property (get_summary)
13779 + updated = property (get_updated)
13780 + thumbnail = property (get_thumbnail)
13781 + related = property (get_related)
13782 + items = property (get_items)
13784 -#programme = memoize(programme)
13787 -class programme_simple(object):
13788 +class ProgrammeSimple (object):
13790 - Represents an individual iPlayer programme, as identified by an 8-letter PID,
13791 - and contains the programme pid, title, subtitle etc
13792 + Represents an individual iPlayer programme, as identified by an 8-letter
13793 + PID, and contains the programme pid, title, subtitle etc
13796 - def __init__(self, pid, entry):
13797 + def __init__ (self, pid, entry):
13798 self.pid = pid
13799 self.meta = {}
13800 self.meta['title'] = entry.title
13801 self.meta['summary'] = entry.summary
13802 self.meta['updated'] = entry.updated
13803 self.categories = []
13804 - for c in entry.categories:
13805 - if c != 'TV':
13806 - self.categories.append(c.rstrip())
13807 + for category in entry.categories:
13808 + if category != 'TV':
13809 + self.categories.append (category.rstrip ())
13810 self._items = []
13811 self._related = []
13813 @call_once
13814 - def read_playlist(self):
13815 + def __read_playlist (self):
13816 pass
13818 - def get_playlist_xml(self):
13819 + def get_playlist_xml (self):
13820 pass
13822 - def parse_playlist(self, xml):
13823 + def __parse_playlist (self, xml):
13824 pass
13826 - def get_thumbnail(self, size='large', tvradio='tv'):
13827 + def get_thumbnail (self, size='large', tvradio='tv'):
13829 Returns the URL of a thumbnail.
13830 size: '640x360'/'biggest'/'largest' or '512x288'/'big'/'large' or None
13832 + url_format = "http://www.bbc.co.uk/iplayer/images/episode/%s_%d_%d.jpg"
13834 if size in ['640x360', '640x', 'x360', 'biggest', 'largest']:
13835 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_640_360.jpg" % (self.pid)
13836 + return url_format % (self.pid, 640, 360)
13837 elif size in ['512x288', '512x', 'x288', 'big', 'large']:
13838 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_512_288.jpg" % (self.pid)
13839 + return url_format % (self.pid, 512, 288)
13840 elif size in ['178x100', '178x', 'x100', 'small']:
13841 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_178_100.jpg" % (self.pid)
13842 + return url_format % (self.pid, 178, 100)
13843 elif size in ['150x84', '150x', 'x84', 'smallest']:
13844 - return "http://www.bbc.co.uk/iplayer/images/episode/%s_150_84.jpg" % (self.pid)
13845 + return url_format % (self.pid, 150, 84)
13846 else:
13847 - return os.path.join(IMG_DIR, '%s.png' % tvradio)
13848 + return os.path.join (IMG_DIR, '%s.png' % tvradio)
13851 - def get_url(self):
13852 + def get_url (self):
13854 Returns the programmes episode page.
13856 return "http://www.bbc.co.uk/iplayer/episode/%s" % (self.pid)
13858 @property
13859 - def playlist_url(self):
13860 + def playlist_url (self):
13861 return "http://www.bbc.co.uk/iplayer/playlist/%s" % self.pid
13863 @property
13864 - def playlist(self):
13865 - return self.get_playlist_xml()
13866 + def playlist (self):
13867 + return self.get_playlist_xml ()
13869 - def get_updated(self):
13870 + def get_updated (self):
13871 return self.meta['updated']
13873 - @loaded_by(read_playlist)
13874 - def get_title(self):
13875 + @loaded_by (__read_playlist)
13876 + def get_title (self):
13877 return self.meta['title']
13879 - @loaded_by(read_playlist)
13880 - def get_summary(self):
13881 + @loaded_by (__read_playlist)
13882 + def get_summary (self):
13883 return self.meta['summary']
13885 - @loaded_by(read_playlist)
13886 - def get_related(self):
13887 + @loaded_by (__read_playlist)
13888 + def get_related (self):
13889 return self._related
13891 - @loaded_by(read_playlist)
13892 - def get_items(self):
13893 + @loaded_by (__read_playlist)
13894 + def get_items (self):
13895 if not self._items:
13896 - raise NoItemsError(self.meta['reason'])
13897 + raise NoItemsError (self.meta['reason'])
13898 return self._items
13900 @property
13901 - def programme(self):
13902 + def programme (self):
13903 for i in self.items:
13904 if i.is_programme:
13905 return i
13906 return None
13908 - title = property(get_title)
13909 - summary = property(get_summary)
13910 - updated = property(get_updated)
13911 - thumbnail = property(get_thumbnail)
13912 - related = property(get_related)
13913 - items = property(get_items)
13914 + title = property (get_title)
13915 + summary = property (get_summary)
13916 + updated = property (get_updated)
13917 + thumbnail = property (get_thumbnail)
13918 + related = property (get_related)
13919 + items = property (get_items)
13922 -class feed(object):
13923 - def __init__(self, tvradio=None, channel=None, category=None, subcategory=None, atoz=None, searchterm=None):
13924 +class Feed (object):
13925 + def __init__ (self, tvradio = None, channel = None, category = None,
13926 + subcategory = None, atoz = None, searchterm = None):
13928 Creates a feed for the specified channel/category/whatever.
13929 - tvradio: type of channel - 'tv' or 'radio'. If a known channel is specified, use 'auto'.
13930 + tvradio: type of channel - 'tv' or 'radio'. If a known channel is
13931 + specified, use 'auto'.
13932 channel: name of channel, e.g. 'bbc_one'
13933 category: category name, e.g. 'drama'
13934 subcategory: subcategory name, e.g. 'period_drama'
13935 @@ -770,14 +774,15 @@ class feed(object):
13937 if tvradio == 'auto':
13938 if not channel and not searchterm:
13939 - raise Exception, "Must specify channel or searchterm when using 'auto'"
13940 - elif channel in channels_tv:
13941 + raise Exception, "Must specify channel or searchterm when "\
13942 + "using 'auto'"
13943 + elif channel in CHANNELS_TV:
13944 self.tvradio = 'tv'
13945 - elif channel in channels_radio:
13946 + elif channel in CHANNELS_RADIO:
13947 self.tvradio = 'radio'
13948 else:
13949 - raise Exception, "TV channel '%s' not recognised." % self.channel
13951 + raise Exception, "TV channel '%s' not "\
13952 + "recognised." % channel
13953 elif tvradio in ['tv', 'radio']:
13954 self.tvradio = tvradio
13955 else:
13956 @@ -788,12 +793,15 @@ class feed(object):
13957 self.atoz = atoz
13958 self.searchterm = searchterm
13960 - def create_url(self, listing):
13961 + def __create_url (self, listing):
13963 <channel>/['list'|'popular'|'highlights']
13964 - 'categories'/<category>(/<subcategory>)(/['tv'/'radio'])/['list'|'popular'|'highlights']
13965 + 'categories'/<category> (/<subcategory>) \
13966 + (/['tv'/'radio'])/['list'|'popular'|'highlights']
13968 - assert listing in ['list', 'popular', 'highlights'], "Unknown listing type"
13969 + assert listing in ['list', 'popular', 'highlights'], "Unknown "\
13970 + "listing type"
13972 if self.searchterm:
13973 path = ['search']
13974 if self.tvradio:
13975 @@ -819,205 +827,215 @@ class feed(object):
13976 assert listing != 'list', "Can't list at tv/radio level'"
13977 path = [listing, self.tvradio]
13979 - return "http://feeds.bbc.co.uk/iplayer/" + '/'.join(path)
13980 + return "http://feeds.bbc.co.uk/iplayer/" + '/'.join (path)
13982 - def get_name(self, separator=' '):
13983 + def get_name (self, separator=' '):
13985 - A readable title for this feed, e.g. 'BBC One' or 'TV Drama' or 'BBC One Drama'
13986 - separator: string to separate name parts with, defaults to ' '. Use None to return a list (e.g. ['TV', 'Drama']).
13987 + A readable title for this feed, e.g. 'BBC One' or 'TV Drama' or
13988 + 'BBC One Drama'
13989 + separator: string to separate name parts with, defaults to ' '.
13990 + Use None to return a list (e.g. ['TV', 'Drama']).
13992 path = []
13994 # TODO: This is not i18n-friendly whatsoever
13995 # if got a channel, don't need tv/radio distinction
13996 if self.channel:
13997 - assert self.channel in channels_tv or self.channel in channels_radio, 'Unknown channel'
13998 + assert (self.channel in CHANNELS_TV or
13999 + self.channel in CHANNELS_RADIO), 'Unknown channel'
14000 #print self.tvradio
14001 if self.tvradio == 'tv':
14002 - path.append(channels_tv.get(self.channel, '(TV)'))
14003 + path.append (CHANNELS_TV.get (self.channel, ' (TV)'))
14004 else:
14005 - path.append(channels_radio.get(self.channel, '(Radio)'))
14006 + path.append (CHANNELS_RADIO.get (self.channel, ' (Radio)'))
14007 elif self.tvradio:
14008 # no channel
14009 medium = 'TV'
14010 - if self.tvradio == 'radio': medium = 'Radio'
14011 - path.append(medium)
14012 + if self.tvradio == 'radio':
14013 + medium = 'Radio'
14014 + path.append (medium)
14016 if self.searchterm:
14017 path += ['Search results for %s' % self.searchterm]
14019 if self.category:
14020 - assert self.category in categories, 'Unknown category'
14021 - path.append(categories.get(self.category, '(Category)'))
14022 + assert self.category in CATEGORIES, 'Unknown category'
14023 + path.append (CATEGORIES.get (self.category, ' (Category)'))
14025 if self.atoz:
14026 - path.append("beginning with %s" % self.atoz.upper())
14027 + path.append ("beginning with %s" % self.atoz.upper ())
14029 if separator != None:
14030 - return separator.join(path)
14031 + return separator.join (path)
14032 else:
14033 return path
14035 - def channels(self):
14036 + def channels (self):
14038 Return a list of available channels.
14040 - if self.channel: return None
14041 - if self.tvradio == 'tv': return channels_tv
14042 - if self.tvradio == 'radio': return channels_radio
14043 + if self.channel:
14044 + return None
14045 + if self.tvradio == 'tv':
14046 + return CHANNELS_TV
14047 + if self.tvradio == 'radio':
14048 + return CHANNELS_RADIO
14049 return None
14051 - def channels_feed(self):
14052 + def channels_feed (self):
14054 Return a list of available channels as a list of feeds.
14056 if self.channel:
14057 - #logging.warning("%s doesn\'t have any channels!", self.channel)
14058 + #logging.warning ("%s doesn\'t have any channels!", self.channel)
14059 return None
14060 if self.tvradio == 'tv':
14061 - return [feed('tv', channel=ch) for (ch, title) in channels_tv_list]
14062 + return [Feed ('tv', channel = ch)
14063 + for (ch, _title) in CHANNELS_TV_LIST]
14064 if self.tvradio == 'radio':
14065 - return [feed('radio', channel=ch) for (ch, title) in channels_radio_list]
14066 + return [Feed ('radio', channel = ch)
14067 + for (ch, _title) in CHANNELS_RADIO_LIST]
14068 return None
14070 - def subcategories(self):
14071 - raise NotImplementedError('Sub-categories not yet supported')
14072 + def subcategories (self):
14073 + raise NotImplementedError ('Sub-categories not yet supported')
14075 @classmethod
14076 - def is_atoz(self, letter):
14077 + def __is_atoz (cls, letter):
14079 - Return False if specified letter is not a valid 'A to Z' directory entry.
14080 - Otherwise returns the directory name.
14081 + Return False if specified letter is not a valid 'A to Z' directory
14082 + entry. Otherwise returns the directory name.
14084 - >>> feed.is_atoz('a'), feed.is_atoz('z')
14085 + >>> feed.__is_atoz ('a'), feed.__is_atoz ('z')
14086 ('a', 'z')
14087 - >>> feed.is_atoz('0'), feed.is_atoz('9')
14088 + >>> feed.__is_atoz ('0'), feed.__is_atoz ('9')
14089 ('0-9', '0-9')
14090 - >>> feed.is_atoz('123'), feed.is_atoz('abc')
14091 + >>> feed.__is_atoz ('123'), feed.__is_atoz ('abc')
14092 (False, False)
14093 - >>> feed.is_atoz('big british castle'), feed.is_atoz('')
14094 + >>> feed.__is_atoz ('big british castle'), feed.__is_atoz ('')
14095 (False, False)
14097 - l = letter.lower()
14098 - if len(l) != 1 and l != '0-9':
14099 + letter = letter.lower ()
14100 + if len (letter) != 1 and letter != '0-9':
14101 return False
14102 - if l in '0123456789': l = "0-9"
14103 - if l not in 'abcdefghijklmnopqrstuvwxyz0-9':
14104 + if letter in '0123456789':
14105 + letter = "0-9"
14106 + if letter not in 'abcdefghijklmnopqrstuvwxyz0-9':
14107 return False
14108 - return l
14109 + return letter
14111 - def sub(self, *args, **kwargs):
14112 + def sub (self, *_args, **kwargs):
14114 Clones this feed, altering the specified parameters.
14116 - >>> feed('tv').sub(channel='bbc_one').channel
14117 + >>> feed ('tv').sub (channel='bbc_one').channel
14118 'bbc_one'
14119 - >>> feed('tv', channel='bbc_one').sub(channel='bbc_two').channel
14120 + >>> feed ('tv', channel='bbc_one').sub (channel='bbc_two').channel
14121 'bbc_two'
14122 - >>> feed('tv', channel='bbc_one').sub(category='drama').category
14123 + >>> feed ('tv', channel='bbc_one').sub (category='drama').category
14124 'drama'
14125 - >>> feed('tv', channel='bbc_one').sub(channel=None).channel
14126 + >>> feed ('tv', channel='bbc_one').sub (channel=None).channel
14129 - d = self.__dict__.copy()
14130 - d.update(kwargs)
14131 - return feed(**d)
14132 + dictionary = self.__dict__.copy ()
14133 + dictionary.update (kwargs)
14134 + return Feed (**dictionary) # pylint: disable-msg=W0142
14136 - def get(self, subfeed):
14137 + def get (self, subfeed):
14139 Returns a child/subfeed of this feed.
14140 child: can be channel/cat/subcat/letter, e.g. 'bbc_one'
14142 if self.channel:
14143 - return self.sub(category=subfeed)
14144 + return self.sub (category = subfeed)
14145 elif self.category:
14146 # no children: TODO support subcategories
14147 return None
14148 - elif self.is_atoz(subfeed):
14149 - return self.sub(atoz=self.is_atoz(subfeed))
14150 + elif self.__is_atoz (subfeed):
14151 + return self.sub (atoz=self.__is_atoz (subfeed))
14152 else:
14153 - if subfeed in channels_tv: return feed('tv', channel=subfeed)
14154 - if subfeed in channels_radio: return feed('radio', channel=subfeed)
14155 + if subfeed in CHANNELS_TV:
14156 + return Feed ('tv', channel = subfeed)
14157 + if subfeed in CHANNELS_RADIO:
14158 + return Feed ('radio', channel = subfeed)
14159 # TODO handle properly oh pants
14160 return None
14162 @classmethod
14163 - def read_rss(self, url):
14164 - #logging.info('Read RSS: %s', url)
14165 - if url not in rss_cache:
14166 - #logging.info('Feed URL not in cache, requesting...')
14167 - xml = httpget(url)
14168 - progs = listparser.parse(xml)
14169 - if not progs: return []
14170 - d = []
14171 + def __read_rss (cls, url):
14172 + #logging.info ('Read RSS: %s', url)
14173 + if url not in RSS_CACHE:
14174 + #logging.info ('Feed URL not in cache, requesting...')
14175 + xml = httpget (url)
14176 + progs = listparser.parse (xml)
14177 + if not progs:
14178 + return []
14179 + cached_programmes = []
14180 for entry in progs.entries:
14181 - pid = parse_entry_id(entry.id)
14182 - p = programme(pid)
14183 - d.append(p)
14184 - #logging.info('Found %d entries', len(d))
14185 - rss_cache[url] = d
14186 + pid = parse_entry_id (entry.id)
14187 + programme = Programme (pid)
14188 + cached_programmes.append (programme)
14189 + #logging.info ('Found %d entries', len (d))
14190 + RSS_CACHE[url] = cached_programmes
14191 #else:
14192 - # logging.info('RSS found in cache')
14193 - return rss_cache[url]
14194 + # logging.info ('RSS found in cache')
14195 + return RSS_CACHE[url]
14197 - def popular(self):
14198 - return self.read_rss(self.create_url('popular'))
14199 + def popular (self):
14200 + return self.__read_rss (self.__create_url ('popular'))
14202 - def highlights(self):
14203 - return self.read_rss(self.create_url('highlights'))
14204 + def highlights (self):
14205 + return self.__read_rss (self.__create_url ('highlights'))
14207 - def list(self):
14208 - return self.read_rss(self.create_url('list'))
14209 + def list (self):
14210 + return self.__read_rss (self.__create_url ('list'))
14212 - def categories(self):
14213 + def categories (self):
14214 # quick and dirty category extraction and count
14215 - xmlURL = self.create_url('list')
14216 - xml = httpget(xmlURL)
14217 - cat = re.findall( "<category .*term=\"(.*?)\"", xml )
14218 + xml_url = self.__create_url ('list')
14219 + xml = httpget (xml_url)
14220 + cat = re.findall ("<category .*term=\" (.*?)\"", xml)
14221 categories = {}
14222 - for c in cat:
14223 - if c != 'TV':
14224 - if not categories.has_key(c): categories[c] = 0
14225 - categories[c] += 1
14226 - alist=[]
14227 - k = categories.keys()
14228 - k.sort()
14229 - for c in k:
14230 - n = categories[c]
14231 - c = c.replace('&amp;', '&')
14232 - c = c.replace('&gt;', '>')
14233 - c = c.replace('&lt;', '<')
14234 - alist.append((c, n))
14235 + for category in cat:
14236 + if category != 'TV':
14237 + if not categories.has_key (category):
14238 + categories[category] = 0
14239 + categories[category] += 1
14240 + alist = []
14241 + category_keys = categories.keys ()
14242 + category_keys.sort ()
14243 + for category in category_keys:
14244 + name = categories[category]
14245 + category = category.replace ('&amp;', '&')
14246 + category = category.replace ('&gt;', '>')
14247 + category = category.replace ('&lt;', '<')
14248 + alist.append ((category, name))
14249 return alist
14251 @property
14252 - def is_radio(self):
14253 + def is_radio (self):
14254 """ True if this feed is for radio. """
14255 return self.tvradio == 'radio'
14257 @property
14258 - def is_tv(self):
14259 + def is_tv (self):
14260 """ True if this feed is for tv. """
14261 return self.tvradio == 'tv'
14263 - name = property(get_name)
14266 -tv = feed('tv')
14267 -radio = feed('radio')
14269 -def test():
14270 - tv = feed('tv')
14271 - print tv.popular()
14272 - print tv.channels()
14273 - print tv.get('bbc_one')
14274 - print tv.get('bbc_one').list()
14275 - for c in tv.get('bbc_one').categories():
14276 - print c
14277 - #print tv.get('bbc_one').channels()
14278 - #print tv.categories()
14279 - #print tv.get('drama').list()
14280 - #print tv.get('drama').get_subcategory('period').list()
14281 + name = property (get_name)
14283 +def test ():
14284 + tv_feed = Feed ('tv')
14285 + print tv_feed.popular ()
14286 + print tv_feed.channels ()
14287 + print tv_feed.get ('bbc_one')
14288 + print tv_feed.get ('bbc_one').list ()
14289 + for category in tv_feed.get ('bbc_one').categories ():
14290 + print category
14291 + #print tv_feed.get ('bbc_one').channels ()
14292 + #print tv_feed.categories ()
14293 + #print tv_feed.get ('drama').list ()
14294 + #print tv_feed.get ('drama').get_subcategory ('period').list ()
14296 if __name__ == '__main__':
14297 - test()
14298 + test ()
14299 diff --git a/src/plugins/jamendo/Makefile.am b/src/plugins/jamendo/Makefile.am
14300 deleted file mode 100644
14301 index cec1f4c..0000000
14302 --- a/src/plugins/jamendo/Makefile.am
14303 +++ /dev/null
14304 @@ -1,22 +0,0 @@
14305 -include $(top_srcdir)/src/plugins/Makefile.plugins
14307 -plugindir = $(PLUGINDIR)/jamendo
14308 -plugin_PYTHON = jamendo.py
14310 -plugin_in_files = jamendo.plugin.in
14312 -uidir = $(plugindir)
14313 -ui_DATA = jamendo.ui
14314 -EXTRA_DIST += $(ui_DATA)
14316 -@INTLTOOL_XML_NOMERGE_RULE@
14317 -@GSETTINGS_RULES@
14319 -gsettings_SCHEMAS = org.gnome.totem.plugins.jamendo.gschema.xml
14320 -CLEANFILES += $(gsettings_SCHEMAS)
14322 -convertdir = $(datadir)/GConf/gsettings
14323 -convert_DATA = jamendo.convert
14324 -EXTRA_DIST += jamendo.convert
14326 --include $(top_srcdir)/git.mk
14327 diff --git a/src/plugins/jamendo/jamendo.convert b/src/plugins/jamendo/jamendo.convert
14328 deleted file mode 100644
14329 index 5acafaa..0000000
14330 --- a/src/plugins/jamendo/jamendo.convert
14331 +++ /dev/null
14332 @@ -1,3 +0,0 @@
14333 -[org.gnome.totem.plugins.jamendo]
14334 -num-per-page = /apps/totem/plugins/jamendo/num_per_page
14335 -format = /apps/totem/plugins/jamendo/format
14336 diff --git a/src/plugins/jamendo/jamendo.plugin.in b/src/plugins/jamendo/jamendo.plugin.in
14337 deleted file mode 100644
14338 index d359cbb..0000000
14339 --- a/src/plugins/jamendo/jamendo.plugin.in
14340 +++ /dev/null
14341 @@ -1,9 +0,0 @@
14342 -[Plugin]
14343 -Loader=python
14344 -Module=jamendo
14345 -IAge=1
14346 -_Name=Jamendo
14347 -_Description=Listen to the large collection of Creative Commons licensed music on Jamendo.
14348 -Authors=David Jean Louis <izimobil@gmail.com>
14349 -Copyright=Copyright © 2008 David Jean Louis
14350 -Website=http://www.jamendo.com
14351 diff --git a/src/plugins/jamendo/jamendo.py b/src/plugins/jamendo/jamendo.py
14352 deleted file mode 100644
14353 index 76e28a1..0000000
14354 --- a/src/plugins/jamendo/jamendo.py
14355 +++ /dev/null
14356 @@ -1,687 +0,0 @@
14357 -# -*- coding: utf-8 -*-
14359 -# Copyright (c) 2008 David JL <izimobil@gmail.com>
14361 -# Permission is hereby granted, free of charge, to any person obtaining a
14362 -# copy of this software and associated documentation files (the "Software"),
14363 -# to deal in the Software without restriction, including without limitation
14364 -# the rights to use, copy, modify, merge, publish, distribute, sublicense,
14365 -# and/or sell copies of the Software, and to permit persons to whom the
14366 -# Software is furnished to do so, subject to the following conditions:
14368 -# The above copyright notice and this permission notice shall be included in
14369 -# all copies or substantial portions of the Software.
14371 -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14372 -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14373 -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
14374 -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14375 -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
14376 -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
14377 -# DEALINGS IN THE SOFTWARE.
14379 -"""
14380 -Jamendo totem plugin (http://www.jamendo.com).
14382 -TODO:
14383 -- store thumbnails in relevant XDG directories (?)
14384 -- cleanup the notebook code
14385 -- interface with jamendo write API (not documented yet):
14386 - favorites, comments, etc...
14387 -"""
14389 -import os
14390 -import gobject
14391 -from gi.repository import Gio
14392 -from gi.repository import Peas
14393 -from gi.repository import PeasGtk
14394 -from gi.repository import Gtk
14395 -from gi.repository import GdkPixbuf
14396 -from gi.repository import Totem
14397 -from gi.repository import Pango
14398 -import socket
14399 -import threading
14400 -import time
14401 -import urllib
14402 -import urllib2
14403 -from xml.sax.saxutils import escape
14404 -try:
14405 - import json
14406 -except ImportError:
14407 - try:
14408 - import simplejson as json
14409 - except ImportError:
14410 - dlg = Gtk.MessageDialog(
14411 - message_type=Gtk.MessageType.ERROR,
14412 - buttons=Gtk.ButtonsType.OK
14414 - dlg.set_markup(_(u'You need to install the Python simplejson module.'))
14415 - dlg.run()
14416 - dlg.destroy()
14417 - raise
14419 -socket.setdefaulttimeout(30)
14420 -gobject.threads_init()
14422 -class JamendoPlugin(gobject.GObject, Peas.Activatable, PeasGtk.Configurable):
14423 - __gtype_name__ = 'JamendoPlugin'
14425 - object = gobject.property(type = gobject.GObject)
14427 - """
14428 - Jamendo totem plugin GUI.
14429 - """
14430 - SEARCH_CRITERIA = ['artist_name', 'tag_idstr']
14431 - AUDIO_FORMATS = ['ogg2', 'mp31']
14432 - TAB_RESULTS = 0
14433 - TAB_POPULAR = 1
14434 - TAB_LATEST = 2
14436 - def __init__(self):
14437 - self.debug = True
14438 - self.gstreamer_plugins_present = True
14439 - self.totem = None
14440 - self.settings = Gio.Settings.new ('org.gnome.totem.plugins.jamendo')
14441 - self.settings.connect ('changed::format', self.on_format_changed)
14442 - self.settings.connect ('changed::num-per-page', self.on_num_per_page_changed)
14444 - def do_activate(self):
14445 - """
14446 - Plugin activation.
14447 - """
14448 - self.totem = self.object
14449 - # Initialise the interface
14450 - builder = Totem.plugin_load_interface ("jamendo", "jamendo.ui", True, self.totem.get_main_window (), self)
14451 - self.popup = builder.get_object('popup_menu')
14452 - container = builder.get_object('container')
14453 - self.notebook = builder.get_object('notebook')
14454 - self.search_entry = builder.get_object('search_entry')
14455 - self.search_combo = builder.get_object('search_combo')
14456 - self.search_combo.set_active(0)
14457 - self.album_button = builder.get_object('album_button')
14458 - self.previous_button = builder.get_object('previous_button')
14459 - self.next_button = builder.get_object('next_button')
14460 - self.progressbars = [
14461 - builder.get_object('results_progressbar'),
14462 - builder.get_object('popular_progressbar'),
14463 - builder.get_object('latest_progressbar'),
14465 - self.treeviews = [
14466 - builder.get_object('results_treeview'),
14467 - builder.get_object('popular_treeview'),
14468 - builder.get_object('latest_treeview'),
14470 - self.setup_treeviews()
14472 - # Set up signals
14473 - builder.get_object('search_button').connect('clicked', self.on_search_button_clicked)
14474 - self.search_entry.connect('activate', self.on_search_entry_activate)
14475 - self.notebook.connect('switch-page', self.on_notebook_switch_page)
14476 - self.previous_button.connect('clicked', self.on_previous_button_clicked)
14477 - self.next_button.connect('clicked', self.on_next_button_clicked)
14478 - self.album_button.connect('clicked', self.on_album_button_clicked)
14479 - builder.get_object('add_to_playlist').connect('activate', self.on_add_to_playlist_activate)
14480 - builder.get_object('jamendo_album_page').connect('activate', self.on_open_jamendo_album_page_activate)
14482 - self.reset()
14483 - container.show_all()
14484 - self.totem.add_sidebar_page("jamendo", _(u"Jamendo"), container)
14486 - def do_deactivate(self):
14487 - """
14488 - Plugin deactivation.
14489 - """
14490 - self.totem.remove_sidebar_page("jamendo")
14492 - def do_create_configure_widget(self):
14493 - """
14494 - Plugin config widget.
14495 - This code must be independent from the rest of the plugin. FIXME: bgo#624073
14496 - """
14497 - builder = Totem.plugin_load_interface ('jamendo', 'jamendo.ui', True, None, self)
14498 - config_widget = builder.get_object ('config_widget')
14499 - config_widget.connect ('destroy', self.on_config_widget_destroy)
14500 - format = self.settings.get_enum ('format')
14501 - num_per_page = self.settings.get_value ('num-per-page').get_uint32 ()
14503 - # Set up the "format" combo box. We can't use g_settings_bind() here, as it won't automatically convert between enums and ints. To do so,
14504 - # we'd need to use g_settings_bind_with_mapping(), but that isn't introspectable. We have to handle the binding manually.
14505 - combo = builder.get_object('preferred_format_combo')
14506 - combo.set_active(format)
14507 - combo.connect ('changed', self.on_format_combo_changed)
14508 - self.settings.connect ('changed::format', self.on_format_setting_changed, combo)
14510 - spinbutton = builder.get_object('album_num_spinbutton')
14511 - spinbutton.set_value(num_per_page)
14512 - self.settings.bind ('num-per-page', spinbutton, 'value', Gio.SettingsBindFlags.DEFAULT)
14514 - return config_widget
14516 - def on_format_combo_changed (self, combo):
14517 - """
14518 - Called when the "format" preference combo box value is changed.
14519 - """
14520 - self.settings.set_enum ('format', combo.get_active ())
14522 - def on_format_setting_changed (self, settings, key, combo):
14523 - """
14524 - Called for the "format" preference combo box when the corresponding GSettings value is changed.
14525 - """
14526 - combo.set_active (self.settings.get_enum ('format'))
14528 - def on_format_changed (self, settings, key):
14529 - JamendoService.AUDIO_FORMAT = self.settings.get_enum ('format')
14531 - def on_num_per_page_changed (self, settings, key):
14532 - JamendoService.NUM_PER_PAGE = self.settings.get_int ('num-per-page')
14534 - def on_config_widget_destroy (self, widget):
14535 - try:
14536 - self.reset()
14537 - except:
14538 - pass
14540 - def reset(self):
14541 - """
14542 - XXX this will be refactored asap.
14543 - """
14544 - self.current_page = {
14545 - self.TAB_RESULTS: 1,
14546 - self.TAB_POPULAR: 1,
14547 - self.TAB_LATEST : 1
14549 - self.running_threads = {
14550 - self.TAB_RESULTS: False,
14551 - self.TAB_POPULAR: False,
14552 - self.TAB_LATEST : False
14554 - self.pages = {
14555 - self.TAB_RESULTS: [],
14556 - self.TAB_POPULAR: [],
14557 - self.TAB_LATEST : []
14559 - self.album_count = [0, 0, 0]
14560 - for tv in self.treeviews:
14561 - tv.get_model().clear()
14562 - self._update_buttons_state()
14564 - def setup_treeviews(self):
14565 - """
14566 - Setup the 3 treeview: result, popular and latest
14567 - """
14568 - self.current_treeview = self.treeviews[0]
14569 - for w in self.treeviews:
14570 - selection = w.get_selection ()
14571 - selection.set_mode(Gtk.SelectionMode.MULTIPLE)
14572 - selection.connect ('changed', self.on_treeview_selection_changed)
14574 - # build pixbuf column
14575 - cell = Gtk.CellRendererPixbuf()
14576 - col = Gtk.TreeViewColumn(cell_renderer=cell, pixbuf=1)
14578 - w.append_column(col)
14580 - # build description column
14581 - cell = Gtk.CellRendererText()
14582 - cell.set_property('ellipsize', Pango.EllipsizeMode.END)
14583 - col = Gtk.TreeViewColumn(cell_renderer=cell, markup=2)
14584 - col.set_expand(True)
14585 - w.append_column(col)
14587 - # duration column
14588 - cell = Gtk.CellRendererText()
14589 - cell.set_property('xalign', 1.0)
14590 - cell.set_property('size-points', 8)
14591 - col = Gtk.TreeViewColumn(cell_renderer=cell, markup=3)
14592 - col.set_alignment(1.0)
14593 - w.append_column(col)
14595 - # configure the treeview
14596 - w.set_show_expanders(False) # we manage internally expand/collapse
14597 - w.set_tooltip_column(4) # set the tooltip column
14599 - # Connect signals
14600 - w.connect("button-press-event", self.on_treeview_row_clicked)
14601 - w.connect("row-activated", self.on_treeview_row_activated)
14604 - def add_treeview_item(self, treeview, album):
14605 - if not isinstance(album['image'], GdkPixbuf.Pixbuf):
14606 - # album image pixbuf is not yet built
14607 - try:
14608 - pb = GdkPixbuf.Pixbuf.new_from_file(album['image'])
14609 - os.unlink(album['image'])
14610 - album['image'] = pb
14611 - except:
14612 - # do not fail for this, just display a dummy pixbuf
14613 - album['image'] = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True,
14614 - 8, 1, 1)
14615 - # format title
14616 - title = '<b>%s</b>\n' % self._format_str(album['name'])
14617 - title += _(u'Artist: %s') % self._format_str(album['artist_name'])
14618 - # format duration
14619 - dur = self._format_duration(album['duration'])
14620 - # format tooltip
14621 - try:
14622 - # Translators: this is the release date of an album in Python strptime format
14623 - release = time.strptime(album['dates']['release'][0:10], _(u'%Y-%m-%d'))
14624 - # Translators: this is the release time of an album in Python strftime format
14625 - release = time.strftime(_(u'%x'), release)
14626 - except:
14627 - release = ''
14628 - tip = '\n'.join([
14629 - '<b>%s</b>' % self._format_str(album['name']),
14630 - _(u'Artist: %s') % self._format_str(album['artist_name']),
14631 - _(u'Genre: %s') % self._format_str(album['genre']),
14632 - _(u'Released on: %s') % release,
14633 - _(u'License: %s') % self._format_str(album['license'][0]),
14634 - ])
14635 - # append album row
14636 - parent = treeview.get_model().append(None,
14637 - [album, album['image'], title, dur, tip]
14640 - # append track rows
14641 - icon = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1)
14642 - for i, track in enumerate(album['tracks']):
14643 - # track title
14644 - # Translators: this is the title of a track in Python format
14645 - # (first argument is the track number, second is the track title)
14646 - tt = (u'<small>%s</small>' % _(u'%02d. %s')) % \
14647 - (i+1, self._format_str(track['name']))
14648 - # track duration
14649 - td = self._format_duration(track['duration'])
14650 - # track tooltip
14651 - tip = '\n'.join([
14652 - '<b>%s</b>' % self._format_str(track['name']),
14653 - _(u'Album: %s') % self._format_str(album['name']),
14654 - _(u'Artist: %s') % self._format_str(album['artist_name']),
14655 - _(u'Duration: %s') % td,
14656 - ])
14657 - # append track
14658 - treeview.get_model().append(parent, [track, icon, tt, td, tip])
14659 - # update current album count
14660 - pindex = self.treeviews.index(treeview)
14661 - self.album_count[pindex] += 1
14663 - def add_album_to_playlist(self, mode, album):
14664 - """
14665 - Add an album to the playlist, mode can be: replace, enqueue or
14666 - enqueue_and_play.
14667 - """
14668 - for i, track in enumerate(album['tracks']):
14669 - if mode in ('replace', 'enqueue_and_play'):
14670 - if i == 0:
14671 - # play first track
14672 - self.add_track_to_playlist(mode, track)
14673 - else:
14674 - # and enqueue other tracks
14675 - self.add_track_to_playlist('enqueue', track)
14676 - else:
14677 - self.add_track_to_playlist('enqueue', track)
14679 - def add_track_to_playlist(self, mode, t):
14680 - """
14681 - Add a track to the playlist, mode can be: replace, enqueue or
14682 - enqueue_and_play.
14683 - """
14684 - if mode == 'replace':
14685 - self.totem.action_remote(Totem.RemoteCommand.REPLACE, t['stream'].encode ('UTF-8'))
14686 - elif mode == 'enqueue':
14687 - self.totem.action_remote(Totem.RemoteCommand.ENQUEUE, t['stream'].encode ('UTF-8'))
14689 - def fetch_albums(self, pn=1):
14690 - """
14691 - Initialize the fetch thread.
14692 - """
14693 - tab_index = self.treeviews.index(self.current_treeview)
14694 - if tab_index == self.TAB_POPULAR:
14695 - params = {'order': 'rating_desc'}
14696 - elif tab_index == self.TAB_LATEST:
14697 - params = {'order': 'date_desc'}
14698 - else:
14699 - value = self.search_entry.get_text()
14700 - if not value:
14701 - return
14702 - prop = self.SEARCH_CRITERIA[self.search_combo.get_active()]
14703 - params = {'order': 'date_desc', prop: value}
14704 - params['pn'] = pn
14705 - self.current_treeview.get_model().clear()
14706 - self.previous_button.set_sensitive(False)
14707 - self.next_button.set_sensitive(False)
14708 - self.album_button.set_sensitive(False)
14709 - self.progressbars[tab_index].show()
14710 - self.progressbars[tab_index].set_fraction(0.0)
14711 - self.progressbars[tab_index].set_text(
14712 - _(u'Fetching albums, please wait…')
14714 - lcb = (self.on_fetch_albums_loop, self.current_treeview)
14715 - dcb = (self.on_fetch_albums_done, self.current_treeview)
14716 - ecb = (self.on_fetch_albums_error, self.current_treeview)
14717 - thread = JamendoService(params, lcb, dcb, ecb)
14718 - thread.start()
14719 - self.running_threads[tab_index] = True
14721 - def on_fetch_albums_loop(self, treeview, album):
14722 - """
14723 - Add an album item and its tracks to the current treeview.
14724 - """
14725 - self.add_treeview_item(treeview, album)
14726 - # pulse progressbar
14727 - pindex = self.treeviews.index(treeview)
14728 - self.progressbars[pindex].set_fraction(
14729 - float(self.album_count[pindex]) / float(JamendoService.NUM_PER_PAGE)
14732 - def on_fetch_albums_done(self, treeview, albums, save_state=True):
14733 - """
14734 - Called when the thread finished fetching albums.
14735 - """
14736 - pindex = self.treeviews.index(treeview)
14737 - model = treeview.get_model()
14738 - if save_state and len(albums):
14739 - self.pages[pindex].append(albums)
14740 - self.current_page[pindex] = len(self.pages[pindex])
14741 - self._update_buttons_state()
14742 - self.progressbars[pindex].set_fraction(0.0)
14743 - self.progressbars[pindex].hide()
14744 - self.album_count[pindex] = 0
14745 - self.running_threads[pindex] = False
14747 - def on_fetch_albums_error(self, treeview, exc):
14748 - """
14749 - Called when an error occured in the thread.
14750 - """
14751 - self.reset()
14752 - pindex = self.treeviews.index(treeview)
14753 - self.progressbars[pindex].set_fraction(0.0)
14754 - self.progressbars[pindex].hide()
14755 - self.running_threads[pindex] = False
14757 - # managing exceptions with urllib is a real PITA... :(
14758 - if hasattr(exc, 'reason'):
14759 - try:
14760 - reason = exc.reason[1]
14761 - except:
14762 - try:
14763 - reason = exc.reason[0]
14764 - except:
14765 - reason = str(exc)
14766 - reason = reason.capitalize()
14767 - msg = _(u'Failed to connect to Jamendo server.\n%s.') % reason
14768 - elif hasattr(exc, 'code'):
14769 - msg = _(u'The Jamendo server returned code %s.') % exc.code
14770 - else:
14771 - msg = str(exc)
14773 - self.totem.action_error(_(u'An error occurred while fetching albums.'), msg)
14775 - def on_search_entry_activate(self, *args):
14776 - """
14777 - Called when the user typed <enter> in the search entry.
14778 - """
14779 - return self.on_search_button_clicked()
14781 - def on_search_button_clicked(self, *args):
14782 - """
14783 - Called when the user clicked on the search button.
14784 - """
14785 - if not self.search_entry.get_text():
14786 - return
14787 - if self.current_treeview != self.treeviews[self.TAB_RESULTS]:
14788 - self.current_treeview = self.treeviews[self.TAB_RESULTS]
14789 - self.notebook.set_current_page(self.TAB_RESULTS)
14790 - else:
14791 - self.on_notebook_switch_page(new_search=True)
14793 - def on_notebook_switch_page(self, nb=None, tab=None, tab_num=0,
14794 - new_search=False):
14795 - """
14796 - Called when the changed a notebook page.
14797 - """
14798 - self.current_treeview = self.treeviews[int(tab_num)]
14799 - self._update_buttons_state()
14800 - model = self.current_treeview.get_model()
14801 - # fetch popular and latest albums only once
14802 - if self.running_threads[int(tab_num)] == True or \
14803 - (not new_search and len(model)):
14804 - return
14805 - if new_search:
14806 - self.current_page[self.TAB_RESULTS] = 1
14807 - self.pages[self.TAB_RESULTS] = []
14808 - self.album_count[self.TAB_RESULTS] = 0
14809 - self._update_buttons_state()
14810 - model.clear()
14811 - self.fetch_albums()
14813 - def on_treeview_row_activated(self, tv, path, column):
14814 - """
14815 - Called when the user double-clicked on a treeview element.
14816 - """
14817 - try:
14818 - item = self._get_selection()[0] # first item selected
14819 - except:
14820 - return
14822 - if path.get_depth () == 1:
14823 - self.add_album_to_playlist('replace', item)
14824 - else:
14825 - self.add_track_to_playlist('replace', item)
14827 - def on_treeview_row_clicked(self, tv, evt):
14828 - """
14829 - Called when the user clicked on a treeview element.
14830 - """
14831 - try:
14832 - if evt.button == 3:
14833 - (path, _, _, _) = tv.get_path_at_pos(int(evt.x), int(evt.y))
14834 - sel = tv.get_selection()
14835 - (_, rows) = sel.get_selected_rows()
14836 - if path not in rows:
14837 - sel.unselect_all()
14838 - sel.select_path(path)
14839 - tv.grab_focus()
14840 - self.popup.popup_for_device(None, None, None, None, None, evt.button, evt.time)
14841 - return True
14843 - (event_x, event_y) = evt.get_coords()
14844 - (path, c, x, y) = tv.get_path_at_pos(int(event_x), int(event_y))
14845 - if (path.get_depth() == 1):
14846 - if tv.row_expanded(path):
14847 - tv.collapse_row(path)
14848 - else:
14849 - tv.expand_row(path, False)
14850 - except:
14851 - pass
14853 - def on_treeview_selection_changed (self, selection):
14854 - (_, rows) = selection.get_selected_rows ()
14855 - self.album_button.set_sensitive (len (rows) > 0)
14857 - def on_previous_button_clicked(self, *args):
14858 - """
14859 - Called when the user clicked the previous button.
14860 - """
14861 - self._update_buttons_state()
14862 - model = self.current_treeview.get_model()
14863 - model.clear()
14864 - pindex = self.treeviews.index(self.current_treeview)
14865 - self.current_page[pindex] -= 1
14866 - albums = self.pages[pindex][self.current_page[pindex]-1]
14867 - for album in albums:
14868 - self.add_treeview_item(self.current_treeview, album)
14869 - self.on_fetch_albums_done(self.current_treeview, albums, False)
14871 - def on_next_button_clicked(self, *args):
14872 - """
14873 - Called when the user clicked the next button.
14874 - """
14875 - self._update_buttons_state()
14876 - model = self.current_treeview.get_model()
14877 - model.clear()
14878 - pindex = self.treeviews.index(self.current_treeview)
14879 - if self.current_page[pindex] == len(self.pages[pindex]):
14880 - self.fetch_albums(self.current_page[pindex]+1)
14881 - else:
14882 - self.current_page[pindex] += 1
14883 - albums = self.pages[pindex][self.current_page[pindex]-1]
14884 - for album in albums:
14885 - self.add_treeview_item(self.current_treeview, album)
14886 - self.on_fetch_albums_done(self.current_treeview, albums, False)
14888 - def on_album_button_clicked(self, *args):
14889 - """
14890 - Called when the user clicked on the album button.
14891 - """
14892 - try:
14893 - url = self._get_selection(True)[0]['url']
14894 - os.spawnlp(os.P_NOWAIT, "xdg-open", "xdg-open", url)
14895 - except:
14896 - pass
14898 - def on_add_to_playlist_activate(self, *args):
14899 - """
14900 - Called when the user clicked on the add to playlist button of the
14901 - popup menu.
14902 - """
14903 - items = self._get_selection()
14904 - for item in items:
14905 - if 'tracks' in item:
14906 - # we have an album
14907 - self.add_album_to_playlist('enqueue', item)
14908 - else:
14909 - # we have a track
14910 - self.add_track_to_playlist('enqueue', item)
14912 - def on_open_jamendo_album_page_activate(self, *args):
14913 - """
14914 - Called when the user clicked on the jamendo album page button of the
14915 - popup menu.
14916 - """
14917 - return self.on_album_button_clicked()
14919 - def _get_selection(self, root=False):
14920 - """
14921 - Shortcut method to retrieve the treeview items selected.
14922 - """
14923 - ret = []
14924 - sel = self.current_treeview.get_selection()
14925 - (model, rows) = sel.get_selected_rows()
14926 - for row in rows:
14927 - it = model.get_iter(row)
14929 - # Return the parent node if root == true
14930 - if root:
14931 - parent_iter = model.iter_parent (it)
14932 - if parent_iter != None:
14933 - it = parent_iter
14935 - elt = model.get_value(it, 0)
14936 - if elt not in ret:
14937 - ret.append(elt)
14938 - return ret
14940 - def _update_buttons_state(self):
14941 - """
14942 - Update the state of the previous and next buttons.
14943 - """
14944 - sel = self.current_treeview.get_selection()
14945 - (model, rows) = sel.get_selected_rows()
14946 - try:
14947 - it = model.get_iter(rows[0])
14948 - except:
14949 - it = None
14950 - pindex = self.treeviews.index(self.current_treeview)
14951 - self.previous_button.set_sensitive(self.current_page[pindex] > 1)
14952 - self.next_button.set_sensitive(len(model)==JamendoService.NUM_PER_PAGE)
14953 - self.album_button.set_sensitive(it is not None)
14956 - def _format_str(self, st, truncate=False):
14957 - """
14958 - Escape entities for pango markup and force the string to utf-8.
14959 - """
14960 - if not st:
14961 - return ''
14962 - try:
14963 - return escape (unicode (st))
14964 - except:
14965 - return st
14967 - def _format_duration(self, secs):
14968 - """
14969 - Format the given number of seconds to a human readable duration.
14970 - """
14971 - try:
14972 - secs = int(secs)
14973 - if secs >= 3600:
14974 - # Translators: time formatting (in Python strftime format) for the Jamendo plugin
14975 - # for times longer than an hour
14976 - return time.strftime(_(u'%H:%M:%S'), time.gmtime(secs))
14977 - # Translators: time formatting (in Python strftime format) for the Jamendo plugin
14978 - # for times shorter than an hour
14979 - return time.strftime(_(u'%M:%S'), time.gmtime(secs))
14980 - except:
14981 - return ''
14984 -class JamendoService(threading.Thread):
14985 - """
14986 - Class that requests the jamendo REST service.
14987 - """
14989 - API_URL = 'http://api.jamendo.com/get2'
14990 - AUDIO_FORMAT = 'ogg2'
14991 - NUM_PER_PAGE = 10
14993 - def __init__(self, params, loop_cb, done_cb, error_cb):
14994 - self.params = params
14995 - self.loop_cb = loop_cb
14996 - self.done_cb = done_cb
14997 - self.error_cb = error_cb
14998 - self.lock = threading.Lock()
14999 - threading.Thread.__init__(self)
15001 - def run(self):
15002 - url = '%s/id+name+duration+image+genre+dates+url+artist_id+' \
15003 - 'artist_name+artist_url/album/json/?n=%s&imagesize=50' % \
15004 - (self.API_URL, self.NUM_PER_PAGE)
15005 - if len(self.params):
15006 - url += '&%s' % urllib.urlencode(self.params)
15007 - try:
15008 - self.lock.acquire()
15009 - albums = json.loads(self._request(url))
15010 - ret = []
15011 - for i, album in enumerate(albums):
15012 - fname, headers = urllib.urlretrieve(album['image'])
15013 - album['image'] = fname
15014 - album['tracks'] = json.loads(self._request(
15015 - '%s/id+name+duration+stream/track/json/?album_id=%s'\
15016 - '&order=numalbum_asc&streamencoding=%s' % (self.API_URL, album['id'], self.AUDIO_FORMAT)
15017 - ))
15018 - album['license'] = json.loads(self._request(
15019 - '%s/name/license/json/album_license/?album_id=%s'\
15020 - % (self.API_URL, album['id'])
15021 - ))
15022 - # Translators: If Jamendo supports your language, replace "en" with the language code, enclosed
15023 - # in slashes, used to view pages in your language on the Jamendo website. e.g. For French, "en"
15024 - # would be translated to "fr", as Jamendo uses that in its URLs:
15025 - # http://www.jamendo.com/fr/album/4818
15026 - # Compared to:
15027 - # http://www.jamendo.com/en/album/4818
15028 - # If Jamendo doesn't support your language, *do not translate this string*!
15029 - album['url'] = album['url'].replace('/en/', '/' + _('en') + '/')
15030 - gobject.idle_add(self.loop_cb[0], self.loop_cb[1], album)
15031 - gobject.idle_add(self.done_cb[0], self.done_cb[1], albums)
15032 - except Exception as exc:
15033 - gobject.idle_add(self.error_cb[0], self.error_cb[1], exc)
15034 - finally:
15035 - self.lock.release()
15037 - def _request(self, url):
15038 - opener = urllib2.build_opener()
15039 - opener.addheaders = [('User-agent', 'Totem Jamendo plugin')]
15040 - handle = opener.open(url)
15041 - data = handle.read()
15042 - handle.close()
15043 - return data
15044 diff --git a/src/plugins/jamendo/jamendo.ui b/src/plugins/jamendo/jamendo.ui
15045 deleted file mode 100644
15046 index cca7b1c..0000000
15047 --- a/src/plugins/jamendo/jamendo.ui
15048 +++ /dev/null
15049 @@ -1,603 +0,0 @@
15050 -<?xml version="1.0"?>
15051 -<!--*- mode: xml -*-->
15052 -<interface>
15053 - <object class="GtkAdjustment" id="adjustment1">
15054 - <property name="upper">100</property>
15055 - <property name="lower">1</property>
15056 - <property name="page_increment">0</property>
15057 - <property name="step_increment">1</property>
15058 - <property name="page_size">0</property>
15059 - <property name="value">10</property>
15060 - </object>
15061 - <object class="GtkListStore" id="search_combo_model">
15062 - <columns>
15063 - <column type="gchararray"/>
15064 - </columns>
15065 - <data>
15066 - <row>
15067 - <col id="0" translatable="yes">By artist</col>
15068 - </row>
15069 - <row>
15070 - <col id="0" translatable="yes">By tag</col>
15071 - </row>
15072 - </data>
15073 - </object>
15074 - <object class="GtkListStore" id="preferred_format_combo_model">
15075 - <columns>
15076 - <column type="gchararray"/>
15077 - </columns>
15078 - <data>
15079 - <row>
15080 - <col id="0">Ogg</col>
15081 - </row>
15082 - <row>
15083 - <col id="0">MP3</col>
15084 - </row>
15085 - </data>
15086 - </object>
15087 - <object class="GtkTreeStore" id="results_treeview_model">
15088 - <columns>
15089 - <column type="PyObject"/>
15090 - <column type="GdkPixbuf"/>
15091 - <column type="gchararray"/>
15092 - <column type="gchararray"/>
15093 - <column type="gchararray"/>
15094 - </columns>
15095 - </object>
15096 - <object class="GtkTreeStore" id="popular_treeview_model">
15097 - <columns>
15098 - <column type="PyObject"/>
15099 - <column type="GdkPixbuf"/>
15100 - <column type="gchararray"/>
15101 - <column type="gchararray"/>
15102 - <column type="gchararray"/>
15103 - </columns>
15104 - </object>
15105 - <object class="GtkTreeStore" id="latest_treeview_model">
15106 - <columns>
15107 - <column type="PyObject"/>
15108 - <column type="GdkPixbuf"/>
15109 - <column type="gchararray"/>
15110 - <column type="gchararray"/>
15111 - <column type="gchararray"/>
15112 - </columns>
15113 - </object>
15114 - <object class="GtkUIManager" id="uimanager1">
15115 - <child>
15116 - <object class="GtkActionGroup" id="actiongroup1">
15117 - <child>
15118 - <object class="GtkAction" id="add_to_playlist">
15119 - <property name="stock_id">gtk-add</property>
15120 - <property name="name">add_to_playlist</property>
15121 - <property name="label" translatable="yes">_Add to Playlist</property>
15122 - </object>
15123 - </child>
15124 - <child>
15125 - <object class="GtkAction" id="jamendo_album_page">
15126 - <property name="stock_id">gtk-jump-to</property>
15127 - <property name="name">jamendo_album_page</property>
15128 - <property name="label" translatable="yes">_Open Jamendo Album Page in Browser</property>
15129 - </object>
15130 - </child>
15131 - </object>
15132 - </child>
15133 - <ui>
15134 - <popup name="popup_menu">
15135 - <menuitem action="add_to_playlist"/>
15136 - <menuitem action="jamendo_album_page"/>
15137 - </popup>
15138 - </ui>
15139 - </object>
15140 - <object class="GtkImage" id="album_button_image">
15141 - <property name="visible">True</property>
15142 - <property name="stock">gtk-jump-to</property>
15143 - <property name="icon_size">4</property>
15144 - <property name="xalign">0.5</property>
15145 - <property name="yalign">0.5</property>
15146 - <property name="xpad">0</property>
15147 - <property name="ypad">0</property>
15148 - </object>
15149 - <object class="GtkVBox" id="container">
15150 - <property name="visible">True</property>
15151 - <property name="homogeneous">False</property>
15152 - <property name="spacing">6</property>
15153 - <child>
15154 - <object class="GtkEntry" id="search_entry">
15155 - <property name="visible">True</property>
15156 - <property name="can_focus">True</property>
15157 - <property name="editable">True</property>
15158 - <property name="visibility">True</property>
15159 - <property name="max_length">0</property>
15160 - <property name="text" translatable="yes"/>
15161 - <property name="has_frame">True</property>
15162 - <property name="activates_default">False</property>
15163 - </object>
15164 - <packing>
15165 - <property name="padding">0</property>
15166 - <property name="expand">False</property>
15167 - <property name="fill">True</property>
15168 - </packing>
15169 - </child>
15170 - <child>
15171 - <object class="GtkHBox" id="search_hbox">
15172 - <property name="visible">True</property>
15173 - <property name="homogeneous">False</property>
15174 - <property name="spacing">6</property>
15175 - <child>
15176 - <object class="GtkComboBox" id="search_combo">
15177 - <property name="model">search_combo_model</property>
15178 - <property name="visible">True</property>
15179 - <property name="add_tearoffs">False</property>
15180 - <property name="focus_on_click">True</property>
15181 - <child>
15182 - <object class="GtkCellRendererText" id="renderer1"/>
15183 - <attributes>
15184 - <attribute name="text">0</attribute>
15185 - </attributes>
15186 - </child>
15187 - </object>
15188 - <packing>
15189 - <property name="padding">0</property>
15190 - <property name="expand">True</property>
15191 - <property name="fill">True</property>
15192 - </packing>
15193 - </child>
15194 - <child>
15195 - <object class="GtkButton" id="search_button">
15196 - <property name="use-stock">True</property>
15197 - <property name="label">gtk-find</property>
15198 - </object>
15199 - <packing>
15200 - <property name="padding">0</property>
15201 - <property name="expand">True</property>
15202 - <property name="fill">True</property>
15203 - </packing>
15204 - </child>
15205 - </object>
15206 - <packing>
15207 - <property name="padding">0</property>
15208 - <property name="expand">False</property>
15209 - <property name="fill">True</property>
15210 - </packing>
15211 - </child>
15212 - <child>
15213 - <object class="GtkNotebook" id="notebook">
15214 - <property name="visible">True</property>
15215 - <property name="can_focus">True</property>
15216 - <property name="show_tabs">True</property>
15217 - <property name="show_border">True</property>
15218 - <property name="tab_pos">GTK_POS_TOP</property>
15219 - <property name="scrollable">False</property>
15220 - <property name="enable_popup">False</property>
15221 - <child>
15222 - <object class="GtkVBox" id="vbox1">
15223 - <property name="visible">True</property>
15224 - <property name="homogeneous">False</property>
15225 - <property name="spacing">6</property>
15226 - <child>
15227 - <object class="GtkScrolledWindow" id="results_scrolledwindow">
15228 - <property name="visible">True</property>
15229 - <property name="can_focus">True</property>
15230 - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
15231 - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
15232 - <property name="shadow_type">GTK_SHADOW_NONE</property>
15233 - <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
15234 - <child>
15235 - <object class="GtkViewport" id="viewport1">
15236 - <property name="visible">True</property>
15237 - <property name="shadow_type">GTK_SHADOW_IN</property>
15238 - <child>
15239 - <object class="GtkTreeView" id="results_treeview">
15240 - <property name="model">results_treeview_model</property>
15241 - <property name="visible">True</property>
15242 - <property name="can_focus">True</property>
15243 - <property name="headers_visible">False</property>
15244 - <property name="rules_hint">False</property>
15245 - <property name="reorderable">False</property>
15246 - <property name="enable_search">True</property>
15247 - <property name="fixed_height_mode">False</property>
15248 - <property name="hover_selection">False</property>
15249 - <property name="hover_expand">False</property>
15250 - </object>
15251 - </child>
15252 - </object>
15253 - </child>
15254 - </object>
15255 - <packing>
15256 - <property name="padding">0</property>
15257 - <property name="expand">True</property>
15258 - <property name="fill">True</property>
15259 - </packing>
15260 - </child>
15261 - <child>
15262 - <object class="GtkProgressBar" id="results_progressbar">
15263 - <property name="fraction">0</property>
15264 - <property name="pulse_step">0.10000000149</property>
15265 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15266 - </object>
15267 - <packing>
15268 - <property name="padding">0</property>
15269 - <property name="expand">False</property>
15270 - <property name="fill">False</property>
15271 - </packing>
15272 - </child>
15273 - </object>
15274 - <packing>
15275 - <property name="tab_expand">False</property>
15276 - <property name="tab_fill">True</property>
15277 - </packing>
15278 - </child>
15279 - <child type="tab">
15280 - <object class="GtkLabel" id="results_tab_label">
15281 - <property name="visible">True</property>
15282 - <property name="label" translatable="yes">Search Results</property>
15283 - <property name="use_underline">False</property>
15284 - <property name="use_markup">False</property>
15285 - <property name="justify">GTK_JUSTIFY_LEFT</property>
15286 - <property name="wrap">True</property>
15287 - <property name="selectable">False</property>
15288 - <property name="xalign">0.5</property>
15289 - <property name="yalign">0.5</property>
15290 - <property name="xpad">0</property>
15291 - <property name="ypad">0</property>
15292 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15293 - <property name="width_chars">-1</property>
15294 - <property name="single_line_mode">False</property>
15295 - <property name="angle">0</property>
15296 - </object>
15297 - </child>
15298 - <child>
15299 - <object class="GtkVBox" id="vbox2">
15300 - <property name="visible">True</property>
15301 - <property name="homogeneous">False</property>
15302 - <property name="spacing">6</property>
15303 - <child>
15304 - <object class="GtkScrolledWindow" id="popular_scrolledwindow">
15305 - <property name="visible">True</property>
15306 - <property name="can_focus">True</property>
15307 - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
15308 - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
15309 - <property name="shadow_type">GTK_SHADOW_NONE</property>
15310 - <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
15311 - <child>
15312 - <object class="GtkViewport" id="viewport2">
15313 - <property name="visible">True</property>
15314 - <property name="shadow_type">GTK_SHADOW_IN</property>
15315 - <child>
15316 - <object class="GtkTreeView" id="popular_treeview">
15317 - <property name="model">popular_treeview_model</property>
15318 - <property name="visible">True</property>
15319 - <property name="can_focus">True</property>
15320 - <property name="headers_visible">False</property>
15321 - <property name="rules_hint">False</property>
15322 - <property name="reorderable">False</property>
15323 - <property name="enable_search">True</property>
15324 - <property name="fixed_height_mode">False</property>
15325 - <property name="hover_selection">False</property>
15326 - <property name="hover_expand">False</property>
15327 - </object>
15328 - </child>
15329 - </object>
15330 - </child>
15331 - </object>
15332 - <packing>
15333 - <property name="padding">0</property>
15334 - <property name="expand">True</property>
15335 - <property name="fill">True</property>
15336 - </packing>
15337 - </child>
15338 - <child>
15339 - <object class="GtkProgressBar" id="popular_progressbar">
15340 - <property name="fraction">0</property>
15341 - <property name="pulse_step">0.10000000149</property>
15342 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15343 - </object>
15344 - <packing>
15345 - <property name="padding">0</property>
15346 - <property name="expand">False</property>
15347 - <property name="fill">False</property>
15348 - </packing>
15349 - </child>
15350 - </object>
15351 - <packing>
15352 - <property name="tab_expand">False</property>
15353 - <property name="tab_fill">True</property>
15354 - </packing>
15355 - </child>
15356 - <child type="tab">
15357 - <object class="GtkLabel" id="popular_tab_label">
15358 - <property name="visible">True</property>
15359 - <property name="label" translatable="yes">Popular</property>
15360 - <property name="use_underline">False</property>
15361 - <property name="use_markup">False</property>
15362 - <property name="justify">GTK_JUSTIFY_LEFT</property>
15363 - <property name="wrap">True</property>
15364 - <property name="selectable">False</property>
15365 - <property name="xalign">0.5</property>
15366 - <property name="yalign">0.5</property>
15367 - <property name="xpad">0</property>
15368 - <property name="ypad">0</property>
15369 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15370 - <property name="width_chars">-1</property>
15371 - <property name="single_line_mode">False</property>
15372 - <property name="angle">0</property>
15373 - </object>
15374 - </child>
15375 - <child>
15376 - <object class="GtkVBox" id="vbox3">
15377 - <property name="visible">True</property>
15378 - <property name="homogeneous">False</property>
15379 - <property name="spacing">6</property>
15380 - <child>
15381 - <object class="GtkScrolledWindow" id="latest_scrolledwindow">
15382 - <property name="visible">True</property>
15383 - <property name="can_focus">True</property>
15384 - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
15385 - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
15386 - <property name="shadow_type">GTK_SHADOW_NONE</property>
15387 - <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
15388 - <child>
15389 - <object class="GtkViewport" id="viewport3">
15390 - <property name="visible">True</property>
15391 - <property name="shadow_type">GTK_SHADOW_IN</property>
15392 - <child>
15393 - <object class="GtkTreeView" id="latest_treeview">
15394 - <property name="model">latest_treeview_model</property>
15395 - <property name="visible">True</property>
15396 - <property name="can_focus">True</property>
15397 - <property name="headers_visible">False</property>
15398 - <property name="rules_hint">False</property>
15399 - <property name="reorderable">False</property>
15400 - <property name="enable_search">True</property>
15401 - <property name="fixed_height_mode">False</property>
15402 - <property name="hover_selection">False</property>
15403 - <property name="hover_expand">False</property>
15404 - </object>
15405 - </child>
15406 - </object>
15407 - </child>
15408 - </object>
15409 - <packing>
15410 - <property name="padding">0</property>
15411 - <property name="expand">True</property>
15412 - <property name="fill">True</property>
15413 - </packing>
15414 - </child>
15415 - <child>
15416 - <object class="GtkProgressBar" id="latest_progressbar">
15417 - <property name="fraction">0</property>
15418 - <property name="pulse_step">0.10000000149</property>
15419 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15420 - </object>
15421 - <packing>
15422 - <property name="padding">0</property>
15423 - <property name="expand">False</property>
15424 - <property name="fill">False</property>
15425 - </packing>
15426 - </child>
15427 - </object>
15428 - <packing>
15429 - <property name="tab_expand">False</property>
15430 - <property name="tab_fill">True</property>
15431 - </packing>
15432 - </child>
15433 - <child type="tab">
15434 - <object class="GtkLabel" id="latest_tab_label">
15435 - <property name="visible">True</property>
15436 - <property name="label" translatable="yes">Latest Releases</property>
15437 - <property name="use_underline">False</property>
15438 - <property name="use_markup">False</property>
15439 - <property name="justify">GTK_JUSTIFY_LEFT</property>
15440 - <property name="wrap">True</property>
15441 - <property name="selectable">False</property>
15442 - <property name="xalign">0.5</property>
15443 - <property name="yalign">0.5</property>
15444 - <property name="xpad">0</property>
15445 - <property name="ypad">0</property>
15446 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15447 - <property name="width_chars">-1</property>
15448 - <property name="single_line_mode">False</property>
15449 - <property name="angle">0</property>
15450 - </object>
15451 - </child>
15452 - </object>
15453 - <packing>
15454 - <property name="padding">0</property>
15455 - <property name="expand">True</property>
15456 - <property name="fill">True</property>
15457 - </packing>
15458 - </child>
15459 - <child>
15460 - <object class="GtkHBox" id="hbox1">
15461 - <property name="visible">True</property>
15462 - <property name="homogeneous">False</property>
15463 - <property name="spacing">6</property>
15464 - <child>
15465 - <object class="GtkButton" id="album_button">
15466 - <property name="visible">True</property>
15467 - <property name="sensitive">False</property>
15468 - <property name="can_focus">True</property>
15469 - <property name="relief">GTK_RELIEF_NORMAL</property>
15470 - <property name="focus_on_click">True</property>
15471 - <property name="image">album_button_image</property>
15472 - <property name="label" translatable="yes">Jamendo Album Page</property>
15473 - </object>
15474 - <packing>
15475 - <property name="padding">0</property>
15476 - <property name="expand">False</property>
15477 - <property name="fill">False</property>
15478 - </packing>
15479 - </child>
15480 - <child>
15481 - <object class="GtkHBox" id="hbox2">
15482 - <property name="visible">True</property>
15483 - <property name="homogeneous">False</property>
15484 - <property name="spacing">6</property>
15485 - <child>
15486 - <object class="GtkButton" id="previous_button">
15487 - <property name="visible">True</property>
15488 - <property name="sensitive">False</property>
15489 - <property name="can_focus">True</property>
15490 - <property name="relief">GTK_RELIEF_NORMAL</property>
15491 - <property name="focus_on_click">True</property>
15492 - <child>
15493 - <object class="GtkImage" id="previous_button_image">
15494 - <property name="visible">True</property>
15495 - <property name="stock">gtk-go-back</property>
15496 - <property name="icon_size">4</property>
15497 - <property name="xalign">0.5</property>
15498 - <property name="yalign">0.5</property>
15499 - <property name="xpad">0</property>
15500 - <property name="ypad">0</property>
15501 - </object>
15502 - </child>
15503 - </object>
15504 - <packing>
15505 - <property name="padding">0</property>
15506 - <property name="expand">False</property>
15507 - <property name="fill">False</property>
15508 - </packing>
15509 - </child>
15510 - <child>
15511 - <object class="GtkButton" id="next_button">
15512 - <property name="visible">True</property>
15513 - <property name="sensitive">False</property>
15514 - <property name="can_focus">True</property>
15515 - <property name="relief">GTK_RELIEF_NORMAL</property>
15516 - <property name="focus_on_click">True</property>
15517 - <child>
15518 - <object class="GtkImage" id="next_button_image">
15519 - <property name="visible">True</property>
15520 - <property name="stock">gtk-go-forward</property>
15521 - <property name="icon_size">4</property>
15522 - <property name="xalign">0.5</property>
15523 - <property name="yalign">0.5</property>
15524 - <property name="xpad">0</property>
15525 - <property name="ypad">0</property>
15526 - </object>
15527 - </child>
15528 - </object>
15529 - <packing>
15530 - <property name="padding">0</property>
15531 - <property name="expand">False</property>
15532 - <property name="fill">False</property>
15533 - </packing>
15534 - </child>
15535 - </object>
15536 - <packing>
15537 - <property name="padding">0</property>
15538 - <property name="expand">False</property>
15539 - <property name="fill">True</property>
15540 - <property name="pack_type">GTK_PACK_END</property>
15541 - </packing>
15542 - </child>
15543 - </object>
15544 - <packing>
15545 - <property name="padding">0</property>
15546 - <property name="expand">False</property>
15547 - <property name="fill">False</property>
15548 - </packing>
15549 - </child>
15550 - </object>
15551 - <object class="GtkTable" id="config_widget">
15552 - <property name="visible">True</property>
15553 - <property name="n_rows">2</property>
15554 - <property name="n_columns">2</property>
15555 - <property name="homogeneous">False</property>
15556 - <property name="row_spacing">6</property>
15557 - <property name="column_spacing">6</property>
15558 - <property name="border_width">5</property>
15559 - <child>
15560 - <object class="GtkLabel" id="album_num_label">
15561 - <property name="visible">True</property>
15562 - <property name="label" translatable="yes">Number of albums to _retrieve:</property>
15563 - <property name="use_underline">True</property>
15564 - <property name="mnemonic-widget">album_num_spinbutton</property>
15565 - <property name="use_markup">False</property>
15566 - <property name="justify">GTK_JUSTIFY_LEFT</property>
15567 - <property name="wrap">False</property>
15568 - <property name="selectable">False</property>
15569 - <property name="xalign">0</property>
15570 - <property name="yalign">0.5</property>
15571 - <property name="xpad">0</property>
15572 - <property name="ypad">0</property>
15573 - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
15574 - <property name="width_chars">-1</property>
15575 - <property name="single_line_mode">False</property>
15576 - <property name="angle">0</property>
15577 - </object>
15578 - <packing>
15579 - <property name="left_attach">0</property>
15580 - <property name="right_attach">1</property>
15581 - <property name="top_attach">1</property>
15582 - <property name="bottom_attach">2</property>
15583 - </packing>
15584 - </child>
15585 - <child>
15586 - <object class="GtkSpinButton" id="album_num_spinbutton">
15587 - <property name="visible">True</property>
15588 - <property name="can_focus">True</property>
15589 - <property name="climb_rate">1</property>
15590 - <property name="digits">0</property>
15591 - <property name="numeric">False</property>
15592 - <property name="snap_to_ticks">False</property>
15593 - <property name="wrap">False</property>
15594 - <property name="adjustment">adjustment1</property>
15595 - </object>
15596 - <packing>
15597 - <property name="left_attach">1</property>
15598 - <property name="right_attach">2</property>
15599 - <property name="top_attach">1</property>
15600 - <property name="bottom_attach">2</property>
15601 - </packing>
15602 - </child>
15603 - <child>
15604 - <object class="GtkComboBox" id="preferred_format_combo">
15605 - <property name="model">preferred_format_combo_model</property>
15606 - <property name="visible">True</property>
15607 - <property name="add_tearoffs">False</property>
15608 - <property name="focus_on_click">True</property>
15609 - <child>
15610 - <object class="GtkCellRendererText" id="renderer2"/>
15611 - <attributes>
15612 - <attribute name="text">0</attribute>
15613 - </attributes>
15614 - </child>
15615 - </object>
15616 - <packing>
15617 - <property name="left_attach">1</property>
15618 - <property name="right_attach">2</property>
15619 - <property name="top_attach">0</property>
15620 - <property name="bottom_attach">1</property>
15621 - <property name="y_options"/>
15622 - </packing>
15623 - </child>
15624 - <child>
15625 - <object class="GtkLabel" id="preferred_format_label">
15626 - <property name="visible">True</property>
15627 - <property name="label" translatable="yes">Preferred audio _format:</property>
15628 - <property name="use_underline">True</property>
15629 - <property name="mnemonic-widget">preferred_format_combo</property>
15630 - <property name="use_markup">False</property>
15631 - <property name="justify">GTK_JUSTIFY_LEFT</property>
15632 - <property name="wrap">False</property>
15633 - <property name="selectable">False</property>
15634 - <property name="xalign">0</property>
15635 - <property name="yalign">0.5</property>
15636 - <property name="xpad">0</property>
15637 - <property name="ypad">0</property>
15638 - <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
15639 - <property name="width_chars">-1</property>
15640 - <property name="single_line_mode">False</property>
15641 - <property name="angle">0</property>
15642 - </object>
15643 - <packing>
15644 - <property name="left_attach">0</property>
15645 - <property name="right_attach">1</property>
15646 - <property name="top_attach">0</property>
15647 - <property name="bottom_attach">1</property>
15648 - </packing>
15649 - </child>
15650 - </object>
15651 - <object class="GtkMenu" constructor="uimanager1" id="popup_menu"/>
15652 -</interface>
15653 diff --git a/src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in b/src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in
15654 deleted file mode 100644
15655 index 3fe7739..0000000
15656 --- a/src/plugins/jamendo/org.gnome.totem.plugins.jamendo.gschema.xml.in.in
15657 +++ /dev/null
15658 @@ -1,20 +0,0 @@
15659 -<?xml version="1.0" encoding="UTF-8"?>
15660 -<schemalist>
15661 - <enum id="org.gnome.totem.plugins.jamendo.Format">
15662 - <value nick="ogg" value="0"/>
15663 - <value nick="mp3" value="1"/>
15664 - </enum>
15666 - <schema id="org.gnome.totem.plugins.jamendo" path="/org/gnome/Totem/jamendo/" gettext-domain="@GETTEXT_PACKAGE@">
15667 - <key name="num-per-page" type="u">
15668 - <default>10</default>
15669 - <_summary>Number of results per page</_summary>
15670 - <_description>The number of Jamendo search results to display in each page of results.</_description>
15671 - </key>
15672 - <key name="format" enum="org.gnome.totem.plugins.jamendo.Format">
15673 - <default>'ogg'</default>
15674 - <_summary>Audio format to download from Jamendo</_summary>
15675 - <_description>The preferred audio format to download tracks from Jamendo in.</_description>
15676 - </key>
15677 - </schema>
15678 -</schemalist>
15679 diff --git a/src/plugins/media-player-keys/totem-media-player-keys.c b/src/plugins/media-player-keys/totem-media-player-keys.c
15680 index 9534ba6..a6cd721 100644
15681 --- a/src/plugins/media-player-keys/totem-media-player-keys.c
15682 +++ b/src/plugins/media-player-keys/totem-media-player-keys.c
15683 @@ -31,7 +31,6 @@
15684 #include <glib-object.h>
15685 #include <glib/gi18n-lib.h>
15686 #include <gmodule.h>
15687 -#include <dbus/dbus-glib.h>
15688 #include <libpeas/peas-extension-base.h>
15689 #include <libpeas/peas-object-module.h>
15690 #include <libpeas/peas-activatable.h>
15691 @@ -49,8 +48,11 @@
15692 #define TOTEM_MEDIA_PLAYER_KEYS_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TOTEM_TYPE_MEDIA_PLAYER_KEYS_PLUGIN, TotemMediaPlayerKeysPluginClass))
15694 typedef struct {
15695 - DBusGProxy *media_player_keys_proxy;
15696 + GDBusProxy *proxy;
15697 guint handler_id;
15698 + guint watch_id;
15699 + GCancellable *cancellable_init;
15700 + GCancellable *cancellable;
15701 } TotemMediaPlayerKeysPluginPrivate;
15703 TOTEM_PLUGIN_REGISTER(TOTEM_TYPE_MEDIA_PLAYER_KEYS_PLUGIN,
15704 @@ -58,122 +60,200 @@ TOTEM_PLUGIN_REGISTER(TOTEM_TYPE_MEDIA_PLAYER_KEYS_PLUGIN,
15705 totem_media_player_keys_plugin);
15707 static void
15708 -on_media_player_key_pressed (DBusGProxy *proxy, const gchar *application, const gchar *key, TotemObject *totem)
15709 +on_media_player_key_pressed (TotemObject *totem,
15710 + const gchar *key)
15712 - if (strcmp ("Totem", application) == 0) {
15713 - if (strcmp ("Play", key) == 0)
15714 - totem_action_play_pause (totem);
15715 - else if (strcmp ("Previous", key) == 0)
15716 - totem_action_previous (totem);
15717 - else if (strcmp ("Next", key) == 0)
15718 - totem_action_next (totem);
15719 - else if (strcmp ("Stop", key) == 0)
15720 - totem_action_pause (totem);
15721 - else if (strcmp ("FastForward", key) == 0)
15722 - totem_action_remote (totem, TOTEM_REMOTE_COMMAND_SEEK_FORWARD, NULL);
15723 - else if (strcmp ("Rewind", key) == 0)
15724 - totem_action_remote (totem, TOTEM_REMOTE_COMMAND_SEEK_BACKWARD, NULL);
15725 - else if (strcmp ("Repeat", key) == 0) {
15726 - gboolean value;
15728 - value = totem_action_remote_get_setting (totem, TOTEM_REMOTE_SETTING_REPEAT);
15729 - totem_action_remote_set_setting (totem, TOTEM_REMOTE_SETTING_REPEAT, !value);
15730 - } else if (strcmp ("Shuffle", key) == 0) {
15731 - gboolean value;
15733 - value = totem_action_remote_get_setting (totem, TOTEM_REMOTE_SETTING_SHUFFLE);
15734 - totem_action_remote_set_setting (totem, TOTEM_REMOTE_SETTING_SHUFFLE, !value);
15736 + if (strcmp ("Play", key) == 0)
15737 + totem_action_play_pause (totem);
15738 + else if (strcmp ("Previous", key) == 0)
15739 + totem_action_previous (totem);
15740 + else if (strcmp ("Next", key) == 0)
15741 + totem_action_next (totem);
15742 + else if (strcmp ("Stop", key) == 0)
15743 + totem_action_pause (totem);
15744 + else if (strcmp ("FastForward", key) == 0)
15745 + totem_action_remote (totem, TOTEM_REMOTE_COMMAND_SEEK_FORWARD, NULL);
15746 + else if (strcmp ("Rewind", key) == 0)
15747 + totem_action_remote (totem, TOTEM_REMOTE_COMMAND_SEEK_BACKWARD, NULL);
15748 + else if (strcmp ("Repeat", key) == 0) {
15749 + gboolean value;
15751 + value = totem_action_remote_get_setting (totem, TOTEM_REMOTE_SETTING_REPEAT);
15752 + totem_action_remote_set_setting (totem, TOTEM_REMOTE_SETTING_REPEAT, !value);
15753 + } else if (strcmp ("Shuffle", key) == 0) {
15754 + gboolean value;
15756 + value = totem_action_remote_get_setting (totem, TOTEM_REMOTE_SETTING_SHUFFLE);
15757 + totem_action_remote_set_setting (totem, TOTEM_REMOTE_SETTING_SHUFFLE, !value);
15761 -static gboolean
15762 -on_window_focus_in_event (GtkWidget *window, GdkEventFocus *event, TotemMediaPlayerKeysPlugin *pi)
15763 +static void
15764 +grab_media_player_keys_cb (GDBusProxy *proxy,
15765 + GAsyncResult *res,
15766 + TotemMediaPlayerKeysPlugin *pi)
15768 - if (pi->priv->media_player_keys_proxy != NULL) {
15769 - dbus_g_proxy_call (pi->priv->media_player_keys_proxy,
15770 - "GrabMediaPlayerKeys", NULL,
15771 - G_TYPE_STRING, "Totem", G_TYPE_UINT, 0, G_TYPE_INVALID,
15772 - G_TYPE_INVALID);
15773 + GVariant *variant;
15774 + GError *error = NULL;
15776 + variant = g_dbus_proxy_call_finish (proxy, res, &error);
15777 + pi->priv->cancellable = NULL;
15779 + if (variant == NULL) {
15780 + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
15781 + g_warning ("Failed to call \"GrabMediaPlayerKeys\": %s", error->message);
15782 + g_error_free (error);
15783 + return;
15785 + g_variant_unref (variant);
15787 - return FALSE;
15788 + g_object_unref (pi);
15791 static void
15792 -proxy_destroy (DBusGProxy *proxy,
15793 - TotemMediaPlayerKeysPlugin* plugin)
15794 +grab_media_player_keys (TotemMediaPlayerKeysPlugin *pi)
15796 - plugin->priv->media_player_keys_proxy = NULL;
15797 + GCancellable *cancellable;
15799 + if (pi->priv->proxy == NULL)
15800 + return;
15802 + /* Only allow one key grab operation to happen concurrently */
15803 + if (pi->priv->cancellable) {
15804 + g_cancellable_cancel (pi->priv->cancellable);
15807 + cancellable = g_cancellable_new ();
15808 + pi->priv->cancellable = cancellable;
15810 + g_dbus_proxy_call (pi->priv->proxy,
15811 + "GrabMediaPlayerKeys",
15812 + g_variant_new ("(su)", "Totem", 0),
15813 + G_DBUS_CALL_FLAGS_NONE,
15814 + -1, cancellable,
15815 + (GAsyncReadyCallback) grab_media_player_keys_cb,
15816 + g_object_ref (pi));
15818 + /* GDBus keeps a reference throughout the async call */
15819 + g_object_unref (cancellable);
15822 +static gboolean
15823 +on_window_focus_in_event (GtkWidget *window,
15824 + GdkEventFocus *event,
15825 + TotemMediaPlayerKeysPlugin *pi)
15827 + grab_media_player_keys (pi);
15829 + return FALSE;
15832 static void
15833 -impl_activate (PeasActivatable *plugin)
15834 +key_pressed (GDBusProxy *proxy,
15835 + gchar *sender_name,
15836 + gchar *signal_name,
15837 + GVariant *parameters,
15838 + TotemMediaPlayerKeysPlugin *pi)
15840 - TotemMediaPlayerKeysPlugin *pi = TOTEM_MEDIA_PLAYER_KEYS_PLUGIN (plugin);
15841 - TotemObject *totem;
15842 - DBusGConnection *connection;
15843 - GError *err = NULL;
15844 - GtkWindow *window;
15845 + char *app, *cmd;
15847 - connection = dbus_g_bus_get (DBUS_BUS_SESSION, &err);
15848 - if (connection == NULL) {
15849 - g_warning ("Error connecting to D-Bus: %s", err->message);
15850 + if (g_strcmp0 (signal_name, "MediaPlayerKeyPressed") != 0)
15851 return;
15853 + g_variant_get (parameters, "(ss)", &app, &cmd);
15854 + if (g_strcmp0 (app, "Totem") == 0) {
15855 + TotemObject *totem;
15857 - /* Try the gnome-settings-daemon version,
15858 - * then the gnome-control-center version of things */
15859 - pi->priv->media_player_keys_proxy = dbus_g_proxy_new_for_name_owner (connection,
15860 - "org.gnome.SettingsDaemon",
15861 - "/org/gnome/SettingsDaemon/MediaKeys",
15862 - "org.gnome.SettingsDaemon.MediaKeys",
15863 - NULL);
15864 - if (pi->priv->media_player_keys_proxy == NULL) {
15865 - pi->priv->media_player_keys_proxy = dbus_g_proxy_new_for_name_owner (connection,
15866 - "org.gnome.SettingsDaemon",
15867 - "/org/gnome/SettingsDaemon",
15868 - "org.gnome.SettingsDaemon",
15869 - &err);
15870 + totem = g_object_get_data (G_OBJECT (pi), "object");
15871 + on_media_player_key_pressed (totem, cmd);
15873 + g_free (app);
15874 + g_free (cmd);
15877 +static void
15878 +got_proxy_cb (GObject *source_object,
15879 + GAsyncResult *res,
15880 + TotemMediaPlayerKeysPlugin *pi)
15882 + GError *error = NULL;
15884 - dbus_g_connection_unref (connection);
15885 - if (err != NULL) {
15886 -#if 0
15887 - gboolean daemon_not_running;
15888 - g_warning ("Failed to create dbus proxy for org.gnome.SettingsDaemon: %s",
15889 - err->message);
15890 - daemon_not_running = (err->code == DBUS_GERROR_NAME_HAS_NO_OWNER);
15891 - g_error_free (err);
15892 - /* don't popup error if settings-daemon is not running,
15893 - * ie when starting totem not under GNOME desktop */
15894 - return daemon_not_running;
15895 -#endif
15896 + pi->priv->proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
15897 + pi->priv->cancellable_init = NULL;
15899 + if (pi->priv->proxy == NULL) {
15900 + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
15901 + g_warning ("Failed to contact settings daemon: %s", error->message);
15902 + g_error_free (error);
15903 return;
15904 - } else {
15905 - g_signal_connect_object (pi->priv->media_player_keys_proxy,
15906 - "destroy",
15907 - G_CALLBACK (proxy_destroy),
15908 - pi, 0);
15911 - dbus_g_proxy_call (pi->priv->media_player_keys_proxy,
15912 - "GrabMediaPlayerKeys", NULL,
15913 - G_TYPE_STRING, "Totem", G_TYPE_UINT, 0, G_TYPE_INVALID,
15914 - G_TYPE_INVALID);
15915 + grab_media_player_keys (pi);
15917 - totem = g_object_get_data (G_OBJECT (plugin), "object");
15918 + g_signal_connect (G_OBJECT (pi->priv->proxy), "g-signal",
15919 + G_CALLBACK (key_pressed), pi);
15921 + g_object_unref (pi);
15924 +static void
15925 +name_appeared_cb (GDBusConnection *connection,
15926 + const gchar *name,
15927 + const gchar *name_owner,
15928 + TotemMediaPlayerKeysPlugin *pi)
15930 + GCancellable *cancellable;
15932 + cancellable = g_cancellable_new ();
15933 + pi->priv->cancellable_init = cancellable;
15935 - dbus_g_object_register_marshaller (totem_marshal_VOID__STRING_STRING,
15936 - G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
15937 - dbus_g_proxy_add_signal (pi->priv->media_player_keys_proxy, "MediaPlayerKeyPressed",
15938 - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
15939 - dbus_g_proxy_connect_signal (pi->priv->media_player_keys_proxy, "MediaPlayerKeyPressed",
15940 - G_CALLBACK (on_media_player_key_pressed), totem, NULL);
15941 + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
15942 + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
15943 + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
15944 + NULL,
15945 + "org.gnome.SettingsDaemon",
15946 + "/org/gnome/SettingsDaemon/MediaKeys",
15947 + "org.gnome.SettingsDaemon.MediaKeys",
15948 + cancellable,
15949 + (GAsyncReadyCallback) got_proxy_cb,
15950 + g_object_ref (pi));
15952 + /* GDBus keeps a reference throughout the async call */
15953 + g_object_unref (cancellable);
15956 +static void
15957 +name_vanished_cb (GDBusConnection *connection,
15958 + const gchar *name,
15959 + TotemMediaPlayerKeysPlugin *pi)
15961 + if (pi->priv->proxy != NULL) {
15962 + g_object_unref (pi->priv->proxy);
15963 + pi->priv->proxy = NULL;
15966 + if (pi->priv->cancellable) {
15967 + g_cancellable_cancel (pi->priv->cancellable);
15971 +static void
15972 +impl_activate (PeasActivatable *plugin)
15974 + TotemMediaPlayerKeysPlugin *pi = TOTEM_MEDIA_PLAYER_KEYS_PLUGIN (plugin);
15975 + TotemObject *totem;
15976 + GtkWindow *window;
15978 + pi->priv->watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
15979 + "org.gnome.SettingsDaemon",
15980 + G_BUS_NAME_WATCHER_FLAGS_NONE,
15981 + (GBusNameAppearedCallback) name_appeared_cb,
15982 + (GBusNameVanishedCallback) name_vanished_cb,
15983 + g_object_ref (pi), (GDestroyNotify) g_object_unref);
15985 + totem = g_object_get_data (G_OBJECT (plugin), "object");
15986 window = totem_get_main_window (totem);
15987 pi->priv->handler_id = g_signal_connect (G_OBJECT (window), "focus-in-event",
15988 - G_CALLBACK (on_window_focus_in_event), pi);
15989 + G_CALLBACK (on_window_focus_in_event), pi);
15991 g_object_unref (G_OBJECT (window));
15993 @@ -184,12 +264,17 @@ impl_deactivate (PeasActivatable *plugin)
15994 TotemMediaPlayerKeysPlugin *pi = TOTEM_MEDIA_PLAYER_KEYS_PLUGIN (plugin);
15995 GtkWindow *window;
15997 - if (pi->priv->media_player_keys_proxy != NULL) {
15998 - dbus_g_proxy_call (pi->priv->media_player_keys_proxy,
15999 - "ReleaseMediaPlayerKeys", NULL,
16000 - G_TYPE_STRING, "Totem", G_TYPE_INVALID, G_TYPE_INVALID);
16001 - g_object_unref (pi->priv->media_player_keys_proxy);
16002 - pi->priv->media_player_keys_proxy = NULL;
16003 + if (pi->priv->cancellable_init) {
16004 + g_cancellable_cancel (pi->priv->cancellable_init);
16007 + if (pi->priv->cancellable) {
16008 + g_cancellable_cancel (pi->priv->cancellable);
16011 + if (pi->priv->proxy != NULL) {
16012 + g_object_unref (pi->priv->proxy);
16013 + pi->priv->proxy = NULL;
16016 if (pi->priv->handler_id != 0) {
16017 @@ -203,6 +288,11 @@ impl_deactivate (PeasActivatable *plugin)
16018 g_signal_handler_disconnect (G_OBJECT (window), pi->priv->handler_id);
16020 g_object_unref (window);
16021 + pi->priv->handler_id = 0;
16023 + if (pi->priv->watch_id != 0) {
16024 + g_bus_unwatch_name (pi->priv->watch_id);
16025 + pi->priv->watch_id = 0;
16029 diff --git a/src/plugins/opensubtitles/hash.py b/src/plugins/opensubtitles/hash.py
16030 index 7e1189d..d81e588 100644
16031 --- a/src/plugins/opensubtitles/hash.py
16032 +++ b/src/plugins/opensubtitles/hash.py
16033 @@ -1,47 +1,50 @@
16034 import struct
16035 import os
16036 -import gio
16037 +from gi.repository import Gio
16039 SIZE_ERROR = -1
16040 SEEK_ERROR = -2
16042 -def hashFile(name):
16043 - """ FIXME Need to handle exceptions !! """
16046 - longlongformat = 'q' # long long
16047 - bytesize = struct.calcsize(longlongformat)
16049 - fp = gio.File(name)
16051 - filesize = fp.query_info('standard::size', 0).get_attribute_uint64('standard::size')
16053 - hash = filesize
16055 - if filesize < 65536 * 2:
16056 - return SIZE_ERROR, 0
16058 - data = fp.read()
16060 - if data.can_seek() != True:
16061 - return SEEK_ERROR, 0
16063 - for x in range(65536/bytesize):
16064 - buffer = data.read(bytesize)
16065 - (l_value,)= struct.unpack(longlongformat, buffer)
16066 - hash += l_value
16067 - hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number
16069 - if data.seek(max(0,filesize-65536),1) != True:
16070 - return SEEK_ERROR, 0
16072 - for x in range(65536/bytesize):
16073 - buffer = data.read(bytesize)
16074 - (l_value,)= struct.unpack(longlongformat, buffer)
16075 - hash += l_value
16076 - hash = hash & 0xFFFFFFFFFFFFFFFF
16078 - data.close()
16079 - returnedhash = "%016x" % hash
16080 - return returnedhash, filesize
16081 +def hash_file (name):
16082 + """ FIXME Need to handle exceptions !! """
16084 + longlongformat = 'q' # long long
16085 + bytesize = struct.calcsize (longlongformat)
16087 + file_to_hash = Gio.File.new_for_uri (name)
16089 + file_info = file_to_hash.query_info ('standard::size', 0, None)
16090 + filesize = file_info.get_attribute_uint64 ('standard::size')
16092 + file_hash = filesize
16094 + if filesize < 65536 * 2:
16095 + return SIZE_ERROR, 0
16097 + f = file(file_to_hash.get_path(), "rb")
16099 + for _ in range (65536 / bytesize):
16100 + buf = f.read (bytesize)
16101 + (l_value,) = struct.unpack (longlongformat, buf)
16102 + file_hash += l_value
16103 + file_hash = file_hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number
16105 + f.seek (max (0, filesize - 65536), os.SEEK_SET)
16107 + if f.tell() != max (0, filesize - 65536):
16108 + return SEEK_ERROR, 0
16110 + for _ in range (65536/bytesize):
16111 + buf = f.read (bytesize)
16112 + (l_value,) = struct.unpack (longlongformat, buf)
16113 + file_hash += l_value
16114 + file_hash = file_hash & 0xFFFFFFFFFFFFFFFF
16116 + f.close ()
16117 + returnedhash = "%016x" % file_hash
16119 + print returnedhash
16120 + print filesize
16122 + return returnedhash, filesize
16124 diff --git a/src/plugins/opensubtitles/opensubtitles.py b/src/plugins/opensubtitles/opensubtitles.py
16125 index 1c4edb8..dd7a04d 100644
16126 --- a/src/plugins/opensubtitles/opensubtitles.py
16127 +++ b/src/plugins/opensubtitles/opensubtitles.py
16128 @@ -1,668 +1,770 @@
16129 # -*- coding: utf-8 -*-
16131 -from gi.repository import Peas
16132 -from gi.repository import Gtk
16133 -from gi.repository import Gdk
16134 -from gi.repository import Gio
16135 -from gi.repository import Pango
16136 -from gi.repository import Totem
16137 -import gobject
16138 -gobject.threads_init()
16139 +from gi.repository import GObject, Peas, Gtk, Gdk # pylint: disable-msg=E0611
16140 +from gi.repository import Gio, Pango, Totem # pylint: disable-msg=E0611
16142 import xmlrpclib
16143 import threading
16144 import xdg.BaseDirectory
16145 from os import sep, path, mkdir
16146 import gettext
16148 -from hash import hashFile
16149 +from hash import hash_file
16151 -gettext.textdomain("totem")
16152 +gettext.textdomain ("totem")
16154 D_ = gettext.dgettext
16155 _ = gettext.gettext
16157 +GObject.threads_init ()
16159 USER_AGENT = 'Totem'
16160 OK200 = '200 OK'
16161 TOTEM_REMOTE_COMMAND_REPLACE = 14
16163 SUBTITLES_EXT = [
16164 - "asc",
16165 - "txt",
16166 - "sub",
16167 - "srt",
16168 - "smi",
16169 - "ssa",
16170 - "ass",
16171 + "asc",
16172 + "txt",
16173 + "sub",
16174 + "srt",
16175 + "smi",
16176 + "ssa",
16177 + "ass",
16180 -# Map of the language codes used by opensubtitles.org's API to their human-readable name
16181 -LANGUAGES_STR = [(D_('iso_639_3', 'Albanian'), 'sq'),
16182 - (D_('iso_639_3', 'Arabic'), 'ar'),
16183 - (D_('iso_639_3', 'Armenian'), 'hy'),
16184 - (D_('iso_639_3', 'Neo-Aramaic, Assyrian'), 'ay'),
16185 - (D_('iso_639_3', 'Bosnian'), 'bs'),
16186 - (_('Brasilian Portuguese'), 'pb'),
16187 - (D_('iso_639_3', 'Bulgarian'), 'bg'),
16188 - (D_('iso_639_3', 'Catalan'), 'ca'),
16189 - (D_('iso_639_3', 'Chinese'), 'zh'),
16190 - (D_('iso_639_3', 'Croatian'), 'hr'),
16191 - (D_('iso_639_3', 'Czech'), 'cs'),
16192 - (D_('iso_639_3', 'Danish'), 'da'),
16193 - (D_('iso_639_3', 'Dutch'), 'nl'),
16194 - (D_('iso_639_3', 'English'), 'en'),
16195 - (D_('iso_639_3', 'Esperanto'), 'eo'),
16196 - (D_('iso_639_3', 'Estonian'), 'et'),
16197 - (D_('iso_639_3', 'Finnish'), 'fi'),
16198 - (D_('iso_639_3', 'French'), 'fr'),
16199 - (D_('iso_639_3', 'Galician'), 'gl'),
16200 - (D_('iso_639_3', 'Georgian'), 'ka'),
16201 - (D_('iso_639_3', 'German'), 'de'),
16202 - (D_('iso_639_3', 'Greek, Modern (1453-)'), 'el'),
16203 - (D_('iso_639_3', 'Hebrew'), 'he'),
16204 - (D_('iso_639_3', 'Hindi'), 'hi'),
16205 - (D_('iso_639_3', 'Hungarian'), 'hu'),
16206 - (D_('iso_639_3', 'Icelandic'), 'is'),
16207 - (D_('iso_639_3', 'Indonesian'), 'id'),
16208 - (D_('iso_639_3', 'Italian'), 'it'),
16209 - (D_('iso_639_3', 'Japanese'), 'ja'),
16210 - (D_('iso_639_3', 'Kazakh'), 'kk'),
16211 - (D_('iso_639_3', 'Korean'), 'ko'),
16212 - (D_('iso_639_3', 'Latvian'), 'lv'),
16213 - (D_('iso_639_3', 'Lithuanian'), 'lt'),
16214 - (D_('iso_639_3', 'Luxembourgish'), 'lb'),
16215 - (D_('iso_639_3', 'Macedonian'), 'mk'),
16216 - (D_('iso_639_3', 'Malay (macrolanguage)'), 'ms'),
16217 - (D_('iso_639_3', 'Norwegian'), 'no'),
16218 - (D_('iso_639_3', 'Occitan (post 1500)'), 'oc'),
16219 - (D_('iso_639_3', 'Persian'), 'fa'),
16220 - (D_('iso_639_3', 'Polish'), 'pl'),
16221 - (D_('iso_639_3', 'Portuguese'), 'pt'),
16222 - (D_('iso_639_3', 'Romanian'), 'ro'),
16223 - (D_('iso_639_3', 'Russian'), 'ru'),
16224 - (D_('iso_639_3', 'Serbian'), 'sr'),
16225 - (D_('iso_639_3', 'Slovak'), 'sk'),
16226 - (D_('iso_639_3', 'Slovenian'), 'sl'),
16227 - (D_('iso_639_3', 'Spanish'), 'es'),
16228 - (D_('iso_639_3', 'Swedish'), 'sv'),
16229 - (D_('iso_639_3', 'Thai'), 'th'),
16230 - (D_('iso_639_3', 'Turkish'), 'tr'),
16231 - (D_('iso_639_3', 'Ukrainian'), 'uk'),
16232 - (D_('iso_639_3', 'Vietnamese'), 'vi'),]
16233 +# Map of the language codes used by opensubtitles.org's API to their
16234 +# human-readable name
16235 +LANGUAGES_STR = [ (D_('iso_639_3', 'Albanian'), 'sq'),
16236 + (D_('iso_639_3', 'Arabic'), 'ar'),
16237 + (D_('iso_639_3', 'Armenian'), 'hy'),
16238 + (D_('iso_639_3', 'Neo-Aramaic, Assyrian'), 'ay'),
16239 + (D_('iso_639_3', 'Bosnian'), 'bs'),
16240 + (_('Brazilian Portuguese'), 'pb'),
16241 + (D_('iso_639_3', 'Bulgarian'), 'bg'),
16242 + (D_('iso_639_3', 'Catalan'), 'ca'),
16243 + (D_('iso_639_3', 'Chinese'), 'zh'),
16244 + (D_('iso_639_3', 'Croatian'), 'hr'),
16245 + (D_('iso_639_3', 'Czech'), 'cs'),
16246 + (D_('iso_639_3', 'Danish'), 'da'),
16247 + (D_('iso_639_3', 'Dutch'), 'nl'),
16248 + (D_('iso_639_3', 'English'), 'en'),
16249 + (D_('iso_639_3', 'Esperanto'), 'eo'),
16250 + (D_('iso_639_3', 'Estonian'), 'et'),
16251 + (D_('iso_639_3', 'Finnish'), 'fi'),
16252 + (D_('iso_639_3', 'French'), 'fr'),
16253 + (D_('iso_639_3', 'Galician'), 'gl'),
16254 + (D_('iso_639_3', 'Georgian'), 'ka'),
16255 + (D_('iso_639_3', 'German'), 'de'),
16256 + (D_('iso_639_3', 'Greek, Modern (1453-)'), 'el'),
16257 + (D_('iso_639_3', 'Hebrew'), 'he'),
16258 + (D_('iso_639_3', 'Hindi'), 'hi'),
16259 + (D_('iso_639_3', 'Hungarian'), 'hu'),
16260 + (D_('iso_639_3', 'Icelandic'), 'is'),
16261 + (D_('iso_639_3', 'Indonesian'), 'id'),
16262 + (D_('iso_639_3', 'Italian'), 'it'),
16263 + (D_('iso_639_3', 'Japanese'), 'ja'),
16264 + (D_('iso_639_3', 'Kazakh'), 'kk'),
16265 + (D_('iso_639_3', 'Korean'), 'ko'),
16266 + (D_('iso_639_3', 'Latvian'), 'lv'),
16267 + (D_('iso_639_3', 'Lithuanian'), 'lt'),
16268 + (D_('iso_639_3', 'Luxembourgish'), 'lb'),
16269 + (D_('iso_639_3', 'Macedonian'), 'mk'),
16270 + (D_('iso_639_3', 'Malay (macrolanguage)'), 'ms'),
16271 + (D_('iso_639_3', 'Norwegian'), 'no'),
16272 + (D_('iso_639_3', 'Occitan (post 1500)'), 'oc'),
16273 + (D_('iso_639_3', 'Persian'), 'fa'),
16274 + (D_('iso_639_3', 'Polish'), 'pl'),
16275 + (D_('iso_639_3', 'Portuguese'), 'pt'),
16276 + (D_('iso_639_3', 'Romanian'), 'ro'),
16277 + (D_('iso_639_3', 'Russian'), 'ru'),
16278 + (D_('iso_639_3', 'Serbian'), 'sr'),
16279 + (D_('iso_639_3', 'Slovak'), 'sk'),
16280 + (D_('iso_639_3', 'Slovenian'), 'sl'),
16281 + (D_('iso_639_3', 'Spanish'), 'es'),
16282 + (D_('iso_639_3', 'Swedish'), 'sv'),
16283 + (D_('iso_639_3', 'Thai'), 'th'),
16284 + (D_('iso_639_3', 'Turkish'), 'tr'),
16285 + (D_('iso_639_3', 'Ukrainian'), 'uk'),
16286 + (D_('iso_639_3', 'Vietnamese'), 'vi'),]
16288 # Map of ISO 639-1 language codes to the codes used by opensubtitles.org's API
16289 -LANGUAGES = {'sq':'alb',
16290 - 'ar':'ara',
16291 - 'hy':'arm',
16292 - 'ay':'ass',
16293 - 'bs':'bos',
16294 - 'pb':'pob',
16295 - 'bg':'bul',
16296 - 'ca':'cat',
16297 - 'zh':'chi',
16298 - 'hr':'hrv',
16299 - 'cs':'cze',
16300 - 'da':'dan',
16301 - 'nl':'dut',
16302 - 'en':'eng',
16303 - 'eo':'epo',
16304 - 'et':'est',
16305 - 'fi':'fin',
16306 - 'fr':'fre',
16307 - 'gl':'glg',
16308 - 'ka':'geo',
16309 - 'de':'ger',
16310 - 'el':'ell',
16311 - 'he':'heb',
16312 - 'hi':'hin',
16313 - 'hu':'hun',
16314 - 'is':'ice',
16315 - 'id':'ind',
16316 - 'it':'ita',
16317 - 'ja':'jpn',
16318 - 'kk':'kaz',
16319 - 'ko':'kor',
16320 - 'lv':'lav',
16321 - 'lt':'lit',
16322 - 'lb':'ltz',
16323 - 'mk':'mac',
16324 - 'ms':'may',
16325 - 'no':'nor',
16326 - 'oc':'oci',
16327 - 'fa':'per',
16328 - 'pl':'pol',
16329 - 'pt':'por',
16330 - 'ro':'rum',
16331 - 'ru':'rus',
16332 - 'sr':'scc',
16333 - 'sk':'slo',
16334 - 'sl':'slv',
16335 - 'es':'spa',
16336 - 'sv':'swe',
16337 - 'th':'tha',
16338 - 'tr':'tur',
16339 - 'uk':'ukr',
16340 - 'vi':'vie',}
16342 -class SearchThread(threading.Thread):
16343 +LANGUAGES = {'sq':'alb',
16344 + 'ar':'ara',
16345 + 'hy':'arm',
16346 + 'ay':'ass',
16347 + 'bs':'bos',
16348 + 'pb':'pob',
16349 + 'bg':'bul',
16350 + 'ca':'cat',
16351 + 'zh':'chi',
16352 + 'hr':'hrv',
16353 + 'cs':'cze',
16354 + 'da':'dan',
16355 + 'nl':'dut',
16356 + 'en':'eng',
16357 + 'eo':'epo',
16358 + 'et':'est',
16359 + 'fi':'fin',
16360 + 'fr':'fre',
16361 + 'gl':'glg',
16362 + 'ka':'geo',
16363 + 'de':'ger',
16364 + 'el':'ell',
16365 + 'he':'heb',
16366 + 'hi':'hin',
16367 + 'hu':'hun',
16368 + 'is':'ice',
16369 + 'id':'ind',
16370 + 'it':'ita',
16371 + 'ja':'jpn',
16372 + 'kk':'kaz',
16373 + 'ko':'kor',
16374 + 'lv':'lav',
16375 + 'lt':'lit',
16376 + 'lb':'ltz',
16377 + 'mk':'mac',
16378 + 'ms':'may',
16379 + 'no':'nor',
16380 + 'oc':'oci',
16381 + 'fa':'per',
16382 + 'pl':'pol',
16383 + 'pt':'por',
16384 + 'ro':'rum',
16385 + 'ru':'rus',
16386 + 'sr':'scc',
16387 + 'sk':'slo',
16388 + 'sl':'slv',
16389 + 'es':'spa',
16390 + 'sv':'swe',
16391 + 'th':'tha',
16392 + 'tr':'tur',
16393 + 'uk':'ukr',
16394 + 'vi':'vie',}
16396 +class SearchThread (threading.Thread):
16398 This is the thread started when the dialog is searching for subtitles
16400 - def __init__(self, model):
16401 - self.model = model
16402 + def __init__ (self, model, movie_hash, movie_size):
16403 + self._model = model
16404 + self._movie_hash = movie_hash
16405 + self._movie_size = movie_size
16406 self._done = False
16407 - self._lock = threading.Lock()
16408 - threading.Thread.__init__(self)
16410 - def run(self):
16411 - self.model.lock.acquire(True)
16412 - self.model.results = self.model.os_search_subtitles()
16413 - self.model.lock.release()
16414 + self._results = []
16415 + self._lock = threading.Lock ()
16416 + self._message = ''
16417 + threading.Thread.__init__ (self)
16419 + def run (self):
16420 + self._lock.acquire (True)
16421 + (self._results,
16422 + self._message) = self._model.search_subtitles (self._movie_hash,
16423 + self._movie_size)
16424 self._done = True
16426 + self._lock.release ()
16428 + def get_results (self):
16429 + results = []
16431 + self._lock.acquire (True)
16432 + if self._done:
16433 + results = self._results
16434 + self._lock.release ()
16436 + return results
16438 + def get_message (self):
16439 + message = _(u'Searching for subtitles…')
16441 + self._lock.acquire (True)
16442 + if self._done:
16443 + message = self._message
16444 + self._lock.release ()
16446 + return message
16448 @property
16449 - def done(self):
16450 + def done (self):
16451 """ Thread-safe property to know whether the query is done or not """
16452 - self._lock.acquire(True)
16453 + self._lock.acquire (True)
16454 res = self._done
16455 - self._lock.release()
16456 + self._lock.release ()
16457 return res
16459 -class DownloadThread(threading.Thread):
16460 +class DownloadThread (threading.Thread):
16462 This is the thread started when the dialog is downloading the subtitles.
16464 - def __init__(self, model, subtitle_id):
16465 - self.model = model
16466 - self.subtitle_id = subtitle_id
16467 + def __init__ (self, model, subtitle_id):
16468 + self._model = model
16469 + self._subtitle_id = subtitle_id
16470 self._done = False
16471 - self._lock = threading.Lock()
16472 - threading.Thread.__init__(self)
16474 - def run(self):
16475 - self.model.lock.acquire(True)
16476 - self.model.subtitles = self.model.os_download_subtitles(self.subtitle_id)
16477 - self.model.lock.release()
16478 + self._lock = threading.Lock ()
16479 + self._subtitles = ''
16480 + self._message = ''
16481 + threading.Thread.__init__ (self)
16483 + def run (self):
16484 + self._lock.acquire (True)
16485 + (self._subtitles,
16486 + self._message) = self._model.download_subtitles (self._subtitle_id)
16487 self._done = True
16489 + self._lock.release ()
16491 + def get_subtitles (self):
16492 + subtitles = ''
16494 + self._lock.acquire (True)
16495 + if self._done:
16496 + subtitles = self._subtitles
16497 + self._lock.release ()
16499 + return subtitles
16501 + def get_message (self):
16502 + message = _(u'Downloading the subtitles…')
16504 + self._lock.acquire (True)
16505 + if self._done:
16506 + message = self._message
16507 + self._lock.release ()
16509 + return message
16511 @property
16512 - def done(self):
16513 + def done (self):
16514 """ Thread-safe property to know whether the query is done or not """
16515 - self._lock.acquire(True)
16516 + self._lock.acquire (True)
16517 res = self._done
16518 - self._lock.release()
16519 + self._lock.release ()
16520 return res
16522 # OpenSubtitles.org API abstraction
16524 -class OpenSubtitlesModel(object):
16525 +class OpenSubtitlesModel (object):
16527 This contains the logic of the opensubtitles service.
16529 - def __init__(self, server):
16530 - self.server = server
16531 - self.token = None
16532 + def __init__ (self, server):
16533 + self._server = server
16534 + self._token = None
16536 try:
16537 import locale
16538 - self.lang = LANGUAGES[locale.getlocale()[0].split('_')[0]]
16539 - except:
16540 + (language_code, _encoding) = locale.getlocale ()
16541 + self.lang = LANGUAGES[language_code.split ('_')[0]]
16542 + except (ImportError, IndexError, AttributeError):
16543 self.lang = 'eng'
16544 - self.hash = None
16545 - self.size = 0
16547 - self.lock = threading.Lock()
16548 - self.results = []
16549 - self.subtitles = ''
16551 - self.message = ''
16552 + self._lock = threading.Lock ()
16554 - def os_login(self, username='', password=''):
16555 + def _log_in (self, username='', password=''):
16557 - Logs into the opensubtitles web service and gets a valid token for
16558 - the comming comunications. If we are already logged it only checks
16559 - the if the token is still valid.
16560 + Non-locked version of log_in() for internal use only.
16562 - @rtype : bool
16563 + @rtype : (bool, string)
16566 result = None
16567 - self.message = ''
16569 - if self.token:
16570 + if self._token:
16571 # We have already logged-in before, check the connection
16572 try:
16573 - result = self.server.NoOperation(self.token)
16574 - except:
16575 + result = self._server.NoOperation (self._token)
16576 + except (xmlrpclib.Fault, xmlrpclib.ProtocolError):
16577 pass
16578 if result and result['status'] != OK200:
16579 - return True
16580 + return (True, '')
16582 try:
16583 - result = self.server.LogIn(username, password, self.lang, USER_AGENT)
16584 - except:
16585 + result = self._server.LogIn (username, password, self.lang,
16586 + USER_AGENT)
16587 + except (xmlrpclib.Fault, xmlrpclib.ProtocolError):
16588 pass
16589 - if result and result.get('status') == OK200:
16590 - self.token = result.get('token')
16591 - if self.token:
16592 - return True
16594 - self.message = _(u'Could not contact the OpenSubtitles website')
16595 + if result and result.get ('status') == OK200:
16596 + self._token = result.get ('token')
16597 + if self._token:
16598 + return (True, '')
16600 - return False
16601 + return (False, _(u'Could not contact the OpenSubtitles website'))
16603 - def os_search_subtitles(self):
16604 + def log_in (self, username='', password=''):
16606 + Logs into the opensubtitles web service and gets a valid token for
16607 + the comming comunications. If we are already logged it only checks
16608 + the if the token is still valid. It returns a tuple of success boolean
16609 + and error message (if appropriate).
16611 + @rtype : (bool, string)
16613 - self.message = ''
16614 - if self.os_login():
16615 - searchdata = {'sublanguageid': self.lang,
16616 - 'moviehash' : self.hash,
16617 - 'moviebytesize': str(self.size)}
16619 + self._lock.acquire (True)
16620 + result = self._log_in (username, password)
16621 + self._lock.release ()
16623 + return result
16625 + def search_subtitles (self, movie_hash, movie_size):
16626 + self._lock.acquire (True)
16628 + message = ''
16630 + (log_in_success, log_in_message) = self._log_in ()
16632 + if log_in_success:
16633 + searchdata = {'sublanguageid': self.lang,
16634 + 'moviehash' : movie_hash,
16635 + 'moviebytesize': str (movie_size)}
16636 try:
16637 - result = self.server.SearchSubtitles(self.token, [searchdata])
16638 + result = self._server.SearchSubtitles (self._token,
16639 + [searchdata])
16640 except xmlrpclib.ProtocolError:
16641 - self.message = _(u'Could not contact the OpenSubtitles website')
16642 + message = _(u'Could not contact the OpenSubtitles website.')
16644 - if result.get('data'):
16645 - return result['data']
16646 + if result.get ('data'):
16647 + self._lock.release ()
16648 + return (result['data'], message)
16649 else:
16650 - self.message = _(u'No results found')
16651 + message = _(u'No results found.')
16652 + else:
16653 + message = log_in_message
16655 - return None
16656 + self._lock.release ()
16658 - def os_download_subtitles(self, subtitleId):
16659 - """
16660 - """
16661 - self.message = ''
16662 - if self.os_login():
16663 + return (None, message)
16665 + def download_subtitles (self, subtitle_id):
16666 + self._lock.acquire (True)
16668 + message = ''
16669 + error_message = _(u'Could not contact the OpenSubtitles website.')
16671 + (log_in_success, log_in_message) = self._log_in ()
16673 + if log_in_success:
16674 try:
16675 - result = self.server.DownloadSubtitles(self.token, [subtitleId])
16676 + result = self._server.DownloadSubtitles (self._token,
16677 + [subtitle_id])
16678 except xmlrpclib.ProtocolError:
16679 - self.message = _(u'Could not contact the OpenSubtitles website')
16680 + message = error_message
16682 - if result and result.get('status') == OK200:
16683 + if result and result.get ('status') == OK200:
16684 try:
16685 subtitle64 = result['data'][0]['data']
16686 - except:
16687 - self.message = _(u'Could not contact the OpenSubtitles website')
16688 - return None
16689 + except LookupError:
16690 + self._lock.release ()
16691 + return (None, error_message)
16693 import StringIO, gzip, base64
16694 - subtitleDecoded = base64.decodestring(subtitle64)
16695 - subtitleGzipped = StringIO.StringIO(subtitleDecoded)
16696 - subtitleGzippedFile = gzip.GzipFile(fileobj=subtitleGzipped)
16697 + subtitle_decoded = base64.decodestring (subtitle64)
16698 + subtitle_gzipped = StringIO.StringIO (subtitle_decoded)
16699 + subtitle_gzipped_file = gzip.GzipFile (fileobj=subtitle_gzipped)
16701 + self._lock.release ()
16703 - return subtitleGzippedFile.read()
16704 + return (subtitle_gzipped_file.read (), message)
16705 + else:
16706 + message = log_in_message
16708 - return None
16709 + self._lock.release ()
16711 -class OpenSubtitles(gobject.GObject, Peas.Activatable):
16712 + return (None, message)
16714 +class OpenSubtitles (GObject.Object, Peas.Activatable):
16715 __gtype_name__ = 'OpenSubtitles'
16717 - object = gobject.property(type = gobject.GObject)
16718 + object = GObject.property (type = GObject.Object)
16720 + def __init__ (self):
16721 + GObject.Object.__init__ (self)
16723 - def __init__(self):
16724 - self.dialog = None
16725 - self.totem = None
16726 - self.settings = Gio.Settings.new ('org.gnome.totem.plugins.opensubtitles')
16727 + self._dialog = None
16728 + self._totem = None
16729 + schema = 'org.gnome.totem.plugins.opensubtitles'
16730 + self._settings = Gio.Settings.new (schema)
16732 + self._manager = None
16733 + self._menu_id = None
16734 + self._action_group = None
16735 + self._action = None
16737 + self._find_button = None
16738 + self._apply_button = None
16739 + self._close_button = None
16741 + self._list_store = None
16742 + self._model = None
16743 + self._tree_view = None
16745 + self._filename = None
16746 + self._progress = None
16748 # totem.Plugin methods
16750 - def do_activate(self):
16751 + def do_activate (self):
16753 Called when the plugin is activated.
16754 - Here the sidebar page is initialized(set up the treeview, connect
16755 + Here the sidebar page is initialized (set up the treeview, connect
16756 the callbacks, ...) and added to totem.
16758 - self.totem = self.object
16759 - self.filename = None
16760 + self._totem = self.object
16762 + # Name of the movie file which the most-recently-downloaded subtitles
16763 + # are related to.
16764 + self._filename = None
16766 - self.manager = self.totem.get_ui_manager()
16767 - self.os_append_menu()
16768 + self._manager = self._totem.get_ui_manager ()
16769 + self._append_menu ()
16771 - self.totem.connect('file-opened', self.on_totem__file_opened)
16772 - self.totem.connect('file-closed', self.on_totem__file_closed)
16773 + self._totem.connect ('file-opened', self.__on_totem__file_opened)
16774 + self._totem.connect ('file-closed', self.__on_totem__file_closed)
16776 - # Obtain the ServerProxy and init the model
16777 - server = xmlrpclib.Server('http://api.opensubtitles.org/xml-rpc')
16778 - self.model = OpenSubtitlesModel(server)
16779 + # Obtain the ServerProxy and init the model
16780 + server = xmlrpclib.Server ('http://api.opensubtitles.org/xml-rpc')
16781 + self._model = OpenSubtitlesModel (server)
16783 - def do_deactivate(self):
16784 - if self.dialog:
16785 - self.dialog.destroy()
16786 - self.dialog = None
16788 - self.os_delete_menu()
16789 + def do_deactivate (self):
16790 + if self._dialog:
16791 + self._dialog.destroy ()
16792 + self._dialog = None
16794 + self._delete_menu ()
16796 # UI related code
16798 - def os_build_dialog(self, action):
16799 - builder = Totem.plugin_load_interface ("opensubtitles", "opensubtitles.ui", True, self.totem.get_main_window (), self)
16800 + def _build_dialog (self):
16801 + builder = Totem.plugin_load_interface ("opensubtitles",
16802 + "opensubtitles.ui", True,
16803 + self._totem.get_main_window (),
16804 + self)
16806 # Obtain all the widgets we need to initialize
16807 - combobox = builder.get_object('language_combobox')
16808 - languages = builder.get_object('language_model')
16809 - self.progress = builder.get_object('progress_bar')
16810 - self.treeview = builder.get_object('subtitle_treeview')
16811 - self.liststore = builder.get_object('subtitle_model')
16812 - self.dialog = builder.get_object('subtitles_dialog')
16813 - self.find_button = builder.get_object('find_button')
16814 - self.apply_button = builder.get_object('apply_button')
16815 - self.close_button = builder.get_object('close_button')
16816 + combobox = builder.get_object ('language_combobox')
16817 + languages = builder.get_object ('language_model')
16818 + self._progress = builder.get_object ('progress_bar')
16819 + self._tree_view = builder.get_object ('subtitle_treeview')
16820 + self._list_store = builder.get_object ('subtitle_model')
16821 + self._dialog = builder.get_object ('subtitles_dialog')
16822 + self._find_button = builder.get_object ('find_button')
16823 + self._apply_button = builder.get_object ('apply_button')
16824 + self._close_button = builder.get_object ('close_button')
16826 # Set up and populate the languages combobox
16827 - renderer = Gtk.CellRendererText()
16828 + renderer = Gtk.CellRendererText ()
16829 sorted_languages = Gtk.TreeModelSort (model = languages)
16830 - sorted_languages.set_sort_column_id(0, Gtk.SortType.ASCENDING)
16831 - combobox.set_model(sorted_languages)
16832 - combobox.pack_start(renderer, True)
16833 - combobox.add_attribute(renderer, 'text', 0)
16834 + sorted_languages.set_sort_column_id (0, Gtk.SortType.ASCENDING)
16835 + combobox.set_model (sorted_languages)
16836 + combobox.pack_start (renderer, True)
16837 + combobox.add_attribute (renderer, 'text', 0)
16839 - lang = self.settings.get_string ('language')
16840 + lang = self._settings.get_string ('language')
16841 if lang is not None:
16842 - self.model.lang = lang
16843 + self._model.lang = lang
16845 for lang in LANGUAGES_STR:
16846 - it = languages.append(lang)
16847 - if LANGUAGES[lang[1]] == self.model.lang:
16848 - (success, parentit) = sorted_languages.convert_child_iter_to_iter (it)
16849 + itera = languages.append (lang)
16850 + if LANGUAGES[lang[1]] == self._model.lang:
16851 + (success,
16852 + parentit) = sorted_languages.convert_child_iter_to_iter (itera)
16853 if success:
16854 combobox.set_active_iter (parentit)
16856 - # Set up the results treeview
16857 - renderer = Gtk.CellRendererText()
16858 - self.treeview.set_model(self.liststore)
16859 - self.treeview.set_headers_visible(False)
16860 - renderer.set_property('ellipsize', Pango.EllipsizeMode.END)
16861 - column = Gtk.TreeViewColumn(_(u"Subtitles"), renderer, text=0)
16862 - column.set_resizable(True)
16863 - column.set_expand(True)
16864 - self.treeview.append_column(column)
16865 - # translators comment:
16866 - # This is the file-type of the subtitle file detected
16867 - column = Gtk.TreeViewColumn(_(u"Format"), renderer, text=1)
16868 - column.set_resizable(False)
16869 - self.treeview.append_column(column)
16870 - # translators comment:
16871 - # This is a rating of the quality of the subtitle
16872 - column = Gtk.TreeViewColumn(_(u"Rating"), renderer, text=2)
16873 - column.set_resizable(False)
16874 - self.treeview.append_column(column)
16876 - self.apply_button.set_sensitive(False)
16878 - self.apply_button.connect('clicked', self.on_apply_clicked)
16879 - self.find_button.connect('clicked', self.on_find_clicked)
16880 - self.close_button.connect('clicked', self.on_close_clicked)
16882 - # Set up signals
16884 - combobox_changed_id = combobox.connect('changed', self.on_combobox__changed)
16885 - self.dialog.connect ('delete-event', self.dialog.hide_on_delete)
16886 - self.dialog.set_transient_for (self.totem.get_main_window())
16887 - self.dialog.set_position (Gtk.WindowPosition.CENTER_ON_PARENT)
16889 - # Connect the callbacks
16890 - self.dialog.connect ('key-press-event', self.on_window__key_press_event)
16891 - self.treeview.get_selection().connect('changed', self.on_treeview__row_change)
16892 - self.treeview.connect('row-activated', self.on_treeview__row_activate)
16894 - def os_show_dialog(self, action):
16895 - if not self.dialog:
16896 - self.os_build_dialog(action)
16898 - filename = self.totem.get_current_mrl()
16899 - if not self.model.results or filename != self.filename:
16900 - self.filename = filename
16902 - self.dialog.show_all()
16904 - self.progress.set_fraction(0.0)
16906 - def os_append_menu(self):
16907 - """
16908 - """
16910 - self.os_action_group = Gtk.ActionGroup(name='OpenSubtitles')
16912 - self.action = Gtk.Action(name='opensubtitles',
16913 + # Set up the results treeview
16914 + renderer = Gtk.CellRendererText ()
16915 + self._tree_view.set_model (self._list_store)
16916 + renderer.set_property ('ellipsize', Pango.EllipsizeMode.END)
16917 + column = Gtk.TreeViewColumn (_(u"Subtitles"), renderer, text=0)
16918 + column.set_resizable (True)
16919 + column.set_expand (True)
16920 + self._tree_view.append_column (column)
16921 + # translators comment:
16922 + # This is the file-type of the subtitle file detected
16923 + column = Gtk.TreeViewColumn (_(u"Format"), renderer, text=1)
16924 + column.set_resizable (False)
16925 + self._tree_view.append_column (column)
16926 + # translators comment:
16927 + # This is a rating of the quality of the subtitle
16928 + column = Gtk.TreeViewColumn (_(u"Rating"), renderer, text=2)
16929 + column.set_resizable (False)
16930 + self._tree_view.append_column (column)
16932 + self._apply_button.set_sensitive (False)
16934 + self._apply_button.connect ('clicked', self.__on_apply_clicked)
16935 + self._find_button.connect ('clicked', self.__on_find_clicked)
16936 + self._close_button.connect ('clicked', self.__on_close_clicked)
16938 + # Set up signals
16940 + combobox.connect ('changed', self.__on_combobox__changed)
16941 + self._dialog.connect ('delete-event', self._dialog.hide_on_delete)
16942 + self._dialog.set_transient_for (self._totem.get_main_window ())
16943 + self._dialog.set_position (Gtk.WindowPosition.CENTER_ON_PARENT)
16945 + # Connect the callbacks
16946 + self._dialog.connect ('key-press-event',
16947 + self.__on_window__key_press_event)
16948 + self._tree_view.get_selection ().connect ('changed',
16949 + self.__on_treeview__row_change)
16950 + self._tree_view.connect ('row-activated',
16951 + self.__on_treeview__row_activate)
16953 + def _show_dialog (self, _action):
16954 + if not self._dialog:
16955 + self._build_dialog ()
16957 + self._dialog.show_all ()
16959 + self._progress.set_fraction (0.0)
16961 + def _append_menu (self):
16962 + self._action_group = Gtk.ActionGroup (name='OpenSubtitles')
16964 + tooltip_text = _(u"Download movie subtitles from OpenSubtitles")
16965 + self._action = Gtk.Action (name='opensubtitles',
16966 label=_(u'_Download Movie Subtitles…'),
16967 - tooltip=_(u"Download movie subtitles from OpenSubtitles"),
16968 + tooltip=tooltip_text,
16969 stock_id=None)
16971 - self.os_action_group.add_action(self.action)
16972 + self._action_group.add_action (self._action)
16974 - self.manager.insert_action_group(self.os_action_group, 0)
16975 + self._manager.insert_action_group (self._action_group, 0)
16977 - self.menu_id = self.manager.new_merge_id()
16978 - self.manager.add_ui(self.menu_id,
16979 - '/tmw-menubar/view/subtitles/subtitle-download-placeholder',
16980 + self._menu_id = self._manager.new_merge_id ()
16981 + merge_path = '/tmw-menubar/view/subtitles/subtitle-download-placeholder'
16982 + self._manager.add_ui (self._menu_id,
16983 + merge_path,
16984 'opensubtitles',
16985 'opensubtitles',
16986 Gtk.UIManagerItemType.MENUITEM,
16987 False
16989 - self.action.set_visible(True)
16990 + self._action.set_visible (True)
16992 + self._manager.ensure_update ()
16994 - self.manager.ensure_update()
16995 + self._action.connect ('activate', self._show_dialog)
16997 - self.action.connect('activate', self.os_show_dialog)
16998 + self._action.set_sensitive (self._totem.is_playing () and
16999 + self._check_allowed_scheme () and
17000 + not self._check_is_audio ())
17002 - self.action.set_sensitive(self.totem.is_playing() and
17003 - self.os_check_allowed_scheme() and
17004 - not self.os_check_is_audio())
17005 + def _check_allowed_scheme (self):
17006 + current_file = Gio.file_new_for_uri (self._totem.get_current_mrl ())
17007 + scheme = current_file.get_uri_scheme ()
17009 - def os_check_allowed_scheme(self):
17010 - scheme = Gio.file_new_for_uri(self.totem.get_current_mrl()).get_uri_scheme()
17011 - if scheme == 'dvd' or scheme == 'http' or scheme == 'dvb' or scheme == 'vcd':
17012 + if (scheme == 'dvd' or scheme == 'http' or
17013 + scheme == 'dvb' or scheme == 'vcd'):
17014 return False
17016 return True
17018 - def os_check_is_audio(self):
17019 + def _check_is_audio (self):
17020 # FIXME need to use something else here
17021 - # I think we must use video widget metadata but I don't found a way
17022 - # to get this info from python
17023 - filename = self.totem.get_current_mrl()
17024 - if Gio.content_type_guess(filename, '')[0].split('/')[0] == 'audio':
17025 + # I think we must use video widget metadata but I don't found a way
17026 + # to get this info from python
17027 + filename = self._totem.get_current_mrl ()
17028 + if Gio.content_type_guess (filename, '')[0].split ('/')[0] == 'audio':
17029 return True
17030 return False
17032 - def os_delete_menu(self):
17033 - self.manager.remove_action_group(self.os_action_group)
17034 - self.manager.remove_ui(self.menu_id)
17035 + def _delete_menu (self):
17036 + self._manager.remove_action_group (self._action_group)
17037 + self._manager.remove_ui (self._menu_id)
17039 - def os_get_results(self):
17040 - """
17041 - """
17042 - self.liststore.clear()
17043 - self.treeview.set_headers_visible(False)
17044 - self.model.results = []
17045 - self.apply_button.set_sensitive(False)
17046 - self.find_button.set_sensitive(False)
17047 + def _get_results (self, movie_hash, movie_size):
17048 + self._list_store.clear ()
17049 + self._apply_button.set_sensitive (False)
17050 + self._find_button.set_sensitive (False)
17052 - self.dialog.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH))
17053 + cursor = Gdk.Cursor.new (Gdk.CursorType.WATCH)
17054 + self._dialog.get_window ().set_cursor (cursor)
17056 - thread = SearchThread(self.model)
17057 - thread.start()
17058 - gobject.idle_add(self.os_populate_treeview)
17059 + thread = SearchThread (self._model, movie_hash, movie_size)
17060 + thread.start ()
17061 + GObject.idle_add (self._populate_treeview, thread)
17063 - self.progress.set_text(_(u'Searching subtitles…'))
17064 - gobject.timeout_add(350, self.os_progress_bar_increment, thread)
17065 + self._progress.set_text (_(u'Searching subtitles…'))
17066 + GObject.timeout_add (350, self._progress_bar_increment, thread)
17068 - def os_populate_treeview(self):
17069 - """
17070 - """
17071 - if self.model.lock.acquire(False) == False:
17072 + def _populate_treeview (self, search_thread):
17073 + if not search_thread.done:
17074 return True
17076 - if self.model.results:
17077 - self.apply_button.set_sensitive(True)
17078 - for subData in self.model.results:
17079 - if not SUBTITLES_EXT.count(subData['SubFormat']):
17080 - continue
17081 - self.liststore.append([subData['SubFileName'], subData['SubFormat'], subData['SubRating'], subData['IDSubtitleFile'],])
17082 - self.treeview.set_headers_visible(True)
17083 - else:
17084 - self.apply_button.set_sensitive(False)
17086 - self.model.lock.release()
17087 + results = search_thread.get_results ()
17088 + if results:
17089 + for sub_data in results:
17090 + if not SUBTITLES_EXT.count (sub_data['SubFormat']):
17091 + continue
17092 + self._list_store.append ([sub_data['SubFileName'],
17093 + sub_data['SubFormat'],
17094 + sub_data['SubRating'],
17095 + sub_data['IDSubtitleFile'],])
17097 - self.dialog.get_window().set_cursor(None)
17098 + self._dialog.get_window ().set_cursor (None)
17100 return False
17102 - def os_save_selected_subtitle(self, filename=None):
17103 - """
17104 - """
17105 - self.dialog.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH))
17106 + def _save_selected_subtitle (self, filename=None):
17107 + cursor = Gdk.Cursor.new (Gdk.CursorType.WATCH)
17108 + self._dialog.get_window ().set_cursor (cursor)
17110 - model, rows = self.treeview.get_selection().get_selected_rows()
17111 + model, rows = self._tree_view.get_selection ().get_selected_rows ()
17112 if rows:
17113 - iter = model.get_iter(rows[0])
17114 - subtitle_id = model.get_value(iter, 3)
17115 - subtitle_format = model.get_value(iter, 1)
17117 - gfile = None
17118 + subtitle_iter = model.get_iter (rows[0])
17119 + subtitle_id = model.get_value (subtitle_iter, 3)
17120 + subtitle_format = model.get_value (subtitle_iter, 1)
17122 if not filename:
17123 - directory = Gio.file_new_for_path(xdg.BaseDirectory.xdg_cache_home + sep + 'totem' + sep + 'subtitles' + sep)
17124 - if not directory.query_exists(None):
17125 - if not path.exists (xdg.BaseDirectory.xdg_cache_home + sep + 'totem' + sep):
17126 - mkdir (xdg.BaseDirectory.xdg_cache_home + sep + 'totem' + sep)
17127 - if not path.exists (xdg.BaseDirectory.xdg_cache_home + sep + 'totem' + sep + 'subtitles' + sep):
17128 - mkdir (xdg.BaseDirectory.xdg_cache_home + sep + 'totem' + sep + 'subtitles' + sep)
17129 - # FIXME: We can't use this function until we depend on GLib (PyGObject) 2.18
17130 - # directory.make_directory_with_parents()
17132 - file = Gio.file_new_for_path(self.filename)
17133 - movie_name = file.get_basename().rpartition('.')[0]
17134 - filename = directory.get_uri() + sep + movie_name + '.' + subtitle_format
17136 - self.model.subtitles = ''
17138 - thread = DownloadThread(self.model, subtitle_id)
17139 - thread.start()
17140 - gobject.idle_add(self.os_save_subtitles, filename)
17142 - self.progress.set_text(_(u'Downloading the subtitles…'))
17143 - gobject.timeout_add(350, self.os_progress_bar_increment, thread)
17144 + bpath = xdg.BaseDirectory.xdg_cache_home + sep
17145 + bpath += 'totem' + sep
17147 + directory = Gio.file_new_for_path (bpath + 'subtitles' + sep)
17149 + if not directory.query_exists (None):
17150 + if not path.exists (bpath):
17151 + mkdir (bpath)
17152 + if not path.exists (bpath + 'subtitles' + sep):
17153 + mkdir (bpath + 'subtitles' + sep)
17154 + # FIXME: We can't use this function until we depend on
17155 + # GLib (PyGObject) 2.18
17156 + # directory.make_directory_with_parents ()
17158 + subtitle_file = Gio.file_new_for_path (self._filename)
17159 + movie_name = subtitle_file.get_basename ().rpartition ('.')[0]
17161 + filename = directory.get_uri () + sep
17162 + filename += movie_name + '.' + subtitle_format
17164 + thread = DownloadThread (self._model, subtitle_id)
17165 + thread.start ()
17166 + GObject.idle_add (self._save_subtitles, thread, filename)
17168 + self._progress.set_text (_(u'Downloading the subtitles…'))
17169 + GObject.timeout_add (350, self._progress_bar_increment, thread)
17170 else:
17171 #warn user!
17172 pass
17174 - def os_save_subtitles(self, filename):
17175 - if self.model.lock.acquire(False) == False:
17176 + def _save_subtitles (self, download_thread, filename):
17177 + if not download_thread.done:
17178 return True
17180 - if self.model.subtitles:
17181 - # Delete all previous cached subtitle for this file
17182 + subtitles = download_thread.get_subtitles ()
17183 + if subtitles:
17184 + # Delete all previous cached subtitle for this file
17185 for ext in SUBTITLES_EXT:
17186 - fp = Gio.file_new_for_path(filename[:-3] + ext)
17187 - if fp.query_exists(None):
17188 - fp.delete(None)
17190 - fp = Gio.file_new_for_uri (filename)
17191 - suburi = fp.get_uri ()
17192 + subtitle_file = Gio.file_new_for_path (filename[:-3] + ext)
17193 + if subtitle_file.query_exists (None):
17194 + subtitle_file.delete (None)
17196 - subFile = fp.replace('', False)
17197 - subFile.write(self.model.subtitles)
17198 - subFile.close()
17199 + subtitle_file = Gio.file_new_for_uri (filename)
17200 + suburi = subtitle_file.get_uri ()
17202 - self.model.lock.release()
17203 + sub_file = subtitle_file.replace ('', False, Gio.FileCreateFlags.REPLACE_DESTINATION, None)
17204 + sub_file.write (subtitles, None)
17205 + sub_file.close (None)
17207 - self.dialog.get_window().set_cursor(None)
17208 - self.on_close_clicked (None)
17209 + self._dialog.get_window ().set_cursor (None)
17210 + self._close_dialog ()
17212 if suburi:
17213 - self.totem.set_current_subtitle(suburi)
17214 + self._totem.set_current_subtitle (suburi)
17216 return False
17218 - def os_progress_bar_increment(self, thread):
17220 + def _progress_bar_increment (self, thread):
17221 if not thread.done:
17222 - self.progress.pulse()
17223 + self._progress.pulse ()
17224 return True
17226 - if self.model.message:
17227 - self.progress.set_text(self.model.message)
17228 + message = thread.get_message ()
17229 + if message:
17230 + self._progress.set_text (message)
17231 else:
17232 - self.progress.set_text('')
17234 - self.progress.set_fraction(0.0)
17235 - self.find_button.set_sensitive(True)
17236 - self.apply_button.set_sensitive(False)
17237 - self.treeview.set_sensitive(True)
17238 + self._progress.set_text (' ')
17240 + self._progress.set_fraction (0.0)
17241 + self._find_button.set_sensitive (True)
17242 + self._apply_button.set_sensitive (False)
17243 + self._tree_view.set_sensitive (True)
17244 return False
17246 - def os_download_and_apply(self):
17247 - self.apply_button.set_sensitive(False)
17248 - self.find_button.set_sensitive(False)
17249 - self.action.set_sensitive(False)
17250 - self.treeview.set_sensitive(False)
17251 - self.os_save_selected_subtitle()
17252 + def _download_and_apply (self):
17253 + self._apply_button.set_sensitive (False)
17254 + self._find_button.set_sensitive (False)
17255 + self._action.set_sensitive (False)
17256 + self._tree_view.set_sensitive (False)
17257 + self._save_selected_subtitle ()
17259 + def _close_dialog (self):
17260 + # We hide the dialogue instead of closing it so that we still have the
17261 + # last set of search results up if we re-open the dialogue without
17262 + # changing the movie
17263 + self._dialog.hide ()
17265 # Callbacks
17267 - def on_window__key_press_event(self, widget, event):
17268 + def __on_window__key_press_event (self, _widget, event):
17269 if event.keyval == Gdk.KEY_Escape:
17270 - self.dialog.destroy()
17271 - self.dialog = None
17272 + self._close_dialog ()
17273 return True
17274 return False
17276 - def on_treeview__row_change(self, selection):
17277 - if selection.count_selected_rows() > 0:
17278 - self.apply_button.set_sensitive(True)
17279 + def __on_treeview__row_change (self, selection):
17280 + if selection.count_selected_rows () > 0:
17281 + self._apply_button.set_sensitive (True)
17282 else:
17283 - self.apply_button.set_sensitive(False)
17284 + self._apply_button.set_sensitive (False)
17286 - def on_treeview__row_activate(self, path, column, data):
17287 - self.os_download_and_apply()
17288 + def __on_treeview__row_activate (self, _tree_path, _column, _data):
17289 + self._download_and_apply ()
17291 - def on_totem__file_opened(self, totem, filename):
17292 - """
17293 - """
17294 + def __on_totem__file_opened (self, _totem, new_mrl):
17295 # Check if allows subtitles
17296 - if self.os_check_allowed_scheme() and not self.os_check_is_audio():
17297 - self.action.set_sensitive(True)
17298 - if self.dialog:
17299 - self.find_button.set_sensitive(True)
17300 - self.filename = self.totem.get_current_mrl()
17301 - self.liststore.clear()
17302 - self.treeview.set_headers_visible(False)
17303 - self.apply_button.set_sensitive(False)
17304 - self.results = []
17305 - else:
17306 - self.action.set_sensitive(False)
17307 - if self.dialog and self.dialog.is_active():
17308 - self.liststore.clear()
17309 - self.treeview.set_headers_visible(False)
17310 - self.apply_button.set_sensitive(False)
17311 - self.find_button.set_sensitive(False)
17313 - def on_totem__file_closed(self, totem):
17314 - self.action.set_sensitive(False)
17315 - if self.dialog:
17316 - self.apply_button.set_sensitive(False)
17317 - self.find_button.set_sensitive(False)
17319 - def on_combobox__changed(self, combobox):
17320 - iter = combobox.get_active_iter()
17321 - self.model.lang = LANGUAGES[combobox.get_model().get_value(iter, 1)]
17322 - self.settings.set_string('language', self.model.lang)
17324 - def on_close_clicked(self, data):
17325 - self.dialog.destroy()
17326 - self.dialog = None
17328 - def on_apply_clicked(self, data):
17329 - self.os_download_and_apply()
17331 - def on_find_clicked(self, data):
17332 - self.apply_button.set_sensitive(False)
17333 - self.find_button.set_sensitive(False)
17334 - self.filename = self.totem.get_current_mrl()
17335 - self.model.hash , self.model.size = hashFile(self.filename)
17337 - self.os_get_results()
17338 + if self._check_allowed_scheme () and not self._check_is_audio ():
17339 + self._action.set_sensitive (True)
17340 + if self._dialog:
17341 + self._find_button.set_sensitive (True)
17342 + # Check we're not re-opening the same file; if we are, don't
17343 + # clear anything. This happens when we re-load the file with a
17344 + # new set of subtitles, for example
17345 + if self._filename != new_mrl:
17346 + self._filename = new_mrl
17347 + self._list_store.clear ()
17348 + self._apply_button.set_sensitive (False)
17349 + else:
17350 + self._action.set_sensitive (False)
17351 + if self._dialog and self._dialog.is_active ():
17352 + self._filename = None
17353 + self._list_store.clear ()
17354 + self._apply_button.set_sensitive (False)
17355 + self._find_button.set_sensitive (False)
17357 + def __on_totem__file_closed (self, _totem):
17358 + self._action.set_sensitive (False)
17359 + if self._dialog:
17360 + self._apply_button.set_sensitive (False)
17361 + self._find_button.set_sensitive (False)
17363 + def __on_combobox__changed (self, combobox):
17364 + combo_iter = combobox.get_active_iter ()
17365 + combo_model = combobox.get_model ()
17366 + self._model.lang = LANGUAGES[combo_model.get_value (combo_iter, 1)]
17367 + self._settings.set_string ('language', self._model.lang)
17369 + def __on_close_clicked (self, _data):
17370 + self._close_dialog ()
17372 + def __on_apply_clicked (self, _data):
17373 + self._download_and_apply ()
17375 + def __on_find_clicked (self, _data):
17376 + self._apply_button.set_sensitive (False)
17377 + self._find_button.set_sensitive (False)
17378 + self._filename = self._totem.get_current_mrl ()
17379 + (movie_hash, movie_size) = hash_file (self._filename)
17381 + self._get_results (movie_hash, movie_size)
17383 diff --git a/src/plugins/opensubtitles/opensubtitles.ui b/src/plugins/opensubtitles/opensubtitles.ui
17384 index ce06941..ad24241 100644
17385 --- a/src/plugins/opensubtitles/opensubtitles.ui
17386 +++ b/src/plugins/opensubtitles/opensubtitles.ui
17387 @@ -22,11 +22,6 @@
17388 <column type="gchararray"/>
17389 </columns>
17390 </object>
17391 - <object class="GtkImage" id="image_apply">
17392 - <property name="visible">True</property>
17393 - <property name="stock">gtk-media-play</property>
17394 - <property name="icon-size">4</property>
17395 - </object>
17396 <object class="GtkWindow" id="subtitles_dialog">
17397 <property name="border_width">12</property>
17398 <property name="title" translatable="yes">Download Movie Subtitles</property>
17399 @@ -36,83 +31,48 @@
17400 <property name="type_hint">dialog</property>
17401 <child>
17402 <object class="GtkVBox" id="vbox1">
17403 + <property name="orientation">vertical</property>
17404 <property name="spacing">6</property>
17405 <child>
17406 - <object class="GtkFrame" id="frame1">
17407 - <property name="visible">True</property>
17408 - <property name="label_xalign">0</property>
17409 - <property name="shadow_type">none</property>
17410 + <object class="GtkHBox" id="hbox2">
17411 + <property name="spacing">6</property>
17412 <child>
17413 - <object class="GtkAlignment" id="alignment1">
17414 + <object class="GtkLabel" id="label3">
17415 + <property name="visible">True</property>
17416 + <property name="label" translatable="yes">Subtitle _language:</property>
17417 + <property name="use_underline">True</property>
17418 + <property name="mnemonic_widget">language_combobox</property>
17419 + </object>
17420 + <packing>
17421 + <property name="expand">False</property>
17422 + <property name="position">0</property>
17423 + </packing>
17424 + </child>
17425 + <child>
17426 + <object class="GtkComboBox" id="language_combobox">
17427 <property name="visible">True</property>
17428 - <property name="left_padding">12</property>
17429 - <child>
17430 - <object class="GtkVBox" id="vbox3">
17431 - <child>
17432 - <object class="GtkHBox" id="hbox2">
17433 - <child>
17434 - <object class="GtkLabel" id="label3">
17435 - <property name="visible">True</property>
17436 - <property name="use-underline">True</property>
17437 - <property name="mnemonic-widget">language_combobox</property>
17438 - <property name="label" translatable="yes">Subtitle _language:</property>
17439 - </object>
17440 - <packing>
17441 - <property name="expand">False</property>
17442 - <property name="padding">6</property>
17443 - <property name="position">0</property>
17444 - </packing>
17445 - </child>
17446 - <child>
17447 - <object class="GtkComboBox" id="language_combobox">
17448 - <property name="visible">True</property>
17449 - </object>
17450 - <packing>
17451 - <property name="padding">6</property>
17452 - <property name="position">1</property>
17453 - </packing>
17454 - </child>
17455 - <child>
17456 - <object class="GtkButton" id="find_button">
17457 - <property name="label">gtk-find</property>
17458 - <property name="use-stock">True</property>
17459 - <property name="visible">True</property>
17460 - <property name="can_focus">True</property>
17461 - <property name="receives_default">True</property>
17462 - </object>
17463 - <packing>
17464 - <property name="expand">False</property>
17465 - <property name="fill">False</property>
17466 - <property name="position">2</property>
17467 - </packing>
17468 - </child>
17469 - </object>
17470 - <packing>
17471 - <property name="expand">False</property>
17472 - <property name="fill">False</property>
17473 - <property name="padding">6</property>
17474 - <property name="position">0</property>
17475 - </packing>
17476 - </child>
17477 - </object>
17478 - </child>
17479 </object>
17480 + <packing>
17481 + <property name="position">1</property>
17482 + </packing>
17483 </child>
17484 - <child type="label">
17485 - <object class="GtkLabel" id="label1">
17486 + <child>
17487 + <object class="GtkButton" id="find_button">
17488 + <property name="label">gtk-find</property>
17489 <property name="visible">True</property>
17490 - <property name="label" translatable="yes">Language</property>
17491 - <property name="use_markup">True</property>
17492 - <attributes>
17493 - <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
17494 - </attributes>
17495 + <property name="can_focus">True</property>
17496 + <property name="receives_default">True</property>
17497 + <property name="use_stock">True</property>
17498 </object>
17499 + <packing>
17500 + <property name="expand">False</property>
17501 + <property name="fill">False</property>
17502 + <property name="position">2</property>
17503 + </packing>
17504 </child>
17505 </object>
17506 <packing>
17507 <property name="expand">False</property>
17508 - <property name="fill">False</property>
17509 - <property name="padding">6</property>
17510 <property name="position">0</property>
17511 </packing>
17512 </child>
17513 @@ -135,7 +95,10 @@
17514 </packing>
17515 </child>
17516 <child>
17517 - <object class="GtkProgressBar" id="progress_bar"/>
17518 + <object class="GtkProgressBar" id="progress_bar">
17519 + <property name="text"> </property>
17520 + <property name="show-text">True</property>
17521 + </object>
17522 <packing>
17523 <property name="expand">False</property>
17524 <property name="position">2</property>
17525 @@ -143,7 +106,7 @@
17526 </child>
17527 <child>
17528 <object class="GtkAlignment" id="alignment2">
17529 - <property name="top_padding">12</property>
17530 + <property name="top_padding">6</property>
17531 <child>
17532 <object class="GtkHButtonBox" id="hbbox1">
17533 <property name="visible">True</property>
17534 @@ -156,7 +119,7 @@
17535 <property name="can_focus">True</property>
17536 <property name="receives_default">True</property>
17537 <property name="image">image_apply</property>
17538 - <property name="use-underline">True</property>
17539 + <property name="use_underline">True</property>
17540 </object>
17541 <packing>
17542 <property name="expand">False</property>
17543 @@ -167,12 +130,12 @@
17544 <child>
17545 <object class="GtkButton" id="close_button">
17546 <property name="label">gtk-close</property>
17547 - <property name="use-stock">True</property>
17548 <property name="visible">True</property>
17549 <property name="can_focus">True</property>
17550 - <property name="receives_default">True</property>
17551 <property name="can_default">True</property>
17552 <property name="has_default">True</property>
17553 + <property name="receives_default">True</property>
17554 + <property name="use_stock">True</property>
17555 </object>
17556 <packing>
17557 <property name="expand">False</property>
17558 @@ -193,4 +156,8 @@
17559 </object>
17560 </child>
17561 </object>
17562 + <object class="GtkImage" id="image_apply">
17563 + <property name="visible">True</property>
17564 + <property name="stock">gtk-media-play</property>
17565 + </object>
17566 </interface>
17567 diff --git a/src/plugins/pythonconsole/console.py b/src/plugins/pythonconsole/console.py
17568 index 6a71183..8bbfb9f 100644
17569 --- a/src/plugins/pythonconsole/console.py
17570 +++ b/src/plugins/pythonconsole/console.py
17571 @@ -36,10 +36,7 @@ import string
17572 import sys
17573 import re
17574 import traceback
17575 -import gobject
17576 -from gi.repository import Pango
17577 -from gi.repository import Gtk
17578 -from gi.repository import Gdk
17579 +from gi.repository import GObject, Pango, Gtk, Gdk # pylint: disable-msg=E0611
17581 class PythonConsole(Gtk.ScrolledWindow):
17582 def __init__(self, namespace = {}, destroy_cb = None):
17583 @@ -117,7 +114,7 @@ class PythonConsole(Gtk.ScrolledWindow):
17584 cur = buffer.get_end_iter()
17586 buffer.place_cursor(cur)
17587 - gobject.idle_add(self.scroll_to_end)
17588 + GObject.idle_add(self.scroll_to_end)
17589 return True
17591 elif event.keyval == Gdk.KEY_Return:
17592 @@ -161,21 +158,21 @@ class PythonConsole(Gtk.ScrolledWindow):
17593 cur = buffer.get_end_iter()
17594 buffer.move_mark(inp_mark, cur)
17595 buffer.place_cursor(cur)
17596 - gobject.idle_add(self.scroll_to_end)
17597 + GObject.idle_add(self.scroll_to_end)
17598 return True
17600 elif event.keyval == Gdk.KEY_KP_Down or event.keyval == Gdk.KEY_Down:
17601 # Next entry from history
17602 view.emit_stop_by_name("key_press_event")
17603 self.history_down()
17604 - gobject.idle_add(self.scroll_to_end)
17605 + GObject.idle_add(self.scroll_to_end)
17606 return True
17608 elif event.keyval == Gdk.KEY_KP_Up or event.keyval == Gdk.KEY_Up:
17609 # Previous entry from history
17610 view.emit_stop_by_name("key_press_event")
17611 self.history_up()
17612 - gobject.idle_add(self.scroll_to_end)
17613 + GObject.idle_add(self.scroll_to_end)
17614 return True
17616 elif event.keyval == Gdk.KEY_KP_Left or event.keyval == Gdk.KEY_Left or \
17617 @@ -246,7 +243,7 @@ class PythonConsole(Gtk.ScrolledWindow):
17618 else:
17619 buf.insert_with_tags(buf.get_end_iter(), text, tag)
17621 - gobject.idle_add(self.scroll_to_end)
17622 + GObject.idle_add(self.scroll_to_end)
17624 def eval(self, command, display_command = False):
17625 buffer = self.view.get_buffer()
17626 diff --git a/src/plugins/pythonconsole/pythonconsole.convert b/src/plugins/pythonconsole/pythonconsole.convert
17627 index 5acafaa..6461c23 100644
17628 --- a/src/plugins/pythonconsole/pythonconsole.convert
17629 +++ b/src/plugins/pythonconsole/pythonconsole.convert
17630 @@ -1,3 +1,2 @@
17631 -[org.gnome.totem.plugins.jamendo]
17632 -num-per-page = /apps/totem/plugins/jamendo/num_per_page
17633 -format = /apps/totem/plugins/jamendo/format
17634 +[org.gnome.totem.plugins.pythonconsole]
17635 +rpdb2-password = /apps/totem/plugins/pythonconsole/rpdb2_password
17636 diff --git a/src/plugins/pythonconsole/pythonconsole.py b/src/plugins/pythonconsole/pythonconsole.py
17637 index 6e6b286..40d6a78 100644
17638 --- a/src/plugins/pythonconsole/pythonconsole.py
17639 +++ b/src/plugins/pythonconsole/pythonconsole.py
17640 @@ -8,7 +8,7 @@
17641 # it under the terms of the GNU General Public License as published by
17642 # the Free Software Foundation; either version 2, or (at your option)
17643 # any later version.
17646 # This program is distributed in the hope that it will be useful,
17647 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17648 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17649 @@ -18,7 +18,8 @@
17650 # along with this program; if not, write to the Free Software
17651 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17653 -# Parts from "Interactive Python-GTK Console" (stolen from epiphany's console.py)
17654 +# Parts from "Interactive Python-GTK Console" (stolen from epiphany's
17655 +# console.py)
17656 # Copyright (C), 1998 James Henstridge <james@daa.com.au>
17657 # Copyright (C), 2005 Adam Hooper <adamh@densi.com>
17658 # Bits from gedit Python Console Plugin
17659 @@ -36,24 +37,22 @@ from console import PythonConsole
17661 __all__ = ('PythonConsole', 'OutFile')
17663 -from gi.repository import Peas
17664 -from gi.repository import Gtk
17665 -from gi.repository import Totem
17666 -from gi.repository import Gio
17667 -import gobject
17668 +from gi.repository import GObject, Peas, Gtk, Totem # pylint: disable-msg=E0611
17669 +from gi.repository import Gio # pylint: disable-msg=E0611
17671 try:
17672 - import rpdb2
17673 - have_rpdb2 = True
17674 -except:
17675 - have_rpdb2 = False
17676 + import rpdb2
17677 + HAVE_RPDB2 = True
17678 +except ImportError:
17679 + HAVE_RPDB2 = False
17681 import gettext
17682 -gettext.textdomain("totem")
17683 +gettext.textdomain ("totem")
17685 D_ = gettext.dgettext
17686 _ = gettext.gettext
17688 -ui_str = """
17689 +UI_STR = """
17690 <ui>
17691 <menubar name="tmw-menubar">
17692 <menu name="Python" action="Python">
17693 @@ -66,92 +65,107 @@ ui_str = """
17694 </ui>
17697 -class PythonConsolePlugin(gobject.GObject, Peas.Activatable):
17698 - __gtype_name__ = 'PythonConsolePlugin'
17700 - object = gobject.property(type = gobject.GObject)
17702 - def __init__(self):
17703 - self.totem = None
17704 - self.window = None
17706 - def do_activate(self):
17707 - self.totem = self.object
17709 - data = dict()
17710 - manager = self.totem.get_ui_manager()
17712 - data['action_group'] = Gtk.ActionGroup(name = 'Python')
17714 - action = Gtk.Action(name = 'Python', label = 'Python', tooltip = _(u'Python Console Menu'), stock_id = None)
17715 - data['action_group'].add_action(action)
17717 - action = Gtk.Action(name = 'PythonConsole', label = _(u'_Python Console'),
17718 - tooltip = _(u"Show Totem's Python console"),
17719 - stock_id = 'gnome-mime-text-x-python')
17720 - action.connect('activate', self.show_console)
17721 - data['action_group'].add_action(action)
17723 - action = Gtk.Action(name = 'PythonDebugger', label = _(u'Python Debugger'),
17724 - tooltip = _(u"Enable remote Python debugging with rpdb2"), stock_id = None)
17725 - if have_rpdb2:
17726 - action.connect('activate', self.enable_debugging)
17727 - else:
17728 - action.set_visible(False)
17729 - data['action_group'].add_action(action)
17731 - manager.insert_action_group(data['action_group'], 0)
17732 - data['ui_id'] = manager.add_ui_from_string(ui_str)
17733 - manager.ensure_update()
17735 - self.totem.set_data('PythonConsolePluginInfo', data)
17737 - def show_console(self, action):
17738 - if not self.window:
17739 - console = PythonConsole(namespace = {'__builtins__' : __builtins__,
17740 - 'Totem' : Totem,
17741 - 'totem_object' : self.totem},
17742 - destroy_cb = self.destroy_console)
17744 - console.set_size_request(600, 400)
17745 - console.eval('print "%s" %% totem_object' % _(u"You can access the Totem.Object through " \
17746 - "\'totem_object\' :\\n%s"), False)
17748 - self.window = Gtk.Window()
17749 - self.window.set_title(_(u'Totem Python Console'))
17750 - self.window.add(console)
17751 - self.window.connect('destroy', self.destroy_console)
17752 - self.window.show_all()
17753 - else:
17754 - self.window.show_all()
17755 - self.window.grab_focus()
17757 - def enable_debugging(self, action):
17758 - msg = _(u"After you press OK, Totem will wait until you connect to it with winpdb or rpdb2. If you have not set a debugger password in DConf, it will use the default password ('totem').")
17759 - dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK_CANCEL, msg)
17760 - if dialog.run() == Gtk.ResponseType.OK:
17761 - settings = Gio.Settings.new ('org.gnome.totem.plugins.pythonconsole')
17762 - password = settings.get_string('rpdb2-password') or "totem"
17763 - def start_debugger(password):
17764 - rpdb2.start_embedded_debugger(password)
17765 - return False
17767 - gobject.idle_add(start_debugger, password)
17768 - dialog.destroy()
17770 - def destroy_console(self, *args):
17771 - self.window.destroy()
17772 - self.window = None
17774 - def do_deactivate(self):
17775 - data = self.totem.get_data('PythonConsolePluginInfo')
17777 - manager = self.totem.get_ui_manager()
17778 - manager.remove_ui(data['ui_id'])
17779 - manager.remove_action_group(data['action_group'])
17780 - manager.ensure_update()
17782 - self.totem.set_data('PythonConsolePluginInfo', None)
17784 - if self.window is not None:
17785 - self.window.destroy()
17786 +class PythonConsolePlugin (GObject.Object, Peas.Activatable):
17787 + __gtype_name__ = 'PythonConsolePlugin'
17789 + object = GObject.property (type = GObject.Object)
17791 + def __init__ (self):
17792 + GObject.Object.__init__ (self)
17794 + self.totem = None
17795 + self.window = None
17797 + def do_activate (self):
17798 + self.totem = self.object
17800 + data = dict ()
17801 + manager = self.totem.get_ui_manager ()
17803 + data['action_group'] = Gtk.ActionGroup (name = 'Python')
17805 + action = Gtk.Action (name = 'Python', label = 'Python',
17806 + tooltip = _(u'Python Console Menu'),
17807 + stock_id = None)
17808 + data['action_group'].add_action (action)
17810 + action = Gtk.Action (name = 'PythonConsole',
17811 + label = _(u'_Python Console'),
17812 + tooltip = _(u"Show Totem's Python console"),
17813 + stock_id = 'gnome-mime-text-x-python')
17814 + action.connect ('activate', self._show_console)
17815 + data['action_group'].add_action (action)
17817 + action = Gtk.Action (name = 'PythonDebugger',
17818 + label = _(u'Python Debugger'),
17819 + tooltip = _(u"Enable remote Python debugging "\
17820 + "with rpdb2"),
17821 + stock_id = None)
17822 + if HAVE_RPDB2:
17823 + action.connect ('activate', self._enable_debugging)
17824 + else:
17825 + action.set_visible (False)
17826 + data['action_group'].add_action (action)
17828 + manager.insert_action_group (data['action_group'], 0)
17829 + data['ui_id'] = manager.add_ui_from_string (UI_STR)
17830 + manager.ensure_update ()
17832 + self.totem.set_data ('PythonConsolePluginInfo', data)
17834 + def _show_console (self, _action):
17835 + if not self.window:
17836 + console = PythonConsole (namespace = {
17837 + '__builtins__' : __builtins__,
17838 + 'Totem' : Totem,
17839 + 'totem_object' : self.totem
17840 + }, destroy_cb = self._destroy_console)
17842 + console.set_size_request (600, 400) # pylint: disable-msg=E1101
17843 + console.eval ('print "%s" %% totem_object' % _(u"You can access "\
17844 + "the Totem.Object through \'totem_object\' :\\n%s"), False)
17846 + self.window = Gtk.Window ()
17847 + self.window.set_title (_(u'Totem Python Console'))
17848 + self.window.add (console)
17849 + self.window.connect ('destroy', self._destroy_console)
17850 + self.window.show_all ()
17851 + else:
17852 + self.window.show_all ()
17853 + self.window.grab_focus ()
17855 + @classmethod
17856 + def _enable_debugging (cls, _action):
17857 + msg = _(u"After you press OK, Totem will wait until you connect to it "\
17858 + "with winpdb or rpdb2. If you have not set a debugger "\
17859 + "password in DConf, it will use the default password "\
17860 + "('totem').")
17861 + dialog = Gtk.MessageDialog (None, 0, Gtk.MessageType.INFO,
17862 + Gtk.ButtonsType.OK_CANCEL, msg)
17863 + if dialog.run () == Gtk.ResponseType.OK:
17864 + schema = 'org.gnome.totem.plugins.pythonconsole'
17865 + settings = Gio.Settings.new (schema)
17866 + password = settings.get_string ('rpdb2-password') or "totem"
17867 + def start_debugger (password):
17868 + rpdb2.start_embedded_debugger (password)
17869 + return False
17871 + GObject.idle_add (start_debugger, password)
17872 + dialog.destroy ()
17874 + def _destroy_console (self, *_args):
17875 + self.window.destroy ()
17876 + self.window = None
17878 + def do_deactivate (self):
17879 + data = self.totem.get_data ('PythonConsolePluginInfo')
17881 + manager = self.totem.get_ui_manager ()
17882 + manager.remove_ui (data['ui_id'])
17883 + manager.remove_action_group (data['action_group'])
17884 + manager.ensure_update ()
17886 + self.totem.set_data ('PythonConsolePluginInfo', None)
17888 + if self.window is not None:
17889 + self.window.destroy ()
17890 diff --git a/src/plugins/sample-python/Makefile.am b/src/plugins/sample-python/Makefile.am
17891 deleted file mode 100644
17892 index bb0ce6d..0000000
17893 --- a/src/plugins/sample-python/Makefile.am
17894 +++ /dev/null
17895 @@ -1,14 +0,0 @@
17896 -include $(top_srcdir)/src/plugins/Makefile.plugins
17898 -plugindir = $(PLUGINDIR)/sample-python
17899 -plugin_PYTHON = sample-python.py
17901 -plugin_in_files = sample-python.plugin.in
17903 -# Override to _not_ install the test plugins
17904 -install-pluginPYTHON:
17905 -install-pluginDATA:
17906 -uninstall-pluginPYTHON:
17907 -uninstall-pluginDATA:
17909 --include $(top_srcdir)/git.mk
17910 diff --git a/src/plugins/sample-python/sample-python.plugin.in b/src/plugins/sample-python/sample-python.plugin.in
17911 deleted file mode 100644
17912 index ab75dd0..0000000
17913 --- a/src/plugins/sample-python/sample-python.plugin.in
17914 +++ /dev/null
17915 @@ -1,9 +0,0 @@
17916 -[Plugin]
17917 -Loader=python
17918 -Module=sample-python
17919 -IAge=1
17920 -_Name=Python Sample Plugin
17921 -_Description=A useless sample plugin in Python
17922 -Authors=Philip Withnall <philip@tecnocode.co.uk>
17923 -Copyright=Copyright © 2006 James Livingston, 2007 Philip Withnall
17924 -Website=http://www.gnome.org/projects/totem/
17925 diff --git a/src/plugins/sample-python/sample-python.py b/src/plugins/sample-python/sample-python.py
17926 deleted file mode 100644
17927 index 3956cf8..0000000
17928 --- a/src/plugins/sample-python/sample-python.py
17929 +++ /dev/null
17930 @@ -1,17 +0,0 @@
17931 -# From code by James Livingston
17933 -import gobject
17934 -from gi.repository import Peas
17935 -from gi.repository import Totem
17937 -class SamplePython(gobject.GObject, Peas.Activatable):
17938 - __gtype_name__ = 'SamplePython'
17940 - object = gobject.property(type = gobject.GObject)
17942 - def do_activate(self):
17943 - print "Activating sample Python plugin"
17944 - self.object.action_fullscreen_toggle()
17946 - def do_deactivate(self):
17947 - print "Deactivating sample Python plugin"
17948 diff --git a/src/plugins/samplepython/Makefile.am b/src/plugins/samplepython/Makefile.am
17949 new file mode 100644
17950 index 0000000..9bbcda6
17951 --- /dev/null
17952 +++ b/src/plugins/samplepython/Makefile.am
17953 @@ -0,0 +1,14 @@
17954 +include $(top_srcdir)/src/plugins/Makefile.plugins
17956 +plugindir = $(PLUGINDIR)/sample-python
17957 +plugin_PYTHON = samplepython.py
17959 +plugin_in_files = samplepython.plugin.in
17961 +# Override to _not_ install the test plugins
17962 +install-pluginPYTHON:
17963 +install-pluginDATA:
17964 +uninstall-pluginPYTHON:
17965 +uninstall-pluginDATA:
17967 +-include $(top_srcdir)/git.mk
17968 diff --git a/src/plugins/samplepython/samplepython.plugin.in b/src/plugins/samplepython/samplepython.plugin.in
17969 new file mode 100644
17970 index 0000000..48eec9c
17971 --- /dev/null
17972 +++ b/src/plugins/samplepython/samplepython.plugin.in
17973 @@ -0,0 +1,9 @@
17974 +[Plugin]
17975 +Loader=python
17976 +Module=samplepython
17977 +IAge=1
17978 +_Name=Python Sample Plugin
17979 +_Description=A useless sample plugin in Python
17980 +Authors=Philip Withnall <philip@tecnocode.co.uk>
17981 +Copyright=Copyright © 2006 James Livingston, 2007 Philip Withnall
17982 +Website=http://www.gnome.org/projects/totem/
17983 diff --git a/src/plugins/samplepython/samplepython.py b/src/plugins/samplepython/samplepython.py
17984 new file mode 100644
17985 index 0000000..0630328
17986 --- /dev/null
17987 +++ b/src/plugins/samplepython/samplepython.py
17988 @@ -0,0 +1,19 @@
17989 +# From code by James Livingston
17991 +from gi.repository import GObject, Peas, Totem # pylint: disable-msg=E0611,W0611
17993 +class SamplePython (GObject.Object, Peas.Activatable):
17994 + __gtype_name__ = 'SamplePython'
17996 + object = GObject.property (type = GObject.Object)
17998 + def __init__ (self):
17999 + GObject.Object.__init__ (self)
18001 + def do_activate (self):
18002 + print "Activating sample Python plugin"
18003 + self.object.action_fullscreen_toggle ()
18005 + def do_deactivate (self):
18006 + print "Deactivating sample Python plugin"
18007 + self.object.action_fullscreen_toggle ()
18008 diff --git a/src/plugins/save-file/totem-save-file.c b/src/plugins/save-file/totem-save-file.c
18009 index 2351dc9..85c8fd5 100644
18010 --- a/src/plugins/save-file/totem-save-file.c
18011 +++ b/src/plugins/save-file/totem-save-file.c
18012 @@ -60,7 +60,7 @@ static void totem_save_file_plugin_copy (GtkAction *action,
18013 TotemSaveFilePlugin *pi);
18015 static GtkActionEntry totem_save_file_plugin_actions [] = {
18016 - { "SaveFile", "save-as", N_("Save a Copy..."), NULL,
18017 + { "SaveFile", "save-as", N_("Save a Copy..."), "<Ctrl>E",
18018 N_("Save a copy of the movie"),
18019 G_CALLBACK (totem_save_file_plugin_copy) },
18021 diff --git a/src/plugins/screenshot/gnome-screenshot-widget.c b/src/plugins/screenshot/gnome-screenshot-widget.c
18022 index ebd7fcf..43b93bc 100644
18023 --- a/src/plugins/screenshot/gnome-screenshot-widget.c
18024 +++ b/src/plugins/screenshot/gnome-screenshot-widget.c
18025 @@ -265,7 +265,6 @@ void
18026 on_preview_expose_event (GtkWidget *drawing_area, GdkEventExpose *event, GnomeScreenshotWidget *self)
18028 GdkPixbuf *pixbuf = NULL;
18029 - gboolean free_pixbuf = FALSE;
18030 GtkStyleContext *context;
18031 cairo_t *cr;
18033 @@ -282,7 +281,6 @@ on_preview_expose_event (GtkWidget *drawing_area, GdkEventExpose *event, GnomeSc
18034 gtk_icon_source_set_size_wildcarded (source, FALSE);
18036 pixbuf = gtk_render_icon_pixbuf (context, source, (GtkIconSize) -1);
18037 - free_pixbuf = TRUE;
18038 gtk_icon_source_free (source);
18039 } else {
18040 pixbuf = g_object_ref (self->priv->preview_image);
18041 diff --git a/src/plugins/screenshot/totem-gallery-progress.c b/src/plugins/screenshot/totem-gallery-progress.c
18042 index 6769886..854065e 100644
18043 --- a/src/plugins/screenshot/totem-gallery-progress.c
18044 +++ b/src/plugins/screenshot/totem-gallery-progress.c
18045 @@ -105,6 +105,7 @@ totem_gallery_progress_new (GPid child_pid, const gchar *output_filename)
18047 /* Set the progress label */
18048 label_text = g_strdup_printf (_("Saving gallery as \"%s\""), output_filename);
18049 + gtk_progress_bar_set_show_text (self->priv->progress_bar, TRUE);
18050 gtk_progress_bar_set_text (self->priv->progress_bar, label_text);
18051 g_free (label_text);
18053 diff --git a/src/plugins/skipto/totem-time-entry.c b/src/plugins/skipto/totem-time-entry.c
18054 index 853f674..37c9f4a 100644
18055 --- a/src/plugins/skipto/totem-time-entry.c
18056 +++ b/src/plugins/skipto/totem-time-entry.c
18057 @@ -27,8 +27,10 @@
18058 * Author: Philip Withnall <philip@tecnocode.co.uk>
18061 +#include "config.h"
18062 #include <string.h>
18063 #include <glib.h>
18064 +#include <glib/gi18n-lib.h>
18065 #include <gtk/gtk.h>
18067 #include "backend/video-utils.h"
18068 diff --git a/src/plugins/totem-plugins-engine.c b/src/plugins/totem-plugins-engine.c
18069 index f53c0c3..2f101e6 100644
18070 --- a/src/plugins/totem-plugins-engine.c
18071 +++ b/src/plugins/totem-plugins-engine.c
18072 @@ -81,7 +81,7 @@ on_activatable_extension_added (PeasExtensionSet *set,
18073 PeasExtension *exten,
18074 TotemPluginsEngine *engine)
18076 - peas_extension_call (exten, "activate");
18077 + peas_activatable_activate (PEAS_ACTIVATABLE (exten));
18080 static void
18081 @@ -90,7 +90,7 @@ on_activatable_extension_removed (PeasExtensionSet *set,
18082 PeasExtension *exten,
18083 TotemPluginsEngine *engine)
18085 - peas_extension_call (exten, "deactivate");
18086 + peas_activatable_deactivate (PEAS_ACTIVATABLE (exten));
18089 TotemPluginsEngine *
18090 diff --git a/src/plugins/tracker/Makefile.am b/src/plugins/tracker/Makefile.am
18091 deleted file mode 100644
18092 index 0ef3fc4..0000000
18093 --- a/src/plugins/tracker/Makefile.am
18094 +++ /dev/null
18095 @@ -1,19 +0,0 @@
18096 -include $(top_srcdir)/src/plugins/Makefile.plugins
18098 -plugindir = $(PLUGINDIR)/tracker
18099 -plugin_LTLIBRARIES = libtracker.la
18101 -plugin_in_files = tracker.plugin.in
18103 -libtracker_la_SOURCES = totem-tracker.c totem-tracker-widget.h totem-tracker-widget.c
18104 -libtracker_la_LDFLAGS = $(plugin_ldflags)
18105 -libtracker_la_LIBADD = \
18106 - $(plugin_libadd) \
18107 - $(TRACKER_LIBS) \
18108 - $(DBUS_LIBS)
18109 -libtracker_la_CFLAGS = \
18110 - $(plugin_cflags) \
18111 - $(TRACKER_CFLAGS) \
18112 - $(DBUS_CFLAGS)
18114 --include $(top_srcdir)/git.mk
18115 diff --git a/src/plugins/tracker/totem-tracker-widget.c b/src/plugins/tracker/totem-tracker-widget.c
18116 deleted file mode 100644
18117 index fa91c05..0000000
18118 --- a/src/plugins/tracker/totem-tracker-widget.c
18119 +++ /dev/null
18120 @@ -1,885 +0,0 @@
18121 -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
18123 - * The _get_result_count method taken from the tracker-client.h file from libtracker
18124 - * Copyright (C) 2006, Jamie McCracken <jamiemcc@gnome.org>
18125 - * Copyright (C) 2007, Javier Goday <jgoday@gmail.com>
18126 - * Copyright (C) 2010, Martyn Russell <martyn@lanedo.com>
18128 - * This library is free software; you can redistribute it and/or
18129 - * modify it under the terms of the GNU Library General Public
18130 - * License as published by the Free Software Foundation; either
18131 - * version 2 of the License, or (at your option) any later version.
18133 - * This library is distributed in the hope that it will be useful,
18134 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
18135 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18136 - * General Public License for more details.
18138 - * You should have received a copy of the GNU Library General Public
18139 - * License along with this library; if not, write to the
18140 - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18141 - * Boston, MA 02110-1301, USA.
18143 - * Author: Jamie McCracken <jamiemcc@gnome.org>
18144 - * Javier Goday <jgoday@gmail.com>
18145 - * Martyn Russell <martyn@lanedo.com>
18146 - */
18148 -#include "config.h"
18150 -#include <string.h>
18151 -#include <stdio.h>
18152 -#include <stdlib.h>
18153 -#include <libintl.h>
18155 -#include <glib/gi18n-lib.h>
18157 -#include <gio/gio.h>
18159 -#include <libtracker-sparql/tracker-sparql.h>
18161 -#include "totem-tracker-widget.h"
18162 -#include "totem-cell-renderer-video.h"
18163 -#include "totem-playlist.h"
18164 -#include "totem-video-list.h"
18165 -#include "totem-interface.h"
18167 -#define TOTEM_TRACKER_MAX_RESULTS_SIZE 20
18169 -G_DEFINE_TYPE (TotemTrackerWidget, totem_tracker_widget, GTK_TYPE_VBOX)
18171 -struct TotemTrackerWidgetPrivate {
18172 - GtkWidget *search_entry;
18173 - GtkWidget *search_button;
18174 - GtkWidget *status_label;
18176 - GtkWidget *next_button;
18177 - GtkWidget *previous_button;
18178 - GtkWidget *page_selector;
18180 - guint total_result_count;
18181 - guint current_result_page;
18183 - GtkListStore *result_store;
18184 - TotemVideoList *result_list;
18186 - GSList *thumbnail_requests;
18187 - GdkPixbuf *default_icon;
18188 - gint default_icon_size;
18191 -typedef struct {
18192 - TotemTrackerWidget *widget;
18193 - TrackerSparqlConnection *connection;
18194 - GCancellable *cancellable;
18195 - gchar *search_text;
18196 - gint offset;
18197 -} SearchResultsData;
18199 -typedef struct {
18200 - TotemTrackerWidget *widget;
18201 - GCancellable *cancellable;
18202 - GtkTreeIter iter;
18203 -} ThumbnailData;
18205 -enum {
18206 - IMAGE_COLUMN,
18207 - FILE_COLUMN,
18208 - NAME_COLUMN,
18209 - N_COLUMNS
18212 -enum {
18213 - PROP_0,
18214 - PROP_TOTEM
18217 -static void totem_tracker_widget_dispose (GObject *object);
18218 -static void totem_tracker_widget_set_property (GObject *object,
18219 - guint property_id,
18220 - const GValue *value,
18221 - GParamSpec *pspec);
18222 -static void page_selector_value_changed_cb (GtkSpinButton *self,
18223 - TotemTrackerWidget *widget);
18224 -static void thumbnail_data_free (ThumbnailData *td);
18225 -static void search_get_hits_next (SearchResultsData *srd,
18226 - TrackerSparqlCursor *cursor);
18227 -static void search_get_hits (SearchResultsData *srd);
18228 -static void search_finish (SearchResultsData *srd,
18229 - GError *error);
18231 -static void
18232 -totem_tracker_widget_class_init (TotemTrackerWidgetClass *klass)
18234 - GObjectClass *object_class;
18236 - g_type_class_add_private (klass, sizeof (TotemTrackerWidgetPrivate));
18238 - object_class = G_OBJECT_CLASS (klass);
18239 - object_class->dispose = totem_tracker_widget_dispose;
18240 - object_class->set_property = totem_tracker_widget_set_property;
18242 - g_object_class_install_property (object_class, PROP_TOTEM,
18243 - g_param_spec_object ("totem", NULL, NULL,
18244 - TOTEM_TYPE_OBJECT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
18247 -static void
18248 -totem_tracker_widget_dispose (GObject *object)
18250 - TotemTrackerWidget *self = TOTEM_TRACKER_WIDGET (object);
18252 - if (self->priv->default_icon != NULL) {
18253 - g_object_unref (self->priv->default_icon);
18254 - self->priv->default_icon = NULL;
18257 - g_slist_foreach (self->priv->thumbnail_requests, (GFunc) thumbnail_data_free, NULL);
18258 - g_slist_free (self->priv->thumbnail_requests);
18259 - self->priv->thumbnail_requests = NULL;
18261 - if (self->priv->result_store != NULL) {
18262 - g_object_unref (self->priv->result_store);
18263 - self->priv->result_store = NULL;
18266 - G_OBJECT_CLASS (totem_tracker_widget_parent_class)->dispose (object);
18269 -static void
18270 -totem_tracker_widget_set_property (GObject *object,
18271 - guint property_id,
18272 - const GValue *value,
18273 - GParamSpec *pspec)
18275 - TotemTrackerWidget *widget;
18277 - widget = TOTEM_TRACKER_WIDGET (object);
18279 - switch (property_id)
18281 - case PROP_TOTEM:
18282 - widget->totem = g_value_dup_object (value);
18283 - g_object_set (G_OBJECT (widget->priv->result_list), "totem", widget->totem, NULL);
18284 - break;
18285 - default:
18286 - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
18290 -static ThumbnailData *
18291 -thumbnail_data_new (TotemTrackerWidget *widget,
18292 - GtkTreeIter iter)
18294 - ThumbnailData *td;
18296 - td = g_slice_new0 (ThumbnailData);
18298 - td->widget = g_object_ref (widget);
18299 - td->cancellable = g_cancellable_new ();
18300 - td->iter = iter;
18302 - return td;
18305 -static void
18306 -thumbnail_data_free (ThumbnailData *td)
18308 - if (!td)
18309 - return;
18311 - if (td->cancellable) {
18312 - g_cancellable_cancel (td->cancellable);
18313 - g_object_unref (td->cancellable);
18316 - if (td->widget)
18317 - g_object_unref (td->widget);
18319 - g_slice_free (ThumbnailData, td);
18323 -static void
18324 -search_results_populate_cb (GObject *source_object,
18325 - GAsyncResult *res,
18326 - gpointer user_data)
18328 - ThumbnailData *td;
18329 - TotemTrackerWidget *widget;
18330 - GFileInfo *info;
18331 - GError *error = NULL;
18332 - GdkPixbuf *thumbnail = NULL;
18334 - td = user_data;
18335 - widget = td->widget;
18337 - info = g_file_query_info_finish (G_FILE (source_object),
18338 - res,
18339 - &error);
18341 - if (error) {
18342 - g_warning ("Call to g_file_query_info_async() failed for '%s': %s",
18343 - G_FILE_ATTRIBUTE_THUMBNAIL_PATH,
18344 - error->message);
18345 - g_error_free (error);
18346 - } else {
18347 - const gchar *thumbnail_path;
18349 - thumbnail_path = g_file_info_get_attribute_byte_string (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
18351 - if (thumbnail_path != NULL)
18352 - thumbnail = gdk_pixbuf_new_from_file (thumbnail_path, NULL);
18355 - gtk_list_store_set (GTK_LIST_STORE (widget->priv->result_store), &td->iter,
18356 - IMAGE_COLUMN, thumbnail ? thumbnail : widget->priv->default_icon,
18357 - -1);
18359 - if (thumbnail)
18360 - g_object_unref (thumbnail);
18362 - if (info)
18363 - g_object_unref (info);
18365 - widget->priv->thumbnail_requests = g_slist_remove (widget->priv->thumbnail_requests, td);
18366 - thumbnail_data_free (td);
18369 -static void
18370 -search_results_populate (SearchResultsData *srd,
18371 - const gchar *uri,
18372 - const gchar *title)
18374 - TotemTrackerWidget *widget;
18375 - ThumbnailData *td;
18376 - GFile *file;
18377 - GtkTreeIter iter;
18379 - widget = srd->widget;
18381 - gtk_list_store_append (GTK_LIST_STORE (widget->priv->result_store), &iter); /* Acquire an iterator */
18382 - gtk_list_store_set (GTK_LIST_STORE (widget->priv->result_store), &iter,
18383 - FILE_COLUMN, uri,
18384 - NAME_COLUMN, title,
18385 - -1);
18387 - td = thumbnail_data_new (widget, iter);
18388 - widget->priv->thumbnail_requests = g_slist_prepend (widget->priv->thumbnail_requests, td);
18390 - file = g_file_new_for_uri (uri);
18391 - g_file_query_info_async (file,
18392 - G_FILE_ATTRIBUTE_THUMBNAIL_PATH,
18393 - G_FILE_QUERY_INFO_NONE,
18394 - G_PRIORITY_DEFAULT,
18395 - td->cancellable,
18396 - search_results_populate_cb,
18397 - td);
18398 - g_object_unref (file);
18401 -static SearchResultsData *
18402 -search_results_new (TotemTrackerWidget *widget,
18403 - const gchar *search_text)
18405 - SearchResultsData *srd;
18406 - TrackerSparqlConnection *connection;
18407 - GCancellable *cancellable;
18408 - GError *error = NULL;
18410 - if (!widget) {
18411 - return NULL;
18414 - cancellable = g_cancellable_new ();
18416 - connection = tracker_sparql_connection_get (cancellable, &error);
18417 - if (error) {
18418 - g_warning ("Call to tracker_sparql_connection_get() failed: %s", error->message);
18419 - g_object_unref (cancellable);
18420 - g_error_free (error);
18421 - return NULL;
18424 - srd = g_slice_new0 (SearchResultsData);
18426 - srd->widget = g_object_ref (widget);
18427 - srd->connection = connection;
18428 - srd->cancellable = cancellable;
18429 - srd->search_text = g_strdup (search_text);
18431 - return srd;
18434 -static void
18435 -search_results_free (SearchResultsData *srd)
18437 - if (!srd) {
18438 - return;
18441 - if (srd->cancellable) {
18442 - g_cancellable_cancel (srd->cancellable);
18443 - g_object_unref (srd->cancellable);
18446 - if (srd->connection) {
18447 - g_object_unref (srd->connection);
18450 - if (srd->widget) {
18451 - g_object_unref (srd->widget);
18454 - g_free (srd->search_text);
18455 - g_slice_free (SearchResultsData, srd);
18458 -static gchar *
18459 -get_fts_string (GStrv search_words,
18460 - gboolean use_or_operator)
18462 - GString *fts;
18463 - gint i, len;
18465 - if (!search_words) {
18466 - return NULL;
18469 - fts = g_string_new ("");
18470 - len = g_strv_length (search_words);
18472 - for (i = 0; i < len; i++) {
18473 - g_string_append (fts, search_words[i]);
18474 - g_string_append_c (fts, '*');
18476 - if (i < len - 1) {
18477 - if (use_or_operator) {
18478 - g_string_append (fts, " OR ");
18479 - } else {
18480 - g_string_append (fts, " ");
18485 - return g_string_free (fts, FALSE);
18488 -static void
18489 -search_get_hits_next_cb (GObject *source_object,
18490 - GAsyncResult *res,
18491 - gpointer user_data)
18493 - TrackerSparqlCursor *cursor;
18494 - SearchResultsData *srd = user_data;
18495 - GError *error = NULL;
18496 - gboolean more_results;
18498 - cursor = TRACKER_SPARQL_CURSOR (source_object);
18500 - more_results = tracker_sparql_cursor_next_finish (cursor,
18501 - res,
18502 - &error);
18503 - if (error) {
18504 - g_warning ("Call to tracker_sparql_cursor_next_finish() failed getting next hit: %s", error->message);
18505 - g_object_unref (cursor);
18506 - search_finish (srd, error);
18507 - return;
18510 - if (!more_results) {
18511 - /* got all results */
18512 - g_object_unref (cursor);
18513 - search_finish (srd, NULL);
18514 - } else {
18515 - const gchar *url, *title;
18517 - url = tracker_sparql_cursor_get_string (cursor, 0, NULL);
18518 - title = tracker_sparql_cursor_get_string (cursor, 1, NULL);
18520 - g_message (" Got hit:'%s' --> '%s'", url, title);
18521 - search_results_populate (srd, url, title);
18523 - /* Now continue with next row in the db */
18524 - search_get_hits_next (srd, cursor);
18528 -static void
18529 -search_get_hits_next (SearchResultsData *srd,
18530 - TrackerSparqlCursor *cursor)
18532 - tracker_sparql_cursor_next_async (cursor,
18533 - srd->cancellable,
18534 - search_get_hits_next_cb,
18535 - srd);
18538 -static void
18539 -search_get_hits_cb (GObject *source_object,
18540 - GAsyncResult *res,
18541 - gpointer user_data)
18543 - TrackerSparqlCursor *cursor;
18544 - SearchResultsData *srd = user_data;
18545 - GError *error = NULL;
18547 - cursor = tracker_sparql_connection_query_finish (TRACKER_SPARQL_CONNECTION (source_object),
18548 - res,
18549 - &error);
18550 - if (error) {
18551 - g_warning ("Call to tracker_sparql_connection_query_finish() failed getting hits: %s", error->message);
18552 - g_object_unref (cursor);
18553 - search_finish (srd, error);
18554 - return;
18557 - search_get_hits_next (srd, cursor);
18560 -static void
18561 -search_get_hits (SearchResultsData *srd)
18563 - gchar *fts, *query;
18565 - if (srd->search_text && srd->search_text[0] != '\0') {
18566 - GStrv strv;
18568 - strv = g_strsplit (srd->search_text, " ", -1);
18569 - fts = get_fts_string (strv, FALSE);
18570 - g_strfreev (strv);
18571 - } else {
18572 - fts = NULL;
18575 - if (fts) {
18576 - query = g_strdup_printf ("SELECT nie:url(?urn) nie:title(?urn) "
18577 - "WHERE {"
18578 - " ?urn a nmm:Video ;"
18579 - " fts:match \"%s\" ;"
18580 - " tracker:available true . "
18581 - "} "
18582 - "ORDER BY DESC(fts:rank(?urn)) ASC(nie:url(?urn)) "
18583 - "OFFSET %d "
18584 - "LIMIT %d",
18585 - fts,
18586 - srd->offset,
18587 - TOTEM_TRACKER_MAX_RESULTS_SIZE);
18588 - } else {
18589 - query = g_strdup_printf ("SELECT nie:url(?urn) nie:title(?urn) "
18590 - "WHERE {"
18591 - " ?urn a nmm:Video ; "
18592 - " tracker:available true . "
18593 - "} "
18594 - "ORDER BY DESC(fts:rank(?urn)) ASC(nie:url(?urn)) "
18595 - "OFFSET %d "
18596 - "LIMIT %d",
18597 - srd->offset,
18598 - TOTEM_TRACKER_MAX_RESULTS_SIZE);
18601 - tracker_sparql_connection_query_async (srd->connection,
18602 - query,
18603 - srd->cancellable,
18604 - search_get_hits_cb,
18605 - srd);
18606 - g_free (query);
18607 - g_free (fts);
18610 -static void
18611 -search_get_count_cb (GObject *source_object,
18612 - GAsyncResult *res,
18613 - gpointer user_data)
18615 - TrackerSparqlCursor *cursor;
18616 - SearchResultsData *srd = user_data;
18617 - GError *error = NULL;
18619 - cursor = tracker_sparql_connection_query_finish (TRACKER_SPARQL_CONNECTION (source_object),
18620 - res,
18621 - &error);
18622 - if (error) {
18623 - g_warning ("Call to tracker_sparql_connection_query_finish() failed getting hit count: %s", error->message);
18624 - g_object_unref (cursor);
18625 - search_finish (srd, error);
18626 - return;
18629 - srd->widget->priv->total_result_count = 0;
18631 - if (cursor) {
18632 - tracker_sparql_cursor_next (cursor, srd->cancellable, &error);
18634 - if (error) {
18635 - g_warning ("Call to tracker_sparql_cursor_next() failed getting hit count: %s", error->message);
18636 - g_object_unref (cursor);
18637 - search_finish (srd, error);
18638 - return;
18641 - srd->widget->priv->total_result_count = tracker_sparql_cursor_get_integer (cursor, 0);
18642 - g_object_unref (cursor);
18645 - g_message ("Got hit count:%d", srd->widget->priv->total_result_count);
18647 - /* Now continue with next query */
18648 - search_get_hits (srd);
18651 -static void
18652 -search_get_count (SearchResultsData *srd)
18654 - gchar *fts, *query;
18656 - if (srd->search_text && srd->search_text[0] != '\0') {
18657 - GStrv strv;
18659 - strv = g_strsplit (srd->search_text, " ", -1);
18660 - fts = get_fts_string (strv, FALSE);
18661 - g_strfreev (strv);
18662 - } else {
18663 - fts = NULL;
18666 - /* NOTE: We use FILTERS here for the type because we may want
18667 - * to show more items than just videos in the future - like
18668 - * music or some other specialised content.
18669 - */
18670 - if (fts) {
18671 - query = g_strdup_printf ("SELECT COUNT(?urn) "
18672 - "WHERE {"
18673 - " ?urn a nmm:Video ;"
18674 - " fts:match \"%s\" ;"
18675 - " tracker:available true . "
18676 - "}",
18677 - fts);
18678 - } else {
18679 - query = g_strdup_printf ("SELECT COUNT(?urn) "
18680 - "WHERE {"
18681 - " ?urn a nmm:Video ;"
18682 - " tracker:available true . "
18683 - "}");
18686 - tracker_sparql_connection_query_async (srd->connection,
18687 - query,
18688 - srd->cancellable,
18689 - search_get_count_cb,
18690 - srd);
18691 - g_free (query);
18692 - g_free (fts);
18695 -static void
18696 -search_finish (SearchResultsData *srd,
18697 - GError *error)
18699 - TotemTrackerWidgetPrivate *priv = srd->widget->priv;
18700 - gchar *str;
18701 - guint next_page, total_pages;
18703 - /* Always do this first so we can try again */
18704 - gtk_widget_set_sensitive (priv->search_entry, TRUE);
18706 - if (error) {
18707 - gtk_label_set_text (GTK_LABEL (priv->status_label), _("Could not connect to Tracker"));
18708 - /* gtk_list_store_clear (GTK_LIST_STORE (priv->result_store)); */
18709 - g_error_free (error);
18710 - return;
18713 - if (srd->widget->priv->total_result_count < 1) {
18714 - gtk_label_set_text (GTK_LABEL (priv->status_label), _("No results"));
18715 - gtk_widget_set_sensitive (GTK_WIDGET (priv->page_selector), FALSE);
18716 - gtk_widget_set_sensitive (GTK_WIDGET (priv->next_button), FALSE);
18717 - } else {
18718 - next_page = (priv->current_result_page + 1) * TOTEM_TRACKER_MAX_RESULTS_SIZE;
18719 - total_pages = priv->total_result_count / TOTEM_TRACKER_MAX_RESULTS_SIZE + 1;
18721 - /* Set the new range on the page selector's adjustment and ensure the current page is correct */
18722 - gtk_spin_button_set_range (GTK_SPIN_BUTTON (priv->page_selector), 1, total_pages);
18723 - priv->current_result_page = gtk_spin_button_get_value (GTK_SPIN_BUTTON (priv->page_selector)) - 1;
18725 - /* Translators:
18726 - * This is used to show which items are listed in the
18727 - * list view, for example:
18729 - * Showing 10-20 of 128 matches
18731 - * This is similar to what web searches use, eg.
18732 - * Google on the top-right of their search results
18733 - * page show:
18735 - * Personalized Results 1 - 10 of about 4,130,000 for foobar
18737 - */
18738 - str = g_strdup_printf (ngettext ("Showing %i - %i of %i match", "Showing %i - %i of %i matches",
18739 - priv->total_result_count),
18740 - priv->current_result_page * TOTEM_TRACKER_MAX_RESULTS_SIZE + 1,
18741 - next_page > priv->total_result_count ? priv->total_result_count : next_page,
18742 - priv->total_result_count);
18743 - gtk_label_set_text (GTK_LABEL (priv->status_label), str);
18744 - g_free (str);
18746 - /* Enable or disable the pager buttons */
18747 - if (priv->current_result_page < priv->total_result_count / TOTEM_TRACKER_MAX_RESULTS_SIZE) {
18748 - gtk_widget_set_sensitive (GTK_WIDGET (priv->page_selector), TRUE);
18749 - gtk_widget_set_sensitive (GTK_WIDGET (priv->next_button), TRUE);
18752 - if (priv->current_result_page > 0) {
18753 - gtk_widget_set_sensitive (GTK_WIDGET (priv->page_selector), TRUE);
18754 - gtk_widget_set_sensitive (GTK_WIDGET (priv->previous_button), TRUE);
18755 - } else {
18756 - gtk_widget_set_sensitive (GTK_WIDGET (priv->previous_button), FALSE);
18759 - if (priv->current_result_page >= total_pages - 1) {
18760 - gtk_widget_set_sensitive (GTK_WIDGET (priv->next_button), FALSE);
18764 - /* Clean up */
18765 - g_signal_handlers_unblock_by_func (priv->page_selector,
18766 - page_selector_value_changed_cb,
18767 - srd->widget);
18768 - search_results_free (srd);
18771 -static void
18772 -search_start (TotemTrackerWidget *widget)
18774 - SearchResultsData *srd;
18775 - const gchar *search_text;
18777 - /* Cancel previous searches */
18778 - /* tracker_cancel_call (widget->priv->cookie_id); */
18780 - /* Clear the list store */
18781 - gtk_list_store_clear (GTK_LIST_STORE (widget->priv->result_store));
18783 - /* Stop pagination temporarily */
18784 - gtk_widget_set_sensitive (GTK_WIDGET (widget->priv->previous_button), FALSE);
18785 - gtk_widget_set_sensitive (GTK_WIDGET (widget->priv->page_selector), FALSE);
18786 - gtk_widget_set_sensitive (GTK_WIDGET (widget->priv->next_button), FALSE);
18788 - /* Stop after clearing the list store if they're just emptying the search entry box */
18789 - search_text = gtk_entry_get_text (GTK_ENTRY (widget->priv->search_entry));
18791 - g_signal_handlers_block_by_func (widget->priv->page_selector, page_selector_value_changed_cb, widget);
18793 - /* Get the tracker connection and data set up */
18794 - srd = search_results_new (widget, search_text);
18795 - if (!srd) {
18796 - gtk_label_set_text (GTK_LABEL (widget->priv->status_label), _("Could not connect to Tracker"));
18797 - return;
18800 - gtk_widget_set_sensitive (widget->priv->search_entry, FALSE);
18802 - srd->offset = widget->priv->current_result_page * TOTEM_TRACKER_MAX_RESULTS_SIZE;
18804 - /* This is how things proceed (everything is done async):
18805 - * 1. Get the count (but only for the first time)
18806 - * 2. Get the cursor using the criteria.
18807 - * 3. Call the cursor_next() as many times as we have results.
18808 - * 4. Clean up the search UI.
18809 - */
18810 - if (widget->priv->current_result_page < 1) {
18811 - search_get_count (srd);
18812 - } else {
18813 - search_get_hits (srd);
18817 -static void
18818 -go_next (GtkWidget *button, TotemTrackerWidget *widget)
18820 - if (widget->priv->current_result_page < widget->priv->total_result_count / TOTEM_TRACKER_MAX_RESULTS_SIZE)
18821 - gtk_spin_button_spin (GTK_SPIN_BUTTON (widget->priv->page_selector), GTK_SPIN_STEP_FORWARD, 1);
18823 - /* do_search is called via page_selector_value_changed_cb */
18826 -static void
18827 -go_previous (GtkWidget *button, TotemTrackerWidget *widget)
18829 - if (widget->priv->current_result_page > 0)
18830 - gtk_spin_button_spin (GTK_SPIN_BUTTON (widget->priv->page_selector), GTK_SPIN_STEP_BACKWARD, 1);
18832 - /* do_search is called via page_selector_value_changed_cb */
18835 -static void
18836 -page_selector_value_changed_cb (GtkSpinButton *self, TotemTrackerWidget *widget)
18838 - widget->priv->current_result_page = gtk_spin_button_get_value (self) - 1;
18840 - search_start (widget);
18843 -static void
18844 -new_search (GtkButton *button, TotemTrackerWidget *widget)
18846 - /* Reset from the last search */
18847 - g_signal_handlers_block_by_func (widget->priv->page_selector, page_selector_value_changed_cb, widget);
18848 - gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget->priv->page_selector), 1);
18849 - g_signal_handlers_unblock_by_func (widget->priv->page_selector, page_selector_value_changed_cb, widget);
18851 - search_start (widget);
18854 -static void
18855 -init_result_list (TotemTrackerWidget *widget)
18857 - /* Initialize the store result list */
18858 - widget->priv->result_store = gtk_list_store_new (N_COLUMNS,
18859 - GDK_TYPE_PIXBUF,
18860 - G_TYPE_STRING,
18861 - G_TYPE_STRING);
18863 - /* Create the gtktreewidget to show the results */
18864 - widget->priv->result_list = g_object_new (TOTEM_TYPE_VIDEO_LIST,
18865 - "mrl-column", FILE_COLUMN,
18866 - "tooltip-column", NAME_COLUMN,
18867 - NULL);
18869 - gtk_tree_view_set_model (GTK_TREE_VIEW (widget->priv->result_list),
18870 - GTK_TREE_MODEL (widget->priv->result_store));
18873 -static void
18874 -initialize_list_store (TotemTrackerWidget *widget)
18876 - TotemCellRendererVideo *renderer;
18877 - GtkTreeViewColumn *column;
18879 - /* Initialise the columns of the result list */
18880 - renderer = totem_cell_renderer_video_new (TRUE);
18881 - column = gtk_tree_view_column_new_with_attributes (_("Search Results"), GTK_CELL_RENDERER (renderer),
18882 - "thumbnail", IMAGE_COLUMN,
18883 - "title", NAME_COLUMN,
18884 - NULL);
18886 - gtk_tree_view_append_column (GTK_TREE_VIEW (widget->priv->result_list), column);
18889 -static void
18890 -search_entry_changed_cb (GtkWidget *entry,
18891 - gpointer user_data)
18893 - TotemTrackerWidget *widget = user_data;
18895 - gtk_label_set_text (GTK_LABEL (widget->priv->status_label), "");
18898 -static void
18899 -totem_tracker_widget_init (TotemTrackerWidget *widget)
18901 - GtkWidget *v_box; /* the main vertical box of the widget */
18902 - GtkWidget *h_box;
18903 - GtkWidget *pager_box; /* box that holds the next and previous buttons */
18904 - GtkScrolledWindow *scroll; /* make the result list scrollable */
18905 - GtkAdjustment *adjust; /* adjustment for the page selector spin button */
18906 - GdkScreen *screen;
18907 - GtkIconTheme *theme;
18909 - widget->priv = G_TYPE_INSTANCE_GET_PRIVATE (widget, TOTEM_TYPE_TRACKER_WIDGET, TotemTrackerWidgetPrivate);
18911 - init_result_list (widget);
18913 - v_box = gtk_vbox_new (FALSE, 6);
18914 - h_box = gtk_hbox_new (FALSE, 6);
18916 - /* Search entry */
18917 - widget->priv->search_entry = gtk_entry_new ();
18919 - /* Search button */
18920 - widget->priv->search_button = gtk_button_new_from_stock (GTK_STOCK_FIND);
18921 - gtk_box_pack_start (GTK_BOX (h_box), widget->priv->search_entry, TRUE, TRUE, 0);
18922 - gtk_box_pack_start (GTK_BOX (h_box), widget->priv->search_button, FALSE, TRUE, 0);
18923 - gtk_box_pack_start (GTK_BOX (v_box), h_box, FALSE, TRUE, 0);
18925 - /* Insert the result list and initialize the viewport */
18926 - scroll = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
18927 - gtk_scrolled_window_set_policy (scroll, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
18928 - gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (widget->priv->result_list));
18929 - gtk_container_add (GTK_CONTAINER (v_box), GTK_WIDGET (scroll));
18931 - /* Status label */
18932 - widget->priv->status_label = gtk_label_new ("");
18933 - gtk_misc_set_alignment (GTK_MISC (widget->priv->status_label), 0.0, 0.5);
18934 - gtk_box_pack_start (GTK_BOX (v_box), widget->priv->status_label, FALSE, TRUE, 2);
18936 - /* Initialise the pager box */
18937 - pager_box = gtk_hbox_new (FALSE, 6);
18938 - widget->priv->next_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
18939 - widget->priv->previous_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
18940 - adjust = GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 1, 1, 5, 0));
18941 - widget->priv->page_selector = gtk_spin_button_new (adjust, 1, 0);
18942 - gtk_box_pack_start (GTK_BOX (pager_box), widget->priv->previous_button, TRUE, TRUE, 0);
18943 - gtk_box_pack_start (GTK_BOX (pager_box), gtk_label_new (_("Page")), TRUE, TRUE, 0);
18944 - gtk_box_pack_start (GTK_BOX (pager_box), widget->priv->page_selector, TRUE, TRUE, 0);
18945 - gtk_box_pack_start (GTK_BOX (pager_box), widget->priv->next_button, TRUE, TRUE, 0);
18946 - gtk_box_pack_start (GTK_BOX (v_box), pager_box, FALSE, TRUE, 0);
18948 - gtk_widget_set_sensitive (GTK_WIDGET (widget->priv->previous_button), FALSE);
18949 - gtk_widget_set_sensitive (GTK_WIDGET (widget->priv->page_selector), FALSE);
18950 - gtk_widget_set_sensitive (GTK_WIDGET (widget->priv->next_button), FALSE);
18952 - /* Add the main container to the widget */
18953 - gtk_container_add (GTK_CONTAINER (widget), v_box);
18955 - gtk_widget_show_all (GTK_WIDGET (widget));
18957 - /* Get default pixbuf for movies with no thumbnail available yet */
18958 - if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG,
18959 - &widget->priv->default_icon_size,
18960 - NULL)) {
18961 - /* default to this if all else fails */
18962 - widget->priv->default_icon_size = 64;
18965 - screen = gdk_display_get_default_screen (gdk_display_get_default());
18966 - theme = gtk_icon_theme_get_for_screen (screen);
18967 - widget->priv->default_icon = gtk_icon_theme_load_icon (theme,
18968 - "video-x-generic",
18969 - widget->priv->default_icon_size,
18970 - GTK_ICON_LOOKUP_USE_BUILTIN,
18971 - NULL);
18973 - /* Connect the search button clicked signal and the search entry */
18974 - g_signal_connect (widget->priv->search_entry, "changed",
18975 - G_CALLBACK (search_entry_changed_cb), widget);
18976 - g_signal_connect (widget->priv->search_button, "clicked",
18977 - G_CALLBACK (new_search), widget);
18978 - g_signal_connect (widget->priv->search_entry, "activate",
18979 - G_CALLBACK (new_search), widget);
18980 - /* Connect the pager buttons */
18981 - g_signal_connect (widget->priv->next_button, "clicked",
18982 - G_CALLBACK (go_next), widget);
18983 - g_signal_connect (widget->priv->previous_button, "clicked",
18984 - G_CALLBACK (go_previous), widget);
18985 - g_signal_connect (widget->priv->page_selector, "value-changed",
18986 - G_CALLBACK (page_selector_value_changed_cb), widget);
18989 -GtkWidget *
18990 -totem_tracker_widget_new (TotemObject *totem)
18992 - GtkWidget *widget;
18994 - widget = g_object_new (TOTEM_TYPE_TRACKER_WIDGET,
18995 - "totem", totem, NULL);
18997 - /* Reset the info about the search */
18998 - TOTEM_TRACKER_WIDGET (widget)->priv->total_result_count = 0;
18999 - TOTEM_TRACKER_WIDGET (widget)->priv->current_result_page = 0;
19001 - initialize_list_store (TOTEM_TRACKER_WIDGET (widget));
19003 - return widget;
19006 diff --git a/src/plugins/tracker/totem-tracker-widget.h b/src/plugins/tracker/totem-tracker-widget.h
19007 deleted file mode 100644
19008 index fa24d74..0000000
19009 --- a/src/plugins/tracker/totem-tracker-widget.h
19010 +++ /dev/null
19011 @@ -1,54 +0,0 @@
19012 -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
19014 - * Copyright (C) 2007 Javier Goday <jgoday@gmail.com>
19016 - * This library is free software; you can redistribute it and/or
19017 - * modify it under the terms of the GNU Library General Public
19018 - * License as published by the Free Software Foundation; either
19019 - * version 2 of the License, or (at your option) any later version.
19021 - * This library is distributed in the hope that it will be useful,
19022 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
19023 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19024 - * General Public License for more details.
19026 - * You should have received a copy of the GNU Library General Public
19027 - * License along with this library; if not, write to the
19028 - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19029 - * Boston, MA 02110-1301, USA.
19031 - * Author : Javier Goday <jgoday@gmail.com>
19032 - */
19033 -#ifndef __TOTEM_TRACKER_WIDGET_H__
19034 -#define __TOTEM_TRACKER_WIDGET_H__
19036 -#include "totem.h"
19038 -#include <gtk/gtk.h>
19040 -#include <libtracker-sparql/tracker-sparql.h>
19042 -#define TOTEM_TYPE_TRACKER_WIDGET (totem_tracker_widget_get_type ())
19043 -#define TOTEM_TRACKER_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TOTEM_TYPE_TRACKER_WIDGET, TotemTrackerWidget))
19044 -#define TOTEM_TRACKER_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TOTEM_TYPE_TRACKER_WIDGET, TotemTrackerWidgetClass))
19045 -#define TOTEM_IS_TRACKER_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TOTEM_TYPE_TRACKER_WIDGET))
19046 -#define TOTEM_IS_TRACKER_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TOTEM_TYPE_TRACKER_WIDGET))
19047 -#define TOTEM_TRACKER_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TOTEM_TYPE_TRACKER_WIDGET, TotemTrackerWidgetClass))
19049 -typedef struct TotemTrackerWidgetPrivate TotemTrackerWidgetPrivate;
19051 -typedef struct TotemTrackerWidget {
19052 - GtkEventBox parent;
19054 - TotemObject *totem;
19055 - TotemTrackerWidgetPrivate *priv;
19056 -} TotemTrackerWidget;
19058 -typedef struct {
19059 - GtkEventBoxClass parent_class;
19060 -} TotemTrackerWidgetClass;
19062 -GType totem_tracker_widget_get_type (void);
19063 -GtkWidget* totem_tracker_widget_new (TotemObject *totem);
19065 -#endif /* __TOTEM_TRACKER_WIDGET_H__ */
19066 diff --git a/src/plugins/tracker/totem-tracker.c b/src/plugins/tracker/totem-tracker.c
19067 deleted file mode 100644
19068 index 2a7c219..0000000
19069 --- a/src/plugins/tracker/totem-tracker.c
19070 +++ /dev/null
19071 @@ -1,79 +0,0 @@
19072 -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
19073 -/*
19074 - * Copyright (C) 2007 Javier Goday <jgoday@gmail.com>
19075 - * Based on the sidebar-test totem plugin example
19076 - * Copyright (C) 2007 Bastien Nocera <hadess@hadess.net>
19078 - * This program is free software; you can redistribute it and/or modify
19079 - * it under the terms of the GNU General Public License as published by
19080 - * the Free Software Foundation; either version 2 of the License, or
19081 - * (at your option) any later version.
19083 - * This program is distributed in the hope that it will be useful,
19084 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
19085 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19086 - * GNU General Public License for more details.
19088 - * You should have received a copy of the GNU General Public License
19089 - * along with this program; if not, write to the Free Software
19090 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19092 - * The Totem project hereby grant permission for non-gpl compatible GStreamer
19093 - * plugins to be used and distributed together with GStreamer and Totem. This
19094 - * permission are above and beyond the permissions granted by the GPL license
19095 - * Totem is covered by.
19097 - * See license_change file for details.
19099 - */
19101 -#include "config.h"
19103 -#include <glib.h>
19104 -#include <glib-object.h>
19105 -#include <glib/gi18n-lib.h>
19106 -#include <gmodule.h>
19107 -#include <string.h>
19109 -#include "totem-plugin.h"
19110 -#include "totem.h"
19111 -#include "totem-tracker-widget.h"
19113 -#define TOTEM_TYPE_TRACKER_PLUGIN (totem_tracker_plugin_get_type ())
19114 -#define TOTEM_TRACKER_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TOTEM_TYPE_TRACKER_PLUGIN, TotemTrackerPlugin))
19115 -#define TOTEM_TRACKER_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), TOTEM_TYPE_TRACKER_PLUGIN, TotemTrackerPluginClass))
19116 -#define TOTEM_IS_TRACKER_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TOTEM_TYPE_TRACKER_PLUGIN))
19117 -#define TOTEM_IS_TRACKER_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TOTEM_TYPE_TRACKER_PLUGIN))
19118 -#define TOTEM_TRACKER_PLUGIN_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TOTEM_TYPE_TRACKER_PLUGIN, TotemTrackerPluginClass))
19120 -typedef struct {
19121 - gpointer unused;
19122 -} TotemTrackerPluginPrivate;
19124 -TOTEM_PLUGIN_REGISTER (TOTEM_TYPE_TRACKER_PLUGIN, TotemTrackerPlugin, totem_tracker_plugin);
19126 -static void
19127 -impl_activate (PeasActivatable *plugin)
19129 - GtkWidget *widget;
19130 - TotemObject *totem;
19132 - g_object_get (plugin, "object", &totem, NULL);
19134 - widget = totem_tracker_widget_new (totem);
19135 - gtk_widget_show (widget);
19136 - totem_add_sidebar_page (totem, "tracker", _("Local Search"), widget);
19138 - g_object_unref (totem);
19141 -static void
19142 -impl_deactivate (PeasActivatable *plugin)
19144 - TotemObject *totem;
19146 - g_object_get (plugin, "object", &totem, NULL);
19147 - totem_remove_sidebar_page (totem, "tracker");
19148 - g_object_unref (totem);
19151 diff --git a/src/plugins/tracker/tracker.plugin.in b/src/plugins/tracker/tracker.plugin.in
19152 deleted file mode 100644
19153 index 00a8e36..0000000
19154 --- a/src/plugins/tracker/tracker.plugin.in
19155 +++ /dev/null
19156 @@ -1,9 +0,0 @@
19157 -[Plugin]
19158 -Module=tracker
19159 -IAge=1
19160 -Builtin=false
19161 -_Name=Local Search
19162 -_Description=Search for local videos using Tracker
19163 -Authors=Javier Goday
19164 -Copyright=Copyright © 2007 Javier Goday, 2010 Martyn Russell
19165 -Website=http://www.gnome.org/projects/totem/
19166 diff --git a/src/plugins/youtube/totem-youtube.c b/src/plugins/youtube/totem-youtube.c
19167 index 710ce75..5daa39c 100644
19168 --- a/src/plugins/youtube/totem-youtube.c
19169 +++ b/src/plugins/youtube/totem-youtube.c
19170 @@ -282,7 +282,7 @@ increment_progress_bar_fraction (TotemYouTubePlugin *self, guint tree_view)
19171 if (gtk_progress_bar_get_fraction (priv->progress_bar[tree_view]) == 1.0) {
19172 /* The entire search process (including loading thumbnails) is finished, so update the progress bar */
19173 gdk_window_set_cursor (gtk_widget_get_window (priv->vbox), NULL);
19174 - gtk_progress_bar_set_text (priv->progress_bar[tree_view], "");
19175 + gtk_progress_bar_set_text (priv->progress_bar[tree_view], " ");
19176 gtk_progress_bar_set_fraction (priv->progress_bar[tree_view], 0.0);
19179 @@ -591,6 +591,17 @@ execute_query (TotemYouTubePlugin *self, guint tree_view, gboolean clear_tree_vi
19180 if (clear_tree_view == TRUE)
19181 gtk_list_store_clear (self->priv->list_store[tree_view]);
19183 +#ifdef HAVE_LIBGDATA_0_9
19184 + if (tree_view == SEARCH_TREE_VIEW) {
19185 + gdata_youtube_service_query_videos_async (self->priv->service, self->priv->query[tree_view], data->query_cancellable,
19186 + (GDataQueryProgressCallback) query_progress_cb, data, NULL,
19187 + (GAsyncReadyCallback) query_finished_cb, data);
19188 + } else {
19189 + gdata_youtube_service_query_related_async (self->priv->service, self->priv->playing_video, self->priv->query[tree_view],
19190 + data->query_cancellable, (GDataQueryProgressCallback) query_progress_cb, data, NULL,
19191 + (GAsyncReadyCallback) query_finished_cb, data);
19193 +#else
19194 if (tree_view == SEARCH_TREE_VIEW) {
19195 gdata_youtube_service_query_videos_async (self->priv->service, self->priv->query[tree_view], data->query_cancellable,
19196 (GDataQueryProgressCallback) query_progress_cb, data,
19197 @@ -600,6 +611,7 @@ execute_query (TotemYouTubePlugin *self, guint tree_view, gboolean clear_tree_vi
19198 data->query_cancellable, (GDataQueryProgressCallback) query_progress_cb, data,
19199 (GAsyncReadyCallback) query_finished_cb, data);
19201 +#endif /* !HAVE_LIBGDATA_0_9 */
19204 void
19205 @@ -634,7 +646,11 @@ search_button_clicked_cb (GtkButton *button, TotemYouTubePlugin *self)
19206 g_assert (priv->regex != NULL);
19208 /* Set up the GData service (needed for the tree views' queries) */
19209 +#ifdef HAVE_LIBGDATA_0_9
19210 + priv->service = gdata_youtube_service_new (DEVELOPER_KEY, NULL);
19211 +#else
19212 priv->service = gdata_youtube_service_new (DEVELOPER_KEY, CLIENT_ID);
19213 +#endif /* !HAVE_LIBGDATA_0_9 */
19215 /* Set up network timeouts, if they're supported by our version of libgdata.
19216 * This will return from queries with %GDATA_SERVICE_ERROR_NETWORK_ERROR if network operations take longer than 30 seconds. */
19217 diff --git a/src/plugins/youtube/youtube.ui b/src/plugins/youtube/youtube.ui
19218 index a2654ea..9a2852e 100644
19219 --- a/src/plugins/youtube/youtube.ui
19220 +++ b/src/plugins/youtube/youtube.ui
19221 @@ -101,7 +101,10 @@
19222 </object>
19223 </child>
19224 <child>
19225 - <object class="GtkProgressBar" id="yt_progress_bar_search"/>
19226 + <object class="GtkProgressBar" id="yt_progress_bar_search">
19227 + <property name="show-text">True</property>
19228 + <property name="text"> </property>
19229 + </object>
19230 <packing>
19231 <property name="padding">0</property>
19232 <property name="expand">False</property>
19233 diff --git a/src/totem-object.c b/src/totem-object.c
19234 index 22c234c..9d74856 100644
19235 --- a/src/totem-object.c
19236 +++ b/src/totem-object.c
19237 @@ -71,6 +71,9 @@
19238 #include "totem-dnd-menu.h"
19239 #include "totem-preferences.h"
19241 +#include "totem-mime-types.h"
19242 +#include "totem-uri-schemes.h"
19244 #define REWIND_OR_PREVIOUS 4000
19246 #define SEEK_FORWARD_SHORT_OFFSET 15
19247 @@ -953,9 +956,13 @@ totem_object_action_exit (TotemObject *totem)
19248 GdkDisplay *display = NULL;
19249 char *page_id;
19251 + /* Save the page ID before we close the plugins, otherwise
19252 + * we'll never save it properly */
19253 + page_id = totem_sidebar_get_current_page (totem);
19255 /* Shut down the plugins first, allowing them to display modal dialogues (etc.) without threat of being killed from another thread */
19256 if (totem != NULL && totem->engine != NULL)
19257 - totem_plugins_engine_shut_down (totem->engine);
19258 + totem_object_plugins_shutdown (totem);
19260 /* Exit forcefully if we can't do the shutdown in 10 seconds */
19261 g_thread_create ((GThreadFunc) totem_action_wait_force_exit,
19262 @@ -975,11 +982,6 @@ totem_object_action_exit (TotemObject *totem)
19263 if (totem->prefs != NULL)
19264 gtk_widget_hide (totem->prefs);
19266 - /* Save the page ID before we close the plugins, otherwise
19267 - * we'll never save it properly */
19268 - page_id = totem_sidebar_get_current_page (totem);
19269 - totem_object_plugins_shutdown (totem);
19271 if (display != NULL)
19272 gdk_display_sync (display);
19274 @@ -4361,3 +4363,31 @@ video_widget_create (TotemObject *totem)
19275 G_CALLBACK (property_notify_cb_seekable), totem);
19276 update_volume_sliders (totem);
19279 +/**
19280 + * totem_object_get_supported_content_types:
19282 + * Get the full list of file content types which Totem supports playing.
19284 + * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of the content types Totem supports
19285 + * Since: 3.1.5
19286 + */
19287 +const gchar * const *
19288 +totem_object_get_supported_content_types (void)
19290 + return mime_types;
19293 +/**
19294 + * totem_object_get_supported_uri_schemes:
19296 + * Get the full list of URI schemes which Totem supports accessing.
19298 + * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of the URI schemes Totem supports
19299 + * Since: 3.1.5
19300 + */
19301 +const gchar * const *
19302 +totem_object_get_supported_uri_schemes (void)
19304 + return uri_schemes;
19306 diff --git a/src/totem-playlist.c b/src/totem-playlist.c
19307 index 6f44487..539ea57 100644
19308 --- a/src/totem-playlist.c
19309 +++ b/src/totem-playlist.c
19310 @@ -180,22 +180,6 @@ G_DEFINE_TYPE (TotemPlaylist, totem_playlist, GTK_TYPE_VBOX)
19312 /* Helper functions */
19313 static gboolean
19314 -totem_playlist_gtk_tree_model_iter_previous (GtkTreeModel *tree_model,
19315 - GtkTreeIter *iter)
19317 - GtkTreePath *path;
19318 - gboolean ret;
19320 - path = gtk_tree_model_get_path (tree_model, iter);
19321 - ret = gtk_tree_path_prev (path);
19322 - if (ret != FALSE)
19323 - gtk_tree_model_get_iter (tree_model, iter, path);
19325 - gtk_tree_path_free (path);
19326 - return ret;
19329 -static gboolean
19330 totem_playlist_gtk_tree_path_equals (GtkTreePath *path1, GtkTreePath *path2)
19332 char *str1, *str2;
19333 @@ -2550,8 +2534,7 @@ totem_playlist_has_previous_mrl (TotemPlaylist *playlist)
19334 &iter,
19335 playlist->priv->current);
19337 - return totem_playlist_gtk_tree_model_iter_previous
19338 - (playlist->priv->model, &iter);
19339 + return gtk_tree_model_iter_previous (playlist->priv->model, &iter);
19340 } else {
19341 if (playlist->priv->current_shuffled == 0)
19342 return FALSE;
19343 @@ -2700,8 +2683,7 @@ totem_playlist_set_previous (TotemPlaylist *playlist)
19344 &iter,
19345 playlist->priv->current);
19347 - totem_playlist_gtk_tree_model_iter_previous
19348 - (playlist->priv->model, &iter);
19349 + gtk_tree_model_iter_previous (playlist->priv->model, &iter);
19350 gtk_tree_path_free (playlist->priv->current);
19351 playlist->priv->current = gtk_tree_model_get_path
19352 (playlist->priv->model, &iter);
19353 diff --git a/src/totem-video-indexer.c b/src/totem-video-indexer.c
19354 deleted file mode 100644
19355 index 465d198..0000000
19356 --- a/src/totem-video-indexer.c
19357 +++ /dev/null
19358 @@ -1,219 +0,0 @@
19359 -/*
19360 - * Copyright (C) 2006 Bastien Nocera <hadess@hadess.net>
19362 - * This program is free software; you can redistribute it and/or modify
19363 - * it under the terms of the GNU General Public License as published by
19364 - * the Free Software Foundation; either version 2 of the License, or
19365 - * (at your option) any later version.
19367 - * This program is distributed in the hope that it will be useful,
19368 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
19369 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19370 - * GNU General Public License for more details.
19372 - * You should have received a copy of the GNU General Public License
19373 - * along with this program; if not, write to the Free Software
19374 - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19376 - * The Totem project hereby grant permission for non-gpl compatible GStreamer
19377 - * plugins to be used and distributed together with GStreamer and Totem. This
19378 - * permission are above and beyond the permissions granted by the GPL license
19379 - * Totem is covered by.
19381 - * Monday 7th February 2005: Christian Schaller: Add exception clause.
19382 - * See license_change file for details.
19384 - */
19386 -#ifdef HAVE_CONFIG_H
19387 -#include "config.h"
19388 -#endif
19390 -#include <gtk/gtk.h>
19392 -#include <bacon-video-widget.h>
19393 -#include <glib.h>
19394 -#include <string.h>
19395 -#include <unistd.h>
19396 -#include <stdlib.h>
19397 -#include <glib/gi18n.h>
19399 -#include "totem-resources.h"
19400 -#include "totem-mime-types.h"
19402 -static gboolean show_mimetype = FALSE;
19403 -static gboolean time_limit = TRUE;
19404 -static gboolean g_fatal_warnings = FALSE;
19405 -static char **filenames = NULL;
19407 -static void
19408 -print_mimetypes (void)
19410 - guint i;
19412 - for (i =0; i < G_N_ELEMENTS (mime_types); i++) {
19413 - g_print ("%s\n", mime_types[i]);
19417 -static const char *
19418 -boolean_to_string (gboolean data)
19420 - return (data ? "True" : "False");
19423 -static void
19424 -totem_print_string (BaconVideoWidget *bvw, const char *key, BvwMetadataType id)
19426 - GValue value = { 0, };
19427 - const char *str;
19429 - bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw),
19430 - id, &value);
19431 - str = g_value_get_string (&value);
19432 - if (str != NULL) {
19433 - g_print ("%s=%s\n", key, str);
19435 - g_value_unset (&value);
19438 -static void
19439 -totem_print_int (BaconVideoWidget *bvw, const char *key, BvwMetadataType id)
19441 - GValue value = { 0, };
19442 - int num;
19444 - bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw),
19445 - id, &value);
19446 - num = g_value_get_int (&value);
19447 - if (num != 0) {
19448 - g_print ("%s=%d\n", key, num);
19450 - g_value_unset (&value);
19453 -G_GNUC_NORETURN static void
19454 -on_got_metadata_event (BaconVideoWidget *bvw, gpointer data)
19456 - GValue value = { 0, };
19457 - gboolean has_type;
19459 - totem_print_string (bvw, "TOTEM_INFO_TITLE", BVW_INFO_TITLE);
19460 - totem_print_string (bvw, "TOTEM_INFO_ARTIST", BVW_INFO_ARTIST);
19461 - totem_print_string (bvw, "TOTEM_INFO_YEAR", BVW_INFO_YEAR);
19462 - totem_print_string (bvw, "TOTEM_INFO_ALBUM", BVW_INFO_ALBUM);
19464 - totem_print_int (bvw, "TOTEM_INFO_DURATION", BVW_INFO_DURATION);
19465 - totem_print_int (bvw, "TOTEM_INFO_TRACK_NUMBER", BVW_INFO_TRACK_NUMBER);
19467 - bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw),
19468 - BVW_INFO_HAS_VIDEO, &value);
19469 - has_type = g_value_get_boolean (&value);
19470 - g_print ("TOTEM_INFO_HAS_VIDEO=%s\n", boolean_to_string (has_type));
19471 - g_value_unset (&value);
19473 - if (has_type) {
19474 - totem_print_int (bvw, "TOTEM_INFO_VIDEO_WIDTH", BVW_INFO_DIMENSION_X);
19475 - totem_print_int (bvw, "TOTEM_INFO_VIDEO_HEIGHT", BVW_INFO_DIMENSION_Y);
19476 - totem_print_string (bvw, "TOTEM_INFO_VIDEO_CODEC", BVW_INFO_VIDEO_CODEC);
19477 - totem_print_int (bvw, "TOTEM_INFO_FPS", BVW_INFO_FPS);
19478 - totem_print_int (bvw, "TOTEM_INFO_VIDEO_BITRATE", BVW_INFO_VIDEO_BITRATE);
19481 - bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw),
19482 - BVW_INFO_HAS_AUDIO, &value);
19483 - has_type = g_value_get_boolean (&value);
19484 - g_print ("TOTEM_INFO_HAS_AUDIO=%s\n", boolean_to_string (has_type));
19485 - g_value_unset (&value);
19487 - if (has_type) {
19488 - totem_print_int (bvw, "TOTEM_INFO_AUDIO_BITRATE", BVW_INFO_AUDIO_BITRATE);
19489 - totem_print_string (bvw, "TOTEM_INFO_AUDIO_CODEC", BVW_INFO_AUDIO_CODEC);
19490 - totem_print_int (bvw, "TOTEM_INFO_AUDIO_SAMPLE_RATE", BVW_INFO_AUDIO_SAMPLE_RATE);
19491 - totem_print_string (bvw, "TOTEM_INFO_AUDIO_CHANNELS", BVW_INFO_AUDIO_CHANNELS);
19493 - bacon_video_widget_close (bvw);
19494 - exit (0);
19497 -static const GOptionEntry entries[] = {
19498 - {"mimetype", 'm', 0, G_OPTION_ARG_NONE, &show_mimetype, "List the supported mime-types", NULL},
19499 - { "no-limit", 'l', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &time_limit, "Don't limit the thumbnailing time to 30 seconds", NULL },
19500 - {"g-fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &g_fatal_warnings, "Make all warnings fatal", NULL},
19501 - {G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, "Movies to index", NULL},
19502 - {NULL}
19505 -int main (int argc, char **argv)
19507 - GOptionGroup *options;
19508 - GOptionContext *context;
19509 - GtkWidget *widget;
19510 - BaconVideoWidget *bvw;
19511 - GError *error = NULL;
19512 - const char *path;
19514 - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
19515 - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
19516 - textdomain (GETTEXT_PACKAGE);
19518 - g_thread_init (NULL);
19519 - gdk_threads_init ();
19520 - context = g_option_context_new ("Index movies or songs");
19521 - options = bacon_video_widget_get_option_group ();
19522 - g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
19523 - g_option_context_add_group (context, options);
19524 - g_type_init ();
19526 - if (g_option_context_parse (context, &argc, &argv, &error) == FALSE) {
19527 - g_print ("couldn't parse command-line options: %s\n", error->message);
19528 - g_error_free (error);
19529 - return 1;
19532 - if (g_fatal_warnings) {
19533 - GLogLevelFlags fatal_mask;
19535 - fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
19536 - fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
19537 - g_log_set_always_fatal (fatal_mask);
19540 - if (show_mimetype == TRUE) {
19541 - print_mimetypes ();
19542 - return 0;
19543 - } else if (filenames == NULL || g_strv_length (filenames) != 1) {
19544 - char *help;
19545 - help = g_option_context_get_help (context, FALSE, NULL);
19546 - g_print ("%s", help);
19547 - g_free (help);
19548 - return 1;
19551 - widget = bacon_video_widget_new (-1, -1, BVW_USE_TYPE_METADATA, &error);
19552 - if (widget == NULL) {
19553 - g_print ("error creating the video widget: %s\n", error->message);
19554 - g_error_free (error);
19555 - return 1;
19557 - bvw = BACON_VIDEO_WIDGET (widget);
19558 - g_signal_connect (G_OBJECT (bvw), "got-metadata",
19559 - G_CALLBACK (on_got_metadata_event),
19560 - NULL);
19562 - path = filenames[0];
19563 - if (time_limit != FALSE)
19564 - totem_resources_monitor_start (path, 0);
19565 - if (bacon_video_widget_open (bvw, path, NULL, &error) == FALSE) {
19566 - g_print ("Can't open %s: %s\n", path, error->message);
19567 - return 1;
19570 - gtk_main ();
19572 - if (time_limit != FALSE)
19573 - totem_resources_monitor_stop ();
19575 - return 0;
19578 diff --git a/src/totem.h b/src/totem.h
19579 index 4a24fa0..6294781 100644
19580 --- a/src/totem.h
19581 +++ b/src/totem.h
19582 @@ -304,4 +304,7 @@ void totem_object_action_remote_set_setting (TotemObject *totem,
19583 gboolean totem_object_action_remote_get_setting (TotemObject *totem,
19584 TotemRemoteSetting setting);
19586 +const gchar * const *totem_object_get_supported_content_types (void);
19587 +const gchar * const *totem_object_get_supported_uri_schemes (void);
19589 #endif /* __TOTEM_H__ */