7.4 + migration to cobalt.tools

This commit is contained in:
wukko 2023-09-09 22:36:24 +06:00 committed by GitHub
commit fd31b7d4ce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 539 additions and 90 deletions

View file

@ -1,6 +1,6 @@
# cobalt
Best way to save what you love.
Live web app: [co.wukko.me](https://co.wukko.me/)
Live web app: [cobalt.tools](https://cobalt.tools/)
![cobalt logo with repeated logo pattern background](https://raw.githubusercontent.com/wukko/cobalt/current/src/front/icons/pattern.png "cobalt logo with repeated logo pattern background")

View file

@ -2,7 +2,7 @@ version: '3.5'
services:
cobalt-api:
build: .
image: ghcr.io/wukko/cobalt:latest
restart: unless-stopped
container_name: cobalt-api
@ -24,8 +24,11 @@ services:
#- cookiePath=cookies.json
# see src/modules/processing/cookie/cookies_example.json for example file.
labels:
- com.centurylinklabs.watchtower.scope=cobalt
cobalt-web:
build: .
image: ghcr.io/wukko/cobalt:latest
restart: unless-stopped
container_name: cobalt-web
@ -40,6 +43,17 @@ services:
environment:
- webPort=9001
# replace webURL with your instance's target url in same format
- webURL=https://co.wukko.me/
- webURL=https://cobalt.tools/
# replace apiURL with preferred api instance url
- apiURL=https://co.wuk.sh/
labels:
- com.centurylinklabs.watchtower.scope=cobalt
# update the cobalt image automatically with watchtower
watchtower:
image: ghcr.io/containrrr/watchtower
restart: unless-stopped
command: --cleanup --scope cobalt --interval 900
volumes:
- /var/run/docker.sock:/var/run/docker.sock

View file

@ -4,8 +4,7 @@ This document provides info about methods and acceptable variables for all cobal
```
⚠️ Main API instance has moved to https://co.wuk.sh/
Previous API domain will stop redirecting users to correct API instance after July 25th.
Make sure to update your projects in time.
Make sure your projects use the correct API domain.
```
## POST: ``/api/json``
@ -16,17 +15,17 @@ Response Body Type: ``application/json``
### Request Body Variables
| key | type | variables | default | description |
|:----------------|:--------|:----------------------------------|:----------|:-------------------------------------------------------------------------------|
| url | string | Sharable URL encoded as URI | ``null`` | **Must** be included in every request. |
| vCodec | string | ``h264 / av1 / vp9`` | ``h264`` | Applies only to YouTube downloads. ``h264`` is recommended for phones. |
| vQuality | string | ``144 / ... / 2160 / max`` | ``720`` | ``720`` quality is recommended for phones. |
| aFormat | string | ``best / mp3 / ogg / wav / opus`` | ``mp3`` | |
| isAudioOnly | boolean | ``true / false`` | ``false`` | |
| isNoTTWatermark | boolean | ``true / false`` | ``false`` | Changes whether downloaded TikTok & Douyin videos have watermarks. |
| isTTFullAudio | boolean | ``true / false`` | ``false`` | Enables download of original sound used in a TikTok video. |
| isAudioMuted | boolean | ``true / false`` | ``false`` | Disables audio track in video downloads. |
| dubLang | boolean | ``true / false`` | ``false`` | Backend uses Accept-Language for YouTube video audio tracks when ``true``. |
| disableMetadata | boolean | ``true / false`` | ``false`` | Disables file metadata when set to ``true``. |
|:--------------------|:--------|:----------------------------------|:----------|:-------------------------------------------------------------------------------|
| ``url`` | string | Sharable URL encoded as URI | ``null`` | **Must** be included in every request. |
| ``vCodec`` | string | ``h264 / av1 / vp9`` | ``h264`` | Applies only to YouTube downloads. ``h264`` is recommended for phones. |
| ``vQuality`` | string | ``144 / ... / 2160 / max`` | ``720`` | ``720`` quality is recommended for phones. |
| ``aFormat`` | string | ``best / mp3 / ogg / wav / opus`` | ``mp3`` | |
| ``isAudioOnly`` | boolean | ``true / false`` | ``false`` | |
| ``isNoTTWatermark`` | boolean | ``true / false`` | ``false`` | Changes whether downloaded TikTok videos have watermarks. |
| ``isTTFullAudio`` | boolean | ``true / false`` | ``false`` | Enables download of original sound used in a TikTok video. |
| ``isAudioMuted`` | boolean | ``true / false`` | ``false`` | Disables audio track in video downloads. |
| ``dubLang`` | boolean | ``true / false`` | ``false`` | Backend uses Accept-Language for YouTube video audio tracks when ``true``. |
| ``disableMetadata`` | boolean | ``true / false`` | ``false`` | Disables file metadata when set to ``true``. |
### Response Body Variables
| key | type | variables |

View file

@ -1,7 +1,7 @@
{
"name": "cobalt",
"description": "save what you love",
"version": "7.3.1",
"version": "7.4",
"author": "wukko",
"exports": "./src/cobalt.js",
"type": "module",

View file

@ -503,7 +503,7 @@ button:active,
padding-bottom: var(--padding-1);
}
#popup-desc,
#desc-error,
.desc-error,
#popup-info-desc {
width: 100%;
text-align: left;
@ -512,7 +512,7 @@ button:active,
user-select: text;
-webkit-user-select: text;
}
#desc-error {
.desc-error {
padding-bottom: 1.5rem;
}
#popup-title {
@ -837,23 +837,6 @@ button:active,
.no-animation #popup-backdrop {
transition: none;
}
#floating-notification-area {
visibility: visible;
z-index: 999999;
position: absolute;
display: flex;
justify-content: center;
width: 100%;
padding-top: 2rem;
}
.floating-notification {
text-align: center;
padding: 0.6rem 1.2rem;
background: var(--accent-hover-elevated);
display: flex;
box-shadow: 0 0 20px 10px var(--accent-hover);
font-size: 0.85rem;
}
.popup-from-bottom {
position: fixed;
width: 100%;

View file

@ -1,3 +1,5 @@
const version = 36;
const ua = navigator.userAgent.toLowerCase();
const isIOS = ua.match("iphone os");
const isMobile = ua.match("android") || ua.match("iphone os");
@ -5,7 +7,6 @@ const isSafari = ua.match("safari/");
const isFirefox = ua.match("firefox/");
const isOldFirefox = ua.match("firefox/") && ua.split("firefox/")[1].split('.')[0] < 103;
const version = 35;
const regex = new RegExp(/https:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/);
const notification = `<div class="notification-dot"></div>`;
@ -19,18 +20,23 @@ const switchers = {
"audioMode": ["false", "true"]
};
const checkboxes = [
"alwaysVisibleButton",
"disableChangelog",
"downloadPopup",
"disableTikTokWatermark",
"fullTikTokAudio",
"muteAudio",
"reduceTransparency",
"disableAnimations",
"disableMetadata"
"disableMetadata",
];
const exceptions = { // used for mobile devices
"vQuality": "720"
};
const bottomPopups = ["error", "download"]
const pageQuery = new URLSearchParams(window.location.search);
let store = {};
function changeAPI(url) {
@ -207,8 +213,8 @@ function popup(type, action, text) {
case "picker":
switch (text.type) {
case "images":
eid("picker-title").innerHTML = loc.pickerImages;
eid("picker-subtitle").innerHTML = loc.pickerImagesExpl;
eid("picker-title").innerHTML = loc.ImagePickerTitle;
eid("picker-subtitle").innerHTML = isMobile ? loc.ImagePickerExplanationPhone : loc.ImagePickerExplanationPC;
eid("picker-holder").classList.remove("various");
@ -225,8 +231,8 @@ function popup(type, action, text) {
}
break;
default:
eid("picker-title").innerHTML = loc.pickerDefault;
eid("picker-subtitle").innerHTML = loc.pickerDefaultExpl;
eid("picker-title").innerHTML = loc.MediaPickerTitle;
eid("picker-subtitle").innerHTML = isMobile ? loc.MediaPickerExplanationPhone : loc.MediaPickerExplanationPC;
eid("picker-holder").classList.add("various");
@ -296,10 +302,10 @@ function loadSettings() {
eid("downloadPopup").checked = true;
}
if (sGet("reduceTransparency") === "true" || isOldFirefox) {
eid("cobalt-body").classList.toggle('no-transparency');
eid("cobalt-body").classList.add('no-transparency');
}
if (sGet("disableAnimations") === "true") {
eid("cobalt-body").classList.toggle('no-animation');
eid("cobalt-body").classList.add('no-animation');
}
for (let i = 0; i < checkboxes.length; i++) {
if (sGet(checkboxes[i]) === "true") eid(checkboxes[i]).checked = true;
@ -334,7 +340,7 @@ function internetError() {
eid("url-input-area").disabled = false
changeDownloadButton(2, '!!');
setTimeout(() => { changeButton(1); }, 2500);
popup("error", 1, loc.noInternet);
popup("error", 1, loc.ErrorNoInternet);
}
function resetSettings() {
localStorage.clear();
@ -348,13 +354,13 @@ async function pasteClipboard() {
download(eid("url-input-area").value);
}
} catch (e) {
let errorMessage = loc.featureErrorGeneric;
let errorMessage = loc.FeatureErrorGeneric;
let doError = true;
let error = String(e).toLowerCase();
if (error.includes("denied")) errorMessage = loc.clipboardErrorNoPermission;
if (error.includes("denied")) errorMessage = loc.ClipboardErrorNoPermission;
if (error.includes("dismissed") || isIOS) doError = false;
if (error.includes("function") && isFirefox) errorMessage = loc.clipboardErrorFirefox;
if (error.includes("function") && isFirefox) errorMessage = loc.ClipboardErrorFirefox;
if (doError) popup("error", 1, errorMessage);
}
@ -401,7 +407,7 @@ async function download(url) {
if (j.text && (!j.url || !j.picker)) {
if (j.status === "success") {
changeButton(2, j.text)
} else changeButton(0, loc.noURLReturned);
} else changeButton(0, loc.ErrorNoUrlReturned);
}
switch (j.status) {
case "redirect":
@ -419,7 +425,7 @@ async function download(url) {
popup('picker', 1, { arr: j.picker, type: j.pickerType });
setTimeout(() => { changeButton(1) }, 2500);
} else {
changeButton(0, loc.noURLReturned);
changeButton(0, loc.ErrorNoUrlReturned);
}
break;
case "stream":
@ -441,7 +447,7 @@ async function download(url) {
changeButton(2, j.text);
break;
default:
changeButton(0, loc.unknownStatus);
changeButton(0, loc.ErrorUnknownStatus);
break;
}
} else if (j && j.text) {
@ -476,7 +482,7 @@ async function loadOnDemand(elementId, blockId) {
}).catch(() => { throw new Error() });
}
if (j.text) {
eid(elementId).innerHTML = `<button class="switch bottom-margin" onclick="restoreUpdateHistory()">${loc.collapseHistory}</button>${j.text}`;
eid(elementId).innerHTML = `<button class="switch bottom-margin" onclick="restoreUpdateHistory()">${loc.ChangelogPressToHide}</button>${j.text}`;
} else throw new Error()
} catch (e) {
eid(elementId).innerHTML = store.historyButton;
@ -486,26 +492,68 @@ async function loadOnDemand(elementId, blockId) {
function restoreUpdateHistory() {
eid("changelog-history").innerHTML = store.historyButton;
}
function unpackSettings(b64) {
let changed = null;
try {
let settingsToImport = JSON.parse(atob(b64));
let currentSettings = JSON.parse(JSON.stringify(localStorage));
for (let s in settingsToImport) {
if (checkboxes.includes(s) && (settingsToImport[s] === "true" || settingsToImport[s] === "false")
&& currentSettings[s] !== settingsToImport[s]) {
sSet(s, settingsToImport[s]);
changed = true
}
if (switchers[s] && switchers[s].includes(settingsToImport[s])
&& currentSettings[s] !== settingsToImport[s]) {
sSet(s, settingsToImport[s]);
changed = true
}
}
} catch (e) {
changed = false;
}
return changed
}
window.onload = () => {
loadCelebrationsEmoji();
loadSettings();
detectColorScheme();
changeDownloadButton(0, '>>');
notificationCheck();
loadCelebrationsEmoji();
eid("url-input-area").value = "";
if (isIOS) {
sSet("downloadPopup", "true");
eid("downloadPopup-chkbx").style.display = "none";
}
eid("url-input-area").value = "";
eid("home").style.visibility = 'visible';
eid("home").classList.toggle("visible");
let urlQuery = new URLSearchParams(window.location.search).get("u");
if (urlQuery !== null && regex.test(urlQuery)) {
eid("url-input-area").value = urlQuery;
button();
if (pageQuery.has("u") && regex.test(pageQuery.get("u"))) {
eid("url-input-area").value = pageQuery.get("u");
button()
}
if (pageQuery.has("migration")) {
if (pageQuery.has("settingsData") && !sGet("migrated")) {
let setUn = unpackSettings(pageQuery.get("settingsData"));
if (setUn !== null) {
if (setUn) {
sSet("migrated", "true")
eid("desc-migration").innerHTML += `<br/><br/>${loc.DataTransferSuccess}`
} else {
eid("desc-migration").innerHTML += `<br/><br/>${loc.DataTransferError}`
}
}
}
loadSettings();
detectColorScheme();
popup("migration", 1);
}
window.history.replaceState(null, '', window.location.pathname);
notificationCheck();
}
eid("url-input-area").addEventListener("keydown", (e) => {
button();

View file

@ -0,0 +1,345 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint0_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint1_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint2_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint3_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint4_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint5_radial_6893_5267)" />
<g filter="url(#filter0_f_6893_5267)">
<rect x="5.05408" y="21.8203" width="2.72692" height="3.69801" rx="1.36346" fill="#D67908" />
</g>
<g filter="url(#filter1_f_6893_5267)">
<path d="M20.7508 10.2007C17.7675 10.3082 25.9773 15.1544 25.9773 15.1544L27.1023 6.09195C27.157 5.63101 26.7382 5.13844 25.8523 5.96097C25.8523 5.96097 22.0258 9.72898 21.8387 9.91319C21.6516 10.0974 21.4307 10.1621 21.1371 10.2007C20.9875 10.2203 20.9015 10.1952 20.7508 10.2007Z" fill="url(#paint6_linear_6893_5267)" />
</g>
<path d="M6.13258 13.5034L8.93258 10.9034C9.25258 10.6034 9.25258 10.1234 8.93258 9.83344L5.9179 7.15626C5.53508 6.82032 4.74258 6.9297 4.74258 7.76344V12.9634C4.74258 13.7969 5.62258 13.9834 6.13258 13.5034Z" fill="url(#paint7_linear_6893_5267)" />
<g filter="url(#filter2_f_6893_5267)">
<path d="M26.4909 5.65184C26.5488 5.50816 26.6882 5.41406 26.8431 5.41406V5.41406C27.0529 5.41406 27.2229 5.58411 27.2229 5.79388V8.03906L25.8055 7.35156L26.4909 5.65184Z" fill="url(#paint8_linear_6893_5267)" />
</g>
<g filter="url(#filter3_f_6893_5267)">
<path d="M5.44611 5.72656L8.82107 8.9461C9.57518 9.66548 9.58931 10.8646 8.85236 11.6016V11.6016" stroke="#FFDF70" stroke-linecap="round" />
</g>
<g filter="url(#filter4_f_6893_5267)">
<path d="M14.8054 20.6502L14.8697 20.6352C15.3433 20.5248 15.8366 20.5299 16.3077 20.6502V20.6502C16.8288 20.7484 17.1399 21.3457 16.6999 21.7757L16.1491 22.3773C15.8791 22.6473 15.2863 22.6473 15.0163 22.3773L14.4734 21.7757C14.0241 21.2679 14.3054 20.7601 14.8054 20.6502Z" fill="url(#paint9_linear_6893_5267)" />
</g>
<path d="M15.2265 20.2066L15.2908 20.1916C15.7644 20.0811 16.2577 20.0862 16.7289 20.2066V20.2066C17.25 20.3047 17.561 20.902 17.121 21.332L16.5703 21.9336C16.3003 22.2036 15.7075 22.2036 15.4375 21.9336L14.8945 21.332C14.4453 20.8242 14.7265 20.3164 15.2265 20.2066Z" fill="url(#paint10_radial_6893_5267)" />
<g filter="url(#filter5_f_6893_5267)">
<ellipse cx="16.2703" cy="20.7414" rx="0.761719" ry="0.274258" fill="url(#paint11_linear_6893_5267)" />
</g>
<g filter="url(#filter6_f_6893_5267)">
<path d="M24.7851 22.8923L28.5898 21.0798" stroke="url(#paint12_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter7_f_6893_5267)">
<path d="M24.7851 24.9235L26.7117 26.2891" stroke="url(#paint13_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.5663 22.5391L29.371 20.7266" stroke="url(#paint14_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter8_f_6893_5267)">
<path d="M25.5663 22.7109L29.371 20.8984" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter9_f_6893_5267)">
<ellipse cx="29.6059" cy="20.5806" rx="0.18384" ry="0.165827" transform="rotate(-22.7455 29.6059 20.5806)" fill="#FFDD86" />
</g>
<path d="M25.5636 24.6692L29.3652 26.4883" stroke="url(#paint15_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter10_f_6893_5267)">
<path d="M25.4984 24.5491L29.3 26.3682" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter11_f_6893_5267)">
<ellipse cx="29.5404" cy="26.3682" rx="0.18384" ry="0.165827" transform="rotate(28.2981 29.5404 26.3682)" fill="#FFDD86" />
</g>
<path d="M6.5281 24.681L2.72654 26.5" stroke="url(#paint16_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter12_f_6893_5267)">
<path d="M6.59334 24.5608L2.79179 26.3799" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter13_f_6893_5267)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.942776 -0.333427 -0.333427 0.942776 6.64614 24.5049)" fill="#FFDD86" />
</g>
<path d="M6.53973 22.5243L2.72615 20.7306" stroke="url(#paint17_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter14_f_6893_5267)">
<path d="M6.67403 22.4988L2.86046 20.7051" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter15_f_6893_5267)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.338111 -0.941106 -0.941106 0.338111 6.75078 22.5043)" fill="#FFDD86" />
</g>
<path d="M20.4179 23.0547C20.4179 25.4947 18.436 27.3906 15.996 27.3906C13.556 27.3906 11.6835 25.4478 11.6835 23.0078C11.6835 23.0078 13.4882 25.1406 15.996 23.0078C18.3476 25.0859 20.4179 23.0547 20.4179 23.0547Z" fill="url(#paint18_linear_6893_5267)" />
<g filter="url(#filter16_f_6893_5267)">
<rect x="22.1024" y="10.1016" width="4.5851" height="14.1857" fill="url(#paint19_linear_6893_5267)" />
</g>
<path d="M25.8329 13.5034L23.0329 10.9034C22.7129 10.6034 22.7129 10.1234 23.0329 9.83344L26.0476 7.15626C26.4304 6.82032 27.2229 6.9297 27.2229 7.76344V12.9634C27.2229 13.7969 26.3429 13.9834 25.8329 13.5034Z" fill="#FFB915" />
<path d="M25.8329 13.5034L23.0329 10.9034C22.7129 10.6034 22.7129 10.1234 23.0329 9.83344L26.0476 7.15626C26.4304 6.82032 27.2229 6.9297 27.2229 7.76344V12.9634C27.2229 13.7969 26.3429 13.9834 25.8329 13.5034Z" fill="url(#paint20_linear_6893_5267)" />
<g filter="url(#filter17_f_6893_5267)">
<path d="M26.6336 7.36719L23.0086 10.4922L26.5555 13.3047L26.6336 7.36719Z" fill="url(#paint21_radial_6893_5267)" />
</g>
<g filter="url(#filter18_f_6893_5267)">
<path d="M23.7274 10.2891L26.2586 13.0234" stroke="url(#paint22_linear_6893_5267)" stroke-width="0.5" stroke-linecap="round" />
</g>
<g filter="url(#filter19_f_6893_5267)">
<path d="M5.22321 7.49927V13.407L8.69196 10.3176L5.22321 7.49927Z" fill="#FEB33E" />
</g>
<g filter="url(#filter20_f_6893_5267)">
<path d="M5.22321 7.72656V12.9141" stroke="#FFE7A3" stroke-width="0.15" stroke-linecap="round" />
</g>
<g filter="url(#filter21_f_6893_5267)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9757 19.2763C10.8347 19.4617 10.7771 19.6974 10.7723 19.8424C10.7623 20.1459 10.5081 20.3839 10.2045 20.3739C9.90093 20.3639 9.66293 20.1097 9.67294 19.8061C9.68379 19.4771 9.79655 19.0096 10.1001 18.6105C10.4221 18.187 10.9408 17.868 11.6758 17.868C12.4182 17.868 12.9418 18.203 13.2658 18.6309C13.572 19.0351 13.6947 19.5116 13.7022 19.8512C13.7089 20.1549 13.4681 20.4065 13.1644 20.4132C12.8607 20.4198 12.6091 20.1791 12.6025 19.8754C12.5995 19.741 12.5403 19.4948 12.3889 19.295C12.2553 19.1186 12.0458 18.968 11.6758 18.968C11.2983 18.968 11.0982 19.1151 10.9757 19.2763Z" fill="url(#paint23_linear_6893_5267)" />
</g>
<g filter="url(#filter22_f_6893_5267)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.9445 19.2763C18.8035 19.4617 18.7459 19.6974 18.7411 19.8424C18.7311 20.1459 18.4769 20.3839 18.1733 20.3739C17.8697 20.3639 17.6317 20.1097 17.6417 19.8061C17.6526 19.4771 17.7653 19.0096 18.0688 18.6105C18.3909 18.187 18.9095 17.868 19.6445 17.868C20.387 17.868 20.9105 18.203 21.2346 18.6309C21.5407 19.0351 21.6635 19.5116 21.671 19.8512C21.6777 20.1549 21.4369 20.4065 21.1332 20.4132C20.8295 20.4198 20.5779 20.1791 20.5712 19.8754C20.5683 19.741 20.509 19.4948 20.3577 19.295C20.2241 19.1186 20.0146 18.968 19.6445 18.968C19.2671 18.968 19.067 19.1151 18.9445 19.2763Z" fill="url(#paint24_linear_6893_5267)" />
</g>
<path d="M10.5508 19.4141C10.5664 18.9401 10.8914 18.0078 12.0039 18.0078C13.1164 18.0078 13.4701 18.9792 13.4805 19.4531" stroke="url(#paint25_radial_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<path d="M10.5508 19.4141C10.5664 18.9401 10.8914 18.0078 12.0039 18.0078C13.1164 18.0078 13.4701 18.9792 13.4805 19.4531" stroke="url(#paint26_linear_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<path d="M18.5195 19.4141C18.5352 18.9401 18.8602 18.0078 19.9727 18.0078C21.0852 18.0078 21.4388 18.9792 21.4492 19.4531" stroke="url(#paint27_radial_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<path d="M18.5195 19.4141C18.5352 18.9401 18.8602 18.0078 19.9727 18.0078C21.0852 18.0078 21.4388 18.9792 21.4492 19.4531" stroke="url(#paint28_linear_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<g filter="url(#filter23_f_6893_5267)">
<ellipse cx="21.5391" cy="19.3672" rx="0.164062" ry="0.226562" fill="#715167" />
</g>
<g filter="url(#filter24_f_6893_5267)">
<ellipse cx="13.6445" cy="19.3672" rx="0.164062" ry="0.226562" fill="#715167" />
</g>
<defs>
<filter id="filter0_f_6893_5267" x="3.55408" y="20.3203" width="5.72693" height="6.698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter1_f_6893_5267" x="19.098" y="4.5188" width="9.00903" height="11.6356" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter2_f_6893_5267" x="24.8055" y="4.41406" width="3.41745" height="4.625" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter3_f_6893_5267" x="2.94611" y="3.22656" width="8.94989" height="10.7286" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter4_f_6893_5267" x="13.7482" y="20.056" width="3.66141" height="3.02374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter5_f_6893_5267" x="14.9086" y="19.8671" width="2.72344" height="1.74852" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter6_f_6893_5267" x="23.685" y="19.9796" width="6.00494" height="4.01282" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter7_f_6893_5267" x="23.6851" y="23.8235" width="4.12671" height="3.56561" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter8_f_6893_5267" x="24.9163" y="20.2484" width="5.10474" height="3.11255" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter9_f_6893_5267" x="28.9245" y="19.9119" width="1.36264" height="1.3374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter10_f_6893_5267" x="24.8484" y="23.8991" width="5.10162" height="3.11908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter11_f_6893_5267" x="28.8604" y="25.6981" width="1.35999" height="1.34009" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter12_f_6893_5267" x="2.14175" y="23.9108" width="5.10162" height="3.11908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter13_f_6893_5267" x="5.96417" y="23.8369" width="1.36395" height="1.33594" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter14_f_6893_5267" x="2.21042" y="20.0551" width="5.11365" height="3.09381" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter15_f_6893_5267" x="6.08273" y="21.8224" width="1.33606" height="1.36389" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter16_f_6893_5267" x="18.1024" y="6.10156" width="12.5851" height="22.1857" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter17_f_6893_5267" x="22.4086" y="6.76719" width="4.825" height="7.1375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter18_f_6893_5267" x="22.7274" y="9.28906" width="4.53125" height="4.73438" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.375" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter19_f_6893_5267" x="4.72321" y="6.99927" width="4.46875" height="6.90771" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter20_f_6893_5267" x="4.64819" y="7.15155" width="1.15002" height="6.33752" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter21_f_6893_5267" x="9.27264" y="17.468" width="4.82969" height="3.34529" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter22_f_6893_5267" x="17.2414" y="17.468" width="4.82969" height="3.34529" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter23_f_6893_5267" x="20.975" y="18.7406" width="1.12813" height="1.25313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter24_f_6893_5267" x="13.0805" y="18.7406" width="1.12813" height="1.25313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<linearGradient id="paint0_linear_6893_5267" x1="7.90668" y1="1.34978" x2="7.90668" y2="30.99" gradientUnits="userSpaceOnUse">
<stop offset="0.288159" stop-color="#F2CC26" />
<stop offset="0.762024" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint1_linear_6893_5267" x1="8.83102" y1="12.033" x2="1.16971" y2="12.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint2_linear_6893_5267" x1="26.7911" y1="12.033" x2="30.245" y2="12.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint3_linear_6893_5267" x1="16.001" y1="-1.59459" x2="16" y2="30.99" gradientUnits="userSpaceOnUse">
<stop offset="0.77079" stop-color="#F59639" stop-opacity="0" />
<stop offset="1" stop-color="#FF63C4" />
</linearGradient>
<linearGradient id="paint4_linear_6893_5267" x1="16" y1="11.2521" x2="16" y2="32.475" gradientUnits="userSpaceOnUse">
<stop offset="0.854227" stop-color="white" stop-opacity="0" />
<stop offset="0.985362" stop-color="white" />
</linearGradient>
<radialGradient id="paint5_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.1755 4.47688) rotate(55.4547) scale(5.37104 10.6707)">
<stop stop-color="#FFA720" />
<stop offset="0.921158" stop-color="#FFA720" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint6_linear_6893_5267" x1="21.9081" y1="6.85159" x2="28.1649" y2="13.6953" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFA720" />
<stop offset="1" stop-color="#FFA720" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint7_linear_6893_5267" x1="10.6023" y1="10.6172" x2="4.74258" y2="10.0703" gradientUnits="userSpaceOnUse">
<stop offset="0.437473" stop-color="#ED8C1B" />
<stop offset="1" stop-color="#FFB03A" />
</linearGradient>
<linearGradient id="paint8_linear_6893_5267" x1="27.0399" y1="4.96094" x2="26.4438" y2="7.30239" gradientUnits="userSpaceOnUse">
<stop offset="0.28598" stop-color="#FFE792" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint9_linear_6893_5267" x1="15.7508" y1="22.3512" x2="15.0789" y2="23.4449" gradientUnits="userSpaceOnUse">
<stop stop-color="#E3900E" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint10_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.4461 21.1797) rotate(-153.246) scale(2.11729 2.12981)">
<stop stop-color="#EA088B" />
<stop offset="1" stop-color="#E61E27" />
</radialGradient>
<linearGradient id="paint11_linear_6893_5267" x1="17.2036" y1="20.7414" x2="15.6801" y2="20.7414" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.9" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint12_linear_6893_5267" x1="24.2898" y1="23.236" x2="28.0242" y2="21.3203" gradientUnits="userSpaceOnUse">
<stop stop-color="#E88105" />
<stop offset="1" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint13_linear_6893_5267" x1="24.2898" y1="24.5798" x2="28.0242" y2="26.4955" gradientUnits="userSpaceOnUse">
<stop offset="0.286458" stop-color="#DE7D07" />
<stop offset="0.817708" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint14_linear_6893_5267" x1="25.2898" y1="22.9453" x2="29.371" y2="21.0078" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint15_linear_6893_5267" x1="25.0739" y1="24.7096" x2="29.1465" y2="26.6651" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint16_linear_6893_5267" x1="7.01785" y1="24.7214" x2="2.94525" y2="26.6768" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint17_linear_6893_5267" x1="6.81823" y1="22.9292" x2="2.72754" y2="21.0119" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint18_linear_6893_5267" x1="16.0466" y1="27.5225" x2="16.0466" y2="23.1004" gradientUnits="userSpaceOnUse">
<stop stop-color="#E61E27" />
<stop offset="1" stop-color="#672A7A" />
</linearGradient>
<linearGradient id="paint19_linear_6893_5267" x1="23.3524" y1="10.8385" x2="22.9558" y2="22.8891" gradientUnits="userSpaceOnUse">
<stop offset="0.548257" stop-color="#FFDD65" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint20_linear_6893_5267" x1="26.5398" y1="15.5078" x2="25.2898" y2="12.0391" gradientUnits="userSpaceOnUse">
<stop stop-color="#EF8A47" />
<stop offset="1" stop-color="#EF8A47" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint21_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.868 7.77344) rotate(55.7389) scale(7.82686 9.38424)">
<stop stop-color="#FFDF70" />
<stop offset="1" stop-color="#FFDF70" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint22_linear_6893_5267" x1="25.0555" y1="10.4766" x2="25.0555" y2="12.8203" gradientUnits="userSpaceOnUse">
<stop offset="0.432292" stop-color="#FFE7A3" />
<stop offset="1" stop-color="#FFDF83" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint23_linear_6893_5267" x1="14.9531" y1="19.7308" x2="15.2627" y2="22.9469" gradientUnits="userSpaceOnUse">
<stop stop-color="#EC9611" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint24_linear_6893_5267" x1="22.9219" y1="19.7308" x2="23.2315" y2="22.9469" gradientUnits="userSpaceOnUse">
<stop stop-color="#EC9611" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint25_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(12.0156 19.5886) rotate(-91.0929) scale(5.75971 5.75893)">
<stop offset="0.166667" stop-color="#482641" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.401042" stop-color="#483637" />
</radialGradient>
<linearGradient id="paint26_linear_6893_5267" x1="9.98438" y1="20.1406" x2="11.75" y2="18.8594" gradientUnits="userSpaceOnUse">
<stop stop-color="#271B27" />
<stop offset="1" stop-color="#483637" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint27_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19.9844 19.5886) rotate(-91.0929) scale(5.75971 5.75893)">
<stop offset="0.166667" stop-color="#482641" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.401042" stop-color="#483637" />
</radialGradient>
<linearGradient id="paint28_linear_6893_5267" x1="17.9531" y1="20.1406" x2="19.7188" y2="18.8594" gradientUnits="userSpaceOnUse">
<stop stop-color="#271B27" />
<stop offset="1" stop-color="#483637" stop-opacity="0" />
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -0,0 +1,13 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="#FFB02E" />
<path d="M9.00005 10.9265L6.20005 13.5265C5.70005 14.0265 4.80005 13.6265 4.80005 12.9265V7.72648C4.80005 7.12648 5.70005 6.72648 6.20005 7.22648L9.00005 9.82648C9.30005 10.1265 9.30005 10.6265 9.00005 10.9265Z" fill="#FF822D" />
<path d="M23.05 10.9265L25.85 13.5265C26.35 14.0265 27.25 13.6265 27.25 12.9265V7.72648C27.25 7.12648 26.35 6.72648 25.85 7.22648L23.05 9.82648C22.75 10.1265 22.75 10.6265 23.05 10.9265Z" fill="#FF822D" />
<path d="M17.0429 20H14.9571C14.5117 20 14.2886 20.5386 14.6036 20.8536L15.6465 21.8964C15.8417 22.0917 16.1583 22.0917 16.3536 21.8964L17.3965 20.8536C17.7114 20.5386 17.4884 20 17.0429 20Z" fill="#F70A8D" />
<path d="M2.72372 20.0528C2.47673 19.9293 2.17639 20.0294 2.0529 20.2764C1.9294 20.5234 2.02951 20.8237 2.2765 20.9472L6.2765 22.9472C6.52349 23.0707 6.82383 22.9706 6.94732 22.7236C7.07082 22.4766 6.97071 22.1763 6.72372 22.0528L2.72372 20.0528Z" fill="#FF6723" />
<path d="M2.72372 26.9472C2.47673 27.0707 2.17639 26.9706 2.0529 26.7236C1.9294 26.4766 2.02951 26.1763 2.2765 26.0528L6.2765 24.0528C6.52349 23.9293 6.82383 24.0294 6.94732 24.2764C7.07082 24.5234 6.97071 24.8237 6.72372 24.9472L2.72372 26.9472Z" fill="#FF6723" />
<path d="M29.9473 20.2764C29.8238 20.0294 29.5235 19.9293 29.2765 20.0528L25.2765 22.0528C25.0295 22.1763 24.9294 22.4766 25.0529 22.7236C25.1764 22.9706 25.4767 23.0707 25.7237 22.9472L29.7237 20.9472C29.9707 20.8237 30.0708 20.5234 29.9473 20.2764Z" fill="#FF6723" />
<path d="M29.2765 26.9472C29.5235 27.0707 29.8238 26.9706 29.9473 26.7236C30.0708 26.4766 29.9707 26.1763 29.7237 26.0528L25.7237 24.0528C25.4767 23.9293 25.1764 24.0294 25.0529 24.2764C24.9294 24.5234 25.0295 24.8237 25.2765 24.9472L29.2765 26.9472Z" fill="#FF6723" />
<path d="M15.9999 23.106C15.4625 23.6449 14.5434 24 13.4999 24C12.4681 24 11.5579 23.6527 11.0181 23.1239C11.1384 23.8481 11.9461 27.5 15.9999 27.5C20.0538 27.5 20.8615 23.8481 20.9818 23.1239C20.4419 23.6527 19.5317 24 18.4999 24C17.4564 24 16.5374 23.6449 15.9999 23.106Z" fill="#BB1D80" />
<path d="M11 19.5C11 19.33 11.0551 19.0639 11.2058 18.8547C11.3381 18.6709 11.563 18.5 12 18.5C12.437 18.5 12.6619 18.6709 12.7942 18.8547C12.9449 19.0639 13 19.33 13 19.5C13 19.7761 13.2239 20 13.5 20C13.7761 20 14 19.7761 14 19.5C14 19.17 13.9051 18.6861 13.6058 18.2703C13.2881 17.8291 12.763 17.5 12 17.5C11.237 17.5 10.7119 17.8291 10.3942 18.2703C10.0949 18.6861 10 19.17 10 19.5C10 19.7761 10.2239 20 10.5 20C10.7761 20 11 19.7761 11 19.5Z" fill="#402A32" />
<path d="M19 19.5C19 19.33 19.0551 19.0639 19.2058 18.8547C19.3381 18.6709 19.563 18.5 20 18.5C20.437 18.5 20.6619 18.6709 20.7942 18.8547C20.9449 19.0639 21 19.33 21 19.5C21 19.7761 21.2239 20 21.5 20C21.7761 20 22 19.7761 22 19.5C22 19.17 21.9051 18.6861 21.6058 18.2703C21.2881 17.8291 20.763 17.5 20 17.5C19.237 17.5 18.7119 17.8291 18.3942 18.2703C18.0949 18.6861 18 19.17 18 19.5C18 19.7761 18.2239 20 18.5 20C18.7761 20 19 19.7761 19 19.5Z" fill="#402A32" />
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -138,6 +138,11 @@
"FairUse": "cobalt is a tool for easing content downloads from internet and takes <span class=\"text-backdrop\">zero liability</span>. you are responsible for what you download, how you use and distribute that content.\n\ncobalt does not log any info about you, it's impossible for me to snitch on you, but please be mindful when using content of others and always credit original creators!\n\nwhen used in education purposes (lecture, homework, etc) please attach the source link.\n\nfair use and credits benefit everyone.",
"UrgentFeatureUpdate71": "more supported services!",
"UrgentThanks": "thank you for support!",
"SettingsDisableMetadata": "don't add metadata"
"SettingsDisableMetadata": "don't add metadata",
"UrgentNewDomain": "new domain, same cobalt",
"NewDomainWelcomeTitle": "hey there!",
"NewDomainWelcome": "cobalt is moving! same features, same owner, simply a more rememberable domain. and still no ads.\n\n<span class=\"text-backdrop\">cobalt.tools</span> is the new main domain, aka where you are now. make sure to update your bookmarks and reinstall the web app!",
"DataTransferSuccess": "btw, your settings have been transferred automatically :)",
"DataTransferError": "something went wrong when transferring your preferences. you'll have to open settings and configure cobalt by hand."
}
}

View file

@ -139,6 +139,11 @@
"FairUse": "кобальт - это инструмент для облегчения скачивания контента из интернета, и он <span class=\"text-backdrop\">не несёт никакой ответственности</span>. ты несёшь ответственность за то, что скачиваешь, как используешь и распространяешь скачанный контент.\n\nкобальт не собирает никакой информации о тебе, и не может донести на тебя, но, пожалуйста, будь сознателен при использовании чужого контента и всегда указывай авторов!\n\nпри использовании в образовательных целях (лекции, домашние задания и т.д.), пожалуйста, прикладывай ссылку на источник.\n\nчестное использование и указание авторства выгодно всем.",
"UrgentFeatureUpdate71": "расширение поддержки сервисов!",
"UrgentThanks": "спасибо за поддержку!",
"SettingsDisableMetadata": "не добавлять метаданные"
"SettingsDisableMetadata": "не добавлять метаданные",
"UrgentNewDomain": "новый домен, тот же кобальт",
"NewDomainWelcomeTitle": "привет!",
"NewDomainWelcome": "кобальт переезжает! те же функции, тот же владелец, просто более запоминающийся домен. по-прежнему без рекламы.\n\n<span class=\"text-backdrop\">cobalt.tools</span> - новый основной домен, т.е. где ты сейчас находишься. не забудь обновить закладки и переустановить веб-приложение!",
"DataTransferSuccess": "кстати, твои настройки были перенесены автоматически :)",
"DataTransferError": "при переносе настроек что-то пошло не так. придётся зайти в настройки и настроить кобальт вручную."
}
}

View file

@ -1,5 +1,16 @@
{
"current": {
"version": "7.4",
"date": "September 9, 2023",
"title": "new domain, what's coming in future, bug fixes, and more!",
"banner": {
"file": "newdomain.webp",
"width": 960,
"height": 540
},
"content": "cobalt is finally moving to its own domain! many of you have been anticipating this, and many kept forgetting the link due to how cryptic it was.\n\nwell, worry no more - <span class=\"text-backdrop\">cobalt.tools</span> is here.\n\nif you haven't yet, open <a class=\"text-backdrop link\" href=\"https://co.wukko.me\" target=\"_blank\">co.wukko.me</a> to transfer your settings here! no additional action from you is required. just open the old link and cobalt will do everything for you :)\n\nmake sure to <span class=\"text-backdrop\">update your bookmarks</span> and reinstall the web app!\n\nhere's what domain change means:\n*; still no ads, same owner, same features, same reliability. just a way more rememberable link (it's literally two words).\n*; cobalt.tools makes it clear that cobalt is a tool and that it's \"cobalt\", not \"wukko\".\n*; i can host various versions of cobalt on subdomains without links looking awkward.\n*; i can host cobalt-related websites without polluting my personal domain's dns (such as crowdin).\n*; i stand by same privacy policies (and in fact am using the same exact server as before).\n\nthe domain change is required for the future of cobalt.\n\nhere's what's coming soon:\n*; support for many top-requested sites, such as (but not limited to) twitch and niconico.\n*; education version of cobalt, as often requested by students and educators.\n*; major localization system upgrade, allowing for simpler community contributions.\n*; region-specific versions with 100% translations and tweaks.\n*; native clients for desktop and mobile (not sure about this one, i'm no superman).\n*; ...and more!\n\nnow, here's what's new in 7.4:\n*; tabs in popups now scroll to top on tab bar tap.\n*; padding across web app was tuned.\n*; (obviously) a migration agent. soon will be used for importing and exporting settings.\n*; some minor clean ups in codebase.\n\nif you want to help cobalt achieve goals listed above, consider donating! donations are the only way i can keep cobalt ad-less, powerful, (basically) limitless, and also 100% free.\n\nin fact, donations have helped me grow cobalt more than i've ever anticipated. just imagine how much better it will be in a year.\n\ngo to donations down below to find ways to donate!\n\nthank you for reading through all of this. i hope you enjoy this update and have a great day :D"
},
"history": [{
"version": "7.2 & 7.3",
"date": "September 6, 2023",
"title": "extended video length limit, metadata toggle, ui improvements, and more!",
@ -9,8 +20,7 @@
"height": 280
},
"content": "this update gives cobalt a sharp look in chromium browsers and makes it even more useful than before. check out the full changelog below!\n\nservice improvements:\n*; increased video length limit from 3 hours to 5 hours. feel free to download lectures you need :)\n*; you can now disable file metadata in settings.\n*; fixed a bug which previously caused some downloads to end up being 0 bytes.\n\nui improvements:\n*; fixed clickable area for urgent notice (text on top).\n*; fixed blurry header in chrome.\n*; fixed blurry tab bar in chrome.\n*; fixed blurry switches in chrome.\n*; fixed weirdly rounded corners in popups.\n*; fixed 1px gap on edges of various elements in popup in chrome.\n*; fixed overscrolling in other settings tab on ios.\n*; fixed unexpected button highlight effect on phones.\n*; removed outdated fixes for tiny screens.\n\nother improvements:\n*; cobalt web & api start faster than before, additional preparation functions aren't unexpectedly run anymore.\n*; cobalt is now available as a docker package. check it out on <a class=\"text-backdrop link\" href=\"https://github.com/wukko/cobalt/pkgs/container/cobalt\" target=\"_blank\">github</a>.\n\nthank you for being here. i hope you have a great day :D"
},
"history": [{
}, {
"version": "7.1",
"date": "August 20, 2023",
"title": "instagram, streamable, video metadata, and more!",

View file

@ -33,7 +33,8 @@ const names = {
"🔗": "link",
"⌨": "keyboard",
"📑": "boring_document",
"🧮": "abacus"
"🧮": "abacus",
"😸": "cat_grin"
}
let sizing = {
18: 0.8,

View file

@ -238,3 +238,10 @@ export function keyboardShortcuts(arr) {
return base;
}
export function webLoc(t, arr) {
let base = ``;
for (let i = 0; i < arr.length; i++) {
base += `${arr[i]}:` + "`" + t(arr[i]) + "`" + `,`
}
return `{${base}};`
}

View file

@ -1,4 +1,4 @@
import { checkbox, collapsibleList, explanation, footerButtons, multiPagePopup, popup, popupWithBottomButtons, sep, settingsCategory, switcher, socialLink, urgentNotice, keyboardShortcuts } from "./elements.js";
import { checkbox, collapsibleList, explanation, footerButtons, multiPagePopup, popup, popupWithBottomButtons, sep, settingsCategory, switcher, socialLink, urgentNotice, keyboardShortcuts, webLoc } from "./elements.js";
import { services as s, authorInfo, version, repo, donations, supportedAudio } from "../config.js";
import { getCommitInfo } from "../sub/currentCommit.js";
import loc from "../../localization/manager.js";
@ -75,7 +75,7 @@ export default function(obj) {
<noscript><div style="margin: 2rem;">${t('NoScriptMessage')}</div></noscript>
</head>
<body id="cobalt-body" ${platform === "p" ? 'class="desktop"' : ''} data-nosnippet ontouchstart>
<body id="cobalt-body" ${platform === "d" ? 'class="desktop"' : ''} data-nosnippet ontouchstart>
<body id="notification-area"></div>
${multiPagePopup({
name: "about",
@ -452,7 +452,7 @@ export default function(obj) {
padding: "no-margin"
}])
})
}],
}]
})}
${popupWithBottomButtons({
name: "picker",
@ -492,21 +492,35 @@ export default function(obj) {
buttonOnly: true,
classes: ["small"],
header: {
closeAria: t('AccessibilityGoBack'),
title: t('TitlePopupError'),
emoji: emoji("😿", 78, 1, 1),
},
body: `<div id="desc-error" class="desc-padding subtext"></div>`,
body: `<div id="desc-error" class="desc-padding subtext desc-error"></div>`,
buttonText: t('ErrorPopupCloseButton')
})}
</div>
<div id="popup-migration-container" class="popup-from-bottom">
${popup({
name: "migration",
standalone: true,
buttonOnly: true,
classes: ["small"],
header: {
title: t('NewDomainWelcomeTitle'),
emoji: emoji("😸", 78, 1, 1),
},
body: `<div id="desc-migration" class="desc-padding subtext desc-error">${t('NewDomainWelcome')}</div>`,
buttonText: t('ErrorPopupCloseButton')
})}
<div id="popup-backdrop-message" onclick="popup('message', 0)"></div>
</div>
<div id="popup-backdrop" onclick="hideAllPopups()"></div>
<div id="home" style="visibility:hidden">
${urgentNotice({
emoji: "💖",
text: t("UrgentThanks"),
emoji: "",
text: t("UrgentNewDomain"),
visible: true,
action: "popup('about', 1, 'donate')"
action: "popup('about', 1, 'changelog')"
})}
<div id="cobalt-main-box" class="center">
<div id="logo">${t("AppTitleCobalt")}</div>
@ -554,20 +568,25 @@ export default function(obj) {
</div>
</body>
<script type="text/javascript">
const loc = {
noInternet: ` + "`" + t('ErrorNoInternet') + "`" + `,
noURLReturned: ` + "`" + t('ErrorNoUrlReturned') + "`" + `,
unknownStatus: ` + "`" + t('ErrorUnknownStatus') + "`" + `,
collapseHistory: ` + "`" + t('ChangelogPressToHide') + "`" + `,
pickerDefault: ` + "`" + t('MediaPickerTitle') + "`" + `,
pickerImages: ` + "`" + t('ImagePickerTitle') + "`" + `,
pickerImagesExpl: ` + "`" + t(`ImagePickerExplanation${isMobile ? "Phone" : "PC"}`) + "`" + `,
pickerDefaultExpl: ` + "`" + t(`MediaPickerExplanation${isMobile ? "Phone" : "PC"}`) + "`" + `,
featureErrorGeneric: ` + "`" + t('FeatureErrorGeneric') + "`" + `,
clipboardErrorNoPermission: ` + "`" + t('ClipboardErrorNoPermission') + "`" + `,
clipboardErrorFirefox: ` + "`" + t('ClipboardErrorFirefox') + "`" + `,
};
let apiURL = '${process.env.apiURL ? process.env.apiURL.slice(0, -1) : ''}';
const loc = ${webLoc(t,
[
'ErrorNoInternet',
'ErrorNoUrlReturned',
'ErrorUnknownStatus',
'ChangelogPressToHide',
'MediaPickerTitle',
'MediaPickerExplanationPhone',
'MediaPickerExplanationPC',
'ImagePickerTitle',
'ImagePickerExplanationPhone',
'ImagePickerExplanationPC',
'FeatureErrorGeneric',
'ClipboardErrorNoPermission',
'ClipboardErrorFirefox',
'DataTransferSuccess',
'DataTransferError'
])}
</script>
<script type="text/javascript" src="cobalt.js"></script>
</html>

View file

@ -22,7 +22,7 @@
"enabled": true
},
"youtube": {
"alias": "youtube videos & shorts & music",
"alias": "youtube videos, shorts & music",
"patterns": ["watch?v=:id", "embed/:id"],
"bestAudio": "opus",
"enabled": true
@ -32,7 +32,7 @@
"enabled": true
},
"tiktok": {
"alias": "tiktok videos & photos & audio",
"alias": "tiktok videos, photos & audio",
"patterns": [":user/video/:postId", ":id", "t/:id"],
"audioFormats": ["best", "m4a", "mp3"],
"enabled": true

View file

@ -70,7 +70,7 @@ function setup() {
})
break;
case 'web':
console.log(Bright("\nAwesome! What's the domain this web app instance will be running on? (localhost)\nExample: co.wukko.me"));
console.log(Bright("\nAwesome! What's the domain this web app instance will be running on? (localhost)\nExample: cobalt.tools"));
rl.question(q, webURL => {
ob['webURL'] = `http://localhost:9001/`;