New upstream version 0.3.15
Alberto Garcia
1 year, 8 months ago
0 | 0 | image: fedora:latest |
1 | 1 | |
2 | 2 | variables: |
3 | DEPENDENCIES: chrpath vala gtk-doc | |
4 | gobject-introspection-devel libxml2-devel | |
5 | libsoup-devel glib2-devel gtk3-devel | |
6 | liboauth-devel totem-pl-parser-devel | |
7 | meson redhat-rpm-config gcc gcc-c++ glibc-devel | |
3 | DEPENDENCIES: chrpath | |
4 | vala | |
5 | gtk-doc | |
6 | gobject-introspection-devel | |
7 | libxml2-devel | |
8 | glib2-devel | |
9 | gtk3-devel | |
10 | liboauth-devel | |
11 | totem-pl-parser-devel | |
12 | meson | |
13 | redhat-rpm-config | |
14 | gcc | |
15 | gcc-c++ | |
16 | glibc-devel | |
17 | libabigail | |
18 | SOUP2_DEPS: libsoup-devel | |
19 | SOUP3_DEPS: libsoup3-devel | |
20 | LAST_ABI_BREAK: 60d135ef64f16671bb0ab4079ecbc59bdc32cbc7 | |
8 | 21 | |
9 | 22 | build_stable: |
10 | 23 | before_script: |
11 | 24 | - dnf update -y --nogpgcheck |
12 | - dnf install -y --nogpgcheck $DEPENDENCIES | |
25 | - dnf install -y --nogpgcheck $DEPENDENCIES $SOUP3_DEPS | |
13 | 26 | script: |
14 | 27 | - meson . _build --prefix=/usr |
15 | 28 | - ninja -C _build |
19 | 32 | build_no_optional_libs: |
20 | 33 | before_script: |
21 | 34 | - dnf update -y --nogpgcheck |
22 | - dnf install -y --nogpgcheck $DEPENDENCIES | |
35 | - dnf install -y --nogpgcheck $DEPENDENCIES $SOUP2_DEPS | |
23 | 36 | script: |
24 | - meson . _build --prefix=/usr -Denable-grl-net=false -Denable-grl-pls=false | |
37 | - meson . _build --prefix=/usr -Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=false | |
25 | 38 | - ninja -C _build |
26 | 39 | - ninja -C _build install |
27 | 40 | - ninja -C _build test |
41 | - curl https://gitlab.freedesktop.org/hadess/check-abi/-/raw/main/contrib/check-abi-fedora.sh | bash | |
42 | - check-abi --old-parameters="-Denable-grl-net=true -Denable-grl-pls=true" --new-parameters="-Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=false" ${LAST_ABI_BREAK} $(git rev-parse HEAD) | |
43 | ||
44 | build_no_optional_libs_soup3: | |
45 | before_script: | |
46 | - dnf update -y --nogpgcheck | |
47 | - dnf install -y --nogpgcheck $DEPENDENCIES $SOUP3_DEPS | |
48 | script: | |
49 | - meson . _build --prefix=/usr -Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=true | |
50 | - ninja -C _build | |
51 | - ninja -C _build install | |
52 | - ninja -C _build test | |
53 | - curl https://gitlab.freedesktop.org/hadess/check-abi/-/raw/main/contrib/check-abi-fedora.sh | bash | |
54 | # For the soup2 build | |
55 | - dnf install -y --nogpgcheck $SOUP2_DEPS | |
56 | - check-abi --old-parameters="-Denable-grl-net=true -Denable-grl-pls=true" --new-parameters="-Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=true" ${LAST_ABI_BREAK} $(git rev-parse HEAD) |
2 | 2 | 1PunMan |
3 | 3 | Adrião Morão |
4 | 4 | Adrien Plazas |
5 | Ahmad Haghighi | |
5 | 6 | Alban Browaeys |
6 | 7 | Alberto Garcia |
7 | 8 | Alexander Shopov |
108 | 109 | Milo Casagrande |
109 | 110 | Muhammet Kara |
110 | 111 | Murray Cumming |
112 | Naala Nanba | |
111 | 113 | Nathan Follens |
112 | 114 | Nilamdyuti Goswami |
113 | 115 | Nishio Futoshi |
148 | 150 | Xavier Claessens |
149 | 151 | Xavi Ivars |
150 | 152 | Yaakov Selkowitz |
153 | Yaron Shahrabani | |
151 | 154 | Yi-Jyun Pan |
152 | 155 | Yi-Soo An |
153 | 156 | Yosef Or Boczko |
154 | 157 | Yuri Myasoedov |
158 | Zurab Kargareteli | |
155 | 159 | Źmicier Turok |
156 | 160 | Марко Костић |
157 | 161 | Милош Поповић |
0 | NEW in 0.3.15 | |
1 | ============= | |
2 | * !88 Increase glib requirement to 2.66 so we can use GUri | |
3 | * !91 !90 net: add libsoup3 support with compile-time option | |
4 | * !92 net: Add documentation on throttling property in libsoup3 | |
5 | * !86 Build fixes and cleanups | |
6 | ||
7 | * New translations | |
8 | * Abkhazian | |
9 | * Georgian | |
10 | * Persian | |
11 | ||
12 | * Updated translations | |
13 | * Hebrew | |
14 | * Bulgarian | |
15 | * Nepali | |
16 | ||
17 | * Contributors to this release: | |
18 | Ahmad Haghighi <haghighi.ahmad@gmail.com> | |
19 | Alexander Shopov <ash@kambanaria.org> | |
20 | Bastien Nocera <hadess@hadess.net> | |
21 | Naala Nanba <naala-nanba@rambler.ru> | |
22 | Pawan Chitrakar <chautari@gmail.com> | |
23 | Victor Toso <victortoso@gnome.org> | |
24 | Yaron Shahrabani <sh.yaron@gmail.com> | |
25 | Zurab Kargareteli <zuraxt@gmail.com> | |
26 | ||
0 | 27 | NEW in 0.3.14 |
1 | 28 | ============= |
2 | 29 | * !78 CVE-2016-20011: Fix TLS cert validation not being done for any network call |
27 | 27 | #include <glib/gi18n-lib.h> |
28 | 28 | #include <glib/gstdio.h> |
29 | 29 | #include <gio/gio.h> |
30 | #include <libsoup/soup.h> | |
31 | 30 | #include <string.h> |
32 | 31 | |
33 | 32 | #define _GRILO_H_INSIDE_ |
60 | 59 | char *new_url; |
61 | 60 | |
62 | 61 | if (ignored_parameters) { |
63 | SoupURI *uri = soup_uri_new (url); | |
64 | const char *query = soup_uri_get_query (uri); | |
62 | g_autoptr(GUri) uri = g_uri_parse (url, G_URI_FLAGS_PARSE_RELAXED, NULL); | |
63 | const char *query = g_uri_get_query (uri); | |
65 | 64 | if (query) { |
65 | g_autoptr(GUri) nuri = NULL; | |
66 | 66 | char *new_query = g_regex_replace (ignored_parameters, |
67 | 67 | query, -1, 0, |
68 | 68 | "", 0, NULL); |
69 | soup_uri_set_query (uri, *new_query ? new_query : NULL); | |
70 | new_url = soup_uri_to_string (uri, FALSE); | |
71 | soup_uri_free (uri); | |
69 | nuri = g_uri_build (G_URI_FLAGS_NONE, | |
70 | g_uri_get_scheme (uri), | |
71 | NULL, | |
72 | g_uri_get_host (uri), | |
73 | g_uri_get_port (uri), | |
74 | g_uri_get_path (uri), | |
75 | *new_query ? new_query : NULL, | |
76 | g_uri_get_fragment (uri)); | |
77 | new_url = g_uri_to_string_partial (nuri, G_URI_FLAGS_NONE); | |
72 | 78 | g_free (new_query); |
73 | 79 | } else { |
74 | 80 | new_url = g_strdup (url); |
0 | /* | |
1 | * Copyright (C) 2010, 2011 Igalia S.L. | |
2 | * Copyright (C) 2012 Canonical Ltd. | |
3 | * | |
4 | * Contact: Iago Toral Quiroga <itoral@igalia.com> | |
5 | * | |
6 | * Authors: Víctor M. Jáquez L. <vjaquez@igalia.com> | |
7 | * Juan A. Suarez Romero <jasuarez@igalia.com> | |
8 | * Jens Georg <jensg@openismus.com> | |
9 | * Mathias Hasselmann <mathias@openismus.com> | |
10 | * | |
11 | * This library is free software; you can redistribute it and/or | |
12 | * modify it under the terms of the GNU Lesser General Public License | |
13 | * as published by the Free Software Foundation; version 2.1 of | |
14 | * the License, or (at your option) any later version. | |
15 | * | |
16 | * This library is distributed in the hope that it will be useful, but | |
17 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
19 | * Lesser General Public License for more details. | |
20 | * | |
21 | * You should have received a copy of the GNU Lesser General Public | |
22 | * License along with this library; if not, write to the Free Software | |
23 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | |
24 | * 02110-1301 USA | |
25 | * | |
26 | */ | |
27 | ||
28 | #include <libsoup/soup.h> | |
29 | ||
30 | struct _GrlNetWc { | |
31 | GObject parent; | |
32 | ||
33 | SoupSession *session; | |
34 | char *user_agent; | |
35 | SoupLoggerLogLevel log_level; | |
36 | /* throttling in secs */ | |
37 | guint throttling; | |
38 | /* last request time, timestamp in seconds */ | |
39 | gint64 last_request; | |
40 | /* closure queue for delayed requests */ | |
41 | GQueue *pending; | |
42 | /* cache size in Mb */ | |
43 | gboolean use_cache; | |
44 | guint cache_size; | |
45 | gchar *previous_data; | |
46 | }; |
38 | 38 | #include "config.h" |
39 | 39 | #endif |
40 | 40 | |
41 | #define LIBSOUP_USE_UNSTABLE_REQUEST_API | |
42 | ||
43 | 41 | #include <errno.h> |
44 | 42 | #include <glib/gi18n-lib.h> |
45 | 43 | #include <glib/gstdio.h> |
46 | 44 | #include <libsoup/soup-cache.h> |
45 | #if ! SOUP_CHECK_VERSION (2, 99, 2) | |
46 | #define LIBSOUP_USE_UNSTABLE_REQUEST_API | |
47 | 47 | #include <libsoup/soup-request-http.h> |
48 | #endif | |
48 | 49 | #include <libsoup/soup.h> |
49 | 50 | #include <string.h> |
50 | 51 | |
51 | 52 | #include <grilo.h> |
52 | 53 | #include "grl-net-wc.h" |
54 | #include "grl-net-wc-private.h" | |
53 | 55 | #include "grl-net-mock-private.h" |
54 | 56 | |
55 | 57 | #define GRL_LOG_DOMAIN_DEFAULT wc_log_domain |
67 | 69 | }; |
68 | 70 | |
69 | 71 | struct request_res { |
72 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
73 | SoupMessage *message; | |
74 | #else | |
70 | 75 | SoupRequest *request; |
76 | #endif | |
71 | 77 | gchar *buffer; |
72 | 78 | gsize length; |
73 | 79 | gsize offset; |
74 | 80 | }; |
75 | 81 | |
76 | struct _GrlNetWcPrivate { | |
77 | SoupSession *session; | |
78 | SoupLoggerLogLevel log_level; | |
79 | /* throttling in secs */ | |
80 | guint throttling; | |
81 | /* last request time, timestamp in seconds */ | |
82 | gint64 last_request; | |
83 | /* closure queue for delayed requests */ | |
84 | GQueue *pending; | |
85 | /* cache size in Mb */ | |
86 | guint cache_size; | |
87 | gchar *previous_data; | |
88 | }; | |
89 | ||
90 | 82 | static const char *capture_dir = NULL; |
91 | 83 | |
92 | 84 | GQuark |
95 | 87 | return g_quark_from_static_string ("grl-wc-error-quark"); |
96 | 88 | } |
97 | 89 | |
98 | G_DEFINE_TYPE_WITH_PRIVATE (GrlNetWc, grl_net_wc, G_TYPE_OBJECT); | |
90 | G_DEFINE_TYPE (GrlNetWc, grl_net_wc, G_TYPE_OBJECT); | |
99 | 91 | |
100 | 92 | static void grl_net_wc_finalize (GObject *object); |
101 | 93 | static void grl_net_wc_set_property (GObject *object, |
136 | 128 | * |
137 | 129 | * The timeout in seconds between connections. All the connections will be |
138 | 130 | * queued and each one will be dispatched after waiting this value. |
131 | * | |
132 | * Note that if the grl-net library was compiled against libsoup3, changing | |
133 | * the throttling configuration will show a warning if done after the first | |
134 | * request. | |
139 | 135 | */ |
140 | 136 | g_object_class_install_property (g_klass, |
141 | 137 | PROP_THROTTLING, |
194 | 190 | { |
195 | 191 | struct request_res *rr = op; |
196 | 192 | |
193 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
194 | g_object_unref (rr->message); | |
195 | #else | |
197 | 196 | g_object_unref (rr->request); |
197 | #endif | |
198 | 198 | g_slice_free (struct request_res, rr); |
199 | 199 | } |
200 | 200 | |
201 | #if ! SOUP_CHECK_VERSION (2, 99, 2) | |
201 | 202 | /* |
202 | 203 | * use-thread-context is available for libsoup-2.4 >= 2.39.0 |
203 | 204 | * We check in run-time if it's available |
205 | 206 | static void |
206 | 207 | set_thread_context (GrlNetWc *self) |
207 | 208 | { |
208 | GrlNetWcPrivate *priv = self->priv; | |
209 | GObjectClass *klass = G_OBJECT_GET_CLASS (priv->session); | |
209 | GObjectClass *klass = G_OBJECT_GET_CLASS (self->session); | |
210 | 210 | GParamSpec *spec = g_object_class_find_property (klass, |
211 | 211 | "use-thread-context"); |
212 | 212 | if (spec) |
213 | g_object_set (priv->session, "use-thread-context", TRUE, NULL); | |
214 | } | |
213 | g_object_set (self->session, "use-thread-context", TRUE, NULL); | |
214 | } | |
215 | #endif | |
216 | ||
217 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
218 | static void | |
219 | ensure_session (GrlNetWc *self) | |
220 | { | |
221 | guint max_conns_per_host = self->throttling > 0 ? 1 : 2; | |
222 | ||
223 | if (self->session) | |
224 | return; | |
225 | ||
226 | self->session = soup_session_new_with_options ("max-conns-per-host", max_conns_per_host, | |
227 | "user-agent", self->user_agent, | |
228 | NULL); | |
229 | grl_net_wc_set_log_level (self, self->log_level); | |
230 | grl_net_wc_set_cache (self, self->use_cache); | |
231 | grl_net_wc_set_cache_size (self, self->cache_size); | |
232 | } | |
233 | #endif | |
215 | 234 | |
216 | 235 | static void |
217 | 236 | init_dump_directory (void) |
236 | 255 | cache_down (GrlNetWc *self) |
237 | 256 | { |
238 | 257 | GFile *cache_dir_file; |
239 | GrlNetWcPrivate *priv = self->priv; | |
240 | SoupSessionFeature *cache = soup_session_get_feature (priv->session, SOUP_TYPE_CACHE); | |
258 | SoupSessionFeature *cache; | |
241 | 259 | gchar *cache_dir; |
242 | 260 | |
243 | 261 | GRL_DEBUG ("cache down"); |
244 | 262 | |
263 | if (!self->session) | |
264 | return; | |
265 | ||
266 | cache = soup_session_get_feature (self->session, SOUP_TYPE_CACHE); | |
245 | 267 | if (!cache) { |
246 | 268 | return; |
247 | 269 | } |
255 | 277 | g_file_delete (cache_dir_file, NULL, NULL); |
256 | 278 | g_object_unref (G_OBJECT (cache_dir_file)); |
257 | 279 | |
258 | soup_session_remove_feature (priv->session, cache); | |
280 | soup_session_remove_feature (self->session, cache); | |
259 | 281 | } |
260 | 282 | |
261 | 283 | static void |
262 | 284 | cache_up (GrlNetWc *self) |
263 | 285 | { |
264 | 286 | SoupCache *cache; |
265 | GrlNetWcPrivate *priv = self->priv; | |
266 | 287 | gchar *dir; |
267 | 288 | |
268 | 289 | GRL_DEBUG ("cache up"); |
274 | 295 | cache = soup_cache_new (dir, SOUP_CACHE_SINGLE_USER); |
275 | 296 | g_free (dir); |
276 | 297 | |
277 | soup_session_add_feature (priv->session, | |
298 | soup_session_add_feature (self->session, | |
278 | 299 | SOUP_SESSION_FEATURE (cache)); |
279 | 300 | |
280 | if (priv->cache_size) { | |
281 | soup_cache_set_max_size (cache, priv->cache_size * 1024 * 1024); | |
301 | if (self->cache_size) { | |
302 | soup_cache_set_max_size (cache, self->cache_size * 1024 * 1024); | |
282 | 303 | } |
283 | 304 | |
284 | 305 | g_object_unref (cache); |
287 | 308 | static gboolean |
288 | 309 | cache_is_available (GrlNetWc *self) |
289 | 310 | { |
290 | return soup_session_get_feature (self->priv->session, SOUP_TYPE_CACHE) != NULL; | |
311 | return soup_session_get_feature (self->session, SOUP_TYPE_CACHE) != NULL; | |
291 | 312 | } |
292 | 313 | |
293 | 314 | static void |
299 | 320 | static void |
300 | 321 | finalize_requester (GrlNetWc *self) |
301 | 322 | { |
302 | GrlNetWcPrivate *priv = self->priv; | |
303 | ||
304 | 323 | cache_down (self); |
305 | g_free (priv->previous_data); | |
324 | g_free (self->previous_data); | |
306 | 325 | } |
307 | 326 | |
308 | 327 | static void |
310 | 329 | { |
311 | 330 | GRL_LOG_DOMAIN_INIT (wc_log_domain, "wc"); |
312 | 331 | |
313 | wc->priv = grl_net_wc_get_instance_private (wc); | |
314 | ||
315 | wc->priv->session = soup_session_async_new (); | |
316 | g_object_set (G_OBJECT (wc->priv->session), "ssl-use-system-ca-file", TRUE, NULL); | |
317 | wc->priv->pending = g_queue_new (); | |
318 | ||
332 | #if ! SOUP_CHECK_VERSION (2, 99, 2) | |
333 | wc->session = soup_session_async_new (); | |
334 | g_object_set (G_OBJECT (wc->session), "ssl-use-system-ca-file", TRUE, NULL); | |
319 | 335 | set_thread_context (wc); |
336 | #endif | |
337 | ||
338 | wc->pending = g_queue_new (); | |
339 | ||
320 | 340 | init_mock_requester (wc); |
321 | 341 | init_requester (wc); |
322 | 342 | } |
333 | 353 | finalize_requester (wc); |
334 | 354 | finalize_mock_requester (wc); |
335 | 355 | |
336 | g_queue_free (wc->priv->pending); | |
337 | g_object_unref (wc->priv->session); | |
356 | g_clear_pointer (&wc->user_agent, g_free); | |
357 | g_queue_free (wc->pending); | |
358 | g_clear_object (&wc->session); | |
338 | 359 | |
339 | 360 | G_OBJECT_CLASS (grl_net_wc_parent_class)->finalize (object); |
340 | 361 | } |
363 | 384 | grl_net_wc_set_cache_size (wc, g_value_get_uint (value)); |
364 | 385 | break; |
365 | 386 | case PROP_USER_AGENT: |
366 | g_object_set (G_OBJECT (wc->priv->session), | |
367 | "user-agent", g_value_get_string (value), | |
368 | NULL); | |
387 | g_clear_pointer (&wc->user_agent, g_free); | |
388 | wc->user_agent = g_value_dup_string (value); | |
389 | if (wc->session) { | |
390 | g_object_set (G_OBJECT (wc->session), | |
391 | "user-agent", wc->user_agent, | |
392 | NULL); | |
393 | } | |
369 | 394 | break; |
370 | 395 | default: |
371 | 396 | G_OBJECT_WARN_INVALID_PROPERTY_ID (wc, propid, pspec); |
384 | 409 | |
385 | 410 | switch (propid) { |
386 | 411 | case PROP_LOG_LEVEL: |
387 | g_value_set_uint (value, wc->priv->log_level); | |
412 | g_value_set_uint (value, wc->log_level); | |
388 | 413 | break; |
389 | 414 | case PROP_THROTTLING: |
390 | g_value_set_uint (value, wc->priv->throttling); | |
415 | g_value_set_uint (value, wc->throttling); | |
391 | 416 | break; |
392 | 417 | case PROP_CACHE: |
393 | g_value_set_boolean(value, cache_is_available (wc)); | |
418 | g_value_set_boolean(value, wc->use_cache); | |
394 | 419 | break; |
395 | 420 | case PROP_CACHE_SIZE: |
396 | g_value_set_uint (value, wc->priv->cache_size); | |
421 | g_value_set_uint (value, wc->cache_size); | |
397 | 422 | break; |
398 | 423 | case PROP_USER_AGENT: |
399 | g_object_get_property (G_OBJECT (wc->priv->session), "user_agent", value); | |
424 | g_value_set_string (value, wc->user_agent); | |
400 | 425 | break; |
401 | 426 | default: |
402 | 427 | G_OBJECT_WARN_INVALID_PROPERTY_ID (wc, propid, pspec); |
426 | 451 | static void |
427 | 452 | parse_error (guint status, |
428 | 453 | const gchar *reason, |
429 | const gchar *response, | |
430 | 454 | GSimpleAsyncResult *result) |
431 | 455 | { |
432 | if (!response || *response == '\0') | |
433 | response = reason; | |
434 | ||
435 | 456 | switch (status) { |
457 | #if ! SOUP_CHECK_VERSION (2, 99, 2) | |
436 | 458 | case SOUP_STATUS_CANT_RESOLVE: |
437 | 459 | case SOUP_STATUS_CANT_CONNECT: |
438 | 460 | case SOUP_STATUS_SSL_FAILED: |
447 | 469 | G_IO_ERROR_PROXY_FAILED, |
448 | 470 | _("Cannot connect to the proxy server")); |
449 | 471 | return; |
472 | #endif | |
450 | 473 | case SOUP_STATUS_INTERNAL_SERVER_ERROR: /* 500 */ |
474 | #if ! SOUP_CHECK_VERSION (2, 99, 2) | |
451 | 475 | case SOUP_STATUS_MALFORMED: |
476 | #endif | |
452 | 477 | case SOUP_STATUS_BAD_REQUEST: /* 400 */ |
453 | 478 | g_simple_async_result_set_error (result, GRL_NET_WC_ERROR, |
454 | 479 | GRL_NET_WC_ERROR_PROTOCOL_ERROR, |
455 | 480 | _("Invalid request URI or header: %s"), |
456 | response); | |
481 | reason); | |
457 | 482 | return; |
458 | 483 | case SOUP_STATUS_UNAUTHORIZED: /* 401 */ |
459 | 484 | case SOUP_STATUS_FORBIDDEN: /* 403 */ |
460 | 485 | g_simple_async_result_set_error (result, GRL_NET_WC_ERROR, |
461 | 486 | GRL_NET_WC_ERROR_AUTHENTICATION_REQUIRED, |
462 | _("Authentication required: %s"), response); | |
487 | _("Authentication required: %s"), reason); | |
463 | 488 | return; |
464 | 489 | case SOUP_STATUS_NOT_FOUND: /* 404 */ |
465 | 490 | g_simple_async_result_set_error (result, GRL_NET_WC_ERROR, |
466 | 491 | GRL_NET_WC_ERROR_NOT_FOUND, |
467 | 492 | _("The requested resource was not found: %s"), |
468 | response); | |
493 | reason); | |
469 | 494 | return; |
470 | 495 | case SOUP_STATUS_CONFLICT: /* 409 */ |
471 | 496 | case SOUP_STATUS_PRECONDITION_FAILED: /* 412 */ |
472 | 497 | g_simple_async_result_set_error (result, GRL_NET_WC_ERROR, |
473 | 498 | GRL_NET_WC_ERROR_CONFLICT, |
474 | 499 | _("The entry has been modified since it was downloaded: %s"), |
475 | response); | |
476 | return; | |
500 | reason); | |
501 | return; | |
502 | #if ! SOUP_CHECK_VERSION (2, 99, 2) | |
477 | 503 | case SOUP_STATUS_CANCELLED: |
478 | 504 | g_simple_async_result_set_error (result, G_IO_ERROR, |
479 | 505 | G_IO_ERROR_CANCELLED, |
480 | 506 | _("Operation was cancelled")); |
481 | 507 | return; |
508 | #endif | |
482 | 509 | default: |
483 | 510 | GRL_DEBUG ("Unhandled status: %s", soup_status_get_phrase (status)); |
484 | 511 | g_simple_async_result_set_error (result, G_IO_ERROR, |
500 | 527 | } |
501 | 528 | |
502 | 529 | static void |
503 | dump_data (SoupURI *uri, | |
530 | dump_data (const char *uri_string, | |
504 | 531 | const char *buffer, |
505 | 532 | const gsize length) |
506 | 533 | { |
507 | 534 | if (!capture_dir) |
508 | 535 | return; |
509 | ||
510 | char *uri_string = soup_uri_to_string (uri, FALSE); | |
511 | 536 | |
512 | 537 | /* Write request content to file in capture directory. */ |
513 | 538 | char *request_filename = build_request_filename (uri_string); |
541 | 566 | } |
542 | 567 | |
543 | 568 | g_free (request_filename); |
544 | g_free (uri_string); | |
545 | 569 | } |
546 | 570 | |
547 | 571 | static void |
604 | 628 | } |
605 | 629 | |
606 | 630 | { |
607 | SoupMessage *msg = | |
608 | soup_request_http_get_message (SOUP_REQUEST_HTTP (rr->request)); | |
609 | ||
610 | if (msg && msg->status_code != SOUP_STATUS_OK) { | |
611 | parse_error (msg->status_code, | |
612 | msg->reason_phrase, | |
613 | msg->response_body->data, | |
631 | g_autoptr(SoupMessage) msg = NULL; | |
632 | guint status_code; | |
633 | const char *reason_phrase; | |
634 | ||
635 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
636 | msg = g_object_ref (rr->message); | |
637 | status_code = soup_message_get_status (msg); | |
638 | reason_phrase = soup_message_get_reason_phrase (msg); | |
639 | #else | |
640 | msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (rr->request)); | |
641 | status_code = msg->status_code; | |
642 | reason_phrase = msg->reason_phrase; | |
643 | #endif | |
644 | ||
645 | if (status_code != SOUP_STATUS_OK) { | |
646 | parse_error (status_code, | |
647 | reason_phrase, | |
614 | 648 | G_SIMPLE_ASYNC_RESULT (user_data)); |
615 | g_object_unref (msg); | |
616 | 649 | } |
617 | 650 | } |
618 | 651 | |
625 | 658 | GAsyncResult *res, |
626 | 659 | gpointer user_data) |
627 | 660 | { |
661 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
662 | SoupSession *session = SOUP_SESSION (source); | |
663 | SoupMessage *message = soup_session_get_async_result_message (session, res); | |
664 | SoupMessageHeaders *response_hdrs = soup_message_get_response_headers (message); | |
665 | #endif | |
628 | 666 | GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT (user_data); |
629 | 667 | struct request_res *rr = g_simple_async_result_get_op_res_gpointer (result); |
630 | 668 | |
631 | 669 | GError *error = NULL; |
670 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
671 | GInputStream *in = soup_session_send_finish (session, res, &error); | |
672 | #else | |
632 | 673 | GInputStream *in = soup_request_send_finish (rr->request, res, &error); |
674 | #endif | |
633 | 675 | |
634 | 676 | if (error) { |
635 | 677 | if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { |
646 | 688 | return; |
647 | 689 | } |
648 | 690 | |
691 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
692 | rr->length = soup_message_headers_get_content_length (response_hdrs) + 1; | |
693 | #else | |
649 | 694 | rr->length = soup_request_get_content_length (rr->request) + 1; |
695 | #endif | |
650 | 696 | if (rr->length == 1) |
651 | 697 | rr->length = 50 * 1024; |
652 | 698 | |
668 | 714 | GAsyncResult *result, |
669 | 715 | GCancellable *cancellable) |
670 | 716 | { |
671 | GrlNetWcPrivate *priv = self->priv; | |
672 | SoupURI *uri; | |
673 | 717 | struct request_res *rr = g_slice_new0 (struct request_res); |
674 | 718 | |
675 | 719 | g_simple_async_result_set_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result), |
676 | 720 | rr, |
677 | 721 | NULL); |
678 | 722 | |
679 | uri = soup_uri_new (url); | |
680 | if (uri) { | |
681 | rr->request = soup_session_request_uri (priv->session, uri, NULL); | |
682 | soup_uri_free (uri); | |
683 | } else { | |
684 | rr->request = NULL; | |
685 | } | |
686 | ||
723 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
724 | { | |
725 | g_autoptr(GUri) uri = NULL; | |
726 | ||
727 | uri = g_uri_parse (url, SOUP_HTTP_URI_FLAGS, NULL); | |
728 | rr->message = soup_message_new_from_uri (SOUP_METHOD_GET, uri); | |
729 | } | |
730 | #else | |
731 | rr->request = soup_session_request (self->session, url, NULL); | |
732 | #endif | |
733 | ||
734 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
735 | if (!rr->message) { | |
736 | #else | |
687 | 737 | if (!rr->request) { |
738 | #endif | |
688 | 739 | g_simple_async_result_set_error (G_SIMPLE_ASYNC_RESULT (result), |
689 | 740 | G_IO_ERROR, |
690 | 741 | G_IO_ERROR_INVALID_ARGUMENT, |
696 | 747 | } |
697 | 748 | |
698 | 749 | if (headers != NULL) { |
699 | SoupMessage *message; | |
750 | g_autoptr(SoupMessage) message = NULL; | |
700 | 751 | GHashTableIter iter; |
701 | 752 | const char *key, *value; |
702 | 753 | |
754 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
755 | message = g_object_ref (rr->message); | |
756 | #else | |
703 | 757 | message = soup_request_http_get_message (SOUP_REQUEST_HTTP (rr->request)); |
758 | #endif | |
704 | 759 | |
705 | 760 | if (message) { |
706 | 761 | g_hash_table_iter_init (&iter, headers); |
707 | 762 | while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *)&value)) { |
763 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
764 | soup_message_headers_append (soup_message_get_request_headers (message), key, value); | |
765 | #else | |
708 | 766 | soup_message_headers_append (message->request_headers, key, value); |
767 | #endif | |
709 | 768 | } |
710 | g_object_unref (message); | |
711 | 769 | } |
712 | 770 | } |
713 | 771 | |
772 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
773 | soup_session_send_async (self->session, rr->message, G_PRIORITY_DEFAULT, | |
774 | cancellable, reply_cb, result); | |
775 | #else | |
714 | 776 | soup_request_send_async (rr->request, cancellable, reply_cb, result); |
777 | #endif | |
715 | 778 | } |
716 | 779 | |
717 | 780 | static gboolean |
721 | 784 | |
722 | 785 | /* validation */ |
723 | 786 | { |
724 | GrlNetWcPrivate *priv = c->self->priv; | |
725 | struct request_clos *d = g_queue_pop_tail (priv->pending); | |
787 | struct request_clos *d = g_queue_pop_tail (c->self->pending); | |
726 | 788 | g_assert (c == d); |
727 | 789 | } |
728 | 790 | |
744 | 806 | guint id; |
745 | 807 | gint64 now; |
746 | 808 | struct request_clos *c; |
747 | GrlNetWcPrivate *priv = self->priv; | |
748 | 809 | |
749 | 810 | /* closure */ |
750 | 811 | c = g_new (struct request_clos, 1); |
759 | 820 | /* If grl-net-wc is not mocked, we need to check if throttling is set |
760 | 821 | * otherwise the throttling delay check would always be true */ |
761 | 822 | if (is_mocked () |
762 | || priv->throttling == 0 | |
763 | || (now - priv->last_request) > priv->throttling) { | |
764 | priv->last_request = now; | |
823 | || self->throttling == 0 | |
824 | || (now - self->last_request) > self->throttling) { | |
825 | self->last_request = now; | |
765 | 826 | id = g_idle_add_full (G_PRIORITY_HIGH_IDLE, |
766 | 827 | get_url_cb, c, request_clos_destroy); |
767 | 828 | } else { |
768 | priv->last_request += priv->throttling; | |
829 | self->last_request += self->throttling; | |
769 | 830 | |
770 | 831 | GRL_DEBUG ("delaying web request by %" G_GINT64_FORMAT " seconds", |
771 | priv->last_request - now); | |
832 | self->last_request - now); | |
772 | 833 | id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, |
773 | priv->last_request - now, | |
834 | self->last_request - now, | |
774 | 835 | get_url_cb, c, request_clos_destroy); |
775 | 836 | } |
776 | 837 | g_source_set_name_by_id (id, "[grl-net] get_url_cb"); |
777 | 838 | |
778 | 839 | c->source_id = id; |
779 | g_queue_push_head (self->priv->pending, c); | |
840 | g_queue_push_head (self->pending, c); | |
780 | 841 | } |
781 | 842 | |
782 | 843 | static void |
785 | 846 | gchar **content, |
786 | 847 | gsize *length) |
787 | 848 | { |
788 | GrlNetWcPrivate *priv = self->priv; | |
789 | 849 | struct request_res *rr = op; |
790 | 850 | |
791 | g_clear_pointer (&priv->previous_data, g_free); | |
851 | g_clear_pointer (&self->previous_data, g_free); | |
792 | 852 | |
793 | 853 | if (is_mocked ()) { |
794 | get_content_mocked (self, op, &(priv->previous_data), length); | |
854 | get_content_mocked (self, op, &(self->previous_data), length); | |
795 | 855 | } else { |
796 | dump_data (soup_request_get_uri (rr->request), | |
856 | g_autofree char *uri = NULL; | |
857 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
858 | uri = g_uri_to_string (soup_message_get_uri (rr->message)); | |
859 | #else | |
860 | uri = soup_uri_to_string (soup_request_get_uri (rr->request), FALSE); | |
861 | #endif | |
862 | dump_data (uri, | |
797 | 863 | rr->buffer, |
798 | 864 | rr->offset); |
799 | priv->previous_data = rr->buffer; | |
865 | self->previous_data = rr->buffer; | |
800 | 866 | if (length) { |
801 | 867 | *length = rr->offset; |
802 | 868 | } |
803 | 869 | } |
804 | 870 | |
805 | 871 | if (content) |
806 | *content = self->priv->previous_data; | |
872 | *content = self->previous_data; | |
807 | 873 | else { |
808 | 874 | if (length) { |
809 | 875 | *length = 0; |
933 | 999 | { |
934 | 1000 | GSimpleAsyncResult *result; |
935 | 1001 | |
1002 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
1003 | ensure_session (self); | |
1004 | #endif | |
936 | 1005 | result = g_simple_async_result_new (G_OBJECT (self), |
937 | 1006 | callback, |
938 | 1007 | user_data, |
1009 | 1078 | g_return_if_fail (log_level <= 3); |
1010 | 1079 | g_return_if_fail (GRL_IS_NET_WC (self)); |
1011 | 1080 | |
1012 | if (self->priv->log_level == log_level) | |
1013 | return; | |
1014 | ||
1015 | soup_session_remove_feature_by_type (self->priv->session, SOUP_TYPE_LOGGER); | |
1016 | ||
1081 | self->log_level = log_level; | |
1082 | if (!self->session) | |
1083 | return; | |
1084 | ||
1085 | soup_session_remove_feature_by_type (self->session, SOUP_TYPE_LOGGER); | |
1086 | ||
1087 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
1088 | logger = soup_logger_new ((SoupLoggerLogLevel) log_level); | |
1089 | #else | |
1017 | 1090 | logger = soup_logger_new ((SoupLoggerLogLevel) log_level, -1); |
1018 | soup_session_add_feature (self->priv->session, SOUP_SESSION_FEATURE (logger)); | |
1091 | #endif | |
1092 | soup_session_add_feature (self->session, SOUP_SESSION_FEATURE (logger)); | |
1019 | 1093 | g_object_unref (logger); |
1020 | 1094 | |
1021 | self->priv->log_level = (SoupLoggerLogLevel) log_level; | |
1095 | self->log_level = (SoupLoggerLogLevel) log_level; | |
1022 | 1096 | } |
1023 | 1097 | |
1024 | 1098 | /** |
1028 | 1102 | * |
1029 | 1103 | * Setting this property, the #GrlNetWc will queue all the requests and |
1030 | 1104 | * will dispatch them with a pause between them of this value. |
1105 | * | |
1106 | * Note that if the grl-net library was compiled against libsoup3, changing | |
1107 | * the throttling configuration will show a warning if done after the first | |
1108 | * request. | |
1031 | 1109 | */ |
1032 | 1110 | void |
1033 | 1111 | grl_net_wc_set_throttling (GrlNetWc *self, |
1035 | 1113 | { |
1036 | 1114 | g_return_if_fail (GRL_IS_NET_WC (self)); |
1037 | 1115 | |
1116 | self->throttling = throttling; | |
1117 | if (!self->session) | |
1118 | return; | |
1119 | ||
1120 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
1121 | if (self->session) { | |
1122 | g_warning ("\"throttling\" can only be set before the first request is made."); | |
1123 | return; | |
1124 | } | |
1125 | #endif | |
1126 | ||
1038 | 1127 | if (throttling > 0) { |
1039 | 1128 | /* max conns per host = 1 */ |
1040 | g_object_set (self->priv->session, | |
1041 | SOUP_SESSION_MAX_CONNS_PER_HOST, 1, NULL); | |
1129 | g_object_set (self->session, | |
1130 | "max-conns-per-host", 1, NULL); | |
1042 | 1131 | } else { |
1043 | 1132 | /* default value */ |
1044 | g_object_set (self->priv->session, | |
1045 | SOUP_SESSION_MAX_CONNS_PER_HOST, 2, NULL); | |
1046 | } | |
1047 | ||
1048 | self->priv->throttling = throttling; | |
1133 | g_object_set (self->session, | |
1134 | "max-conns-per-host", 2, NULL); | |
1135 | } | |
1049 | 1136 | } |
1050 | 1137 | |
1051 | 1138 | /** |
1065 | 1152 | { |
1066 | 1153 | g_return_if_fail (GRL_IS_NET_WC (self)); |
1067 | 1154 | |
1155 | self->use_cache = use_cache; | |
1156 | if (!self->session) | |
1157 | return; | |
1158 | ||
1068 | 1159 | if (use_cache && !cache_is_available (self)) |
1069 | 1160 | cache_up (self); |
1070 | 1161 | else if (!use_cache && cache_is_available (self)) |
1087 | 1178 | { |
1088 | 1179 | g_return_if_fail (GRL_IS_NET_WC (self)); |
1089 | 1180 | |
1090 | if (self->priv->cache_size == size) | |
1091 | return; | |
1092 | ||
1093 | self->priv->cache_size = size; | |
1094 | ||
1095 | SoupSessionFeature *cache = soup_session_get_feature (self->priv->session, SOUP_TYPE_CACHE); | |
1181 | self->cache_size = size; | |
1182 | if (!self->session) | |
1183 | return; | |
1184 | ||
1185 | SoupSessionFeature *cache = soup_session_get_feature (self->session, SOUP_TYPE_CACHE); | |
1096 | 1186 | if (!cache) |
1097 | 1187 | return; |
1098 | 1188 | |
1108 | 1198 | void |
1109 | 1199 | grl_net_wc_flush_delayed_requests (GrlNetWc *self) |
1110 | 1200 | { |
1111 | GrlNetWcPrivate *priv = self->priv; | |
1112 | 1201 | struct request_clos *c; |
1113 | 1202 | |
1114 | 1203 | g_return_if_fail (GRL_IS_NET_WC (self)); |
1115 | 1204 | |
1116 | while ((c = g_queue_pop_head (priv->pending))) { | |
1205 | while ((c = g_queue_pop_head (self->pending))) { | |
1117 | 1206 | if (c->cancellable) |
1118 | 1207 | g_cancellable_cancel (c->cancellable); |
1119 | 1208 | /* This will call the destroy notify, request_clos_destroy() */ |
1120 | 1209 | g_source_remove (c->source_id); |
1121 | 1210 | } |
1122 | 1211 | |
1123 | priv->last_request = g_get_real_time() / G_USEC_PER_SEC; | |
1124 | } | |
1212 | self->last_request = g_get_real_time() / G_USEC_PER_SEC; | |
1213 | } |
88 | 88 | G_DEFINE_AUTOPTR_CLEANUP_FUNC (GrlNetWc, g_object_unref) |
89 | 89 | |
90 | 90 | /** |
91 | * GrlNetWc: | |
92 | * @parent: the parent object struct | |
93 | */ | |
94 | struct _GrlNetWc | |
95 | { | |
96 | GObject parent; | |
97 | ||
98 | /*< private >*/ | |
99 | GrlNetWcPrivate *priv; | |
100 | }; | |
101 | ||
102 | /** | |
103 | 91 | * GrlNetWcClass: |
104 | 92 | * @parent_class: the parent class structure |
105 | 93 | * |
55 | 55 | 'datadir=${datarootdir}', |
56 | 56 | 'girdir=' + girdir_for_pc_file, |
57 | 57 | 'typelibdir=' + typelibdir_for_pc_file, |
58 | 'soupapiversion=' + soup_api_version, | |
58 | 59 | ], |
59 | 60 | ) |
60 | 61 | |
66 | 67 | identifier_prefix: 'GrlNet', |
67 | 68 | symbol_prefix: 'grl_net', |
68 | 69 | dependencies: [ gobject_dep, gio_dep, libsoup_dep ], |
69 | includes: [ 'GObject-2.0', 'Gio-2.0', 'Soup-2.4' ], | |
70 | includes: [ 'GObject-2.0', 'Gio-2.0', 'Soup-' + soup_api_version ], | |
70 | 71 | include_directories: libs_inc, |
71 | 72 | install: true, |
72 | 73 | extra_args: [ '--c-include=net/grl-net.h' ]) |
5 | 5 | # Copyright (C) 2016 Igalia S.L. All rights reserved. |
6 | 6 | |
7 | 7 | project('grilo', 'c', |
8 | version: '0.3.14', | |
8 | version: '0.3.15', | |
9 | 9 | default_options: [ |
10 | 10 | 'buildtype=debugoptimized', |
11 | 11 | 'c_std=gnu99', |
12 | 12 | 'warning_level=1' |
13 | 13 | ], |
14 | 14 | license: 'LGPL-2.1-or-later', |
15 | meson_version: '>= 0.46.0') | |
15 | meson_version: '>= 0.47.0') | |
16 | 16 | |
17 | 17 | grilo_version = meson.project_version() |
18 | 18 | grlnet_version = meson.project_version() |
36 | 36 | grl_majorminor = '@0@.@1@'.format(version_array[0], version_array[1]) |
37 | 37 | grl_name = '@0@-@1@'.format(meson.project_name(), grl_majorminor) |
38 | 38 | |
39 | glib2_required = '2.58' | |
39 | glib2_required = '2.66' | |
40 | 40 | glib2_required_info = '>= @0@'.format(glib2_required) |
41 | 41 | |
42 | 42 | gio_dep = dependency('gio-2.0', version: glib2_required_info, required: true) |
47 | 47 | |
48 | 48 | enable_grlnet = get_option('enable-grl-net') |
49 | 49 | if enable_grlnet |
50 | libsoup_dep = dependency('libsoup-2.4', version: '>= 2.41.3', required: true) | |
50 | if get_option('soup3') | |
51 | libsoup_dep = dependency('libsoup-3.0', version: '>= 2.99.2', required: true) | |
52 | soup_api_version = '3.0' | |
53 | else | |
54 | libsoup_dep = dependency('libsoup-2.4', version: '>= 2.41.3', required: true) | |
55 | soup_api_version = '2.4' | |
56 | endif | |
51 | 57 | endif |
52 | 58 | |
53 | 59 | enable_grlpls = get_option('enable-grl-pls') |
3 | 3 | option('enable-introspection', type: 'boolean', value: true, description: 'Enable GObject Introspection') |
4 | 4 | option('enable-test-ui', type: 'boolean', value: true, description: 'Build Test UI') |
5 | 5 | option('enable-vala', type: 'boolean', value: true, description: 'Enable Vala (enables GObject Introspection)') |
6 | option('soup3', type: 'boolean', value: true, description: 'Whether to use libsoup3') |
0 | ab | |
0 | 1 | as |
1 | 2 | be |
2 | 3 | bg |
11 | 12 | eo |
12 | 13 | es |
13 | 14 | eu |
15 | fa | |
14 | 16 | fi |
15 | 17 | fr |
16 | 18 | fur |
21 | 23 | id |
22 | 24 | it |
23 | 25 | ja |
26 | ka | |
24 | 27 | ko |
25 | 28 | lt |
26 | 29 | lv |
0 | # Abkhazian translation for grilo. | |
1 | # Copyright (C) 2022 grilo's COPYRIGHT HOLDER | |
2 | # This file is distributed under the same license as the grilo package. | |
3 | # Нанба Наала <naala-nanba@rambler.ru>, 2022. | |
4 | # | |
5 | msgid "" | |
6 | msgstr "" | |
7 | "Project-Id-Version: grilo master\n" | |
8 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n" | |
9 | "POT-Creation-Date: 2021-11-16 23:26+0000\n" | |
10 | "PO-Revision-Date: 2021-11-16 23:26+0000\n" | |
11 | "Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n" | |
12 | "Language-Team: Abkhazian <ab@li.org>\n" | |
13 | "Language: ab\n" | |
14 | "MIME-Version: 1.0\n" | |
15 | "Content-Type: text/plain; charset=UTF-8\n" | |
16 | "Content-Transfer-Encoding: 8bit\n" | |
17 | ||
18 | #: libs/net/grl-net-mock.c:86 | |
19 | msgid "No mock definition found" | |
20 | msgstr "Арыԥҵә ахҳәаа ԥшааӡам" | |
21 | ||
22 | #: libs/net/grl-net-mock.c:98 | |
23 | #, c-format | |
24 | msgid "Could not find mock content %s" | |
25 | msgstr "Арыԥҵә %s аҵакы аԥшаара залымшахеит" | |
26 | ||
27 | #: libs/net/grl-net-mock.c:116 | |
28 | #, c-format | |
29 | msgid "Could not access mock content: %s" | |
30 | msgstr "Арыԥҵә аҵакы ахь анеира залыршахом: %s " | |
31 | ||
32 | #: libs/net/grl-net-wc.c:443 | |
33 | msgid "Cannot connect to the server" | |
34 | msgstr "Асервер аҿакра залыршахом" | |
35 | ||
36 | #: libs/net/grl-net-wc.c:449 | |
37 | msgid "Cannot connect to the proxy server" | |
38 | msgstr "Апрокси-сервер аҿакра залыршахом" | |
39 | ||
40 | #: libs/net/grl-net-wc.c:456 | |
41 | #, c-format | |
42 | msgid "Invalid request URI or header: %s" | |
43 | msgstr "Ииашам URI, мамзар адҵаалара ахы : %s" | |
44 | ||
45 | #: libs/net/grl-net-wc.c:463 | |
46 | #, c-format | |
47 | msgid "Authentication required: %s" | |
48 | msgstr "Иаҭахуп ахаҭара шьақәыргылара: %s" | |
49 | ||
50 | #: libs/net/grl-net-wc.c:468 | |
51 | #, c-format | |
52 | msgid "The requested resource was not found: %s" | |
53 | msgstr "Адҵаалара ззыҟаҵоу алшарақәа ԥшааӡам: %s" | |
54 | ||
55 | #: libs/net/grl-net-wc.c:475 | |
56 | #, c-format | |
57 | msgid "The entry has been modified since it was downloaded: %s" | |
58 | msgstr "Анҵамҭа ԥсахын ианҭагалаз нахыс : %s" | |
59 | ||
60 | #: libs/net/grl-net-wc.c:481 libs/net/grl-net-wc.c:593 libs/pls/grl-pls.c:493 | |
61 | #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068 | |
62 | #: src/grl-source.c:2325 src/grl-source.c:2446 | |
63 | #, c-format | |
64 | msgid "Operation was cancelled" | |
65 | msgstr "Аоперациа аԥыхоуп" | |
66 | ||
67 | #: libs/net/grl-net-wc.c:597 libs/net/grl-net-wc.c:641 | |
68 | msgid "Data not available" | |
69 | msgstr "Адыррқәа рахь анеира залыршахом" | |
70 | ||
71 | #: libs/net/grl-net-wc.c:692 | |
72 | #, c-format | |
73 | msgid "Invalid URL %s" | |
74 | msgstr "Ииашам URL %s" | |
75 | ||
76 | #: src/grilo.c:218 | |
77 | msgid "Semicolon-separated paths containing Grilo plugins" | |
78 | msgstr "Амҩақәа, Grilo амодульқәа змоу, иеиҟәшоу акәаԥи аҿарҵәи рыла " | |
79 | ||
80 | #: src/grilo.c:220 | |
81 | msgid "Colon-separated paths containing Grilo plugins" | |
82 | msgstr "Амҩақәа, Grilo амодульқәа змоу, ҩ-кәаԥк рыла иеиҟәшоу" | |
83 | ||
84 | #: src/grilo.c:223 | |
85 | msgid "Colon-separated list of Grilo plugins to use" | |
86 | msgstr "Ахархәара зызу амодульқәа Grilo рыхьӡынҵа, ҩ-кәаԥк иеиҟәшагас измоу" | |
87 | ||
88 | #: src/grilo.c:228 | |
89 | msgid "Grilo Options" | |
90 | msgstr "Grilo ахышәарақәа" | |
91 | ||
92 | #: src/grilo.c:229 | |
93 | msgid "Show Grilo Options" | |
94 | msgstr "Grilo ахышәарақәа рырбара" | |
95 | ||
96 | #: src/grl-multiple.c:134 | |
97 | #, c-format | |
98 | msgid "No searchable sources available" | |
99 | msgstr "Аԥшааразы анеиразин змоу ахыҵхырҭақәа ыҟаӡам" | |
100 | ||
101 | #: src/grl-multiple.c:511 | |
102 | #, c-format | |
103 | msgid "Could not resolve media for URI “%s”" | |
104 | msgstr " URI \"%s\" азы аныҟәгага аилкаара залыршахом" | |
105 | ||
106 | #: src/grl-registry.c:499 src/grl-registry.c:1538 | |
107 | #, c-format | |
108 | msgid "Plugin “%s” is already loaded" | |
109 | msgstr " Амодуль «%s» шьҭа иҭагалоуп" | |
110 | ||
111 | #: src/grl-registry.c:523 | |
112 | #, c-format | |
113 | msgid "Failed to initialize plugin from %s" | |
114 | msgstr "%s аҟынтә амодуль аҭагылазаашьа арбара залымшахеит" | |
115 | ||
116 | #: src/grl-registry.c:565 | |
117 | #, c-format | |
118 | msgid "Metadata key “%s” already registered in different format" | |
119 | msgstr "Аметадыррақәа рцыԥха «%s» даҽа форматк аманы иҭагалоуп" | |
120 | ||
121 | #: src/grl-registry.c:578 | |
122 | #, c-format | |
123 | msgid "Metadata key “%s” cannot be registered" | |
124 | msgstr "Аметадыррақәа рцыԥха «%s» аҭагалара залыршахом" | |
125 | ||
126 | #: src/grl-registry.c:1144 | |
127 | #, c-format | |
128 | msgid "Source with id “%s” was not found" | |
129 | msgstr "Ахыҵхырҭа аиԥшрагәаҭара «%s» змоу ԥшааӡам" | |
130 | ||
131 | #: src/grl-registry.c:1218 | |
132 | #, c-format | |
133 | msgid "Failed to load plugin from %s" | |
134 | msgstr "Амодуль %s аҟынтә аҭагалараан иҟалеит агха" | |
135 | ||
136 | #: src/grl-registry.c:1227 | |
137 | #, c-format | |
138 | msgid "Invalid plugin file %s" | |
139 | msgstr "амодуль «%s» афаил иашам " | |
140 | ||
141 | #: src/grl-registry.c:1238 | |
142 | #, c-format | |
143 | msgid "“%s” is not a valid plugin file" | |
144 | msgstr "«%s» ииашоу афаил амодуль акәӡам" | |
145 | ||
146 | #: src/grl-registry.c:1257 | |
147 | #, c-format | |
148 | msgid "Plugin “%s” already exists" | |
149 | msgstr "Амодуль «%s» шьҭа иҟоуп" | |
150 | ||
151 | #: src/grl-registry.c:1420 | |
152 | #, c-format | |
153 | msgid "Invalid path %s" | |
154 | msgstr "Иақәнагам амҩа %s" | |
155 | ||
156 | #: src/grl-registry.c:1487 | |
157 | #, c-format | |
158 | msgid "All configured plugin paths are invalid" | |
159 | msgstr "Амодульқәа рконфигурациатәра амҩақәа зегьы иашаӡам" | |
160 | ||
161 | #: src/grl-registry.c:1527 | |
162 | #, c-format | |
163 | msgid "Plugin “%s” not available" | |
164 | msgstr " Амодуль : «%s» ахь анеира залыршахом" | |
165 | ||
166 | #: src/grl-registry.c:1755 | |
167 | #, c-format | |
168 | msgid "Plugin not found: “%s”" | |
169 | msgstr "Амодуль ԥшааӡам :«%s»" | |
170 | ||
171 | #: src/grl-registry.c:2066 | |
172 | #, c-format | |
173 | msgid "Plugin configuration does not contain “plugin-id” reference" | |
174 | msgstr "Амодульқәа рконфигурациатәра иамаӡам ахцәажәара «plugin-id»" | |
175 | ||
176 | #: src/grl-source.c:2775 | |
177 | #, c-format | |
178 | msgid "Some keys could not be written" | |
179 | msgstr "Цыԥхақәак рынҵара залыршахом" | |
180 | ||
181 | #: src/grl-source.c:2848 | |
182 | #, c-format | |
183 | msgid "None of the specified keys are writable" | |
184 | msgstr "Иарбоу ацаԥхақәа рыбжьара иҟаӡам ианҵатәқәоу" | |
185 | ||
186 | #: src/grl-source.c:4191 | |
187 | #, c-format | |
188 | msgid "Media has no “id”, cannot remove" | |
189 | msgstr "Аныҟәгага иамаӡам «id», уи аныхра залыршахаӡом" |
0 | 0 | # Bulgarian translation of grilo po-file. |
1 | 1 | # Copyright (C) 2016 Free Software Foundation, Inc. |
2 | # Copyright (C) 2022 Alexander Shopov. | |
2 | 3 | # This file is distributed under the same license as the grilo package. |
3 | # Alexander Shopov <ash@kambanaria.org>, 2016. | |
4 | # Alexander Shopov <ash@kambanaria.org>, 2016, 2022. | |
4 | 5 | # |
5 | 6 | msgid "" |
6 | 7 | msgstr "" |
7 | 8 | "Project-Id-Version: grilo master\n" |
8 | "Report-Msgid-Bugs-To: \n" | |
9 | "POT-Creation-Date: 2016-09-25 16:09+0300\n" | |
10 | "PO-Revision-Date: 2016-09-25 15:41+0300\n" | |
9 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n" | |
10 | "POT-Creation-Date: 2022-02-17 20:10+0000\n" | |
11 | "PO-Revision-Date: 2022-03-22 18:20+0100\n" | |
11 | 12 | "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" |
12 | 13 | "Language-Team: Bulgarian <dict@fsa-bg.org>\n" |
13 | 14 | "Language: bg\n" |
16 | 17 | "Content-Transfer-Encoding: 8bit\n" |
17 | 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
18 | 19 | |
19 | #: ../libs/net/grl-net-mock.c:86 | |
20 | #: libs/net/grl-net-mock.c:86 | |
20 | 21 | msgid "No mock definition found" |
21 | 22 | msgstr "Няма дефиниция на имитиращ обект" |
22 | 23 | |
23 | #: ../libs/net/grl-net-mock.c:98 | |
24 | #: libs/net/grl-net-mock.c:98 | |
24 | 25 | #, c-format |
25 | 26 | msgid "Could not find mock content %s" |
26 | 27 | msgstr "Имитиращият обект е без съдържание: %s" |
27 | 28 | |
28 | #: ../libs/net/grl-net-mock.c:116 | |
29 | #: libs/net/grl-net-mock.c:116 | |
29 | 30 | #, c-format |
30 | 31 | msgid "Could not access mock content: %s" |
31 | 32 | msgstr "Имитиращото съдържание е недостъпно: %s" |
32 | 33 | |
33 | #: ../libs/net/grl-net-wc.c:449 | |
34 | #: libs/net/grl-net-wc.c:443 | |
34 | 35 | msgid "Cannot connect to the server" |
35 | 36 | msgstr "Неуспешна връзка към сървъра" |
36 | 37 | |
37 | #: ../libs/net/grl-net-wc.c:455 | |
38 | #: libs/net/grl-net-wc.c:449 | |
38 | 39 | msgid "Cannot connect to the proxy server" |
39 | 40 | msgstr "Неуспешна връзка към сървъра-посредник" |
40 | 41 | |
41 | #: ../libs/net/grl-net-wc.c:462 | |
42 | #: libs/net/grl-net-wc.c:456 | |
42 | 43 | #, c-format |
43 | 44 | msgid "Invalid request URI or header: %s" |
44 | 45 | msgstr "Неправилен адрес или заглавна част на заявката: %s" |
45 | 46 | |
46 | #: ../libs/net/grl-net-wc.c:469 | |
47 | #: libs/net/grl-net-wc.c:463 | |
47 | 48 | #, c-format |
48 | 49 | msgid "Authentication required: %s" |
49 | 50 | msgstr "Задължително е да се идентифицирате: %s" |
50 | 51 | |
51 | #: ../libs/net/grl-net-wc.c:474 | |
52 | #: libs/net/grl-net-wc.c:468 | |
52 | 53 | #, c-format |
53 | 54 | msgid "The requested resource was not found: %s" |
54 | 55 | msgstr "Заявеният ресурс не е открит: %s" |
55 | 56 | |
56 | #: ../libs/net/grl-net-wc.c:481 | |
57 | #: libs/net/grl-net-wc.c:475 | |
57 | 58 | #, c-format |
58 | 59 | msgid "The entry has been modified since it was downloaded: %s" |
59 | 60 | msgstr "Обектът е променен след изтеглянето му: %s" |
60 | 61 | |
61 | #: ../libs/net/grl-net-wc.c:487 ../libs/net/grl-net-wc.c:596 | |
62 | #: ../libs/pls/grl-pls.c:490 ../src/grl-source.c:1828 ../src/grl-source.c:1928 | |
63 | #: ../src/grl-source.c:2075 ../src/grl-source.c:2332 ../src/grl-source.c:2453 | |
62 | #: libs/net/grl-net-wc.c:481 libs/net/grl-net-wc.c:593 libs/pls/grl-pls.c:493 | |
63 | #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068 | |
64 | #: src/grl-source.c:2325 src/grl-source.c:2446 | |
64 | 65 | #, c-format |
65 | 66 | msgid "Operation was cancelled" |
66 | 67 | msgstr "Действието е отменено" |
67 | 68 | |
68 | #: ../libs/net/grl-net-wc.c:490 | |
69 | #, c-format | |
70 | msgid "Unhandled status: %s" | |
71 | msgstr "Необработено състояние: %s" | |
72 | ||
73 | #: ../libs/net/grl-net-wc.c:600 ../libs/net/grl-net-wc.c:644 | |
69 | #: libs/net/grl-net-wc.c:597 libs/net/grl-net-wc.c:641 | |
74 | 70 | msgid "Data not available" |
75 | 71 | msgstr "Няма данни" |
76 | 72 | |
77 | #: ../libs/net/grl-net-wc.c:695 | |
73 | #: libs/net/grl-net-wc.c:692 | |
78 | 74 | #, c-format |
79 | 75 | msgid "Invalid URL %s" |
80 | 76 | msgstr "Неправилен адрес: %s" |
81 | 77 | |
82 | #: ../src/grilo.c:218 | |
78 | #: src/grilo.c:218 | |
83 | 79 | msgid "Semicolon-separated paths containing Grilo plugins" |
84 | 80 | msgstr "Пътища, разделени с „;“, с приставки на Grilo" |
85 | 81 | |
86 | #: ../src/grilo.c:220 | |
82 | #: src/grilo.c:220 | |
87 | 83 | msgid "Colon-separated paths containing Grilo plugins" |
88 | 84 | msgstr "Пътища, разделени с „:“, с приставки на Grilo" |
89 | 85 | |
90 | #: ../src/grilo.c:223 | |
86 | #: src/grilo.c:223 | |
91 | 87 | msgid "Colon-separated list of Grilo plugins to use" |
92 | 88 | msgstr "Пътища, разделени с „:“, с приставки на Grilo за ползване" |
93 | 89 | |
94 | #: ../src/grilo.c:228 | |
90 | #: src/grilo.c:228 | |
95 | 91 | msgid "Grilo Options" |
96 | 92 | msgstr "Опции на Grilo" |
97 | 93 | |
98 | #: ../src/grilo.c:229 | |
94 | #: src/grilo.c:229 | |
99 | 95 | msgid "Show Grilo Options" |
100 | 96 | msgstr "Извеждане на опциите на Grilo" |
101 | 97 | |
102 | #: ../src/grl-multiple.c:134 | |
98 | #: src/grl-multiple.c:134 | |
103 | 99 | #, c-format |
104 | 100 | msgid "No searchable sources available" |
105 | 101 | msgstr "Няма източници, поддържащи търсене" |
106 | 102 | |
107 | #: ../src/grl-multiple.c:511 | |
103 | #: src/grl-multiple.c:511 | |
108 | 104 | #, c-format |
109 | msgid "Could not resolve media for URI '%s'" | |
105 | msgid "Could not resolve media for URI “%s”" | |
110 | 106 | msgstr "На адреса „%s“ не може да бъде открита медия" |
111 | 107 | |
112 | #: ../src/grl-registry.c:464 ../src/grl-registry.c:1377 | |
108 | #: src/grl-registry.c:499 src/grl-registry.c:1538 | |
113 | 109 | #, c-format |
114 | msgid "Plugin '%s' is already loaded" | |
110 | msgid "Plugin “%s” is already loaded" | |
115 | 111 | msgstr "Приставката „%s“ вече е заредена" |
116 | 112 | |
117 | #: ../src/grl-registry.c:488 | |
113 | #: src/grl-registry.c:523 | |
118 | 114 | #, c-format |
119 | 115 | msgid "Failed to initialize plugin from %s" |
120 | 116 | msgstr "Приставката в „%s“ не може да се инициализира" |
121 | 117 | |
122 | #: ../src/grl-registry.c:530 | |
118 | #: src/grl-registry.c:565 | |
123 | 119 | #, c-format |
124 | msgid "Metadata key '%s' already registered in different format" | |
120 | msgid "Metadata key “%s” already registered in different format" | |
125 | 121 | msgstr "Ключът за метаданни „%s“ вече е регистриран с различен формат" |
126 | 122 | |
127 | #: ../src/grl-registry.c:543 | |
123 | #: src/grl-registry.c:578 | |
128 | 124 | #, c-format |
129 | msgid "Metadata key '%s' cannot be registered" | |
125 | msgid "Metadata key “%s” cannot be registered" | |
130 | 126 | msgstr "Ключът за метаданни „%s“ не може да бъде регистриран" |
131 | 127 | |
132 | #: ../src/grl-registry.c:983 | |
128 | #: src/grl-registry.c:1144 | |
133 | 129 | #, c-format |
134 | msgid "Source with id '%s' was not found" | |
130 | msgid "Source with id “%s” was not found" | |
135 | 131 | msgstr "Източник с идентификатор „%s“ липсва" |
136 | 132 | |
137 | #: ../src/grl-registry.c:1057 | |
133 | #: src/grl-registry.c:1218 | |
138 | 134 | #, c-format |
139 | 135 | msgid "Failed to load plugin from %s" |
140 | 136 | msgstr "Приставката в „%s“ не може да се зареди" |
141 | 137 | |
142 | #: ../src/grl-registry.c:1066 | |
138 | #: src/grl-registry.c:1227 | |
143 | 139 | #, c-format |
144 | 140 | msgid "Invalid plugin file %s" |
145 | 141 | msgstr "Неправилен файл за приставка „%s“" |
146 | 142 | |
147 | #: ../src/grl-registry.c:1077 | |
143 | #: src/grl-registry.c:1238 | |
148 | 144 | #, c-format |
149 | msgid "'%s' is not a valid plugin file" | |
145 | msgid "“%s” is not a valid plugin file" | |
150 | 146 | msgstr "„%s“ не е файл за приставка" |
151 | 147 | |
152 | #: ../src/grl-registry.c:1096 | |
148 | #: src/grl-registry.c:1257 | |
153 | 149 | #, c-format |
154 | msgid "Plugin '%s' already exists" | |
155 | msgstr "Приставката в „%s“ вече съществува" | |
150 | msgid "Plugin “%s” already exists" | |
151 | msgstr "Приставката „%s“ вече съществува" | |
156 | 152 | |
157 | #: ../src/grl-registry.c:1259 | |
153 | #: src/grl-registry.c:1420 | |
158 | 154 | #, c-format |
159 | 155 | msgid "Invalid path %s" |
160 | 156 | msgstr "Неправилен път: „%s“" |
161 | 157 | |
162 | #: ../src/grl-registry.c:1326 | |
158 | #: src/grl-registry.c:1487 | |
163 | 159 | #, c-format |
164 | 160 | msgid "All configured plugin paths are invalid" |
165 | 161 | msgstr "Всички настроени пътища за приставки са грешни" |
166 | 162 | |
167 | #: ../src/grl-registry.c:1366 | |
163 | #: src/grl-registry.c:1527 | |
168 | 164 | #, c-format |
169 | msgid "Plugin '%s' not available" | |
165 | msgid "Plugin “%s” not available" | |
170 | 166 | msgstr "Приставката „%s“ липсва" |
171 | 167 | |
172 | #: ../src/grl-registry.c:1594 | |
168 | #: src/grl-registry.c:1755 | |
173 | 169 | #, c-format |
174 | msgid "Plugin not found: '%s'" | |
170 | msgid "Plugin not found: “%s”" | |
175 | 171 | msgstr "Приставката „%s“ липсва" |
176 | 172 | |
177 | #: ../src/grl-registry.c:1905 | |
173 | #: src/grl-registry.c:2066 | |
178 | 174 | #, c-format |
179 | msgid "Plugin configuration does not contain 'plugin-id' reference" | |
175 | msgid "Plugin configuration does not contain “plugin-id” reference" | |
180 | 176 | msgstr "Настройките за приставка не съдържат указател към „plugin-id“" |
181 | 177 | |
182 | #: ../src/grl-source.c:2782 | |
178 | #: src/grl-source.c:2775 | |
183 | 179 | #, c-format |
184 | 180 | msgid "Some keys could not be written" |
185 | msgstr "Някои ключове не могат да се запишат" | |
181 | msgstr "Някои ключове не може да се запишат" | |
186 | 182 | |
187 | #: ../src/grl-source.c:2855 | |
183 | #: src/grl-source.c:2848 | |
188 | 184 | #, c-format |
189 | 185 | msgid "None of the specified keys are writable" |
190 | 186 | msgstr "В никой от посочените ключове не може да се пише" |
191 | 187 | |
192 | #: ../src/grl-source.c:4198 | |
188 | #: src/grl-source.c:4191 | |
193 | 189 | #, c-format |
194 | msgid "Media has no 'id', cannot remove" | |
190 | msgid "Media has no “id”, cannot remove" | |
195 | 191 | msgstr "Медията е без идентификатор и не може да бъде премахната" |
0 | # Persian translation for grilo. | |
1 | # Copyright (C) 2022 grilo's COPYRIGHT HOLDER | |
2 | # This file is distributed under the same license as the grilo package. | |
3 | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | |
4 | # Ahmad Haghighi <haghighi.ahmad@gmail.com>, 2022. | |
5 | # | |
6 | msgid "" | |
7 | msgstr "" | |
8 | "Project-Id-Version: grilo master\n" | |
9 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n" | |
10 | "POT-Creation-Date: 2022-07-05 17:33+0000\n" | |
11 | "PO-Revision-Date: 2022-08-09 13:36+0430\n" | |
12 | "Last-Translator: Ahmad Haghighi <haghighi.ahmad@gmail.com>\n" | |
13 | "Language-Team: Persian <haghighi.ahmad@gmail.com>\n" | |
14 | "Language: fa\n" | |
15 | "MIME-Version: 1.0\n" | |
16 | "Content-Type: text/plain; charset=UTF-8\n" | |
17 | "Content-Transfer-Encoding: 8bit\n" | |
18 | "X-DL-Team: fa\n" | |
19 | "X-DL-Module: grilo\n" | |
20 | "X-DL-Branch: master\n" | |
21 | "X-DL-Domain: po\n" | |
22 | "X-DL-State: Translating\n" | |
23 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
24 | "X-Generator: Gtranslator 40.0\n" | |
25 | ||
26 | #: libs/net/grl-net-mock.c:92 | |
27 | msgid "No mock definition found" | |
28 | msgstr "هیچ تعریف ساختگی یافت نشد" | |
29 | ||
30 | #: libs/net/grl-net-mock.c:104 | |
31 | #, c-format | |
32 | msgid "Could not find mock content %s" | |
33 | msgstr "محتوای ساختگی %s یافت نشد" | |
34 | ||
35 | #: libs/net/grl-net-mock.c:122 | |
36 | #, c-format | |
37 | msgid "Could not access mock content: %s" | |
38 | msgstr "دسترسی به محتوای ساختگی مقدور نیست: %s" | |
39 | ||
40 | #: libs/net/grl-net-wc.c:461 | |
41 | msgid "Cannot connect to the server" | |
42 | msgstr "نمیتوان به کارساز وصل شد" | |
43 | ||
44 | #: libs/net/grl-net-wc.c:467 | |
45 | msgid "Cannot connect to the proxy server" | |
46 | msgstr "نمیتوان به کارساز پیشکار وصل شد" | |
47 | ||
48 | #: libs/net/grl-net-wc.c:477 | |
49 | #, c-format | |
50 | msgid "Invalid request URI or header: %s" | |
51 | msgstr "نشانی اینترنتی یا سرایند درخواست شدهٔ نامعتبر: %s" | |
52 | ||
53 | #: libs/net/grl-net-wc.c:484 | |
54 | #, c-format | |
55 | msgid "Authentication required: %s" | |
56 | msgstr "احراز هویت نیاز است: %s" | |
57 | ||
58 | #: libs/net/grl-net-wc.c:489 | |
59 | #, c-format | |
60 | msgid "The requested resource was not found: %s" | |
61 | msgstr "منبع درخواست شده یافت نشد: %s" | |
62 | ||
63 | #: libs/net/grl-net-wc.c:496 | |
64 | #, c-format | |
65 | msgid "The entry has been modified since it was downloaded: %s" | |
66 | msgstr "مدخل از زمانی که بارگیری شده تغییر یافته است: %s" | |
67 | ||
68 | #: libs/net/grl-net-wc.c:503 libs/net/grl-net-wc.c:613 libs/pls/grl-pls.c:493 | |
69 | #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068 | |
70 | #: src/grl-source.c:2325 src/grl-source.c:2446 | |
71 | #, c-format | |
72 | msgid "Operation was cancelled" | |
73 | msgstr "عملیات لغو شد" | |
74 | ||
75 | #: libs/net/grl-net-wc.c:617 libs/net/grl-net-wc.c:679 | |
76 | msgid "Data not available" | |
77 | msgstr "داده در دسترس نیست" | |
78 | ||
79 | #: libs/net/grl-net-wc.c:739 | |
80 | #, c-format | |
81 | msgid "Invalid URL %s" | |
82 | msgstr "نشانی اینترنتی نامعتبر %s" | |
83 | ||
84 | #: src/grilo.c:218 | |
85 | msgid "Semicolon-separated paths containing Grilo plugins" | |
86 | msgstr "مسیرهای جداشده توسط نقطهویرگول حاوی متصلشوندههای گریلو" | |
87 | ||
88 | #: src/grilo.c:220 | |
89 | msgid "Colon-separated paths containing Grilo plugins" | |
90 | msgstr "مسیرهای جداشده توسط ویرگول حاوی متصلشوندههای گریلو" | |
91 | ||
92 | #: src/grilo.c:223 | |
93 | msgid "Colon-separated list of Grilo plugins to use" | |
94 | msgstr "لیست جداشده توسط ویرگول حاوی متصلشوندههای گریلو به منظور استفاده" | |
95 | ||
96 | #: src/grilo.c:228 | |
97 | msgid "Grilo Options" | |
98 | msgstr "گزینههای گریلو" | |
99 | ||
100 | #: src/grilo.c:229 | |
101 | msgid "Show Grilo Options" | |
102 | msgstr "نمایش گزینههای گریلو" | |
103 | ||
104 | #: src/grl-multiple.c:134 | |
105 | #, c-format | |
106 | msgid "No searchable sources available" | |
107 | msgstr "منبع قابل جستجویی یافت نشد" | |
108 | ||
109 | #: src/grl-multiple.c:511 | |
110 | #, c-format | |
111 | msgid "Could not resolve media for URI “%s”" | |
112 | msgstr "نمیتوان رسانهای برای نشانی اینترنی “%s” یافت" | |
113 | ||
114 | #: src/grl-registry.c:499 src/grl-registry.c:1538 | |
115 | #, c-format | |
116 | msgid "Plugin “%s” is already loaded" | |
117 | msgstr "متصلشوندهٔ “%s” قبلا باز شده است" | |
118 | ||
119 | #: src/grl-registry.c:523 | |
120 | #, c-format | |
121 | msgid "Failed to initialize plugin from %s" | |
122 | msgstr "نمیتوان متصلشونده را از %s مقداردهی اولیه کرد" | |
123 | ||
124 | #: src/grl-registry.c:565 | |
125 | #, c-format | |
126 | msgid "Metadata key “%s” already registered in different format" | |
127 | msgstr "کلید فرادادهٔ “%s” قبلاً در یک قالب دیگر ثبت شده است" | |
128 | ||
129 | #: src/grl-registry.c:578 | |
130 | #, c-format | |
131 | msgid "Metadata key “%s” cannot be registered" | |
132 | msgstr "کلید فرادادهٔ “%s” قابل ثبت نیست" | |
133 | ||
134 | #: src/grl-registry.c:1144 | |
135 | #, c-format | |
136 | msgid "Source with id “%s” was not found" | |
137 | msgstr "منبع با شناسهٔ “%s” یافت نشد" | |
138 | ||
139 | #: src/grl-registry.c:1218 | |
140 | #, c-format | |
141 | msgid "Failed to load plugin from %s" | |
142 | msgstr "خطا در بارکردن متصلشونده از “%s”" | |
143 | ||
144 | #: src/grl-registry.c:1227 | |
145 | #, c-format | |
146 | msgid "Invalid plugin file %s" | |
147 | msgstr "پروندهٔ متصلشوندهٔ نامعتبر “%s”" | |
148 | ||
149 | #: src/grl-registry.c:1238 | |
150 | #, c-format | |
151 | msgid "“%s” is not a valid plugin file" | |
152 | msgstr "“%s” یک پروندهٔ متصلشوندهٔ معتبر نیست" | |
153 | ||
154 | #: src/grl-registry.c:1257 | |
155 | #, c-format | |
156 | msgid "Plugin “%s” already exists" | |
157 | msgstr "متصلشوندهٔ “%s” از قبل وجود دارد" | |
158 | ||
159 | #: src/grl-registry.c:1420 | |
160 | #, c-format | |
161 | msgid "Invalid path %s" | |
162 | msgstr "مسیر نامعتبر “%s”" | |
163 | ||
164 | #: src/grl-registry.c:1487 | |
165 | #, c-format | |
166 | msgid "All configured plugin paths are invalid" | |
167 | msgstr "تمام مسیرهای پیکربندی شدهٔ متصلشونده نامعتبر هستند" | |
168 | ||
169 | #: src/grl-registry.c:1527 | |
170 | #, c-format | |
171 | msgid "Plugin “%s” not available" | |
172 | msgstr "متصلشوندهٔ “%s” در دسترس نیست" | |
173 | ||
174 | #: src/grl-registry.c:1755 | |
175 | #, c-format | |
176 | msgid "Plugin not found: “%s”" | |
177 | msgstr "متصلشونده یافت نشد: “%s”" | |
178 | ||
179 | #: src/grl-registry.c:2066 | |
180 | #, c-format | |
181 | msgid "Plugin configuration does not contain “plugin-id” reference" | |
182 | msgstr "پیکربندی متصلشونده فاقد مرجع “شناسهٔ متصلشونده” است" | |
183 | ||
184 | #: src/grl-source.c:2775 | |
185 | #, c-format | |
186 | msgid "Some keys could not be written" | |
187 | msgstr "برخی کلیدها قابل نگارش نیستند" | |
188 | ||
189 | #: src/grl-source.c:2848 | |
190 | #, c-format | |
191 | msgid "None of the specified keys are writable" | |
192 | msgstr "هیچیک از کلیدهای مشخصشده قابل نگارش نیستند" | |
193 | ||
194 | #: src/grl-source.c:4191 | |
195 | #, c-format | |
196 | msgid "Media has no “id”, cannot remove" | |
197 | msgstr "رسانه فاقد “شناسه” است، نمیتوان حذفش کرد" |
6 | 6 | msgid "" |
7 | 7 | msgstr "" |
8 | 8 | "Project-Id-Version: grilo master\n" |
9 | "Report-Msgid-Bugs-To: \n" | |
10 | "POT-Creation-Date: 2015-12-31 17:28+0200\n" | |
11 | "PO-Revision-Date: 2015-12-31 17:28+0200\n" | |
12 | "Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n" | |
9 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n" | |
10 | "POT-Creation-Date: 2020-07-22 17:10+0000\n" | |
11 | "PO-Revision-Date: 2021-11-17 01:26+0200\n" | |
12 | "Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n" | |
13 | 13 | "Language-Team: עברית <>\n" |
14 | 14 | "Language: he\n" |
15 | 15 | "MIME-Version: 1.0\n" |
16 | 16 | "Content-Type: text/plain; charset=UTF-8\n" |
17 | 17 | "Content-Transfer-Encoding: 8bit\n" |
18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
19 | "X-Generator: Gtranslator 2.91.6\n" | |
18 | "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? 2 : 3);\n" | |
19 | "X-Generator: Poedit 3.0\n" | |
20 | 20 | |
21 | #: ../libs/net/grl-net-mock.c:86 | |
21 | #: libs/net/grl-net-mock.c:86 | |
22 | 22 | msgid "No mock definition found" |
23 | msgstr "No mock definition found" | |
23 | msgstr "לא נמצאה הגדרת הדמיה" | |
24 | 24 | |
25 | #: ../libs/net/grl-net-mock.c:98 | |
25 | #: libs/net/grl-net-mock.c:98 | |
26 | 26 | #, c-format |
27 | 27 | msgid "Could not find mock content %s" |
28 | msgstr "Could not find mock content %s" | |
28 | msgstr "לא ניתן למצוא את התוכן המדומה %s" | |
29 | 29 | |
30 | #: ../libs/net/grl-net-mock.c:116 | |
30 | #: libs/net/grl-net-mock.c:116 | |
31 | 31 | #, c-format |
32 | 32 | msgid "Could not access mock content: %s" |
33 | msgstr "Could not access mock content: %s" | |
33 | msgstr "לא ניתן לגשת לתוכן המדומה: %s" | |
34 | 34 | |
35 | #: ../libs/net/grl-net-wc.c:449 | |
35 | #: libs/net/grl-net-wc.c:442 | |
36 | 36 | msgid "Cannot connect to the server" |
37 | msgstr "Cannot connect to the server" | |
37 | msgstr "לא ניתן להתחבר לשרת" | |
38 | 38 | |
39 | #: ../libs/net/grl-net-wc.c:455 | |
39 | #: libs/net/grl-net-wc.c:448 | |
40 | 40 | msgid "Cannot connect to the proxy server" |
41 | msgstr "Cannot connect to the proxy server" | |
41 | msgstr "לא ניתן להתחבר לשרת המתווך" | |
42 | 42 | |
43 | #: ../libs/net/grl-net-wc.c:462 | |
43 | #: libs/net/grl-net-wc.c:455 | |
44 | 44 | #, c-format |
45 | 45 | msgid "Invalid request URI or header: %s" |
46 | msgstr "Invalid request URI or header: %s" | |
46 | msgstr "כתובת בקשה מלאה או כותרת שגויים: %s" | |
47 | 47 | |
48 | #: ../libs/net/grl-net-wc.c:469 | |
48 | #: libs/net/grl-net-wc.c:462 | |
49 | 49 | #, c-format |
50 | 50 | msgid "Authentication required: %s" |
51 | msgstr "Authentication required: %s" | |
51 | msgstr "נדרש אימות: %s" | |
52 | 52 | |
53 | #: ../libs/net/grl-net-wc.c:474 | |
53 | #: libs/net/grl-net-wc.c:467 | |
54 | 54 | #, c-format |
55 | 55 | msgid "The requested resource was not found: %s" |
56 | msgstr "The requested resource was not found: %s" | |
56 | msgstr "המשאב המבוקש לא נמצא: %s" | |
57 | 57 | |
58 | #: ../libs/net/grl-net-wc.c:481 | |
58 | #: libs/net/grl-net-wc.c:474 | |
59 | 59 | #, c-format |
60 | 60 | msgid "The entry has been modified since it was downloaded: %s" |
61 | msgstr "The entry has been modified since it was downloaded: %s" | |
61 | msgstr "הרשומה נערכה מאז התקבלה: %s" | |
62 | 62 | |
63 | #: ../libs/net/grl-net-wc.c:487 ../libs/net/grl-net-wc.c:596 | |
64 | #: ../libs/pls/grl-pls.c:490 ../src/grl-source.c:1828 ../src/grl-source.c:1928 | |
65 | #: ../src/grl-source.c:2075 ../src/grl-source.c:2332 ../src/grl-source.c:2453 | |
63 | #: libs/net/grl-net-wc.c:480 libs/net/grl-net-wc.c:592 libs/pls/grl-pls.c:493 | |
64 | #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068 | |
65 | #: src/grl-source.c:2325 src/grl-source.c:2446 | |
66 | 66 | #, c-format |
67 | 67 | msgid "Operation was cancelled" |
68 | msgstr "Operation was cancelled" | |
68 | msgstr "הפעולה בוטלה" | |
69 | 69 | |
70 | #: ../libs/net/grl-net-wc.c:490 | |
71 | #, c-format | |
72 | msgid "Unhandled status: %s" | |
73 | msgstr "Unhandled status: %s" | |
70 | #: libs/net/grl-net-wc.c:596 libs/net/grl-net-wc.c:640 | |
71 | msgid "Data not available" | |
72 | msgstr "הנתונים אינם זמינים" | |
74 | 73 | |
75 | #: ../libs/net/grl-net-wc.c:600 ../libs/net/grl-net-wc.c:641 | |
76 | msgid "Data not available" | |
77 | msgstr "Data not available" | |
78 | ||
79 | #: ../libs/net/grl-net-wc.c:691 | |
74 | #: libs/net/grl-net-wc.c:691 | |
80 | 75 | #, c-format |
81 | 76 | msgid "Invalid URL %s" |
82 | msgstr "Invalid URL %s" | |
77 | msgstr "הכתובת %s שגויה" | |
83 | 78 | |
84 | #: ../src/grilo.c:218 | |
79 | #: src/grilo.c:218 | |
85 | 80 | msgid "Semicolon-separated paths containing Grilo plugins" |
86 | msgstr "Semicolon-separated paths containing Grilo plugins" | |
81 | msgstr "רשימה מופרדת בנקודה פסיק של נתיבים שמכילים תוספים של Grilo" | |
87 | 82 | |
88 | #: ../src/grilo.c:220 | |
83 | #: src/grilo.c:220 | |
89 | 84 | msgid "Colon-separated paths containing Grilo plugins" |
90 | msgstr "Colon-separated paths containing Grilo plugins" | |
85 | msgstr "רשימה מופרדת בנקודתיים של נתיבים שמכילים תוספים של Grilo" | |
91 | 86 | |
92 | #: ../src/grilo.c:223 | |
87 | #: src/grilo.c:223 | |
93 | 88 | msgid "Colon-separated list of Grilo plugins to use" |
94 | msgstr "Colon-separated list of Grilo plugins to use" | |
89 | msgstr "רשימה מופרדת בנקודתיים של תוספי Grilo לשימוש" | |
95 | 90 | |
96 | #: ../src/grilo.c:228 | |
91 | #: src/grilo.c:228 | |
97 | 92 | msgid "Grilo Options" |
98 | msgstr "Grilo Options" | |
93 | msgstr "אפשרויות Grilo" | |
99 | 94 | |
100 | #: ../src/grilo.c:229 | |
95 | #: src/grilo.c:229 | |
101 | 96 | msgid "Show Grilo Options" |
102 | msgstr "Show Grilo Options" | |
97 | msgstr "הצגת אפשרויות Grilo" | |
103 | 98 | |
104 | #: ../src/grl-multiple.c:134 | |
99 | #: src/grl-multiple.c:134 | |
105 | 100 | #, c-format |
106 | 101 | msgid "No searchable sources available" |
107 | msgstr "No searchable sources available" | |
102 | msgstr "אין משאבים שניתן לחפש בהם" | |
108 | 103 | |
109 | #: ../src/grl-multiple.c:511 | |
104 | #: src/grl-multiple.c:511 | |
110 | 105 | #, c-format |
111 | msgid "Could not resolve media for URI '%s'" | |
112 | msgstr "Could not resolve media for URI '%s'" | |
106 | msgid "Could not resolve media for URI “%s”" | |
107 | msgstr "לא ניתן לפתור את המדיה עבור הכתובת המלאה ‚%s’" | |
113 | 108 | |
114 | #: ../src/grl-registry.c:464 ../src/grl-registry.c:1376 | |
109 | #: src/grl-registry.c:495 src/grl-registry.c:1476 | |
115 | 110 | #, c-format |
116 | msgid "Plugin '%s' is already loaded" | |
117 | msgstr "Plugin '%s' is already loaded" | |
111 | msgid "Plugin “%s” is already loaded" | |
112 | msgstr "התוסף „%s” כבר נטען" | |
118 | 113 | |
119 | #: ../src/grl-registry.c:488 | |
114 | #: src/grl-registry.c:519 | |
120 | 115 | #, c-format |
121 | 116 | msgid "Failed to initialize plugin from %s" |
122 | msgstr "Failed to initialize plugin from %s" | |
117 | msgstr "אתחול התוסף מתוך %s נכשל" | |
123 | 118 | |
124 | #: ../src/grl-registry.c:530 | |
119 | #: src/grl-registry.c:561 | |
125 | 120 | #, c-format |
126 | msgid "Metadata key '%s' already registered in different format" | |
127 | msgstr "Metadata key '%s' already registered in different format" | |
121 | msgid "Metadata key “%s” already registered in different format" | |
122 | msgstr "מפתח נתוני העל „%s” כבר נרשם בתצורה אחרת" | |
128 | 123 | |
129 | #: ../src/grl-registry.c:543 | |
124 | #: src/grl-registry.c:574 | |
130 | 125 | #, c-format |
131 | msgid "Metadata key '%s' cannot be registered" | |
132 | msgstr "Metadata key '%s' cannot be registered" | |
126 | msgid "Metadata key “%s” cannot be registered" | |
127 | msgstr "את מפתח נתוני העל „%s” לא ניתן לרשום" | |
133 | 128 | |
134 | #: ../src/grl-registry.c:983 | |
129 | #: src/grl-registry.c:1082 | |
135 | 130 | #, c-format |
136 | msgid "Source with id '%s' was not found" | |
137 | msgstr "Source with id '%s' was not found" | |
131 | msgid "Source with id “%s” was not found" | |
132 | msgstr "לא נמצא מקור עם המזהה „%s”" | |
138 | 133 | |
139 | #: ../src/grl-registry.c:1057 | |
134 | #: src/grl-registry.c:1156 | |
140 | 135 | #, c-format |
141 | 136 | msgid "Failed to load plugin from %s" |
142 | msgstr "Failed to load plugin from %s" | |
137 | msgstr "טעינת התוסף מתוך %s נכשלה" | |
143 | 138 | |
144 | #: ../src/grl-registry.c:1066 | |
139 | #: src/grl-registry.c:1165 | |
145 | 140 | #, c-format |
146 | 141 | msgid "Invalid plugin file %s" |
147 | msgstr "Invalid plugin file %s" | |
142 | msgstr "קובץ התוסף %s שגוי" | |
148 | 143 | |
149 | #: ../src/grl-registry.c:1077 | |
144 | #: src/grl-registry.c:1176 | |
150 | 145 | #, c-format |
151 | msgid "'%s' is not a valid plugin file" | |
152 | msgstr "'%s' is not a valid plugin file" | |
146 | msgid "“%s” is not a valid plugin file" | |
147 | msgstr "„%s” אינו קובץ תוסף תקף" | |
153 | 148 | |
154 | #: ../src/grl-registry.c:1096 | |
149 | #: src/grl-registry.c:1195 | |
155 | 150 | #, c-format |
156 | msgid "Plugin '%s' already exists" | |
157 | msgstr "Plugin '%s' already exists" | |
151 | msgid "Plugin “%s” already exists" | |
152 | msgstr "התוסף „%s” כבר קיים" | |
158 | 153 | |
159 | #: ../src/grl-registry.c:1259 | |
154 | #: src/grl-registry.c:1358 | |
160 | 155 | #, c-format |
161 | 156 | msgid "Invalid path %s" |
162 | msgstr "Invalid path %s" | |
157 | msgstr "הנתיב %s שגוי" | |
163 | 158 | |
164 | #: ../src/grl-registry.c:1325 | |
159 | #: src/grl-registry.c:1425 | |
165 | 160 | #, c-format |
166 | 161 | msgid "All configured plugin paths are invalid" |
167 | msgstr "All configured plugin paths are invalid" | |
162 | msgstr "כל נתיבי התוסף המוגדרים שגויים" | |
168 | 163 | |
169 | #: ../src/grl-registry.c:1365 | |
164 | #: src/grl-registry.c:1465 | |
170 | 165 | #, c-format |
171 | msgid "Plugin '%s' not available" | |
172 | msgstr "Plugin '%s' not available" | |
166 | msgid "Plugin “%s” not available" | |
167 | msgstr "התוסף „%s” אינו זמין" | |
173 | 168 | |
174 | #: ../src/grl-registry.c:1593 | |
169 | #: src/grl-registry.c:1693 | |
175 | 170 | #, c-format |
176 | msgid "Plugin not found: '%s'" | |
177 | msgstr "Plugin not found: '%s'" | |
171 | msgid "Plugin not found: “%s”" | |
172 | msgstr "התוסף לא נמצא: „%s”" | |
178 | 173 | |
179 | #: ../src/grl-registry.c:1904 | |
174 | #: src/grl-registry.c:2004 | |
180 | 175 | #, c-format |
181 | msgid "Plugin configuration does not contain 'plugin-id' reference" | |
182 | msgstr "Plugin configuration does not contain 'plugin-id' reference" | |
176 | msgid "Plugin configuration does not contain “plugin-id” reference" | |
177 | msgstr "תצורת התוסף אינה מכילה הפניית „plugin-id”" | |
183 | 178 | |
184 | #: ../src/grl-source.c:2782 | |
179 | #: src/grl-source.c:2775 | |
185 | 180 | #, c-format |
186 | 181 | msgid "Some keys could not be written" |
187 | msgstr "Some keys could not be written" | |
182 | msgstr "לא ניתן לכתוב חלק מהמפתחות" | |
188 | 183 | |
189 | #: ../src/grl-source.c:2855 | |
184 | #: src/grl-source.c:2848 | |
190 | 185 | #, c-format |
191 | 186 | msgid "None of the specified keys are writable" |
192 | msgstr "None of the specified keys are writable" | |
187 | msgstr "אף אחד מהמפתחות שצוינו זמינים לכתיבה" | |
193 | 188 | |
194 | #: ../src/grl-source.c:4198 | |
189 | #: src/grl-source.c:4191 | |
195 | 190 | #, c-format |
196 | msgid "Media has no 'id', cannot remove" | |
197 | msgstr "Media has no 'id', cannot remove" | |
191 | msgid "Media has no “id”, cannot remove" | |
192 | msgstr "למדיה אין „id”, אי אפשר להסיר" | |
193 | ||
194 | #~ msgid "Unhandled status: %s" | |
195 | #~ msgstr "Unhandled status: %s" | |
198 | 196 | |
199 | 197 | #~ msgid "Unable to load plugin '%s'" |
200 | 198 | #~ msgstr "Unable to load plugin '%s'" |
0 | # SOME DESCRIPTIVE TITLE. | |
1 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER | |
2 | # This file is distributed under the same license as the PACKAGE package. | |
3 | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | |
4 | # | |
5 | msgid "" | |
6 | msgstr "" | |
7 | "Project-Id-Version: \n" | |
8 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n" | |
9 | "POT-Creation-Date: 2022-07-01 16:34+0000\n" | |
10 | "PO-Revision-Date: 2022-07-03 06:16+0200\n" | |
11 | "Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n" | |
12 | "Language-Team: \n" | |
13 | "Language: ka\n" | |
14 | "MIME-Version: 1.0\n" | |
15 | "Content-Type: text/plain; charset=UTF-8\n" | |
16 | "Content-Transfer-Encoding: 8bit\n" | |
17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | |
18 | "X-Generator: Poedit 3.1\n" | |
19 | ||
20 | #: libs/net/grl-net-mock.c:86 | |
21 | msgid "No mock definition found" | |
22 | msgstr "" | |
23 | ||
24 | #: libs/net/grl-net-mock.c:98 | |
25 | #, c-format | |
26 | msgid "Could not find mock content %s" | |
27 | msgstr "" | |
28 | ||
29 | #: libs/net/grl-net-mock.c:116 | |
30 | #, c-format | |
31 | msgid "Could not access mock content: %s" | |
32 | msgstr "" | |
33 | ||
34 | #: libs/net/grl-net-wc.c:443 | |
35 | msgid "Cannot connect to the server" | |
36 | msgstr "სერვერთან დაკავშირების შეცდომა" | |
37 | ||
38 | #: libs/net/grl-net-wc.c:449 | |
39 | msgid "Cannot connect to the proxy server" | |
40 | msgstr "პროქსი სერვერთან დაკავშირების შეცდომა" | |
41 | ||
42 | #: libs/net/grl-net-wc.c:456 | |
43 | #, c-format | |
44 | msgid "Invalid request URI or header: %s" | |
45 | msgstr "მოთხოვნის არასწორი URI ან თავსართი: %s" | |
46 | ||
47 | #: libs/net/grl-net-wc.c:463 | |
48 | #, c-format | |
49 | msgid "Authentication required: %s" | |
50 | msgstr "საჭიროა ავთენტიკაცია: %s" | |
51 | ||
52 | #: libs/net/grl-net-wc.c:468 | |
53 | #, c-format | |
54 | msgid "The requested resource was not found: %s" | |
55 | msgstr "მოთხოვნილი რესურსი არ არსებობს: %s" | |
56 | ||
57 | #: libs/net/grl-net-wc.c:475 | |
58 | #, c-format | |
59 | msgid "The entry has been modified since it was downloaded: %s" | |
60 | msgstr "გადმოწერის შემდეგ ეს ჩანაწერი შეიცვალა: %s" | |
61 | ||
62 | #: libs/net/grl-net-wc.c:481 libs/net/grl-net-wc.c:593 libs/pls/grl-pls.c:493 | |
63 | #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068 | |
64 | #: src/grl-source.c:2325 src/grl-source.c:2446 | |
65 | #, c-format | |
66 | msgid "Operation was cancelled" | |
67 | msgstr "ოპერაცია გაუქმდა" | |
68 | ||
69 | #: libs/net/grl-net-wc.c:597 libs/net/grl-net-wc.c:641 | |
70 | msgid "Data not available" | |
71 | msgstr "მონაცემები მიუწვდომელია" | |
72 | ||
73 | #: libs/net/grl-net-wc.c:692 | |
74 | #, c-format | |
75 | msgid "Invalid URL %s" | |
76 | msgstr "არასწორი URL: %s" | |
77 | ||
78 | #: src/grilo.c:218 | |
79 | msgid "Semicolon-separated paths containing Grilo plugins" | |
80 | msgstr "Grilo-ის დამატებების შემცველი ორწერტილით გამოყოფილი ბილიკები" | |
81 | ||
82 | #: src/grilo.c:220 | |
83 | msgid "Colon-separated paths containing Grilo plugins" | |
84 | msgstr "Grilo-ის ორწერტილით გამოყოფილი დამატებები" | |
85 | ||
86 | #: src/grilo.c:223 | |
87 | msgid "Colon-separated list of Grilo plugins to use" | |
88 | msgstr "Gilo-ის ორწერტილით გამოყოფილი დამატებების სია" | |
89 | ||
90 | #: src/grilo.c:228 | |
91 | msgid "Grilo Options" | |
92 | msgstr "Grilo-ის პარამეტრები" | |
93 | ||
94 | #: src/grilo.c:229 | |
95 | msgid "Show Grilo Options" | |
96 | msgstr "Grilo-ის პარამეტრების ჩვენება" | |
97 | ||
98 | #: src/grl-multiple.c:134 | |
99 | #, c-format | |
100 | msgid "No searchable sources available" | |
101 | msgstr "ძებნადი წყაროების გარეშე" | |
102 | ||
103 | #: src/grl-multiple.c:511 | |
104 | #, c-format | |
105 | msgid "Could not resolve media for URI “%s”" | |
106 | msgstr "მედიის ამოსნის შეცდომა URI-სთვის \"%s\"" | |
107 | ||
108 | #: src/grl-registry.c:499 src/grl-registry.c:1538 | |
109 | #, c-format | |
110 | msgid "Plugin “%s” is already loaded" | |
111 | msgstr "დამატება არ ჩაიტვირთულია: \"%s\"" | |
112 | ||
113 | #: src/grl-registry.c:523 | |
114 | #, c-format | |
115 | msgid "Failed to initialize plugin from %s" | |
116 | msgstr "%s-დან დამატების ინიციალიზაციის სეცდომა" | |
117 | ||
118 | #: src/grl-registry.c:565 | |
119 | #, c-format | |
120 | msgid "Metadata key “%s” already registered in different format" | |
121 | msgstr "" | |
122 | ||
123 | #: src/grl-registry.c:578 | |
124 | #, c-format | |
125 | msgid "Metadata key “%s” cannot be registered" | |
126 | msgstr "მეტამოანცემების გასაღების (\"%s\") რეგისტრაციის შეცდომა" | |
127 | ||
128 | #: src/grl-registry.c:1144 | |
129 | #, c-format | |
130 | msgid "Source with id “%s” was not found" | |
131 | msgstr "წყარო ID-ით \"%s\" არ არსებობს" | |
132 | ||
133 | #: src/grl-registry.c:1218 | |
134 | #, c-format | |
135 | msgid "Failed to load plugin from %s" | |
136 | msgstr "%s-დან დამატების ჩატვრთვა შეუძლებელია" | |
137 | ||
138 | #: src/grl-registry.c:1227 | |
139 | #, c-format | |
140 | msgid "Invalid plugin file %s" | |
141 | msgstr "დამატების არასწორი ფაილი: %s" | |
142 | ||
143 | #: src/grl-registry.c:1238 | |
144 | #, c-format | |
145 | msgid "“%s” is not a valid plugin file" | |
146 | msgstr "\"%s\" დამატების სწორ ფაილს არ წარმოადგენს" | |
147 | ||
148 | #: src/grl-registry.c:1257 | |
149 | #, c-format | |
150 | msgid "Plugin “%s” already exists" | |
151 | msgstr "დამატება %s უკვე არსებობს" | |
152 | ||
153 | #: src/grl-registry.c:1420 | |
154 | #, c-format | |
155 | msgid "Invalid path %s" | |
156 | msgstr "ბილიკი არასწორია: \"%s\"" | |
157 | ||
158 | #: src/grl-registry.c:1487 | |
159 | #, c-format | |
160 | msgid "All configured plugin paths are invalid" | |
161 | msgstr "" | |
162 | ||
163 | #: src/grl-registry.c:1527 | |
164 | #, c-format | |
165 | msgid "Plugin “%s” not available" | |
166 | msgstr "დამატება \"%s\" ხელმიუწვდომელია" | |
167 | ||
168 | #: src/grl-registry.c:1755 | |
169 | #, c-format | |
170 | msgid "Plugin not found: “%s”" | |
171 | msgstr "დამატება არ არსებობს: \"%s\"" | |
172 | ||
173 | #: src/grl-registry.c:2066 | |
174 | #, c-format | |
175 | msgid "Plugin configuration does not contain “plugin-id” reference" | |
176 | msgstr "" | |
177 | ||
178 | #: src/grl-source.c:2775 | |
179 | #, c-format | |
180 | msgid "Some keys could not be written" | |
181 | msgstr "ზოგიერთი გასაღების ჩაწერა შეუძლებელია" | |
182 | ||
183 | #: src/grl-source.c:2848 | |
184 | #, c-format | |
185 | msgid "None of the specified keys are writable" | |
186 | msgstr "მითითებული გასაღებები ჩაწერადი არაა" | |
187 | ||
188 | #: src/grl-source.c:4191 | |
189 | #, c-format | |
190 | msgid "Media has no “id”, cannot remove" | |
191 | msgstr "" |
5 | 5 | msgid "" |
6 | 6 | msgstr "" |
7 | 7 | "Project-Id-Version: Gnome Nepali Translation Project\n" |
8 | "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?" | |
9 | "product=grilo&keywords=I18N+L10N&component=general\n" | |
10 | "POT-Creation-Date: 2017-06-29 15:20+0000\n" | |
11 | "PO-Revision-Date: 2017-08-16 14:21+0545\n" | |
8 | "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n" | |
9 | "POT-Creation-Date: 2020-07-22 17:10+0000\n" | |
10 | "PO-Revision-Date: 2022-05-10 15:08+0545\n" | |
11 | "Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n" | |
12 | 12 | "Language-Team: Nepali Translation Team <chautari@gmail.com>\n" |
13 | "Language: ne\n" | |
13 | 14 | "MIME-Version: 1.0\n" |
14 | 15 | "Content-Type: text/plain; charset=UTF-8\n" |
15 | 16 | "Content-Transfer-Encoding: 8bit\n" |
16 | "X-Generator: Poedit 2.0.3\n" | |
17 | "Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n" | |
18 | 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
19 | "Language: ne\n" | |
18 | "X-Generator: Poedit 3.0.1\n" | |
20 | 19 | |
21 | #: ../libs/net/grl-net-mock.c:86 | |
20 | #: libs/net/grl-net-mock.c:86 | |
22 | 21 | msgid "No mock definition found" |
23 | 22 | msgstr "कुनै नक्कली परिभाषा फेला परेन" |
24 | 23 | |
25 | #: ../libs/net/grl-net-mock.c:98 | |
24 | #: libs/net/grl-net-mock.c:98 | |
26 | 25 | #, c-format |
27 | 26 | msgid "Could not find mock content %s" |
28 | 27 | msgstr "नक्कली सामग्री %s फेला पार्न सकेन" |
29 | 28 | |
30 | #: ../libs/net/grl-net-mock.c:116 | |
29 | #: libs/net/grl-net-mock.c:116 | |
31 | 30 | #, c-format |
32 | 31 | msgid "Could not access mock content: %s" |
33 | 32 | msgstr "नक्कली सामग्री पहुँच गर्न सकेन:%s" |
34 | 33 | |
35 | #: ../libs/net/grl-net-wc.c:449 | |
34 | #: libs/net/grl-net-wc.c:442 | |
36 | 35 | msgid "Cannot connect to the server" |
37 | 36 | msgstr "सर्भरमा जडान गर्न सकिँदैन" |
38 | 37 | |
39 | #: ../libs/net/grl-net-wc.c:455 | |
38 | #: libs/net/grl-net-wc.c:448 | |
40 | 39 | msgid "Cannot connect to the proxy server" |
41 | 40 | msgstr "प्रोक्सी सर्भर जडान गर्न सक्दैन" |
42 | 41 | |
43 | #: ../libs/net/grl-net-wc.c:462 | |
42 | #: libs/net/grl-net-wc.c:455 | |
44 | 43 | #, c-format |
45 | 44 | msgid "Invalid request URI or header: %s" |
46 | 45 | msgstr "URI वा हेडरको अवैध अनुरोध URI वा हेडर: %s" |
47 | 46 | |
48 | #: ../libs/net/grl-net-wc.c:469 | |
47 | #: libs/net/grl-net-wc.c:462 | |
49 | 48 | #, c-format |
50 | 49 | msgid "Authentication required: %s" |
51 | msgstr "%s प्रमाणिकरण आवश्यक छ ।" | |
50 | msgstr "प्रमाणिकरण आवश्यक छ : %s " | |
52 | 51 | |
53 | #: ../libs/net/grl-net-wc.c:474 | |
54 | #, fuzzy, c-format | |
52 | #: libs/net/grl-net-wc.c:467 | |
53 | #, c-format | |
55 | 54 | msgid "The requested resource was not found: %s" |
56 | msgstr "%s फेला परेन" | |
55 | msgstr "अनुरोध गरिएको संसाधन फेला परेन: %s" | |
57 | 56 | |
58 | #: ../libs/net/grl-net-wc.c:481 | |
57 | #: libs/net/grl-net-wc.c:474 | |
59 | 58 | #, c-format |
60 | 59 | msgid "The entry has been modified since it was downloaded: %s" |
61 | msgstr "" | |
60 | msgstr "यो डाउनलोड भएदेखि प्रविष्टि परिमार्जन गरिएको छ: %s" | |
62 | 61 | |
63 | #: ../libs/net/grl-net-wc.c:487 ../libs/net/grl-net-wc.c:599 | |
64 | #: ../libs/pls/grl-pls.c:490 ../src/grl-source.c:1828 ../src/grl-source.c:1928 | |
65 | #: ../src/grl-source.c:2075 ../src/grl-source.c:2332 ../src/grl-source.c:2453 | |
62 | #: libs/net/grl-net-wc.c:480 libs/net/grl-net-wc.c:592 libs/pls/grl-pls.c:493 | |
63 | #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068 | |
64 | #: src/grl-source.c:2325 src/grl-source.c:2446 | |
66 | 65 | #, c-format |
67 | 66 | msgid "Operation was cancelled" |
68 | 67 | msgstr "सञ्चालन रद्द भएको छ" |
69 | 68 | |
70 | #: ../libs/net/grl-net-wc.c:603 ../libs/net/grl-net-wc.c:647 | |
69 | #: libs/net/grl-net-wc.c:596 libs/net/grl-net-wc.c:640 | |
71 | 70 | msgid "Data not available" |
72 | 71 | msgstr "डाटा उपलब्ध छैन" |
73 | 72 | |
74 | #: ../libs/net/grl-net-wc.c:698 | |
73 | #: libs/net/grl-net-wc.c:691 | |
75 | 74 | #, c-format |
76 | 75 | msgid "Invalid URL %s" |
77 | 76 | msgstr "अवैध यूआरएल %s" |
78 | 77 | |
79 | #: ../src/grilo.c:218 | |
78 | #: src/grilo.c:218 | |
80 | 79 | msgid "Semicolon-separated paths containing Grilo plugins" |
81 | msgstr "" | |
80 | msgstr "ग्रीलो प्लगइन समाविष्ट सेमीकोलोन-विभाजित मार्ग" | |
82 | 81 | |
83 | #: ../src/grilo.c:220 | |
82 | #: src/grilo.c:220 | |
84 | 83 | msgid "Colon-separated paths containing Grilo plugins" |
85 | msgstr "" | |
84 | msgstr "ग्रीलो प्लगइन समावेश गर्ने कोलोन-विभाजित मार्ग" | |
86 | 85 | |
87 | #: ../src/grilo.c:223 | |
86 | #: src/grilo.c:223 | |
88 | 87 | msgid "Colon-separated list of Grilo plugins to use" |
89 | msgstr "" | |
88 | msgstr "प्रयोग गर्नका लागि ग्रिलो प्लगइनको Colon-separated सूची" | |
90 | 89 | |
91 | #: ../src/grilo.c:228 | |
90 | #: src/grilo.c:228 | |
92 | 91 | msgid "Grilo Options" |
93 | 92 | msgstr "ग्रिलो विकल्प" |
94 | 93 | |
95 | #: ../src/grilo.c:229 | |
94 | #: src/grilo.c:229 | |
96 | 95 | msgid "Show Grilo Options" |
97 | 96 | msgstr "ग्रिलो विकल्प देखाउनुहोस्" |
98 | 97 | |
99 | #: ../src/grl-multiple.c:134 | |
100 | #, fuzzy, c-format | |
98 | #: src/grl-multiple.c:134 | |
99 | #, c-format | |
101 | 100 | msgid "No searchable sources available" |
102 | msgstr "स्रोत" | |
101 | msgstr "कुनै खोजीयोग्य स्रोतहरू उपलब्ध छैन" | |
103 | 102 | |
104 | #: ../src/grl-multiple.c:511 | |
103 | #: src/grl-multiple.c:511 | |
105 | 104 | #, c-format |
106 | msgid "Could not resolve media for URI '%s'" | |
105 | msgid "Could not resolve media for URI “%s”" | |
107 | 106 | msgstr "URI '%s' को लागि मिडिया समाधान गर्न सकेन" |
108 | 107 | |
109 | #: ../src/grl-registry.c:464 ../src/grl-registry.c:1377 | |
110 | #, fuzzy, c-format | |
111 | msgid "Plugin '%s' is already loaded" | |
112 | msgstr "अनुप्रयोग सुची पहिले नै लोड भइसकेको छ" | |
108 | #: src/grl-registry.c:495 src/grl-registry.c:1476 | |
109 | #, c-format | |
110 | msgid "Plugin “%s” is already loaded" | |
111 | msgstr "प्लगइन \"%s\" पहिले नै लोड भइसकेको छ" | |
113 | 112 | |
114 | #: ../src/grl-registry.c:488 | |
115 | #, fuzzy, c-format | |
113 | #: src/grl-registry.c:519 | |
114 | #, c-format | |
116 | 115 | msgid "Failed to initialize plugin from %s" |
117 | msgstr "\"%s\" प्लगइनबाट यो सन्देश हो।" | |
116 | msgstr "%s बाट प्लगइन सुरुआत गर्न असफल" | |
118 | 117 | |
119 | #: ../src/grl-registry.c:530 | |
118 | #: src/grl-registry.c:561 | |
120 | 119 | #, c-format |
121 | msgid "Metadata key '%s' already registered in different format" | |
122 | msgstr "" | |
120 | msgid "Metadata key “%s” already registered in different format" | |
121 | msgstr "मेटाडाटा कुञ्जी \"%s\" पहिले नै विभिन्न ढाँचामा दर्ता भएको छ" | |
123 | 122 | |
124 | #: ../src/grl-registry.c:543 | |
125 | #, fuzzy, c-format | |
126 | msgid "Metadata key '%s' cannot be registered" | |
127 | msgstr "डाइरेक्टरी फेला पार्न सक्दैन %s" | |
123 | #: src/grl-registry.c:574 | |
124 | #, c-format | |
125 | msgid "Metadata key “%s” cannot be registered" | |
126 | msgstr "मेटाडेटा कुञ्जी \"%s\" दर्ता गर्न सकिँदैन" | |
128 | 127 | |
129 | #: ../src/grl-registry.c:983 | |
128 | #: src/grl-registry.c:1082 | |
130 | 129 | #, c-format |
131 | msgid "Source with id '%s' was not found" | |
132 | msgstr "स्रोत %s पाइएन" | |
130 | msgid "Source with id “%s” was not found" | |
131 | msgstr "\"%s\" आईडी भएको स्रोत फेला परेन" | |
133 | 132 | |
134 | #: ../src/grl-registry.c:1057 | |
133 | #: src/grl-registry.c:1156 | |
135 | 134 | #, c-format |
136 | 135 | msgid "Failed to load plugin from %s" |
137 | 136 | msgstr "प्लगइन लोड गर्न असफल: %s" |
138 | 137 | |
139 | #: ../src/grl-registry.c:1066 | |
138 | #: src/grl-registry.c:1165 | |
140 | 139 | #, c-format |
141 | 140 | msgid "Invalid plugin file %s" |
142 | 141 | msgstr "अवैध प्लगइन फाइल %s" |
143 | 142 | |
144 | #: ../src/grl-registry.c:1077 | |
143 | #: src/grl-registry.c:1176 | |
145 | 144 | #, c-format |
146 | msgid "'%s' is not a valid plugin file" | |
145 | msgid "“%s” is not a valid plugin file" | |
147 | 146 | msgstr "'%s' अवैध प्लगिन फाइल" |
148 | 147 | |
149 | #: ../src/grl-registry.c:1096 | |
148 | #: src/grl-registry.c:1195 | |
150 | 149 | #, c-format |
151 | msgid "Plugin '%s' already exists" | |
152 | msgstr "प्लगिन '%s' पहिले नै अवस्थित छ" | |
150 | msgid "Plugin “%s” already exists" | |
151 | msgstr "प्लगइन \"%s\" पहिले नै अवस्थित छ" | |
153 | 152 | |
154 | #: ../src/grl-registry.c:1259 | |
153 | #: src/grl-registry.c:1358 | |
155 | 154 | #, c-format |
156 | 155 | msgid "Invalid path %s" |
157 | 156 | msgstr "अवैध मार्ग %s" |
158 | 157 | |
159 | #: ../src/grl-registry.c:1326 | |
158 | #: src/grl-registry.c:1425 | |
160 | 159 | #, c-format |
161 | 160 | msgid "All configured plugin paths are invalid" |
162 | msgstr "" | |
161 | msgstr "सबै कन्फिगर गरिएका प्लगइन मार्ग अवैध छन्" | |
163 | 162 | |
164 | #: ../src/grl-registry.c:1366 | |
163 | #: src/grl-registry.c:1465 | |
165 | 164 | #, c-format |
166 | msgid "Plugin '%s' not available" | |
167 | msgstr "प्लगइन %s उपलब्ध छैन" | |
165 | msgid "Plugin “%s” not available" | |
166 | msgstr "प्लगइन \"%s\" उपलब्ध छैन" | |
168 | 167 | |
169 | #: ../src/grl-registry.c:1594 | |
168 | #: src/grl-registry.c:1693 | |
170 | 169 | #, c-format |
171 | msgid "Plugin not found: '%s'" | |
172 | msgstr "प्लगिन फेला परेन : '%s'" | |
170 | msgid "Plugin not found: “%s”" | |
171 | msgstr "प्लगइन फेला परेन: \"%s\"" | |
173 | 172 | |
174 | #: ../src/grl-registry.c:1905 | |
173 | #: src/grl-registry.c:2004 | |
175 | 174 | #, c-format |
176 | msgid "Plugin configuration does not contain 'plugin-id' reference" | |
177 | msgstr "" | |
175 | msgid "Plugin configuration does not contain “plugin-id” reference" | |
176 | msgstr "प्लगइन कन्फिगरेसनमा \"plugin-id\" सन्दर्भ समावेश छैन" | |
178 | 177 | |
179 | #: ../src/grl-source.c:2782 | |
180 | #, fuzzy, c-format | |
178 | #: src/grl-source.c:2775 | |
179 | #, c-format | |
181 | 180 | msgid "Some keys could not be written" |
182 | msgstr "यो ठेगाना पुस्तिकामा ठेगाना लेख्न सकेन।" | |
181 | msgstr "केही कुञ्जीहरू लेख्न सकिएन" | |
183 | 182 | |
184 | #: ../src/grl-source.c:2855 | |
185 | #, fuzzy, c-format | |
183 | #: src/grl-source.c:2848 | |
184 | #, c-format | |
186 | 185 | msgid "None of the specified keys are writable" |
187 | msgstr "कुनै पनि निर्दिष्ट गरिएको फाँटले समावेश गर्दछ:" | |
186 | msgstr "कुनै पनि निर्दिष्ट कुञ्जीहरू लेख्न योग्य छैनन्" | |
188 | 187 | |
189 | #: ../src/grl-source.c:4198 | |
188 | #: src/grl-source.c:4191 | |
190 | 189 | #, c-format |
191 | msgid "Media has no 'id', cannot remove" | |
192 | msgstr "" | |
190 | msgid "Media has no “id”, cannot remove" | |
191 | msgstr "मिडियासँग \"id\" छैन, हटाउन सकिँदैन" |
2288 | 2288 | return FALSE; |
2289 | 2289 | } |
2290 | 2290 | |
2291 | /* @max and @min are expected to be initialized with G_VALUE_INIT (non null) | |
2292 | * Returns TRUE if @value has changed | |
2293 | */ | |
2291 | 2294 | G_GNUC_INTERNAL gboolean |
2292 | 2295 | grl_registry_metadata_key_clamp(GrlRegistry *registry, |
2293 | 2296 | GrlKeyID key, |
2296 | 2299 | GValue *max) |
2297 | 2300 | { |
2298 | 2301 | const gchar *key_name; |
2302 | ||
2303 | g_return_val_if_fail (min != NULL, FALSE); | |
2304 | g_return_val_if_fail (max != NULL, FALSE); | |
2305 | ||
2306 | if (value == NULL) { | |
2307 | return FALSE; | |
2308 | } | |
2299 | 2309 | |
2300 | 2310 | key_name = key_id_handler_get_name (®istry->priv->key_id_handler, key); |
2301 | 2311 | if (key_name) { |
22 | 22 | #include <net/grl-net.h> |
23 | 23 | #include <libsoup/soup.h> |
24 | 24 | |
25 | #include "net/grl-net-wc-private.h" | |
26 | ||
25 | 27 | typedef struct { |
26 | 28 | GrlRegistry *registry; |
27 | 29 | GMainLoop *loop; |
79 | 81 | return G_SOURCE_REMOVE; |
80 | 82 | } |
81 | 83 | |
84 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
85 | static void | |
86 | soup_server_throttling_cb (SoupServer *server, | |
87 | SoupServerMessage *message, | |
88 | const char *path, | |
89 | GHashTable *query, | |
90 | gpointer user_data) | |
91 | { | |
92 | gchar *response = g_strdup_printf ("%" G_GINT64_FORMAT, g_get_monotonic_time()); | |
93 | ||
94 | soup_server_message_set_response (message, "text/plain", SOUP_MEMORY_TAKE, response, strlen(response)); | |
95 | soup_server_message_set_status (message, SOUP_STATUS_OK, NULL); | |
96 | } | |
97 | #else | |
82 | 98 | static void |
83 | 99 | soup_server_throttling_cb (SoupServer *server, |
84 | 100 | SoupMessage *message, |
92 | 108 | soup_message_set_response (message, "text/plain", SOUP_MEMORY_TAKE, response, strlen(response)); |
93 | 109 | soup_message_set_status (message, SOUP_STATUS_OK); |
94 | 110 | } |
111 | #endif | |
95 | 112 | |
96 | 113 | static void |
97 | 114 | test_net_wc_throttling_cb (GObject *source_object, |
162 | 179 | |
163 | 180 | uris = soup_server_get_uris (f->server); |
164 | 181 | g_assert_nonnull (uris); |
182 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
183 | request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD); | |
184 | g_slist_free_full (uris, (GDestroyNotify) g_uri_unref); | |
185 | #else | |
165 | 186 | request = soup_uri_to_string (uris->data, FALSE); |
166 | 187 | g_slist_free_full (uris, (GDestroyNotify) soup_uri_free); |
188 | #endif | |
167 | 189 | g_assert_nonnull (request); |
168 | 190 | |
169 | 191 | wc = grl_net_wc_new (); |
202 | 224 | |
203 | 225 | uris = soup_server_get_uris (f->server); |
204 | 226 | g_assert_nonnull (uris); |
227 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
228 | request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD); | |
229 | g_slist_free_full (uris, (GDestroyNotify) g_uri_unref); | |
230 | #else | |
205 | 231 | request = soup_uri_to_string (uris->data, FALSE); |
206 | 232 | g_slist_free_full (uris, (GDestroyNotify) soup_uri_free); |
233 | #endif | |
207 | 234 | g_assert_nonnull (request); |
208 | 235 | |
209 | 236 | wc = grl_net_wc_new (); |
244 | 271 | |
245 | 272 | uris = soup_server_get_uris (f->server); |
246 | 273 | g_assert_nonnull (uris); |
274 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
275 | request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD); | |
276 | g_slist_free_full (uris, (GDestroyNotify) g_uri_unref); | |
277 | #else | |
247 | 278 | request = soup_uri_to_string (uris->data, FALSE); |
248 | 279 | g_slist_free_full (uris, (GDestroyNotify) soup_uri_free); |
280 | #endif | |
249 | 281 | g_assert_nonnull (request); |
250 | 282 | |
251 | 283 | /* Under the same grl-net-wc, create NUM_STRESS_TEST async operations to our |
265 | 297 | g_main_loop_run (f->loop); |
266 | 298 | } |
267 | 299 | |
300 | static void | |
301 | test_net_properties (Fixture *f, | |
302 | gconstpointer data) | |
303 | { | |
304 | GSList *uris; | |
305 | gchar *request; | |
306 | GrlNetWc *wc; | |
307 | ThrottlingOperation *op; | |
308 | ||
309 | g_test_bug ("769331"); | |
310 | ||
311 | GError *error = NULL; | |
312 | soup_server_add_handler (f->server, NULL, soup_server_throttling_cb, NULL, NULL); | |
313 | soup_server_listen_local (f->server, 0, SOUP_SERVER_LISTEN_IPV4_ONLY, &error); | |
314 | g_assert_no_error (error); | |
315 | ||
316 | uris = soup_server_get_uris (f->server); | |
317 | g_assert_nonnull (uris); | |
318 | #if SOUP_CHECK_VERSION (2, 99, 2) | |
319 | request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD); | |
320 | g_slist_free_full (uris, (GDestroyNotify) g_uri_unref); | |
321 | #else | |
322 | request = soup_uri_to_string (uris->data, FALSE); | |
323 | g_slist_free_full (uris, (GDestroyNotify) soup_uri_free); | |
324 | #endif | |
325 | g_assert_nonnull (request); | |
326 | ||
327 | wc = grl_net_wc_new (); | |
328 | g_object_set (G_OBJECT (wc), | |
329 | "throttling", 0, | |
330 | "cache", TRUE, | |
331 | "cache-size", 5, | |
332 | "user-agent", "grl net test 0.1", | |
333 | NULL); | |
334 | ||
335 | op = throttling_operation_new(f, NO_DELAY); | |
336 | grl_net_wc_request_async (wc, request, f->cancellable, test_net_wc_throttling_cb, op); | |
337 | ||
338 | f->timeout_is_expected = FALSE; | |
339 | g_main_loop_run (f->loop); | |
340 | ||
341 | guint max_conns_per_host; | |
342 | g_autofree char *user_agent = NULL; | |
343 | ||
344 | g_assert_nonnull (wc->session); | |
345 | g_object_get (G_OBJECT (wc->session), | |
346 | "max-conns-per-host", &max_conns_per_host, | |
347 | "user-agent", &user_agent, | |
348 | NULL); | |
349 | g_assert_cmpuint (max_conns_per_host, ==, 2); | |
350 | g_assert_cmpstr (user_agent, ==, "grl net test 0.1"); | |
351 | ||
352 | SoupSessionFeature *cache; | |
353 | g_autofree char *cache_dir = NULL; | |
354 | cache = soup_session_get_feature (wc->session, SOUP_TYPE_CACHE); | |
355 | g_assert_nonnull (cache); | |
356 | g_assert_cmpuint (soup_cache_get_max_size (SOUP_CACHE (cache)), ==, 5 * 1024 * 1024); | |
357 | g_object_get (G_OBJECT (cache), "cache-dir", &cache_dir, NULL); | |
358 | g_assert_nonnull (strstr (cache_dir, "grilo-plugin-cache")); | |
359 | ||
360 | g_object_unref (wc); | |
361 | g_free (request); | |
362 | } | |
363 | ||
268 | 364 | int |
269 | 365 | main (int argc, char **argv) |
270 | 366 | { |
292 | 388 | test_net_wc_no_throttling_stress, |
293 | 389 | fixture_teardown); |
294 | 390 | |
391 | g_test_add ("/net/properties", | |
392 | Fixture, NULL, | |
393 | fixture_setup, | |
394 | test_net_properties, | |
395 | fixture_teardown); | |
396 | ||
295 | 397 | return g_test_run (); |
296 | 398 | } |
71 | 71 | } |
72 | 72 | } |
73 | 73 | |
74 | static void | |
75 | range_filters_max_min_null(void) | |
76 | { | |
77 | GrlOperationOptions *options = grl_operation_options_new (NULL); | |
78 | gboolean ret; | |
79 | GValue value = G_VALUE_INIT; | |
80 | GValue *max, *min; | |
81 | ||
82 | g_test_bug ("148"); | |
83 | ||
84 | /* Before */ | |
85 | grl_operation_options_get_key_range_filter (options, | |
86 | GRL_METADATA_KEY_ORIENTATION, | |
87 | &min, | |
88 | &max); | |
89 | /* TODO: this is actually a bug. Should get default min/max for this metadata-key 0/359. | |
90 | * Seems that grilo stores the range in GParamSpec but does not set it in the HashTable | |
91 | * GrlOperationsOptions look at. */ | |
92 | g_assert_null(min); | |
93 | g_assert_null(max); | |
94 | ||
95 | /* Test MIN */ | |
96 | g_value_init (&value, G_TYPE_INT); | |
97 | g_value_set_int (&value, 90); | |
98 | ret = grl_operation_options_set_key_range_filter_value (options, | |
99 | GRL_METADATA_KEY_ORIENTATION, | |
100 | &value, | |
101 | NULL); | |
102 | g_assert_true(ret); | |
103 | ||
104 | grl_operation_options_get_key_range_filter (options, GRL_METADATA_KEY_ORIENTATION, &min, &max); | |
105 | g_assert_cmpint(g_value_get_int (min), ==, 90); | |
106 | // TODO: Same bug, as max was not set we receive NULL instead | |
107 | g_assert_null(max); | |
108 | g_value_unset(min); | |
109 | ||
110 | /* Test MAX */ | |
111 | g_value_set_int (&value, 180); | |
112 | ret = grl_operation_options_set_key_range_filter_value (options, | |
113 | GRL_METADATA_KEY_ORIENTATION, | |
114 | NULL, | |
115 | &value); | |
116 | g_assert_true(ret); | |
117 | ||
118 | grl_operation_options_get_key_range_filter (options, GRL_METADATA_KEY_ORIENTATION, &min, &max); | |
119 | /* TODO: This is another bug. When we set max above, the min should not be changed. | |
120 | * g_assert_cmpint(g_value_get_int (min), ==, 90); | |
121 | */ | |
122 | g_assert_null(min); | |
123 | g_assert_cmpint(g_value_get_int (max), ==, 180); | |
124 | g_value_unset(max); | |
125 | } | |
126 | ||
74 | 127 | int |
75 | 128 | main (int argc, char **argv) |
76 | 129 | { |
84 | 137 | |
85 | 138 | /* registry tests */ |
86 | 139 | g_test_add_func ("/operation/range-filters/max-min/int", range_filters_max_min_int); |
140 | g_test_add_func ("/operation/range-filters/max-min/null", range_filters_max_min_null); | |
87 | 141 | |
88 | 142 | return g_test_run (); |
89 | 143 | } |
14 | 14 | run_command(python, |
15 | 15 | '@0@/generate_core_keys.py'.format(meson.current_source_dir()), |
16 | 16 | '@0@/src/grl-metadata-key.h'.format(source_root), |
17 | '@0@/grl-core-keys.h'.format(meson.current_build_dir())) | |
17 | '@0@/grl-core-keys.h'.format(meson.current_build_dir()), | |
18 | check: true) | |
18 | 19 | |
19 | 20 | configure_file(output: 'config.h', |
20 | 21 | configuration: cdata) |