diff --git a/src/assets/icons/engines/lenso-dark.svg b/src/assets/icons/engines/lenso-dark.svg
new file mode 100644
index 0000000..23da0c0
--- /dev/null
+++ b/src/assets/icons/engines/lenso-dark.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/assets/icons/engines/lenso.svg b/src/assets/icons/engines/lenso.svg
new file mode 100644
index 0000000..b645f5e
--- /dev/null
+++ b/src/assets/icons/engines/lenso.svg
@@ -0,0 +1,15 @@
+
diff --git a/src/assets/locales/en/messages.json b/src/assets/locales/en/messages.json
index 6d6c118..409e5a9 100644
--- a/src/assets/locales/en/messages.json
+++ b/src/assets/locales/en/messages.json
@@ -234,6 +234,11 @@
"description": "Name of the search engine."
},
+ "engineName_lenso": {
+ "message": "Lenso.ai",
+ "description": "Name of the search engine."
+ },
+
"engineName_allEngines": {
"message": "all search engines",
"description": "Name of the search engine."
@@ -480,6 +485,11 @@
"description": "Title of the menu item."
},
+ "menuItemTitle_lenso": {
+ "message": "Lenso.ai",
+ "description": "Title of the menu item."
+ },
+
"menuItemTitle_allEngines": {
"message": "All search engines",
"description": "Title of the menu item."
@@ -746,6 +756,11 @@
"description": "Title of the option."
},
+ "optionTitle_lenso": {
+ "message": "Lenso.ai",
+ "description": "Title of the option."
+ },
+
"optionTitle_searchMode": {
"message": "Search mode",
"description": "Title of the option."
diff --git a/src/engines/lenso.js b/src/engines/lenso.js
new file mode 100644
index 0000000..a4281f1
--- /dev/null
+++ b/src/engines/lenso.js
@@ -0,0 +1,52 @@
+import {findNode, runOnce} from 'utils/common';
+import {setFileInputData, initSearch, sendReceipt} from 'utils/engines';
+
+const engine = 'lenso';
+
+async function search({session, search, image, storageIds}) {
+ if (search.assetType === 'image') {
+ const inputSelector = 'input[type=file]';
+ const input = await findNode(inputSelector);
+
+ await setFileInputData(inputSelector, input, image);
+
+ await sendReceipt(storageIds);
+
+ input.dispatchEvent(new Event('change'));
+
+ const modal = await findNode('.manage-consents-modal', {
+ timeout: 10000,
+ throwError: false
+ });
+
+ if (modal) {
+ (
+ await findNode('label[for="privacy-policy"]', {rootNode: modal})
+ ).click();
+
+ (
+ await findNode('button.perfom-search-btn:not([disabled])', {
+ rootNode: modal,
+ observerOptions: {attributes: true}
+ })
+ ).click();
+ }
+ } else {
+ await sendReceipt(storageIds);
+
+ (
+ await findNode('.search-by-url .cta-btn', {
+ timeout: 10000,
+ throwError: false
+ })
+ ).click();
+ }
+}
+
+function init() {
+ initSearch(search, engine, taskId);
+}
+
+if (runOnce('search')) {
+ init();
+}
diff --git a/src/storage/config.json b/src/storage/config.json
index f0317f0..999e4b8 100755
--- a/src/storage/config.json
+++ b/src/storage/config.json
@@ -54,7 +54,8 @@
"20240514170322_add_appversion",
"20240529183556_update_search_engines",
"20240619180111_add_menuchangeevent",
- "20240624161944_remove_search_engines"
+ "20240624161944_remove_search_engines",
+ "20250102095603_add_lenso.ai"
],
"session": [
"20240514122825_initial_version"
diff --git a/src/storage/revisions/local/20250102095603_add_lenso.ai.js b/src/storage/revisions/local/20250102095603_add_lenso.ai.js
new file mode 100644
index 0000000..c97b593
--- /dev/null
+++ b/src/storage/revisions/local/20250102095603_add_lenso.ai.js
@@ -0,0 +1,30 @@
+const message = 'Add Lenso.ai';
+
+const revision = '20250102095603_add_lenso.ai';
+
+async function upgrade() {
+ const changes = {};
+ const {engines, disabledEngines} = await browser.storage.local.get([
+ 'engines',
+ 'disabledEngines'
+ ]);
+ const newEngine = 'lenso';
+
+ const enabledEngineCount = engines.length - disabledEngines.length;
+
+ engines.splice(1, 0, newEngine);
+ changes.engines = engines;
+
+ if (enabledEngineCount <= 1) {
+ disabledEngines.push(newEngine);
+ }
+ if (enabledEngineCount === 8 && !disabledEngines.includes('alamy')) {
+ disabledEngines.push('alamy');
+ }
+ changes.disabledEngines = disabledEngines;
+
+ changes.storageVersion = revision;
+ return browser.storage.local.set(changes);
+}
+
+export {message, revision, upgrade};
diff --git a/src/utils/data.js b/src/utils/data.js
index 968d5b2..4cbb074 100755
--- a/src/utils/data.js
+++ b/src/utils/data.js
@@ -341,6 +341,16 @@ const engines = {
target: 'https://icons8.com/',
isExec: true
}
+ },
+ lenso: {
+ url: {
+ target: 'https://lenso.ai/en/search-by-url?url={imgUrl}&utm_source=sbi',
+ isExec: true
+ },
+ image: {
+ target: 'https://lenso.ai/en?utm_source=sbi',
+ isExec: true
+ }
}
};
@@ -365,7 +375,8 @@ const engineIconVariants = {
ascii2d: ['dark'],
tmview: ['dark'],
pixta: ['dark'],
- freepik: ['dark']
+ freepik: ['dark'],
+ lenso: ['dark']
};
const rasterEngineIcons = [
@@ -590,7 +601,8 @@ const webpEngineSupport = [
'lykdat',
'googleLens',
'lexica',
- 'icons8'
+ 'icons8',
+ 'lenso'
];
// Search engines only support the image format in compatible browsers.
@@ -651,7 +663,8 @@ const maxImageUploadSize = {
lexica: {ui: 30 * 1024 * 1024},
kagi: {ui: 1 * 1024 * 1024},
freepik: {ui: 60 * 1024 * 1024},
- icons8: {ui: 5 * 1024 * 1024}
+ icons8: {ui: 5 * 1024 * 1024},
+ lenso: {ui: 10 * 1024 * 1024}
};
const chromeDesktopUA =