Browse Source

[fix] dockerhub: switch to new api path

Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
Bnyro 4 months ago
parent
commit
0642c5434a
1 changed files with 24 additions and 12 deletions
  1. 24 12
      searx/engines/docker_hub.py

+ 24 - 12
searx/engines/docker_hub.py

@@ -19,14 +19,17 @@ about = {
 categories = ['it', 'packages']  # optional
 categories = ['it', 'packages']  # optional
 paging = True
 paging = True
 
 
-base_url = "https://hub.docker.com/"
-search_url = base_url + "api/content/v1/products/search?{query}&type=image&page_size=25"
+base_url = "https://hub.docker.com"
+page_size = 10
 
 
 
 
 def request(query, params):
 def request(query, params):
-
-    params['url'] = search_url.format(query=urlencode(dict(q=query, page=params["pageno"])))
-    params["headers"]["Search-Version"] = "v3"
+    args = {
+        "query": query,
+        "from": page_size * (params['pageno'] - 1),
+        "size": page_size,
+    }
+    params['url'] = f"{base_url}/api/search/v3/catalog/search?{urlencode(args)}"
 
 
     return params
     return params
 
 
@@ -36,23 +39,32 @@ def response(resp):
     resp: requests response object
     resp: requests response object
     '''
     '''
     results = []
     results = []
-    body = resp.json()
+    json_resp = resp.json()
+
+    for item in json_resp.get("results", []):
+        image_source = item.get("source")
+        is_official = image_source in ["store", "official"]
+
+        popularity_infos = [f"{item.get('star_count', 0)} stars"]
 
 
-    for item in body.get("summaries", []):
-        filter_type = item.get("filter_type")
-        is_official = filter_type in ["store", "official"]
+        architectures = []
+        for rate_plan in item.get("rate_plans", []):
+            pull_count = rate_plan.get("repositories", [{}])[0].get("pull_count")
+            if pull_count:
+                popularity_infos.insert(0, f"{pull_count} pulls")
+            architectures.extend(arch['name'] for arch in rate_plan.get("architectures", []) if arch['name'])
 
 
         result = {
         result = {
             'template': 'packages.html',
             'template': 'packages.html',
-            'url': base_url + ("_/" if is_official else "r/") + item.get("slug", ""),
+            'url': base_url + ("/_/" if is_official else "/r/") + item.get("slug", ""),
             'title': item.get("name"),
             'title': item.get("name"),
             'content': item.get("short_description"),
             'content': item.get("short_description"),
             'thumbnail': item["logo_url"].get("large") or item["logo_url"].get("small"),
             'thumbnail': item["logo_url"].get("large") or item["logo_url"].get("small"),
             'package_name': item.get("name"),
             'package_name': item.get("name"),
             'maintainer': item["publisher"].get("name"),
             'maintainer': item["publisher"].get("name"),
             'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")),
             'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")),
-            'popularity': item.get("pull_count", "0") + " pulls",
-            'tags': [arch['name'] for arch in item["architectures"]],
+            'popularity': ', '.join(popularity_infos),
+            'tags': architectures,
         }
         }
         results.append(result)
         results.append(result)