8 Commits

Author SHA1 Message Date
return42
738906358b [data] update searx.data - update_currencies.py 2025-01-29 06:23:04 +01:00
return42
fc8938c968 [data] update searx.data - update_ahmia_blacklist.py 2025-01-29 06:07:28 +01:00
return42
3b9e06fbd2 [data] update searx.data - update_wikidata_units.py 2025-01-29 06:06:50 +01:00
return42
4934922156 [data] update searx.data - update_engine_traits.py 2025-01-29 06:05:58 +01:00
return42
bee39e4ec0 [data] update searx.data - update_engine_descriptions.py 2025-01-29 06:04:54 +01:00
Markus Heiser
3f4e0b0859 [fix] gettext can't work with f-strings (i10n)
``str.format`` is the pythonic way of handling strings returned by
gettext.gettext that retain interpolation tokens.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-29 06:04:09 +01:00
Markus Heiser
a235c54f8c [mod] rudimentary implementation of a MainResult type
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-29 05:04:41 +01:00
Markus Heiser
df3344e5d5 [fix] JSON & CSV format return error 500
For CSV and JSON output, the LegacyResult and the Result objects needs to be
converted to a python dictionary.

Closes: https://github.com/searxng/searxng/issues/4244
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-29 05:04:41 +01:00
11 changed files with 960 additions and 230 deletions

View File

@@ -33,7 +33,7 @@ class SXNGAnswerer(Answerer):
return AnswererInfo( return AnswererInfo(
name=gettext(self.__doc__), name=gettext(self.__doc__),
description=gettext(f"Compute {'/'.join(self.keywords)} of the arguments"), description=gettext("Compute {func} of the arguments".format(func='/'.join(self.keywords))),
keywords=self.keywords, keywords=self.keywords,
examples=["avg 123 548 2.04 24.2"], examples=["avg 123 548 2.04 24.2"],
) )

File diff suppressed because it is too large Load Diff

View File

@@ -5359,6 +5359,7 @@
"pt": "pa'anga", "pt": "pa'anga",
"ru": "тонганская паанга", "ru": "тонганская паанга",
"sk": "Tonžská paʻanga", "sk": "Tonžská paʻanga",
"sl": "tongovska paanga",
"sr": "тонганска панга", "sr": "тонганска панга",
"sv": "Tongansk pa'anga", "sv": "Tongansk pa'anga",
"th": "ปาอางา", "th": "ปาอางา",
@@ -5990,6 +5991,23 @@
"uk": "Східно-карибський долар", "uk": "Східно-карибський долар",
"vi": "Đô la Đông Caribe" "vi": "Đô la Đông Caribe"
}, },
"XCG": {
"ar": "الجلدر الكاريبي",
"ca": "florí caribeny",
"de": "Karibischer Gulden",
"en": "Caribbean guilder",
"eo": "Karibia guldeno",
"es": "florín caribeño",
"fr": "Florin caribéen",
"hr": "Karipski gulden",
"hu": "karibi forint",
"it": "fiorino caraibico",
"nl": "Caribische gulden",
"pap": "Florin karibense",
"pt": "Florim do Caribe",
"ru": "Карибский гульден",
"sl": "karibski goldinar"
},
"XDR": { "XDR": {
"ar": "حقوق السحب الخاصة", "ar": "حقوق السحب الخاصة",
"bg": "Специални права на тираж", "bg": "Специални права на тираж",
@@ -6109,6 +6127,7 @@
"vi": "Franc CFP" "vi": "Franc CFP"
}, },
"XPT": { "XPT": {
"ar": "استثمار البلاتين",
"de": "Platinpreis", "de": "Platinpreis",
"en": "platinum as an investment" "en": "platinum as an investment"
}, },
@@ -6375,6 +6394,7 @@
"CLP$": "CLP", "CLP$": "CLP",
"COL$": "COP", "COL$": "COP",
"COU$": "COU", "COU$": "COU",
"Cg": "XCG",
"D": "GMD", "D": "GMD",
"DA": "DZD", "DA": "DZD",
"DEN": "MKD", "DEN": "MKD",
@@ -6439,6 +6459,7 @@
"NT$": "TWD", "NT$": "TWD",
"NZ$": "NZD", "NZ$": "NZD",
"Nfk": "ERN", "Nfk": "ERN",
"Noha heinen krasss": "EUR",
"Nu": "BTN", "Nu": "BTN",
"N₨": "NPR", "N₨": "NPR",
"P": "BWP", "P": "BWP",
@@ -6469,6 +6490,7 @@
"Ush": "UGX", "Ush": "UGX",
"VT": "VUV", "VT": "VUV",
"WS$": "WST", "WS$": "WST",
"XCG": "XCG",
"XDR": "XDR", "XDR": "XDR",
"Z$": "ZWL", "Z$": "ZWL",
"ZK": "ZMW", "ZK": "ZMW",
@@ -7041,6 +7063,8 @@
"canadiske dollar": "CAD", "canadiske dollar": "CAD",
"cape verde escudo": "CVE", "cape verde escudo": "CVE",
"cape verdean escudo": "CVE", "cape verdean escudo": "CVE",
"caribbean guilder": "XCG",
"caribische gulden": "XCG",
"cayman adaları doları": "KYD", "cayman adaları doları": "KYD",
"cayman islands dollar": "KYD", "cayman islands dollar": "KYD",
"caymaneilandse dollar": "KYD", "caymaneilandse dollar": "KYD",
@@ -8382,6 +8406,7 @@
"filler": "HUF", "filler": "HUF",
"fillér": "HUF", "fillér": "HUF",
"fiorino arubano": "AWG", "fiorino arubano": "AWG",
"fiorino caraibico": "XCG",
"fiorino delle antille olandesi": "ANG", "fiorino delle antille olandesi": "ANG",
"fiorino di aruba": "AWG", "fiorino di aruba": "AWG",
"fiorino ungherese": "HUF", "fiorino ungherese": "HUF",
@@ -8393,6 +8418,7 @@
"florim das antilhas holandesas": "ANG", "florim das antilhas holandesas": "ANG",
"florim das antilhas neerlandesas": "ANG", "florim das antilhas neerlandesas": "ANG",
"florim de aruba": "AWG", "florim de aruba": "AWG",
"florim do caribe": "XCG",
"florim húngaro": "HUF", "florim húngaro": "HUF",
"florin": "AWG", "florin": "AWG",
"florin antiano": "ANG", "florin antiano": "ANG",
@@ -8406,14 +8432,17 @@
"florin arubeño": "AWG", "florin arubeño": "AWG",
"florin arubez": "AWG", "florin arubez": "AWG",
"florin arubiano": "AWG", "florin arubiano": "AWG",
"florin caribéen": "XCG",
"florin d'aruba": "AWG", "florin d'aruba": "AWG",
"florin de las antilhas neerlandesas": "ANG", "florin de las antilhas neerlandesas": "ANG",
"florin des antilles néerlandaises": "ANG", "florin des antilles néerlandaises": "ANG",
"florin daruba": "AWG", "florin daruba": "AWG",
"florin hungaro": "HUF", "florin hungaro": "HUF",
"florin húngaro": "HUF", "florin húngaro": "HUF",
"florin karibense": "XCG",
"florint": "HUF", "florint": "HUF",
"florint húngaro": "HUF", "florint húngaro": "HUF",
"florí caribeny": "XCG",
"florí d'aruba": "AWG", "florí d'aruba": "AWG",
"florí de les antilles neerlandeses": "ANG", "florí de les antilles neerlandeses": "ANG",
"florí daruba": "AWG", "florí daruba": "AWG",
@@ -8421,6 +8450,7 @@
"florín antillano neerlandés": "ANG", "florín antillano neerlandés": "ANG",
"florín arubeno": "AWG", "florín arubeno": "AWG",
"florín arubeño": "AWG", "florín arubeño": "AWG",
"florín caribeño": "XCG",
"florín das antillas neerlandesas": "ANG", "florín das antillas neerlandesas": "ANG",
"florín de aruba": "AWG", "florín de aruba": "AWG",
"florín hungaro": "HUF", "florín hungaro": "HUF",
@@ -9162,6 +9192,11 @@
"kapverdské escudo": "CVE", "kapverdské escudo": "CVE",
"kapverdski eskudo": "CVE", "kapverdski eskudo": "CVE",
"karbovanet": "UAH", "karbovanet": "UAH",
"karibi forint": "XCG",
"karibia guldeno": "XCG",
"karibischer gulden": "XCG",
"karibski goldinar": "XCG",
"karipski gulden": "XCG",
"karod": "NPR", "karod": "NPR",
"kartvela lario": "GEL", "kartvela lario": "GEL",
"katar riyal": "QAR", "katar riyal": "QAR",
@@ -11966,6 +12001,7 @@
"tongaška paanga": "TOP", "tongaška paanga": "TOP",
"tongos pa'anga": "TOP", "tongos pa'anga": "TOP",
"tongos paanga": "TOP", "tongos paanga": "TOP",
"tongovska paanga": "TOP",
"tonška paanga": "TOP", "tonška paanga": "TOP",
"tonžská pa'anga": "TOP", "tonžská pa'anga": "TOP",
"tonžská paanga": "TOP", "tonžská paanga": "TOP",
@@ -13202,6 +13238,7 @@
"канадски долар": "CAD", "канадски долар": "CAD",
"канадский доллар": "CAD", "канадский доллар": "CAD",
"канадський долар": "CAD", "канадський долар": "CAD",
"карибский гульден": "XCG",
"катар риалы": "QAR", "катар риалы": "QAR",
"катарски риал": "QAR", "катарски риал": "QAR",
"катарски ријал": "QAR", "катарски ријал": "QAR",
@@ -14234,6 +14271,7 @@
"שקל ישראלי חדש": "ILS", "שקל ישראלי חדש": "ILS",
"؋": "AFN", "؋": "AFN",
"ارياري": "MGA", "ارياري": "MGA",
"استثمار البلاتين": "XPT",
"استثمار الذهب": "XAU", "استثمار الذهب": "XAU",
"استثمار الفضة": "XAG", "استثمار الفضة": "XAG",
"الاستثمار في الذهب": "XAU", "الاستثمار في الذهب": "XAU",
@@ -14243,6 +14281,7 @@
"البوليفيانو": "BOB", "البوليفيانو": "BOB",
"البيزو الكوبي": "CUP", "البيزو الكوبي": "CUP",
"البيزو المكسيكي": "MXN", "البيزو المكسيكي": "MXN",
"الجلدر الكاريبي": "XCG",
"الجنية البريطاني": "GBP", "الجنية البريطاني": "GBP",
"الجنية المصري": "EGP", "الجنية المصري": "EGP",
"الجنيه الاسترليني": "GBP", "الجنيه الاسترليني": "GBP",

File diff suppressed because one or more lines are too long

View File

@@ -19,11 +19,11 @@
"cbz", "cbz",
"djvu", "djvu",
"doc", "doc",
"docx",
"epub", "epub",
"fb2", "fb2",
"htm", "htm",
"html", "html",
"jpg",
"lit", "lit",
"lrf", "lrf",
"mht", "mht",
@@ -42,6 +42,7 @@
"newest_added", "newest_added",
"oldest", "oldest",
"oldest_added", "oldest_added",
"random",
"smallest" "smallest"
] ]
}, },
@@ -195,7 +196,7 @@
"es": "es-es", "es": "es-es",
"et": "et-et", "et": "et-et",
"eu": "eu-eu", "eu": "eu-eu",
"fa": "fa-fa", "fa": "prs-prs",
"fi": "fi-fi", "fi": "fi-fi",
"fil": "fil-fil", "fil": "fil-fil",
"fr": "fr-fr", "fr": "fr-fr",
@@ -203,12 +204,14 @@
"gd": "gd-gd", "gd": "gd-gd",
"gl": "gl-gl", "gl": "gl-gl",
"gu": "gu-gu", "gu": "gu-gu",
"ha": "ha-latn",
"he": "he-he", "he": "he-he",
"hi": "hi-hi", "hi": "hi-hi",
"hr": "hr-hr", "hr": "hr-hr",
"hu": "hu-hu", "hu": "hu-hu",
"hy": "hy-hy", "hy": "hy-hy",
"id": "id-id", "id": "id-id",
"ig": "ig-ig",
"is": "is-is", "is": "is-is",
"it": "it-it", "it": "it-it",
"ja": "ja-ja", "ja": "ja-ja",
@@ -218,6 +221,8 @@
"kn": "kn-kn", "kn": "kn-kn",
"ko": "ko-ko", "ko": "ko-ko",
"kok": "kok-kok", "kok": "kok-kok",
"ku": "ku-arab",
"ky": "ky-ky",
"lb": "lb-lb", "lb": "lb-lb",
"lo": "lo-lo", "lo": "lo-lo",
"lt": "lt-lt", "lt": "lt-lt",
@@ -225,6 +230,7 @@
"mi": "mi-mi", "mi": "mi-mi",
"mk": "mk-mk", "mk": "mk-mk",
"ml": "ml-ml", "ml": "ml-ml",
"mn": "mn-cyrl-mn",
"mr": "mr-mr", "mr": "mr-mr",
"ms": "ms-ms", "ms": "ms-ms",
"mt": "mt-mt", "mt": "mt-mt",
@@ -232,22 +238,33 @@
"ne": "ne-ne", "ne": "ne-ne",
"nl": "nl-nl", "nl": "nl-nl",
"nn": "nn-nn", "nn": "nn-nn",
"nso": "nso-nso",
"or": "or-or", "or": "or-or",
"pa_Arab": "pa-arab",
"pa_Guru": "pa-guru", "pa_Guru": "pa-guru",
"pl": "pl-pl", "pl": "pl-pl",
"pt": "pt-br", "pt": "pt-br",
"qu": "quz-quz", "qu": "quz-quz",
"quc": "quc-quc",
"ro": "ro-ro", "ro": "ro-ro",
"ru": "ru-ru", "ru": "ru-ru",
"rw": "rw-rw",
"sd_Arab": "sd-arab",
"si": "si-si",
"sk": "sk-sk", "sk": "sk-sk",
"sl": "sl-sl", "sl": "sl-sl",
"sq": "sq-sq", "sq": "sq-sq",
"sr_Cyrl": "sr-cyrl", "sr_Cyrl": "sr-cyrl",
"sr_Latn": "sr-latn", "sr_Latn": "sr-latn",
"sv": "sv-sv", "sv": "sv-sv",
"sw": "sw-sw",
"ta": "ta-ta", "ta": "ta-ta",
"te": "te-te", "te": "te-te",
"tg": "tg-cyrl",
"th": "th-th", "th": "th-th",
"ti": "ti-ti",
"tk": "tk-tk",
"tn": "tn-tn",
"tr": "tr-tr", "tr": "tr-tr",
"tt": "tt-tt", "tt": "tt-tt",
"ug": "ug-ug", "ug": "ug-ug",
@@ -255,9 +272,13 @@
"ur": "ur-ur", "ur": "ur-ur",
"uz_Latn": "uz-latn", "uz_Latn": "uz-latn",
"vi": "vi-vi", "vi": "vi-vi",
"wo": "wo-wo",
"xh": "xh-xh",
"yo": "yo-yo",
"zh": "zh-hans", "zh": "zh-hans",
"zh_Hans": "zh-hans", "zh_Hans": "zh-hans",
"zh_Hant": "zh-hant" "zh_Hant": "zh-hant",
"zu": "zu-zu"
}, },
"regions": { "regions": {
"am-ET": "am-et", "am-ET": "am-et",
@@ -473,12 +494,14 @@
"kk-KZ": "kk-kz", "kk-KZ": "kk-kz",
"km-KH": "km-kh", "km-KH": "km-kh",
"ko-KR": "ko-kr", "ko-KR": "ko-kr",
"ky-KG": "ky-kg",
"lb-LU": "lb-lu", "lb-LU": "lb-lu",
"lo-LA": "lo-la", "lo-LA": "lo-la",
"lt-LT": "lt-lt", "lt-LT": "lt-lt",
"lv-LV": "lv-lv", "lv-LV": "lv-lv",
"mi-NZ": "mi-nz", "mi-NZ": "mi-nz",
"mk-MK": "mk-mk", "mk-MK": "mk-mk",
"mn-MN": "mn-mn",
"ms-BN": "ms-bn", "ms-BN": "ms-bn",
"ms-MY": "ms-my", "ms-MY": "ms-my",
"ms-SG": "ms-sg", "ms-SG": "ms-sg",
@@ -512,6 +535,8 @@
"ru-KZ": "ru-kz", "ru-KZ": "ru-kz",
"ru-RU": "ru-ru", "ru-RU": "ru-ru",
"ru-UA": "ru-ua", "ru-UA": "ru-ua",
"rw-RW": "rw-rw",
"si-LK": "si-lk",
"sk-SK": "sk-sk", "sk-SK": "sk-sk",
"sl-SI": "sl-si", "sl-SI": "sl-si",
"sq-AL": "sq-al", "sq-AL": "sq-al",
@@ -520,14 +545,23 @@
"sr-RS": "sr-rs", "sr-RS": "sr-rs",
"sv-FI": "sv-fi", "sv-FI": "sv-fi",
"sv-SE": "sv-se", "sv-SE": "sv-se",
"sw-KE": "sw-ke",
"sw-TZ": "sw-tz",
"sw-UG": "sw-ug",
"ta-LK": "ta-lk", "ta-LK": "ta-lk",
"ta-SG": "ta-sg", "ta-SG": "ta-sg",
"tg-TJ": "tg-tj",
"th-TH": "th-th", "th-TH": "th-th",
"ti-ER": "ti-er",
"tk-TM": "tk-tm",
"tn-BW": "tn-bw",
"tr-CY": "tr-cy", "tr-CY": "tr-cy",
"tr-TR": "tr-tr", "tr-TR": "tr-tr",
"uk-UA": "uk-ua", "uk-UA": "uk-ua",
"ur-PK": "ur-pk", "ur-PK": "ur-pk",
"vi-VN": "vi-vn", "vi-VN": "vi-vn",
"wo-SN": "wo-sn",
"yo-NG": "yo-ng",
"zh-CN": "zh-cn", "zh-CN": "zh-cn",
"zh-HK": "en-hk", "zh-HK": "en-hk",
"zh-MO": "zh-mo", "zh-MO": "zh-mo",
@@ -560,7 +594,7 @@
"es": "es-es", "es": "es-es",
"et": "et-et", "et": "et-et",
"eu": "eu-eu", "eu": "eu-eu",
"fa": "fa-fa", "fa": "prs-prs",
"fi": "fi-fi", "fi": "fi-fi",
"fil": "fil-fil", "fil": "fil-fil",
"fr": "fr-fr", "fr": "fr-fr",
@@ -568,12 +602,14 @@
"gd": "gd-gd", "gd": "gd-gd",
"gl": "gl-gl", "gl": "gl-gl",
"gu": "gu-gu", "gu": "gu-gu",
"ha": "ha-latn",
"he": "he-he", "he": "he-he",
"hi": "hi-hi", "hi": "hi-hi",
"hr": "hr-hr", "hr": "hr-hr",
"hu": "hu-hu", "hu": "hu-hu",
"hy": "hy-hy", "hy": "hy-hy",
"id": "id-id", "id": "id-id",
"ig": "ig-ig",
"is": "is-is", "is": "is-is",
"it": "it-it", "it": "it-it",
"ja": "ja-ja", "ja": "ja-ja",
@@ -583,6 +619,8 @@
"kn": "kn-kn", "kn": "kn-kn",
"ko": "ko-ko", "ko": "ko-ko",
"kok": "kok-kok", "kok": "kok-kok",
"ku": "ku-arab",
"ky": "ky-ky",
"lb": "lb-lb", "lb": "lb-lb",
"lo": "lo-lo", "lo": "lo-lo",
"lt": "lt-lt", "lt": "lt-lt",
@@ -590,6 +628,7 @@
"mi": "mi-mi", "mi": "mi-mi",
"mk": "mk-mk", "mk": "mk-mk",
"ml": "ml-ml", "ml": "ml-ml",
"mn": "mn-cyrl-mn",
"mr": "mr-mr", "mr": "mr-mr",
"ms": "ms-ms", "ms": "ms-ms",
"mt": "mt-mt", "mt": "mt-mt",
@@ -597,22 +636,33 @@
"ne": "ne-ne", "ne": "ne-ne",
"nl": "nl-nl", "nl": "nl-nl",
"nn": "nn-nn", "nn": "nn-nn",
"nso": "nso-nso",
"or": "or-or", "or": "or-or",
"pa_Arab": "pa-arab",
"pa_Guru": "pa-guru", "pa_Guru": "pa-guru",
"pl": "pl-pl", "pl": "pl-pl",
"pt": "pt-br", "pt": "pt-br",
"qu": "quz-quz", "qu": "quz-quz",
"quc": "quc-quc",
"ro": "ro-ro", "ro": "ro-ro",
"ru": "ru-ru", "ru": "ru-ru",
"rw": "rw-rw",
"sd_Arab": "sd-arab",
"si": "si-si",
"sk": "sk-sk", "sk": "sk-sk",
"sl": "sl-sl", "sl": "sl-sl",
"sq": "sq-sq", "sq": "sq-sq",
"sr_Cyrl": "sr-cyrl", "sr_Cyrl": "sr-cyrl",
"sr_Latn": "sr-latn", "sr_Latn": "sr-latn",
"sv": "sv-sv", "sv": "sv-sv",
"sw": "sw-sw",
"ta": "ta-ta", "ta": "ta-ta",
"te": "te-te", "te": "te-te",
"tg": "tg-cyrl",
"th": "th-th", "th": "th-th",
"ti": "ti-ti",
"tk": "tk-tk",
"tn": "tn-tn",
"tr": "tr-tr", "tr": "tr-tr",
"tt": "tt-tt", "tt": "tt-tt",
"ug": "ug-ug", "ug": "ug-ug",
@@ -620,9 +670,13 @@
"ur": "ur-ur", "ur": "ur-ur",
"uz_Latn": "uz-latn", "uz_Latn": "uz-latn",
"vi": "vi-vi", "vi": "vi-vi",
"wo": "wo-wo",
"xh": "xh-xh",
"yo": "yo-yo",
"zh": "zh-hans", "zh": "zh-hans",
"zh_Hans": "zh-hans", "zh_Hans": "zh-hans",
"zh_Hant": "zh-hant" "zh_Hant": "zh-hant",
"zu": "zu-zu"
}, },
"regions": { "regions": {
"am-ET": "am-et", "am-ET": "am-et",
@@ -838,12 +892,14 @@
"kk-KZ": "kk-kz", "kk-KZ": "kk-kz",
"km-KH": "km-kh", "km-KH": "km-kh",
"ko-KR": "ko-kr", "ko-KR": "ko-kr",
"ky-KG": "ky-kg",
"lb-LU": "lb-lu", "lb-LU": "lb-lu",
"lo-LA": "lo-la", "lo-LA": "lo-la",
"lt-LT": "lt-lt", "lt-LT": "lt-lt",
"lv-LV": "lv-lv", "lv-LV": "lv-lv",
"mi-NZ": "mi-nz", "mi-NZ": "mi-nz",
"mk-MK": "mk-mk", "mk-MK": "mk-mk",
"mn-MN": "mn-mn",
"ms-BN": "ms-bn", "ms-BN": "ms-bn",
"ms-MY": "ms-my", "ms-MY": "ms-my",
"ms-SG": "ms-sg", "ms-SG": "ms-sg",
@@ -877,6 +933,8 @@
"ru-KZ": "ru-kz", "ru-KZ": "ru-kz",
"ru-RU": "ru-ru", "ru-RU": "ru-ru",
"ru-UA": "ru-ua", "ru-UA": "ru-ua",
"rw-RW": "rw-rw",
"si-LK": "si-lk",
"sk-SK": "sk-sk", "sk-SK": "sk-sk",
"sl-SI": "sl-si", "sl-SI": "sl-si",
"sq-AL": "sq-al", "sq-AL": "sq-al",
@@ -885,14 +943,23 @@
"sr-RS": "sr-rs", "sr-RS": "sr-rs",
"sv-FI": "sv-fi", "sv-FI": "sv-fi",
"sv-SE": "sv-se", "sv-SE": "sv-se",
"sw-KE": "sw-ke",
"sw-TZ": "sw-tz",
"sw-UG": "sw-ug",
"ta-LK": "ta-lk", "ta-LK": "ta-lk",
"ta-SG": "ta-sg", "ta-SG": "ta-sg",
"tg-TJ": "tg-tj",
"th-TH": "th-th", "th-TH": "th-th",
"ti-ER": "ti-er",
"tk-TM": "tk-tm",
"tn-BW": "tn-bw",
"tr-CY": "tr-cy", "tr-CY": "tr-cy",
"tr-TR": "tr-tr", "tr-TR": "tr-tr",
"uk-UA": "uk-ua", "uk-UA": "uk-ua",
"ur-PK": "ur-pk", "ur-PK": "ur-pk",
"vi-VN": "vi-vn", "vi-VN": "vi-vn",
"wo-SN": "wo-sn",
"yo-NG": "yo-ng",
"zh-CN": "zh-cn", "zh-CN": "zh-cn",
"zh-HK": "en-hk", "zh-HK": "en-hk",
"zh-MO": "zh-mo", "zh-MO": "zh-mo",
@@ -925,7 +992,7 @@
"es": "es-es", "es": "es-es",
"et": "et-et", "et": "et-et",
"eu": "eu-eu", "eu": "eu-eu",
"fa": "fa-fa", "fa": "prs-prs",
"fi": "fi-fi", "fi": "fi-fi",
"fil": "fil-fil", "fil": "fil-fil",
"fr": "fr-fr", "fr": "fr-fr",
@@ -933,12 +1000,14 @@
"gd": "gd-gd", "gd": "gd-gd",
"gl": "gl-gl", "gl": "gl-gl",
"gu": "gu-gu", "gu": "gu-gu",
"ha": "ha-latn",
"he": "he-he", "he": "he-he",
"hi": "hi-hi", "hi": "hi-hi",
"hr": "hr-hr", "hr": "hr-hr",
"hu": "hu-hu", "hu": "hu-hu",
"hy": "hy-hy", "hy": "hy-hy",
"id": "id-id", "id": "id-id",
"ig": "ig-ig",
"is": "is-is", "is": "is-is",
"it": "it-it", "it": "it-it",
"ja": "ja-ja", "ja": "ja-ja",
@@ -948,6 +1017,8 @@
"kn": "kn-kn", "kn": "kn-kn",
"ko": "ko-ko", "ko": "ko-ko",
"kok": "kok-kok", "kok": "kok-kok",
"ku": "ku-arab",
"ky": "ky-ky",
"lb": "lb-lb", "lb": "lb-lb",
"lo": "lo-lo", "lo": "lo-lo",
"lt": "lt-lt", "lt": "lt-lt",
@@ -955,6 +1026,7 @@
"mi": "mi-mi", "mi": "mi-mi",
"mk": "mk-mk", "mk": "mk-mk",
"ml": "ml-ml", "ml": "ml-ml",
"mn": "mn-cyrl-mn",
"mr": "mr-mr", "mr": "mr-mr",
"ms": "ms-ms", "ms": "ms-ms",
"mt": "mt-mt", "mt": "mt-mt",
@@ -962,22 +1034,33 @@
"ne": "ne-ne", "ne": "ne-ne",
"nl": "nl-nl", "nl": "nl-nl",
"nn": "nn-nn", "nn": "nn-nn",
"nso": "nso-nso",
"or": "or-or", "or": "or-or",
"pa_Arab": "pa-arab",
"pa_Guru": "pa-guru", "pa_Guru": "pa-guru",
"pl": "pl-pl", "pl": "pl-pl",
"pt": "pt-br", "pt": "pt-br",
"qu": "quz-quz", "qu": "quz-quz",
"quc": "quc-quc",
"ro": "ro-ro", "ro": "ro-ro",
"ru": "ru-ru", "ru": "ru-ru",
"rw": "rw-rw",
"sd_Arab": "sd-arab",
"si": "si-si",
"sk": "sk-sk", "sk": "sk-sk",
"sl": "sl-sl", "sl": "sl-sl",
"sq": "sq-sq", "sq": "sq-sq",
"sr_Cyrl": "sr-cyrl", "sr_Cyrl": "sr-cyrl",
"sr_Latn": "sr-latn", "sr_Latn": "sr-latn",
"sv": "sv-sv", "sv": "sv-sv",
"sw": "sw-sw",
"ta": "ta-ta", "ta": "ta-ta",
"te": "te-te", "te": "te-te",
"tg": "tg-cyrl",
"th": "th-th", "th": "th-th",
"ti": "ti-ti",
"tk": "tk-tk",
"tn": "tn-tn",
"tr": "tr-tr", "tr": "tr-tr",
"tt": "tt-tt", "tt": "tt-tt",
"ug": "ug-ug", "ug": "ug-ug",
@@ -985,9 +1068,13 @@
"ur": "ur-ur", "ur": "ur-ur",
"uz_Latn": "uz-latn", "uz_Latn": "uz-latn",
"vi": "vi-vi", "vi": "vi-vi",
"wo": "wo-wo",
"xh": "xh-xh",
"yo": "yo-yo",
"zh": "zh-hans", "zh": "zh-hans",
"zh_Hans": "zh-hans", "zh_Hans": "zh-hans",
"zh_Hant": "zh-hant" "zh_Hant": "zh-hant",
"zu": "zu-zu"
}, },
"regions": { "regions": {
"am-ET": "am-et", "am-ET": "am-et",
@@ -1203,12 +1290,14 @@
"kk-KZ": "kk-kz", "kk-KZ": "kk-kz",
"km-KH": "km-kh", "km-KH": "km-kh",
"ko-KR": "ko-kr", "ko-KR": "ko-kr",
"ky-KG": "ky-kg",
"lb-LU": "lb-lu", "lb-LU": "lb-lu",
"lo-LA": "lo-la", "lo-LA": "lo-la",
"lt-LT": "lt-lt", "lt-LT": "lt-lt",
"lv-LV": "lv-lv", "lv-LV": "lv-lv",
"mi-NZ": "mi-nz", "mi-NZ": "mi-nz",
"mk-MK": "mk-mk", "mk-MK": "mk-mk",
"mn-MN": "mn-mn",
"ms-BN": "ms-bn", "ms-BN": "ms-bn",
"ms-MY": "ms-my", "ms-MY": "ms-my",
"ms-SG": "ms-sg", "ms-SG": "ms-sg",
@@ -1242,6 +1331,8 @@
"ru-KZ": "ru-kz", "ru-KZ": "ru-kz",
"ru-RU": "ru-ru", "ru-RU": "ru-ru",
"ru-UA": "ru-ua", "ru-UA": "ru-ua",
"rw-RW": "rw-rw",
"si-LK": "si-lk",
"sk-SK": "sk-sk", "sk-SK": "sk-sk",
"sl-SI": "sl-si", "sl-SI": "sl-si",
"sq-AL": "sq-al", "sq-AL": "sq-al",
@@ -1250,14 +1341,23 @@
"sr-RS": "sr-rs", "sr-RS": "sr-rs",
"sv-FI": "sv-fi", "sv-FI": "sv-fi",
"sv-SE": "sv-se", "sv-SE": "sv-se",
"sw-KE": "sw-ke",
"sw-TZ": "sw-tz",
"sw-UG": "sw-ug",
"ta-LK": "ta-lk", "ta-LK": "ta-lk",
"ta-SG": "ta-sg", "ta-SG": "ta-sg",
"tg-TJ": "tg-tj",
"th-TH": "th-th", "th-TH": "th-th",
"ti-ER": "ti-er",
"tk-TM": "tk-tm",
"tn-BW": "tn-bw",
"tr-CY": "tr-cy", "tr-CY": "tr-cy",
"tr-TR": "tr-tr", "tr-TR": "tr-tr",
"uk-UA": "uk-ua", "uk-UA": "uk-ua",
"ur-PK": "ur-pk", "ur-PK": "ur-pk",
"vi-VN": "vi-vn", "vi-VN": "vi-vn",
"wo-SN": "wo-sn",
"yo-NG": "yo-ng",
"zh-CN": "en-hk", "zh-CN": "en-hk",
"zh-HK": "en-hk", "zh-HK": "en-hk",
"zh-MO": "zh-mo", "zh-MO": "zh-mo",
@@ -1290,7 +1390,7 @@
"es": "es-es", "es": "es-es",
"et": "et-et", "et": "et-et",
"eu": "eu-eu", "eu": "eu-eu",
"fa": "fa-fa", "fa": "prs-prs",
"fi": "fi-fi", "fi": "fi-fi",
"fil": "fil-fil", "fil": "fil-fil",
"fr": "fr-fr", "fr": "fr-fr",
@@ -1298,12 +1398,14 @@
"gd": "gd-gd", "gd": "gd-gd",
"gl": "gl-gl", "gl": "gl-gl",
"gu": "gu-gu", "gu": "gu-gu",
"ha": "ha-latn",
"he": "he-he", "he": "he-he",
"hi": "hi-hi", "hi": "hi-hi",
"hr": "hr-hr", "hr": "hr-hr",
"hu": "hu-hu", "hu": "hu-hu",
"hy": "hy-hy", "hy": "hy-hy",
"id": "id-id", "id": "id-id",
"ig": "ig-ig",
"is": "is-is", "is": "is-is",
"it": "it-it", "it": "it-it",
"ja": "ja-ja", "ja": "ja-ja",
@@ -1313,6 +1415,8 @@
"kn": "kn-kn", "kn": "kn-kn",
"ko": "ko-ko", "ko": "ko-ko",
"kok": "kok-kok", "kok": "kok-kok",
"ku": "ku-arab",
"ky": "ky-ky",
"lb": "lb-lb", "lb": "lb-lb",
"lo": "lo-lo", "lo": "lo-lo",
"lt": "lt-lt", "lt": "lt-lt",
@@ -1320,6 +1424,7 @@
"mi": "mi-mi", "mi": "mi-mi",
"mk": "mk-mk", "mk": "mk-mk",
"ml": "ml-ml", "ml": "ml-ml",
"mn": "mn-cyrl-mn",
"mr": "mr-mr", "mr": "mr-mr",
"ms": "ms-ms", "ms": "ms-ms",
"mt": "mt-mt", "mt": "mt-mt",
@@ -1327,22 +1432,33 @@
"ne": "ne-ne", "ne": "ne-ne",
"nl": "nl-nl", "nl": "nl-nl",
"nn": "nn-nn", "nn": "nn-nn",
"nso": "nso-nso",
"or": "or-or", "or": "or-or",
"pa_Arab": "pa-arab",
"pa_Guru": "pa-guru", "pa_Guru": "pa-guru",
"pl": "pl-pl", "pl": "pl-pl",
"pt": "pt-br", "pt": "pt-br",
"qu": "quz-quz", "qu": "quz-quz",
"quc": "quc-quc",
"ro": "ro-ro", "ro": "ro-ro",
"ru": "ru-ru", "ru": "ru-ru",
"rw": "rw-rw",
"sd_Arab": "sd-arab",
"si": "si-si",
"sk": "sk-sk", "sk": "sk-sk",
"sl": "sl-sl", "sl": "sl-sl",
"sq": "sq-sq", "sq": "sq-sq",
"sr_Cyrl": "sr-cyrl", "sr_Cyrl": "sr-cyrl",
"sr_Latn": "sr-latn", "sr_Latn": "sr-latn",
"sv": "sv-sv", "sv": "sv-sv",
"sw": "sw-sw",
"ta": "ta-ta", "ta": "ta-ta",
"te": "te-te", "te": "te-te",
"tg": "tg-cyrl",
"th": "th-th", "th": "th-th",
"ti": "ti-ti",
"tk": "tk-tk",
"tn": "tn-tn",
"tr": "tr-tr", "tr": "tr-tr",
"tt": "tt-tt", "tt": "tt-tt",
"ug": "ug-ug", "ug": "ug-ug",
@@ -1350,9 +1466,13 @@
"ur": "ur-ur", "ur": "ur-ur",
"uz_Latn": "uz-latn", "uz_Latn": "uz-latn",
"vi": "vi-vi", "vi": "vi-vi",
"wo": "wo-wo",
"xh": "xh-xh",
"yo": "yo-yo",
"zh": "zh-hans", "zh": "zh-hans",
"zh_Hans": "zh-hans", "zh_Hans": "zh-hans",
"zh_Hant": "zh-hant" "zh_Hant": "zh-hant",
"zu": "zu-zu"
}, },
"regions": { "regions": {
"am-ET": "am-et", "am-ET": "am-et",
@@ -1568,12 +1688,14 @@
"kk-KZ": "kk-kz", "kk-KZ": "kk-kz",
"km-KH": "km-kh", "km-KH": "km-kh",
"ko-KR": "ko-kr", "ko-KR": "ko-kr",
"ky-KG": "ky-kg",
"lb-LU": "lb-lu", "lb-LU": "lb-lu",
"lo-LA": "lo-la", "lo-LA": "lo-la",
"lt-LT": "lt-lt", "lt-LT": "lt-lt",
"lv-LV": "lv-lv", "lv-LV": "lv-lv",
"mi-NZ": "mi-nz", "mi-NZ": "mi-nz",
"mk-MK": "mk-mk", "mk-MK": "mk-mk",
"mn-MN": "mn-mn",
"ms-BN": "ms-bn", "ms-BN": "ms-bn",
"ms-MY": "ms-my", "ms-MY": "ms-my",
"ms-SG": "ms-sg", "ms-SG": "ms-sg",
@@ -1607,6 +1729,8 @@
"ru-KZ": "ru-kz", "ru-KZ": "ru-kz",
"ru-RU": "ru-ru", "ru-RU": "ru-ru",
"ru-UA": "ru-ua", "ru-UA": "ru-ua",
"rw-RW": "rw-rw",
"si-LK": "si-lk",
"sk-SK": "sk-sk", "sk-SK": "sk-sk",
"sl-SI": "sl-si", "sl-SI": "sl-si",
"sq-AL": "sq-al", "sq-AL": "sq-al",
@@ -1615,14 +1739,23 @@
"sr-RS": "sr-rs", "sr-RS": "sr-rs",
"sv-FI": "sv-fi", "sv-FI": "sv-fi",
"sv-SE": "sv-se", "sv-SE": "sv-se",
"sw-KE": "sw-ke",
"sw-TZ": "sw-tz",
"sw-UG": "sw-ug",
"ta-LK": "ta-lk", "ta-LK": "ta-lk",
"ta-SG": "ta-sg", "ta-SG": "ta-sg",
"tg-TJ": "tg-tj",
"th-TH": "th-th", "th-TH": "th-th",
"ti-ER": "ti-er",
"tk-TM": "tk-tm",
"tn-BW": "tn-bw",
"tr-CY": "tr-cy", "tr-CY": "tr-cy",
"tr-TR": "tr-tr", "tr-TR": "tr-tr",
"uk-UA": "uk-ua", "uk-UA": "uk-ua",
"ur-PK": "ur-pk", "ur-PK": "ur-pk",
"vi-VN": "vi-vn", "vi-VN": "vi-vn",
"wo-SN": "wo-sn",
"yo-NG": "yo-ng",
"zh-CN": "zh-cn", "zh-CN": "zh-cn",
"zh-HK": "en-hk", "zh-HK": "en-hk",
"zh-MO": "zh-mo", "zh-MO": "zh-mo",

View File

@@ -2574,11 +2574,6 @@
"symbol": "ʰ", "symbol": "ʰ",
"to_si_factor": 0.2617993878 "to_si_factor": 0.2617993878
}, },
"Q11644875": {
"si_name": "Q12438",
"symbol": "Tf",
"to_si_factor": 9806.65
},
"Q1165639": { "Q1165639": {
"si_name": "Q89992008", "si_name": "Q89992008",
"symbol": "daraf", "symbol": "daraf",
@@ -3179,6 +3174,21 @@
"symbol": "₿", "symbol": "₿",
"to_si_factor": null "to_si_factor": null
}, },
"Q131824443": {
"si_name": "Q12438",
"symbol": "tf",
"to_si_factor": 9806.65
},
"Q131824444": {
"si_name": "Q12438",
"symbol": "LTf",
"to_si_factor": 9964.01641818352
},
"Q131824445": {
"si_name": "Q12438",
"symbol": "STf",
"to_si_factor": 8896.443230521
},
"Q1322380": { "Q1322380": {
"si_name": "Q11574", "si_name": "Q11574",
"symbol": "Ts", "symbol": "Ts",
@@ -3420,7 +3430,7 @@
"to_si_factor": null "to_si_factor": null
}, },
"Q1628990": { "Q1628990": {
"si_name": "Q12874593", "si_name": "Q12831618",
"symbol": "hph", "symbol": "hph",
"to_si_factor": 745.7 "to_si_factor": 745.7
}, },

View File

@@ -110,6 +110,28 @@ class Result(msgspec.Struct, kw_only=True):
return iter(self.__struct_fields__) return iter(self.__struct_fields__)
def as_dict(self):
return {f: getattr(self, f) for f in self.__struct_fields__}
class MainResult(Result): # pylint: disable=missing-class-docstring
# open_group and close_group should not manged in the Result class (we should rop it from here!)
open_group: bool = False
close_group: bool = False
title: str = ""
"""Link title of the result item."""
content: str = ""
"""Extract or description of the result item"""
img_src: str = ""
"""URL of a image that is displayed in the result item."""
thumbnail: str = ""
"""URL of a thumbnail that is displayed in the result item."""
class LegacyResult(dict): class LegacyResult(dict):
"""A wrapper around a legacy result item. The SearXNG core uses this class """A wrapper around a legacy result item. The SearXNG core uses this class
@@ -130,10 +152,12 @@ class LegacyResult(dict):
UNSET = object() UNSET = object()
WHITESPACE_REGEX = re.compile('( |\t|\n)+', re.M | re.U) WHITESPACE_REGEX = re.compile('( |\t|\n)+', re.M | re.U)
def as_dict(self):
return self
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.__dict__ = self
# Init fields with defaults / compare with defaults of the fields in class Result # Init fields with defaults / compare with defaults of the fields in class Result
self.engine = self.get("engine", "") self.engine = self.get("engine", "")

View File

@@ -1,6 +1,6 @@
<table> <table>
{% for key, value in result.items() %} {% for key, value in result.items() %}
{% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions', 'pretty_url', 'parsed_url'] %} {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions', 'parsed_url'] %}
{% continue %} {% continue %}
{% endif %} {% endif %}
<tr> <tr>

View File

@@ -694,9 +694,7 @@ def search():
if 'title' in result and result['title']: if 'title' in result and result['title']:
result['title'] = highlight_content(escape(result['title'] or ''), search_query.query) result['title'] = highlight_content(escape(result['title'] or ''), search_query.query)
if 'url' in result: if getattr(result, 'publishedDate', None): # do not try to get a date from an empty string or a None type
result['pretty_url'] = webutils.prettify_url(result['url'])
if result.get('publishedDate'): # do not try to get a date from an empty string or a None type
try: # test if publishedDate >= 1900 (datetime module bug) try: # test if publishedDate >= 1900 (datetime module bug)
result['pubdate'] = result['publishedDate'].strftime('%Y-%m-%d %H:%M:%S%z') result['pubdate'] = result['publishedDate'].strftime('%Y-%m-%d %H:%M:%S%z')
except ValueError: except ValueError:
@@ -706,15 +704,15 @@ def search():
# set result['open_group'] = True when the template changes from the previous result # set result['open_group'] = True when the template changes from the previous result
# set result['close_group'] = True when the template changes on the next result # set result['close_group'] = True when the template changes on the next result
if current_template != result.get('template'): if current_template != result.template:
result['open_group'] = True result.open_group = True
if previous_result: if previous_result:
previous_result['close_group'] = True # pylint: disable=unsupported-assignment-operation previous_result.close_group = True # pylint: disable=unsupported-assignment-operation
current_template = result.get('template') current_template = result.template
previous_result = result previous_result = result
if previous_result: if previous_result:
previous_result['close_group'] = True previous_result.close_group = True
# 4.a RSS # 4.a RSS

View File

@@ -123,17 +123,18 @@ def write_csv_response(csv: CSVWriter, rc: ResultContainer) -> None: # pylint:
""" """
results = rc.get_ordered_results()
keys = ('title', 'url', 'content', 'host', 'engine', 'score', 'type') keys = ('title', 'url', 'content', 'host', 'engine', 'score', 'type')
csv.writerow(keys) csv.writerow(keys)
for row in results: for res in rc.get_ordered_results():
row = res.as_dict()
row['host'] = row['parsed_url'].netloc row['host'] = row['parsed_url'].netloc
row['type'] = 'result' row['type'] = 'result'
csv.writerow([row.get(key, '') for key in keys]) csv.writerow([row.get(key, '') for key in keys])
for a in rc.answers: for a in rc.answers:
row = {'title': a, 'type': 'answer'} row = a.as_dict()
row['host'] = row['parsed_url'].netloc
csv.writerow([row.get(key, '') for key in keys]) csv.writerow([row.get(key, '') for key in keys])
for a in rc.suggestions: for a in rc.suggestions:
@@ -158,18 +159,17 @@ class JSONEncoder(json.JSONEncoder): # pylint: disable=missing-class-docstring
def get_json_response(sq: SearchQuery, rc: ResultContainer) -> str: def get_json_response(sq: SearchQuery, rc: ResultContainer) -> str:
"""Returns the JSON string of the results to a query (``application/json``)""" """Returns the JSON string of the results to a query (``application/json``)"""
results = rc.number_of_results data = {
x = {
'query': sq.query, 'query': sq.query,
'number_of_results': results, 'number_of_results': rc.number_of_results,
'results': rc.get_ordered_results(), 'results': [_.as_dict() for _ in rc.get_ordered_results()],
'answers': list(rc.answers), 'answers': [_.as_dict() for _ in rc.answers],
'corrections': list(rc.corrections), 'corrections': list(rc.corrections),
'infoboxes': rc.infoboxes, 'infoboxes': rc.infoboxes,
'suggestions': list(rc.suggestions), 'suggestions': list(rc.suggestions),
'unresponsive_engines': get_translated_errors(rc.unresponsive_engines), 'unresponsive_engines': get_translated_errors(rc.unresponsive_engines),
} }
response = json.dumps(x, cls=JSONEncoder) response = json.dumps(data, cls=JSONEncoder)
return response return response

View File

@@ -2,13 +2,13 @@
# pylint: disable=missing-module-docstring,disable=missing-class-docstring,invalid-name # pylint: disable=missing-module-docstring,disable=missing-class-docstring,invalid-name
import json import json
from urllib.parse import ParseResult
import babel import babel
from mock import Mock from mock import Mock
import searx.webapp import searx.webapp
import searx.search import searx.search
import searx.search.processors import searx.search.processors
from searx.result_types._base import MainResult
from searx.results import Timing from searx.results import Timing
from searx.preferences import Preferences from searx.preferences import Preferences
@@ -31,30 +31,21 @@ class ViewsTestCase(SearxTestCase): # pylint: disable=too-many-public-methods
# set some defaults # set some defaults
test_results = [ test_results = [
{ MainResult(
'content': 'first test content', title="First Test",
'title': 'First Test', url="http://first.test.xyz",
'url': 'http://first.test.xyz', content="first test content",
'engines': ['youtube', 'startpage'], engine="startpage",
'engine': 'startpage', ),
'parsed_url': ParseResult( MainResult(
scheme='http', netloc='first.test.xyz', path='/', params='', query='', fragment='' title="Second Test",
), url="http://second.test.xyz",
'template': 'default.html', content="second test content",
}, engine="youtube",
{ ),
'content': 'second test content',
'title': 'Second Test',
'url': 'http://second.test.xyz',
'engines': ['youtube', 'startpage'],
'engine': 'youtube',
'parsed_url': ParseResult(
scheme='http', netloc='second.test.xyz', path='/', params='', query='', fragment=''
),
'template': 'default.html',
},
] ]
for r in test_results:
r.normalize_result_fields()
timings = [ timings = [
Timing(engine='startpage', total=0.8, load=0.7), Timing(engine='startpage', total=0.8, load=0.7),
Timing(engine='youtube', total=0.9, load=0.6), Timing(engine='youtube', total=0.9, load=0.6),