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 =