/** * as_image_node_parse_dep11: * @image: a #AsImage instance. * @node: a #GNode. * @ctx: a #AsNodeContext. * @error: A #GError or %NULL. * * Populates the object from a DEP-11 node. * * Returns: %TRUE for success * * Since: 0.3.0 **/ gboolean as_image_node_parse_dep11 (AsImage *im, GNode *node, AsNodeContext *ctx, GError **error) { GNode *n; const gchar *tmp; for (n = node->children; n != NULL; n = n->next) { tmp = as_yaml_node_get_key (n); if (g_strcmp0 (tmp, "height") == 0) as_image_set_height (im, as_yaml_node_get_value_as_uint (n)); else if (g_strcmp0 (tmp, "width") == 0) as_image_set_width (im, as_yaml_node_get_value_as_uint (n)); else if (g_strcmp0 (tmp, "url") == 0) { const gchar *media_base_url = as_node_context_get_media_base_url (ctx); if (media_base_url != NULL) { g_autofree gchar *url = NULL; url = g_build_path ("/", media_base_url, as_yaml_node_get_value (n), NULL); as_image_set_url (im, url); } else { as_image_set_url (im, as_yaml_node_get_value (n)); } } } return TRUE; }
/** * as_image_node_parse_dep11: * @image: a #AsImage instance. * @node: a #GNode. * @ctx: a #AsNodeContext. * @error: A #GError or %NULL. * * Populates the object from a DEP-11 node. * * Returns: %TRUE for success * * Since: 0.3.0 **/ gboolean as_image_node_parse_dep11 (AsImage *im, GNode *node, AsNodeContext *ctx, GError **error) { GNode *n; const gchar *tmp; for (n = node->children; n != NULL; n = n->next) { tmp = as_yaml_node_get_key (n); if (g_strcmp0 (tmp, "height") == 0) as_image_set_height (im, as_yaml_node_get_value_as_int (n)); else if (g_strcmp0 (tmp, "width") == 0) as_image_set_width (im, as_yaml_node_get_value_as_int (n)); else if (g_strcmp0 (tmp, "url") == 0) as_image_set_url (im, as_yaml_node_get_value (n)); } return TRUE; }
static gboolean gs_plugin_steam_update_screenshots (AsApp *app, const gchar *html, GError **error) { const gchar *gameid_str; gchar *tmp1; guint i = 0; guint idx = 0; /* find all the screenshots */ gameid_str = as_app_get_metadata_item (app, "X-Steam-GameID"); while ((tmp1 = gs_plugin_steam_capture (html, "data-screenshotid=\"", "\"", &i))) { g_autoptr(AsImage) im = NULL; g_autoptr(AsScreenshot) ss = NULL; g_autofree gchar *cdn_uri = NULL; /* create an image */ im = as_image_new (); as_image_set_kind (im, AS_IMAGE_KIND_SOURCE); cdn_uri = g_build_filename (GS_PLUGIN_STEAM_SCREENSHOT_URI, gameid_str, tmp1, NULL); as_image_set_url (im, cdn_uri); /* create screenshot with no caption */ ss = as_screenshot_new (); as_screenshot_set_kind (ss, idx == 0 ? AS_SCREENSHOT_KIND_DEFAULT : AS_SCREENSHOT_KIND_NORMAL); as_screenshot_add_image (ss, im); as_app_add_screenshot (app, ss); g_free (tmp1); /* limit this to a sane number */ if (idx++ >= 4) break; } return TRUE; }
static void refine_screenshots (GsApp *app, SnapdSnap *snap) { GPtrArray *media, *screenshots; guint i; media = snapd_snap_get_media (snap); for (i = 0; i < media->len; i++) { SnapdMedia *m = media->pdata[i]; const gchar *url; g_autofree gchar *filename = NULL; g_autoptr(AsScreenshot) ss = NULL; g_autoptr(AsImage) image = NULL; if (g_strcmp0 (snapd_media_get_media_type (m), "screenshot") != 0) continue; /* skip screenshots used for banner when app is featured */ url = snapd_media_get_url (m); filename = g_path_get_basename (url); if (is_banner_image (filename) || is_banner_icon_image (filename)) continue; ss = as_screenshot_new (); as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_NORMAL); image = as_image_new (); as_image_set_url (image, snapd_media_get_url (m)); as_image_set_kind (image, AS_IMAGE_KIND_SOURCE); as_image_set_width (image, snapd_media_get_width (m)); as_image_set_height (image, snapd_media_get_height (m)); as_screenshot_add_image (ss, image); gs_app_add_screenshot (app, ss); } if (gs_app_get_screenshots (app)->len > 0) return; /* fallback to old screenshots data */ G_GNUC_BEGIN_IGNORE_DEPRECATIONS screenshots = snapd_snap_get_screenshots (snap); G_GNUC_END_IGNORE_DEPRECATIONS for (i = 0; i < screenshots->len; i++) { SnapdScreenshot *screenshot = screenshots->pdata[i]; const gchar *url; g_autofree gchar *filename = NULL; g_autoptr(AsScreenshot) ss = NULL; g_autoptr(AsImage) image = NULL; /* skip screenshots used for banner when app is featured */ url = snapd_screenshot_get_url (screenshot); filename = g_path_get_basename (url); if (is_banner_image (filename) || is_banner_icon_image (filename)) continue; ss = as_screenshot_new (); as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_NORMAL); image = as_image_new (); as_image_set_url (image, snapd_screenshot_get_url (screenshot)); as_image_set_kind (image, AS_IMAGE_KIND_SOURCE); as_image_set_width (image, snapd_screenshot_get_width (screenshot)); as_image_set_height (image, snapd_screenshot_get_height (screenshot)); as_screenshot_add_image (ss, image); gs_app_add_screenshot (app, ss); } }
/** * as_screenshot_node_parse: * @screenshot: a #AsScreenshot instance. * @node: a #GNode. * @ctx: a #AsNodeContext. * @error: A #GError or %NULL. * * Populates the object from a DOM node. * * Returns: %TRUE for success * * Since: 0.1.0 **/ gboolean as_screenshot_node_parse (AsScreenshot *screenshot, GNode *node, AsNodeContext *ctx, GError **error) { AsScreenshotPrivate *priv = GET_PRIVATE (screenshot); GList *l; GNode *c; const gchar *tmp; guint size; gint priority; g_autoptr(GHashTable) captions = NULL; tmp = as_node_get_attribute (node, "type"); if (tmp != NULL) { as_screenshot_set_kind (screenshot, as_screenshot_kind_from_string (tmp)); } priority = as_node_get_attribute_as_int (node, "priority"); if (priority != G_MAXINT) as_screenshot_set_priority (screenshot, priority); /* add captions */ captions = as_node_get_localized (node, "caption"); if (captions != NULL) { g_autoptr(GList) keys = NULL; keys = g_hash_table_get_keys (captions); for (l = keys; l != NULL; l = l->next) { tmp = l->data; as_screenshot_set_caption (screenshot, tmp, g_hash_table_lookup (captions, tmp)); } } /* AppData files does not have <image> tags */ tmp = as_node_get_data (node); if (tmp != NULL) { AsImage *image; image = as_image_new (); as_image_set_kind (image, AS_IMAGE_KIND_SOURCE); size = as_node_get_attribute_as_uint (node, "width"); if (size != G_MAXINT) as_image_set_width (image, size); size = as_node_get_attribute_as_uint (node, "height"); if (size != G_MAXINT) as_image_set_height (image, size); as_image_set_url (image, tmp); g_ptr_array_add (priv->images, image); } /* add images */ for (c = node->children; c != NULL; c = c->next) { g_autoptr(AsImage) image = NULL; if (as_node_get_tag (c) != AS_TAG_IMAGE) continue; image = as_image_new (); if (!as_image_node_parse (image, c, ctx, error)) return FALSE; g_ptr_array_add (priv->images, g_object_ref (image)); } return TRUE; }
static void refine_app (GsPlugin *plugin, GsApp *app, JsonObject *package, gboolean from_search, GCancellable *cancellable) { g_autofree gchar *macaroon = NULL; g_auto(GStrv) discharges = NULL; const gchar *status, *icon_url, *launch_name = NULL; g_autoptr(GdkPixbuf) icon_pixbuf = NULL; gint64 size = -1; get_macaroon (plugin, &macaroon, &discharges); status = json_object_get_string_member (package, "status"); if (g_strcmp0 (status, "installed") == 0 || g_strcmp0 (status, "active") == 0) { const gchar *update_available; update_available = json_object_has_member (package, "update_available") ? json_object_get_string_member (package, "update_available") : NULL; if (update_available) gs_app_set_state (app, AS_APP_STATE_UPDATABLE); else { if (gs_app_get_state (app) == AS_APP_STATE_AVAILABLE) gs_app_set_state (app, AS_APP_STATE_UNKNOWN); gs_app_set_state (app, AS_APP_STATE_INSTALLED); } } else if (g_strcmp0 (status, "not installed") == 0 || g_strcmp0 (status, "available") == 0) { gs_app_set_state (app, AS_APP_STATE_AVAILABLE); } gs_app_set_name (app, GS_APP_QUALITY_HIGHEST, json_object_get_string_member (package, "summary")); gs_app_set_summary (app, GS_APP_QUALITY_HIGHEST, json_object_get_string_member (package, "summary")); gs_app_set_description (app, GS_APP_QUALITY_HIGHEST, json_object_get_string_member (package, "description")); gs_app_set_version (app, json_object_get_string_member (package, "version")); if (json_object_has_member (package, "installed-size")) { size = json_object_get_int_member (package, "installed-size"); if (size > 0) gs_app_set_size_installed (app, (guint64) size); } if (json_object_has_member (package, "download-size")) { size = json_object_get_int_member (package, "download-size"); if (size > 0) gs_app_set_size_download (app, (guint64) size); } gs_app_add_quirk (app, AS_APP_QUIRK_PROVENANCE); icon_url = json_object_get_string_member (package, "icon"); if (g_str_has_prefix (icon_url, "/")) { g_autofree gchar *icon_data = NULL; gsize icon_data_length; g_autoptr(GError) error = NULL; icon_data = gs_snapd_get_resource (macaroon, discharges, icon_url, &icon_data_length, cancellable, &error); if (icon_data != NULL) { g_autoptr(GdkPixbufLoader) loader = NULL; loader = gdk_pixbuf_loader_new (); gdk_pixbuf_loader_write (loader, (guchar *) icon_data, icon_data_length, NULL); gdk_pixbuf_loader_close (loader, NULL); icon_pixbuf = g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader)); } else g_printerr ("Failed to get icon: %s\n", error->message); } else { g_autoptr(SoupMessage) message = NULL; g_autoptr(GdkPixbufLoader) loader = NULL; message = soup_message_new (SOUP_METHOD_GET, icon_url); if (message != NULL) { soup_session_send_message (gs_plugin_get_soup_session (plugin), message); loader = gdk_pixbuf_loader_new (); gdk_pixbuf_loader_write (loader, (guint8 *) message->response_body->data, (gsize) message->response_body->length, NULL); gdk_pixbuf_loader_close (loader, NULL); icon_pixbuf = g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader)); } } if (icon_pixbuf) { gs_app_set_pixbuf (app, icon_pixbuf); } else { g_autoptr(AsIcon) icon = as_icon_new (); as_icon_set_kind (icon, AS_ICON_KIND_STOCK); as_icon_set_name (icon, "package-x-generic"); gs_app_add_icon (app, icon); } if (json_object_has_member (package, "screenshots") && gs_app_get_screenshots (app)->len <= 0) { JsonArray *screenshots; guint i; screenshots = json_object_get_array_member (package, "screenshots"); for (i = 0; i < json_array_get_length (screenshots); i++) { JsonObject *screenshot = json_array_get_object_element (screenshots, i); g_autoptr(AsScreenshot) ss = NULL; g_autoptr(AsImage) image = NULL; ss = as_screenshot_new (); as_screenshot_set_kind (ss, AS_SCREENSHOT_KIND_NORMAL); image = as_image_new (); as_image_set_url (image, json_object_get_string_member (screenshot, "url")); as_image_set_kind (image, AS_IMAGE_KIND_SOURCE); as_screenshot_add_image (ss, image); gs_app_add_screenshot (app, ss); } } if (!from_search) { JsonArray *apps; apps = json_object_get_array_member (package, "apps"); if (apps && json_array_get_length (apps) > 0) launch_name = json_object_get_string_member (json_array_get_object_element (apps, 0), "name"); if (launch_name) gs_app_set_metadata (app, "snap::launch-name", launch_name); else gs_app_add_quirk (app, AS_APP_QUIRK_NOT_LAUNCHABLE); } }