diff --git a/.gitignore b/.gitignore
index a21273d6..8af48899 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,6 @@ docker-compose.yml
# cookie file
cookies.json
+
+# opensearch xml build
+src/front/opensearch*
diff --git a/src/front/cobalt.js b/src/front/cobalt.js
index cdf143bc..2bfebb8c 100644
--- a/src/front/cobalt.js
+++ b/src/front/cobalt.js
@@ -610,6 +610,11 @@ window.onload = () => {
detectColorScheme();
popup("migration", 1);
}
+ if (pageQuery.has("opensearchquery")) {
+ eid("url-input-area").value = pageQuery.get("opensearchquery");
+ button();
+ eid("download-button").click();
+ }
window.history.replaceState(null, '', window.location.pathname);
notificationCheck();
diff --git a/src/localization/languages/en.json b/src/localization/languages/en.json
index 7bc69001..f5904825 100644
--- a/src/localization/languages/en.json
+++ b/src/localization/languages/en.json
@@ -157,6 +157,9 @@
"SettingsTwitterGifDescription": "converting looping videos to .gif reduces quality and majorly increases file size. if you want best efficiency, keep this setting off.",
"UpdateTwitterGif": "twitter gifs and pinterest",
"ErrorTweetProtected": "this tweet is from a private account, so i can't see it. try another one!",
- "ErrorTweetNSFW": "this tweet contains sensitive content, so i can't see it. try another one!"
+ "ErrorTweetNSFW": "this tweet contains sensitive content, so i can't see it. try another one!",
+ "ErrorOpenSearch": "",
+ "OpenSearchTitle": "Cobalt",
+ "OpenSearchDescription": "Cobalt is your go-to place for downloads from social and media platforms. Zero ads, trackers, or other creepy bullshit. Simply paste a share link and you're ready to rock!"
}
}
diff --git a/src/localization/languages/ru.json b/src/localization/languages/ru.json
index 7af3413b..6af788c7 100644
--- a/src/localization/languages/ru.json
+++ b/src/localization/languages/ru.json
@@ -159,6 +159,9 @@
"SettingsTwitterGifDescription": "конвертирование зацикленного видео в .gif снижает качество и значительно увеличивает размер файла. если важна максимальная эффективность, то не используй эту функцию.",
"UpdateTwitterGif": "гифки с твиттера и одноклассники",
"ErrorTweetProtected": "этот твит из закрытого аккаунта, поэтому я не могу его увидеть. попробуй другой!",
- "ErrorTweetNSFW": "этот твит содержит деликатный контент, поэтому я не могу его увидеть. попробуй другой!"
+ "ErrorTweetNSFW": "этот твит содержит деликатный контент, поэтому я не могу его увидеть. попробуй другой!",
+ "ErrorOpenSearch": "",
+ "OpenSearchTitle": "TODO TRANSLATE ME!! Cobalt",
+ "OpenSearchDescription": "TODO TRANSLATE ME!! Cobalt is your go-to place for downloads from social and media platforms. Zero ads, trackers, or other creepy bullshit. Simply paste a share link and you're ready to rock!"
}
}
diff --git a/src/modules/build.js b/src/modules/build.js
index 887ffb50..342e936b 100644
--- a/src/modules/build.js
+++ b/src/modules/build.js
@@ -4,6 +4,7 @@ import { loadLoc, languageList } from "../localization/manager.js";
import { cleanHTML } from "./sub/utils.js";
import page from "./pageRender/page.js";
+import buildOpenSearch from "./pageRender/buildOpenSearch.js";
export async function buildFront(commitHash, branch) {
try {
@@ -31,6 +32,9 @@ export async function buildFront(commitHash, branch) {
}
fs.writeFileSync(`./build/pc/${i}.html`, cleanHTML(page(params)));
+ // build opensearch xml
+ fs.writeFileSync(`./src/front/opensearch-${i}.xml`, cleanHTML(buildOpenSearch(i)));
+
params["useragent"] = "iphone os";
fs.writeFileSync(`./build/ios/${i}.html`, cleanHTML(page(params)));
diff --git a/src/modules/pageRender/buildOpenSearch.js b/src/modules/pageRender/buildOpenSearch.js
new file mode 100644
index 00000000..11e4db01
--- /dev/null
+++ b/src/modules/pageRender/buildOpenSearch.js
@@ -0,0 +1,21 @@
+import loc from "../../localization/manager.js";
+
+export default function (lang) {
+ const t = (str, replace) => { return loc(lang, str, replace) };
+
+ const strippedURL = process.env.webURL.replace(/^https?:\/\//, '').replace(/\/$/, '');
+
+ try {
+ return `
+
+ ${t('OpenSearchTitle')}
+ ${t("OpenSearchDescription")}
+
+ ${process.env.webURL}icons/favicon.ico
+ cobalt download
+
+ `
+ } catch (err) {
+ return `${t('ErrorOpenSearchBuildFail', lang)}`;
+ }
+}
\ No newline at end of file
diff --git a/src/modules/pageRender/page.js b/src/modules/pageRender/page.js
index 81e6d514..cca5dabc 100644
--- a/src/modules/pageRender/page.js
+++ b/src/modules/pageRender/page.js
@@ -38,6 +38,8 @@ export default function(obj) {
audioFormats[0]["text"] = t('SettingsAudioFormatBest');
+ const strippedURL = process.env.webURL.replace(/^https?:\/\//, '').replace(/\/$/, '');
+
try {
return `
@@ -56,6 +58,8 @@ export default function(obj) {
+
+
@@ -100,61 +104,61 @@ export default function(obj) {
name: "services",
title: `${emoji("🔗")} ${t("CollapseServices")}`,
body: `${enabledServices}`
- + `