7.6: file name customization
This commit is contained in:
commit
68d65dc0b9
30 changed files with 1074 additions and 128 deletions
25
docs/API.md
25
docs/API.md
|
@ -14,18 +14,19 @@ Request Body Type: ``application/json``<br>
|
||||||
Response Body Type: ``application/json``
|
Response Body Type: ``application/json``
|
||||||
|
|
||||||
### Request Body Variables
|
### Request Body Variables
|
||||||
| key | type | variables | default | description |
|
| key | type | variables | default | description |
|
||||||
|:--------------------|:------------|:----------------------------------|:----------|:-------------------------------------------------------------------------------|
|
|:--------------------|:------------|:-------------------------------------|:------------|:-------------------------------------------------------------------------------|
|
||||||
| ``url`` | ``string`` | Sharable URL encoded as URI | ``null`` | **Must** be included in every request. |
|
| ``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. |
|
| ``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. |
|
| ``vQuality`` | ``string`` | ``144 / ... / 2160 / max`` | ``720`` | ``720`` quality is recommended for phones. |
|
||||||
| ``aFormat`` | ``string`` | ``best / mp3 / ogg / wav / opus`` | ``mp3`` | |
|
| ``aFormat`` | ``string`` | ``best / mp3 / ogg / wav / opus`` | ``mp3`` | |
|
||||||
| ``isAudioOnly`` | ``boolean`` | ``true / false`` | ``false`` | |
|
| ``filenamePattern`` | ``boolean`` | ``classic / pretty / basic / nerdy`` | ``classic`` | Changes the way files are named. Previews can be seen in the web app. |
|
||||||
| ``isNoTTWatermark`` | ``boolean`` | ``true / false`` | ``false`` | Changes whether downloaded TikTok videos have watermarks. |
|
| ``isAudioOnly`` | ``boolean`` | ``true / false`` | ``false`` | |
|
||||||
| ``isTTFullAudio`` | ``boolean`` | ``true / false`` | ``false`` | Enables download of original sound used in a TikTok video. |
|
| ``isNoTTWatermark`` | ``boolean`` | ``true / false`` | ``false`` | Changes whether downloaded TikTok videos have watermarks. |
|
||||||
| ``isAudioMuted`` | ``boolean`` | ``true / false`` | ``false`` | Disables audio track in video downloads. |
|
| ``isTTFullAudio`` | ``boolean`` | ``true / false`` | ``false`` | Enables download of original sound used in a TikTok video. |
|
||||||
| ``dubLang`` | ``boolean`` | ``true / false`` | ``false`` | Backend uses Accept-Language for YouTube video audio tracks when ``true``. |
|
| ``isAudioMuted`` | ``boolean`` | ``true / false`` | ``false`` | Disables audio track in video downloads. |
|
||||||
| ``disableMetadata`` | ``boolean`` | ``true / false`` | ``false`` | Disables file metadata when set to ``true``. |
|
| ``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
|
### Response Body Variables
|
||||||
| key | type | variables |
|
| key | type | variables |
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
"start": "node src/cobalt",
|
"start": "node src/cobalt",
|
||||||
"setup": "node src/modules/setup",
|
"setup": "node src/modules/setup",
|
||||||
"test": "node src/test/test",
|
"test": "node src/test/test",
|
||||||
"build": "node src/modules/buildStatic"
|
"build": "node src/modules/buildStatic",
|
||||||
|
"testFilenames": "node src/test/testFilenamePresets"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/wukko/cobalt#readme",
|
"homepage": "https://github.com/wukko/cobalt#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"content-disposition-header": "0.6.0",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"esbuild": "^0.14.51",
|
"esbuild": "^0.14.51",
|
||||||
|
@ -36,6 +38,6 @@
|
||||||
"set-cookie-parser": "2.6.0",
|
"set-cookie-parser": "2.6.0",
|
||||||
"undici": "^5.19.1",
|
"undici": "^5.19.1",
|
||||||
"url-pattern": "1.0.3",
|
"url-pattern": "1.0.3",
|
||||||
"youtubei.js": "^5.4.0"
|
"youtubei.js": "^6.4.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,15 +13,20 @@
|
||||||
"url": "https://twitter.com/justusecobalt",
|
"url": "https://twitter.com/justusecobalt",
|
||||||
"handle": "@justusecobalt"
|
"handle": "@justusecobalt"
|
||||||
},
|
},
|
||||||
|
"discord": {
|
||||||
|
"emoji": "👾",
|
||||||
|
"url": "https://discord.gg/pQPt8HBUPu",
|
||||||
|
"handle": "cobalt community server"
|
||||||
|
},
|
||||||
"mastodon": {
|
"mastodon": {
|
||||||
"emoji": "🐘",
|
"emoji": "🐘",
|
||||||
"url": "https://wetdry.world/@cobalt",
|
"url": "https://wetdry.world/@cobalt",
|
||||||
"handle": "@cobalt@wetdry.world"
|
"handle": "@cobalt@wetdry.world"
|
||||||
},
|
},
|
||||||
"discord": {
|
"support email": {
|
||||||
"emoji": "👾",
|
"emoji": "📧",
|
||||||
"url": "https://discord.gg/pQPt8HBUPu",
|
"url": "mailto:support@cobalt.tools",
|
||||||
"handle": "cobalt community server"
|
"handle": "support@cobalt.tools"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -886,6 +886,46 @@ button:active,
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transition: opacity 0.2s ease-out;
|
transition: opacity 0.2s ease-out;
|
||||||
}
|
}
|
||||||
|
.sponsored-by-text {
|
||||||
|
text-align: center!important;
|
||||||
|
font-size: .85rem;
|
||||||
|
color: var(--accent-subtext);
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
#sponsored-logos {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.2rem 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.sponsored-logo svg {
|
||||||
|
height: inherit;
|
||||||
|
width: inherit;
|
||||||
|
}
|
||||||
|
.sponsored-logo svg path {
|
||||||
|
fill: var(--accent-subtext);
|
||||||
|
}
|
||||||
|
#filename-preview {
|
||||||
|
background: var(--accent-button);
|
||||||
|
margin-top: 0.8rem;
|
||||||
|
}
|
||||||
|
.filename-item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
gap: 1rem;
|
||||||
|
padding: 0.5rem 0.7rem;
|
||||||
|
}
|
||||||
|
.filename-item.line {
|
||||||
|
border-bottom: 0.1rem solid var(--accent-button-elevated);
|
||||||
|
}
|
||||||
|
.filename-label {
|
||||||
|
color: var(--accent-subtext);
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
/* rounded corners */
|
/* rounded corners */
|
||||||
#bottom #paste,
|
#bottom #paste,
|
||||||
#footer .switch,
|
#footer .switch,
|
||||||
|
@ -900,7 +940,8 @@ button:active,
|
||||||
#popup-about .switch,
|
#popup-about .switch,
|
||||||
#popup-tabs .switch,
|
#popup-tabs .switch,
|
||||||
.text-to-copy,
|
.text-to-copy,
|
||||||
.text-to-copy.text-backdrop {
|
.text-to-copy.text-backdrop,
|
||||||
|
#filename-preview {
|
||||||
border-radius: 5px / 6px;
|
border-radius: 5px / 6px;
|
||||||
}
|
}
|
||||||
[type=checkbox] {
|
[type=checkbox] {
|
||||||
|
@ -946,27 +987,6 @@ button:active,
|
||||||
.collapse-list.last.expanded .collapse-header {
|
.collapse-list.last.expanded .collapse-header {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
.sponsored-by-text {
|
|
||||||
text-align: center!important;
|
|
||||||
font-size: .85rem;
|
|
||||||
color: var(--accent-subtext);
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
#sponsored-logos {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 0.2rem 1rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
.sponsored-logo svg {
|
|
||||||
height: inherit;
|
|
||||||
width: inherit;
|
|
||||||
}
|
|
||||||
.sponsored-logo svg path {
|
|
||||||
fill: var(--accent-subtext);
|
|
||||||
}
|
|
||||||
/* prevent resizing fliecker on ios if web app is installed as standalone */
|
/* prevent resizing fliecker on ios if web app is installed as standalone */
|
||||||
@media all and (display-mode: standalone) {
|
@media all and (display-mode: standalone) {
|
||||||
#home.visible {
|
#home.visible {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const version = 37;
|
const version = 38;
|
||||||
|
|
||||||
const ua = navigator.userAgent.toLowerCase();
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
const isIOS = ua.match("iphone os");
|
const isIOS = ua.match("iphone os");
|
||||||
|
@ -17,7 +17,8 @@ const switchers = {
|
||||||
"aFormat": ["mp3", "best", "ogg", "wav", "opus"],
|
"aFormat": ["mp3", "best", "ogg", "wav", "opus"],
|
||||||
"dubLang": ["original", "auto"],
|
"dubLang": ["original", "auto"],
|
||||||
"vimeoDash": ["false", "true"],
|
"vimeoDash": ["false", "true"],
|
||||||
"audioMode": ["false", "true"]
|
"audioMode": ["false", "true"],
|
||||||
|
"filenamePattern": ["classic", "pretty", "basic", "nerdy"]
|
||||||
};
|
};
|
||||||
const checkboxes = [
|
const checkboxes = [
|
||||||
"alwaysVisibleButton",
|
"alwaysVisibleButton",
|
||||||
|
@ -33,14 +34,20 @@ const checkboxes = [
|
||||||
const exceptions = { // used for mobile devices
|
const exceptions = { // used for mobile devices
|
||||||
"vQuality": "720"
|
"vQuality": "720"
|
||||||
};
|
};
|
||||||
const bottomPopups = ["error", "download"]
|
const bottomPopups = ["error", "download"];
|
||||||
|
|
||||||
const pageQuery = new URLSearchParams(window.location.search);
|
const pageQuery = new URLSearchParams(window.location.search);
|
||||||
|
|
||||||
let store = {};
|
let store = {};
|
||||||
|
|
||||||
function changeAPI(url) {
|
function fixApiUrl(url) {
|
||||||
apiURL = url;
|
return url.endsWith('/') ? url.slice(0, -1) : url
|
||||||
|
}
|
||||||
|
|
||||||
|
let apiURL = fixApiUrl(defaultApiUrl);
|
||||||
|
|
||||||
|
function changeApi(url) {
|
||||||
|
apiURL = fixApiUrl(url);
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
function eid(id) {
|
function eid(id) {
|
||||||
|
@ -127,6 +134,8 @@ function detectColorScheme() {
|
||||||
document.documentElement.setAttribute("data-theme", theme);
|
document.documentElement.setAttribute("data-theme", theme);
|
||||||
}
|
}
|
||||||
function changeTab(evnt, tabId, tabClass) {
|
function changeTab(evnt, tabId, tabClass) {
|
||||||
|
if (tabId === "tab-settings-other") updateFilenamePreview();
|
||||||
|
|
||||||
let tabcontent = document.getElementsByClassName(`tab-content-${tabClass}`);
|
let tabcontent = document.getElementsByClassName(`tab-content-${tabClass}`);
|
||||||
let tablinks = document.getElementsByClassName(`tab-${tabClass}`);
|
let tablinks = document.getElementsByClassName(`tab-${tabClass}`);
|
||||||
|
|
||||||
|
@ -274,6 +283,7 @@ function changeSwitcher(li, b) {
|
||||||
(switchers[li][i] === b) ? enable(`${li}-${b}`) : disable(`${li}-${switchers[li][i]}`)
|
(switchers[li][i] === b) ? enable(`${li}-${b}`) : disable(`${li}-${switchers[li][i]}`)
|
||||||
}
|
}
|
||||||
if (li === "theme") detectColorScheme();
|
if (li === "theme") detectColorScheme();
|
||||||
|
if (li === "filenamePattern") updateFilenamePreview();
|
||||||
} else {
|
} else {
|
||||||
let pref = switchers[li][0];
|
let pref = switchers[li][0];
|
||||||
if (isMobile && exceptions[li]) pref = exceptions[li];
|
if (isMobile && exceptions[li]) pref = exceptions[li];
|
||||||
|
@ -292,28 +302,6 @@ function checkbox(action) {
|
||||||
}
|
}
|
||||||
action === "disableChangelog" && sGet(action) === "true" ? notificationCheck("disable") : notificationCheck();
|
action === "disableChangelog" && sGet(action) === "true" ? notificationCheck("disable") : notificationCheck();
|
||||||
}
|
}
|
||||||
function loadSettings() {
|
|
||||||
if (sGet("alwaysVisibleButton") === "true") {
|
|
||||||
eid("alwaysVisibleButton").checked = true;
|
|
||||||
eid("download-button").value = '>>'
|
|
||||||
eid("download-button").style.padding = '0 1rem';
|
|
||||||
}
|
|
||||||
if (sGet("downloadPopup") === "true" && !isIOS) {
|
|
||||||
eid("downloadPopup").checked = true;
|
|
||||||
}
|
|
||||||
if (sGet("reduceTransparency") === "true" || isOldFirefox) {
|
|
||||||
eid("cobalt-body").classList.add('no-transparency');
|
|
||||||
}
|
|
||||||
if (sGet("disableAnimations") === "true") {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
for (let i in switchers) {
|
|
||||||
changeSwitcher(i, sGet(i))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function changeButton(type, text) {
|
function changeButton(type, text) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0: //error
|
case 0: //error
|
||||||
|
@ -372,6 +360,7 @@ async function download(url) {
|
||||||
let req = {
|
let req = {
|
||||||
url: encodeURIComponent(url.split("&")[0].split('%')[0]),
|
url: encodeURIComponent(url.split("&")[0].split('%')[0]),
|
||||||
aFormat: sGet("aFormat").slice(0, 4),
|
aFormat: sGet("aFormat").slice(0, 4),
|
||||||
|
filenamePattern: sGet("filenamePattern"),
|
||||||
dubLang: false
|
dubLang: false
|
||||||
}
|
}
|
||||||
if (sGet("dubLang") === "auto") {
|
if (sGet("dubLang") === "auto") {
|
||||||
|
@ -514,6 +503,73 @@ function unpackSettings(b64) {
|
||||||
}
|
}
|
||||||
return changed
|
return changed
|
||||||
}
|
}
|
||||||
|
function updateFilenamePreview() {
|
||||||
|
let videoFilePreview = ``;
|
||||||
|
let audioFilePreview = ``;
|
||||||
|
let resMatch = {
|
||||||
|
"max": "3840x2160",
|
||||||
|
"2160": "3840x2160",
|
||||||
|
"1440": "2560x1440",
|
||||||
|
"1080": "1920x1080",
|
||||||
|
"720": "1280x720",
|
||||||
|
"480": "854x480",
|
||||||
|
"360": "640x360",
|
||||||
|
}
|
||||||
|
// "dubLang"
|
||||||
|
// sGet("muteAudio") === "true"
|
||||||
|
switch(sGet("filenamePattern")) {
|
||||||
|
case "classic":
|
||||||
|
videoFilePreview = `youtube_yPYZpwSpKmA_${resMatch[sGet('vQuality')]}_${sGet('vCodec')}`
|
||||||
|
+ `${sGet("muteAudio") === "true" ? "_mute" : ""}.${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
|
||||||
|
audioFilePreview = `youtube_yPYZpwSpKmA_audio.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
|
||||||
|
break;
|
||||||
|
case "pretty":
|
||||||
|
videoFilePreview =
|
||||||
|
`${loc.FilenamePreviewVideoTitle} `
|
||||||
|
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}, `
|
||||||
|
+ `${sGet("muteAudio") === "true" ? "mute, " : ""}youtube).${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
|
||||||
|
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor} (soundcloud).${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
|
||||||
|
break;
|
||||||
|
case "basic":
|
||||||
|
videoFilePreview =
|
||||||
|
`${loc.FilenamePreviewVideoTitle} `
|
||||||
|
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}${sGet("muteAudio") === "true" ? " mute" : ""}).${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
|
||||||
|
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor}.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
|
||||||
|
break;
|
||||||
|
case "nerdy":
|
||||||
|
videoFilePreview =
|
||||||
|
`${loc.FilenamePreviewVideoTitle} `
|
||||||
|
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}, `
|
||||||
|
+ `${sGet("muteAudio") === "true" ? "mute, " : ""}youtube, yPYZpwSpKmA).${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
|
||||||
|
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor} (soundcloud, 1242868615).${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
eid("video-filename-text").innerHTML = videoFilePreview
|
||||||
|
eid("audio-filename-text").innerHTML = audioFilePreview
|
||||||
|
}
|
||||||
|
function loadSettings() {
|
||||||
|
if (sGet("alwaysVisibleButton") === "true") {
|
||||||
|
eid("alwaysVisibleButton").checked = true;
|
||||||
|
eid("download-button").value = '>>'
|
||||||
|
eid("download-button").style.padding = '0 1rem';
|
||||||
|
}
|
||||||
|
if (sGet("downloadPopup") === "true" && !isIOS) {
|
||||||
|
eid("downloadPopup").checked = true;
|
||||||
|
}
|
||||||
|
if (sGet("reduceTransparency") === "true" || isOldFirefox) {
|
||||||
|
eid("cobalt-body").classList.add('no-transparency');
|
||||||
|
}
|
||||||
|
if (sGet("disableAnimations") === "true") {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
for (let i in switchers) {
|
||||||
|
changeSwitcher(i, sGet(i))
|
||||||
|
}
|
||||||
|
updateFilenamePreview()
|
||||||
|
}
|
||||||
window.onload = () => {
|
window.onload = () => {
|
||||||
loadCelebrationsEmoji();
|
loadCelebrationsEmoji();
|
||||||
|
|
||||||
|
|
338
src/front/emoji/3d/film_frames.svg
Normal file
338
src/front/emoji/3d/film_frames.svg
Normal file
|
@ -0,0 +1,338 @@
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g filter="url(#filter0_iiii_18_20100)">
|
||||||
|
<rect x="2.09375" y="4.96875" width="27.875" height="22.0312" rx="0.8" fill="#5E4F86" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter1_f_18_20100)">
|
||||||
|
<path d="M2.57935 21.9844V10.0156H5.96764C6.92614 10.0156 7.70317 10.8663 7.70317 11.9156V20.0844C7.70317 21.1337 6.92614 21.9844 5.96764 21.9844H2.57935Z" stroke="#463875" stroke-width="0.65" />
|
||||||
|
<path d="M2.57935 21.9844V10.0156H5.96764C6.92614 10.0156 7.70317 10.8663 7.70317 11.9156V20.0844C7.70317 21.1337 6.92614 21.9844 5.96764 21.9844H2.57935Z" stroke="url(#paint0_linear_18_20100)" stroke-width="0.65" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter2_f_18_20100)">
|
||||||
|
<path d="M29.4983 10.0156V21.9844H26.1C25.1387 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.1387 10.0156 26.1 10.0156H29.4983Z" stroke="#463875" stroke-width="0.65" />
|
||||||
|
<path d="M29.4983 10.0156V21.9844H26.1C25.1387 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.1387 10.0156 26.1 10.0156H29.4983Z" stroke="url(#paint1_linear_18_20100)" stroke-width="0.65" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter3_f_18_20100)">
|
||||||
|
<path d="M9.94531 11.9156C9.94531 10.8663 10.796 10.0156 11.8453 10.0156H20.1547C21.204 10.0156 22.0547 10.8663 22.0547 11.9156V20.0844C22.0547 21.1337 21.204 21.9844 20.1547 21.9844H11.8453C10.796 21.9844 9.94531 21.1337 9.94531 20.0844V11.9156Z" stroke="#463875" stroke-width="0.65" />
|
||||||
|
<path d="M9.94531 11.9156C9.94531 10.8663 10.796 10.0156 11.8453 10.0156H20.1547C21.204 10.0156 22.0547 10.8663 22.0547 11.9156V20.0844C22.0547 21.1337 21.204 21.9844 20.1547 21.9844H11.8453C10.796 21.9844 9.94531 21.1337 9.94531 20.0844V11.9156Z" stroke="url(#paint2_linear_18_20100)" stroke-width="0.65" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter4_i_18_20100)">
|
||||||
|
<path d="M29.9688 10.0156V21.9844H26.2594C25.21 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.21 10.0156 26.2594 10.0156H29.9688Z" fill="#7BBEE4" />
|
||||||
|
</g>
|
||||||
|
<path d="M29.9688 10.0156V21.9844H26.2594C25.21 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.21 10.0156 26.2594 10.0156H29.9688Z" fill="url(#paint3_linear_18_20100)" />
|
||||||
|
<g filter="url(#filter5_i_18_20100)">
|
||||||
|
<path d="M9.94531 11.9156C9.94531 10.8663 10.796 10.0156 11.8453 10.0156H20.1547C21.204 10.0156 22.0547 10.8663 22.0547 11.9156V20.0844C22.0547 21.1337 21.204 21.9844 20.1547 21.9844H11.8453C10.796 21.9844 9.94531 21.1337 9.94531 20.0844V11.9156Z" fill="#7BBEE4" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter6_i_18_20100)">
|
||||||
|
<path d="M2.09375 21.9844V10.0156H5.80313C6.85246 10.0156 7.70312 10.8663 7.70312 11.9156V20.0844C7.70312 21.1337 6.85246 21.9844 5.80313 21.9844H2.09375Z" fill="#7BBEE4" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter7_f_18_20100)">
|
||||||
|
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" stroke="url(#paint4_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter8_f_18_20100)">
|
||||||
|
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter9_f_18_20100)">
|
||||||
|
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" stroke="url(#paint5_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter10_f_18_20100)">
|
||||||
|
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter11_f_18_20100)">
|
||||||
|
<path d="M15.0078 6.75781C15.0078 6.61974 15.1197 6.50781 15.2578 6.50781H16.8047C16.9428 6.50781 17.0547 6.61974 17.0547 6.75781V8.30469C17.0547 8.44276 16.9428 8.55469 16.8047 8.55469H15.2578C15.1197 8.55469 15.0078 8.44276 15.0078 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M15.0078 6.75781C15.0078 6.61974 15.1197 6.50781 15.2578 6.50781H16.8047C16.9428 6.50781 17.0547 6.61974 17.0547 6.75781V8.30469C17.0547 8.44276 16.9428 8.55469 16.8047 8.55469H15.2578C15.1197 8.55469 15.0078 8.44276 15.0078 8.30469V6.75781Z" stroke="url(#paint6_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter12_f_18_20100)">
|
||||||
|
<path d="M15.0078 6.75781C15.0078 6.61974 15.1197 6.50781 15.2578 6.50781H16.8047C16.9428 6.50781 17.0547 6.61974 17.0547 6.75781V8.30469C17.0547 8.44276 16.9428 8.55469 16.8047 8.55469H15.2578C15.1197 8.55469 15.0078 8.44276 15.0078 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter13_f_18_20100)">
|
||||||
|
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" stroke="url(#paint7_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter14_f_18_20100)">
|
||||||
|
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter15_f_18_20100)">
|
||||||
|
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" stroke="url(#paint8_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter16_f_18_20100)">
|
||||||
|
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter17_f_18_20100)">
|
||||||
|
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" stroke="url(#paint9_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter18_f_18_20100)">
|
||||||
|
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" stroke="url(#paint10_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter19_f_18_20100)">
|
||||||
|
<path d="M15 23.6953C15 23.5572 15.1119 23.4453 15.25 23.4453H16.7969C16.9349 23.4453 17.0469 23.5572 17.0469 23.6953V25.2422C17.0469 25.3803 16.9349 25.4922 16.7969 25.4922H15.25C15.1119 25.4922 15 25.3803 15 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M15 23.6953C15 23.5572 15.1119 23.4453 15.25 23.4453H16.7969C16.9349 23.4453 17.0469 23.5572 17.0469 23.6953V25.2422C17.0469 25.3803 16.9349 25.4922 16.7969 25.4922H15.25C15.1119 25.4922 15 25.3803 15 25.2422V23.6953Z" stroke="url(#paint11_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter20_f_18_20100)">
|
||||||
|
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" stroke="url(#paint12_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter21_f_18_20100)">
|
||||||
|
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
|
||||||
|
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" stroke="url(#paint13_linear_18_20100)" stroke-width="0.6" />
|
||||||
|
</g>
|
||||||
|
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" fill="#E5E5E5" />
|
||||||
|
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" fill="#E5E5E5" />
|
||||||
|
<path d="M15 6.75781C15 6.61974 15.1119 6.50781 15.25 6.50781H16.7969C16.9349 6.50781 17.0469 6.61974 17.0469 6.75781V8.30469C17.0469 8.44276 16.9349 8.55469 16.7969 8.55469H15.25C15.1119 8.55469 15 8.44276 15 8.30469V6.75781Z" fill="#E5E5E5" />
|
||||||
|
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" fill="#E5E5E5" />
|
||||||
|
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" fill="#E5E5E5" />
|
||||||
|
<g filter="url(#filter22_f_18_20100)">
|
||||||
|
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter23_f_18_20100)">
|
||||||
|
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter24_f_18_20100)">
|
||||||
|
<path d="M15.0078 23.6953C15.0078 23.5572 15.1197 23.4453 15.2578 23.4453H16.8047C16.9428 23.4453 17.0547 23.5572 17.0547 23.6953V25.2422C17.0547 25.3803 16.9428 25.4922 16.8047 25.4922H15.2578C15.1197 25.4922 15.0078 25.3803 15.0078 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter25_f_18_20100)">
|
||||||
|
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter26_f_18_20100)">
|
||||||
|
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" fill="#E5E5E5" />
|
||||||
|
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" fill="#E5E5E5" />
|
||||||
|
<path d="M15 23.6953C15 23.5572 15.1119 23.4453 15.25 23.4453H16.7969C16.9349 23.4453 17.0469 23.5572 17.0469 23.6953V25.2422C17.0469 25.3803 16.9349 25.4922 16.7969 25.4922H15.25C15.1119 25.4922 15 25.3803 15 25.2422V23.6953Z" fill="#E5E5E5" />
|
||||||
|
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" fill="#E5E5E5" />
|
||||||
|
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" fill="#E5E5E5" />
|
||||||
|
<defs>
|
||||||
|
<filter id="filter0_iiii_18_20100" x="1.79375" y="4.66875" width="28.575" height="22.6313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dy="0.4" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.356863 0 0 0 0 0.317647 0 0 0 0 0.501961 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dx="-0.4" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.447059 0 0 0 0 0.407843 0 0 0 0 0.572549 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="effect1_innerShadow_18_20100" result="effect2_innerShadow_18_20100" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dy="-0.4" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.376471 0 0 0 0 0.231373 0 0 0 0 0.584314 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="effect2_innerShadow_18_20100" result="effect3_innerShadow_18_20100" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dx="0.4" />
|
||||||
|
<feGaussianBlur stdDeviation="0.2" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.313726 0 0 0 0 0.262745 0 0 0 0 0.466667 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="effect3_innerShadow_18_20100" result="effect4_innerShadow_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter1_f_18_20100" x="1.95439" y="9.39067" width="6.3738" height="13.2187" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter2_f_18_20100" x="23.7344" y="9.39067" width="6.38894" height="13.2187" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter3_f_18_20100" x="9.32036" y="9.39067" width="13.3593" height="13.2187" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter4_i_18_20100" x="24.3594" y="10.0156" width="6.60938" height="11.9688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dx="1" />
|
||||||
|
<feGaussianBlur stdDeviation="1.5" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.321569 0 0 0 0 0.615686 0 0 0 0 0.764706 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter5_i_18_20100" x="9.94531" y="10.0156" width="12.1094" height="11.9688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset />
|
||||||
|
<feGaussianBlur stdDeviation="2" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.321569 0 0 0 0 0.615686 0 0 0 0 0.764706 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter6_i_18_20100" x="1.09375" y="10.0156" width="6.60938" height="11.9688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dx="-1" />
|
||||||
|
<feGaussianBlur stdDeviation="1.5" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.321569 0 0 0 0 0.615686 0 0 0 0 0.764706 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter7_f_18_20100" x="3.51245" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter8_f_18_20100" x="3.86245" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter9_f_18_20100" x="8.9812" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter10_f_18_20100" x="9.3312" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter11_f_18_20100" x="14.4578" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter12_f_18_20100" x="14.8078" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter13_f_18_20100" x="19.9187" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter14_f_18_20100" x="20.2687" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter15_f_18_20100" x="25.3875" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter16_f_18_20100" x="25.7375" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter17_f_18_20100" x="3.51245" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter18_f_18_20100" x="8.9812" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter19_f_18_20100" x="14.45" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter20_f_18_20100" x="19.9187" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter21_f_18_20100" x="25.3875" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter22_f_18_20100" x="3.86245" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter23_f_18_20100" x="9.3312" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter24_f_18_20100" x="14.8078" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter25_f_18_20100" x="20.2687" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter26_f_18_20100" x="25.7375" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient id="paint0_linear_18_20100" x1="2.76942" y1="21.4319" x2="6.13388" y2="21.1993" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#564D7C" />
|
||||||
|
<stop offset="1" stop-color="#564D7C" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_18_20100" x1="24.55" y1="21.4319" x2="25.7998" y2="21.3309" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7D769C" />
|
||||||
|
<stop offset="1" stop-color="#7D769C" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_18_20100" x1="10.3945" y1="21.4319" x2="13.255" y2="20.8871" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7D769C" />
|
||||||
|
<stop offset="1" stop-color="#7D769C" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint3_linear_18_20100" x1="30.8125" y1="21.9844" x2="26.6875" y2="21.9844" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#87CDED" />
|
||||||
|
<stop offset="1" stop-color="#87CDED" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint4_linear_18_20100" x1="3.90625" y1="8.55469" x2="4.8125" y2="8.45312" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint5_linear_18_20100" x1="9.375" y1="8.55469" x2="10.2812" y2="8.45312" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint6_linear_18_20100" x1="14.8516" y1="8.55469" x2="15.7578" y2="8.45312" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint7_linear_18_20100" x1="20.3125" y1="8.55469" x2="21.2187" y2="8.45312" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint8_linear_18_20100" x1="25.7812" y1="8.55469" x2="26.6875" y2="8.45312" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint9_linear_18_20100" x1="3.90625" y1="25.4922" x2="4.8125" y2="25.3906" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint10_linear_18_20100" x1="9.375" y1="25.4922" x2="10.2812" y2="25.3906" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint11_linear_18_20100" x1="14.8437" y1="25.4922" x2="15.75" y2="25.3906" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint12_linear_18_20100" x1="20.3125" y1="25.4922" x2="21.2187" y2="25.3906" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint13_linear_18_20100" x1="25.7812" y1="25.4922" x2="26.6875" y2="25.3906" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7A7294" />
|
||||||
|
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 32 KiB |
186
src/front/emoji/3d/headphone.svg
Normal file
186
src/front/emoji/3d/headphone.svg
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g filter="url(#filter0_i_18_18382)">
|
||||||
|
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint0_radial_18_18382)" />
|
||||||
|
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint1_radial_18_18382)" />
|
||||||
|
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint2_radial_18_18382)" />
|
||||||
|
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint3_radial_18_18382)" />
|
||||||
|
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint4_radial_18_18382)" />
|
||||||
|
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint5_linear_18_18382)" />
|
||||||
|
</g>
|
||||||
|
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint6_linear_18_18382)" />
|
||||||
|
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint7_linear_18_18382)" />
|
||||||
|
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint8_radial_18_18382)" />
|
||||||
|
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint9_linear_18_18382)" />
|
||||||
|
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint10_linear_18_18382)" />
|
||||||
|
<g filter="url(#filter1_i_18_18382)">
|
||||||
|
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint11_linear_18_18382)" />
|
||||||
|
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint12_linear_18_18382)" />
|
||||||
|
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint13_radial_18_18382)" />
|
||||||
|
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint14_radial_18_18382)" />
|
||||||
|
</g>
|
||||||
|
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint15_linear_18_18382)" />
|
||||||
|
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint16_radial_18_18382)" />
|
||||||
|
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint17_radial_18_18382)" />
|
||||||
|
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint18_linear_18_18382)" />
|
||||||
|
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint19_linear_18_18382)" />
|
||||||
|
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint20_linear_18_18382)" />
|
||||||
|
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint21_radial_18_18382)" />
|
||||||
|
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint22_radial_18_18382)" />
|
||||||
|
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint23_linear_18_18382)" />
|
||||||
|
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint24_radial_18_18382)" />
|
||||||
|
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint25_linear_18_18382)" />
|
||||||
|
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint26_radial_18_18382)" />
|
||||||
|
<g filter="url(#filter2_f_18_18382)">
|
||||||
|
<path d="M26.1724 17.316C26.1896 17.2295 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.83019 17.4014" stroke="url(#paint27_linear_18_18382)" stroke-width="0.1" />
|
||||||
|
</g>
|
||||||
|
<g filter="url(#filter3_f_18_18382)">
|
||||||
|
<path d="M27.0589 16.0014C26.9997 16.2263 26.9622 16.7367 27.2856 16.9788C27.609 17.2208 27.8068 17.3878 27.8653 17.441C28.1661 17.6417 28.6741 18.257 28.299 19.1125" stroke="#D1D1D3" stroke-width="0.3" />
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="filter0_i_18_18382" x="3.12305" y="1.83105" width="26.0042" height="20.2361" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dx="0.25" dy="-0.25" />
|
||||||
|
<feGaussianBlur stdDeviation="0.25" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.52549 0 0 0 0 0.513726 0 0 0 0 0.541176 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_18382" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter1_i_18_18382" x="20.6027" y="19.4521" width="7.70354" height="10.2228" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
|
||||||
|
<feOffset dx="-0.2" dy="0.2" />
|
||||||
|
<feGaussianBlur stdDeviation="0.2" />
|
||||||
|
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.690196 0 0 0 0 0.686275 0 0 0 0 0.698039 0 0 0 1 0" />
|
||||||
|
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_18382" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter2_f_18_18382" x="4.82808" y="3.15132" width="22.3438" height="14.459" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_18_18382" />
|
||||||
|
</filter>
|
||||||
|
<filter id="filter3_f_18_18382" x="26.5693" y="15.6633" width="2.31326" height="3.80947" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix" />
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
|
||||||
|
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_18382" />
|
||||||
|
</filter>
|
||||||
|
<radialGradient id="paint0_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(23.6188 4.48184) rotate(114.311) scale(16.9353 23.4245)">
|
||||||
|
<stop stop-color="#DADADB" />
|
||||||
|
<stop offset="1" stop-color="#B9B5BD" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint1_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(3.12305 10.8068) rotate(19.2062) scale(9.61161 32.0782)">
|
||||||
|
<stop offset="0.095751" stop-color="#969499" />
|
||||||
|
<stop offset="1" stop-color="#969499" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint2_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.95906 20.563) rotate(-117.087) scale(3.0608 1.02371)">
|
||||||
|
<stop offset="0.256074" stop-color="#C6C4C9" />
|
||||||
|
<stop offset="1" stop-color="#C6C4C9" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint3_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.83425 20.7294) rotate(-117.35) scale(2.03754 0.586159)">
|
||||||
|
<stop offset="0.166979" stop-color="#8D8D8F" />
|
||||||
|
<stop offset="1" stop-color="#8D8D8F" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint4_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.3511 8.14414) rotate(-54.3815) scale(3.429 6.67803)">
|
||||||
|
<stop offset="0.56676" stop-color="#EBEBED" />
|
||||||
|
<stop offset="1" stop-color="#EBEBED" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint5_linear_18_18382" x1="27.8844" y1="21.4159" x2="27.094" y2="18.67" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0.326903" stop-color="#B1B0B4" />
|
||||||
|
<stop offset="1" stop-color="#B1B0B4" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint6_linear_18_18382" x1="5.06449" y1="21.4326" x2="7.42872" y2="29.4749" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#A6A0AA" />
|
||||||
|
<stop offset="1" stop-color="#9D94A2" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint7_linear_18_18382" x1="8.15118" y1="29.4749" x2="7.42872" y2="26.9552" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#998E9E" />
|
||||||
|
<stop offset="1" stop-color="#998E9E" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint8_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(3.677 22.0576) rotate(75.1074) scale(8.92479 1.06286)">
|
||||||
|
<stop stop-color="#817F83" />
|
||||||
|
<stop offset="1" stop-color="#817F83" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint9_linear_18_18382" x1="4.53324" y1="19.9951" x2="5.87699" y2="23.1513" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#7F7E80" />
|
||||||
|
<stop offset="1" stop-color="#7F7E80" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint10_linear_18_18382" x1="8.55733" y1="24.1461" x2="7.00043" y2="24.6537" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0.181858" stop-color="#807D84" />
|
||||||
|
<stop offset="1" stop-color="#807D84" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint11_linear_18_18382" x1="27.1583" y1="20.8076" x2="24.5546" y2="29.4749" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#BAB9BC" />
|
||||||
|
<stop offset="1" stop-color="#9F96A4" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint12_linear_18_18382" x1="23.252" y1="29.4749" x2="25.1583" y2="26.4013" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#9A8F9F" />
|
||||||
|
<stop offset="1" stop-color="#9A8F9F" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint13_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(27.6739 22.7295) rotate(106.376) scale(3.71313 0.681309)">
|
||||||
|
<stop stop-color="#C7C6C8" />
|
||||||
|
<stop offset="1" stop-color="#BAB8BC" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint14_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(23.6895 22.6826) rotate(19.7468) scale(3.88469 2.56034)">
|
||||||
|
<stop stop-color="#C1BFC3" />
|
||||||
|
<stop offset="1" stop-color="#C1BFC3" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint15_linear_18_18382" x1="7.97071" y1="18.4013" x2="11.7207" y2="30.9013" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#B7B6B8" />
|
||||||
|
<stop offset="0.321101" stop-color="#D9D5DD" />
|
||||||
|
<stop offset="0.681651" stop-color="#D9D5DD" />
|
||||||
|
<stop offset="1" stop-color="#CDC1D4" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint16_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(6.18946 18.8701) rotate(72.755) scale(16.655 1.37978)">
|
||||||
|
<stop stop-color="#A4A2A6" />
|
||||||
|
<stop offset="1" stop-color="#C5BACF" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint17_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(11.5332 22.6201) rotate(162.646) scale(1.04769 9.65758)">
|
||||||
|
<stop offset="0.261566" stop-color="#F6F4F7" />
|
||||||
|
<stop offset="1" stop-color="#E6E1EA" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint18_linear_18_18382" x1="12.1426" y1="24.1201" x2="11.6113" y2="24.2607" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0.133145" stop-color="#DBD9DE" />
|
||||||
|
<stop offset="1" stop-color="#DBD9DE" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint19_linear_18_18382" x1="24.377" y1="18.3076" x2="20.0958" y2="31.1201" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#DAD9DB" />
|
||||||
|
<stop offset="0.399322" stop-color="#DEDDE1" />
|
||||||
|
<stop offset="0.961979" stop-color="#C7B9CF" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint20_linear_18_18382" x1="23.9395" y1="18.1826" x2="23.2833" y2="20.2763" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0.10868" stop-color="#C9C9CA" />
|
||||||
|
<stop offset="1" stop-color="#C9C9CA" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint21_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(20.377 21.6513) rotate(15.7807) scale(1.4938 15.9576)">
|
||||||
|
<stop offset="0.205252" stop-color="#A4A3A6" />
|
||||||
|
<stop offset="1" stop-color="#CECAD3" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="paint22_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(24.2364 21.7763) rotate(105.977) scale(3.91692 0.624606)">
|
||||||
|
<stop offset="0.151268" stop-color="#F5F3F7" />
|
||||||
|
<stop offset="1" stop-color="#E8E4EC" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint23_linear_18_18382" x1="6.09582" y1="16.9951" x2="17.4083" y2="2.49512" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#CDCBCF" />
|
||||||
|
<stop offset="1" stop-color="#BEB5C7" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint24_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.6271 8.58887) rotate(-88.0363) scale(5.47196 16.8348)">
|
||||||
|
<stop offset="0.172043" stop-color="#AFA7B6" />
|
||||||
|
<stop offset="1" stop-color="#AFA7B6" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint25_linear_18_18382" x1="26.3146" y1="17.7549" x2="22.8771" y2="9.33887" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#9B99A0" />
|
||||||
|
<stop offset="1" stop-color="#9B99A0" stop-opacity="0" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint26_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(6.28332 18.5264) rotate(-88.9949) scale(3.56305 5.42238)">
|
||||||
|
<stop stop-color="#A5A2A9" />
|
||||||
|
<stop offset="1" stop-color="#A5A2A9" stop-opacity="0" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="paint27_linear_18_18382" x1="10.0646" y1="7.08887" x2="25.1271" y2="7.15137" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#CFC9D4" />
|
||||||
|
<stop offset="1" stop-color="#DFDDE3" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 27 KiB |
9
src/front/emoji/email.svg
Normal file
9
src/front/emoji/email.svg
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="1" y="5" width="30" height="22" rx="1.5" fill="#B4ACBC" />
|
||||||
|
<rect x="2" y="7" width="28" height="18" rx="1" fill="#CDC4D6" />
|
||||||
|
<path d="M30 23.4001L17.029 15.6175C16.3956 15.2375 15.6044 15.2375 14.971 15.6175L2 23.4001V25.0001C2 25.5524 2.44771 26.0001 3 26.0001L29 26.0001C29.5523 26.0001 30 25.5524 30 25.0001V23.4001Z" fill="#E1D8EC" />
|
||||||
|
<path d="M2 9.76619V8H30V9.76619L17.5435 17.2401C16.5934 17.8101 15.4066 17.8101 14.4565 17.2401L2 9.76619Z" fill="#998EA4" />
|
||||||
|
<path d="M2 8.6V7C2 6.44772 2.44772 6 3 6H29C29.5523 6 30 6.44772 30 7V8.6L17.029 16.3826C16.3956 16.7626 15.6044 16.7626 14.971 16.3826L2 8.6Z" fill="#F3EEF8" />
|
||||||
|
<path d="M16 23C19.866 23 23 19.866 23 16C23 12.134 19.866 9 16 9C12.134 9 9 12.134 9 16C9 19.866 12.134 23 16 23Z" fill="#00A6ED" />
|
||||||
|
<path d="M15.9999 11.5001C14.7899 11.4801 13.6399 11.9401 12.7799 12.8001C11.9099 13.6501 11.4399 14.7901 11.4399 16.0001C11.4399 18.4801 13.4599 20.5001 15.9399 20.5001C16.1999 20.5001 16.4099 20.2901 16.4099 20.0301C16.4099 19.7701 16.1999 19.5601 15.9399 19.5601C13.9799 19.5601 12.3799 17.9601 12.3799 16.0001C12.3799 15.0401 12.7599 14.1401 13.4399 13.4701C14.1199 12.8001 15.0299 12.4401 15.9899 12.4401C17.9199 12.4701 19.4999 14.0901 19.4999 16.0601V16.8701C19.4999 17.2401 19.1999 17.5401 18.8299 17.5401C18.4599 17.5401 18.1599 17.2401 18.1599 16.8701V13.7901C18.1599 13.5301 17.9499 13.3201 17.6899 13.3201C17.4299 13.3201 17.1999 13.5301 17.1999 13.7901V13.8801C16.7599 13.5301 16.2099 13.3101 15.5999 13.3101C14.1999 13.3101 13.0599 14.4501 13.0599 15.8501C13.0599 17.2501 14.1999 18.3901 15.5999 18.3901C16.2999 18.3901 16.9399 18.1001 17.3999 17.6401C17.6799 18.1401 18.2099 18.4801 18.8199 18.4801C19.7099 18.4801 20.4399 17.7501 20.4399 16.8601V16.0501C20.4399 13.5801 18.4499 11.5301 15.9999 11.5001ZM15.6099 17.4601C14.7299 17.4601 14.0099 16.7401 14.0099 15.8601C14.0099 14.9801 14.7299 14.2601 15.6099 14.2601C16.4899 14.2601 17.2099 14.9801 17.2099 15.8601C17.2099 16.7401 16.4899 17.4601 15.6099 17.4601Z" fill="#F4F4F4" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
4
src/front/emoji/film_frames.svg
Normal file
4
src/front/emoji/film_frames.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M30 8.91016H2V22.9802H30V8.91016Z" fill="#83CBFF" />
|
||||||
|
<path d="M30 10.02V5.82C30 5.37 29.63 5 29.18 5H2.82C2.37 5 2 5.37 2 5.82V10.02H5.74C6.8 10.02 7.66 10.88 7.66 11.94V20C7.66 21.06 6.8 21.92 5.74 21.92H2V26.12C2 26.57 2.37 26.94 2.82 26.94H29.18C29.63 26.94 30 26.57 30 26.12V21.92H26.26C25.2 21.92 24.34 21.06 24.34 20V11.94C24.34 10.88 25.2 10.02 26.26 10.02H30ZM20.11 21.92H11.89C10.83 21.92 9.97 21.06 9.97 20V11.94C9.97 10.88 10.83 10.02 11.89 10.02H20.11C21.17 10.02 22.03 10.88 22.03 11.94V20C22.03 21.06 21.17 21.92 20.11 21.92ZM5.77001 23.39C5.95001 23.39 6.09001 23.53 6.09001 23.71V25.09C6.09001 25.27 5.95001 25.41 5.77001 25.41H4.39001C4.21001 25.41 4.07001 25.27 4.07001 25.09V23.71C4.07001 23.53 4.21001 23.39 4.39001 23.39H5.77001ZM11.23 23.39C11.41 23.39 11.55 23.53 11.55 23.71V25.09C11.55 25.27 11.41 25.41 11.23 25.41H9.85003C9.67003 25.41 9.53003 25.27 9.53003 25.09V23.71C9.53003 23.53 9.67003 23.39 9.85003 23.39H11.23ZM15.31 23.39H16.69C16.87 23.39 17.01 23.53 17.01 23.71V25.09C17.01 25.27 16.87 25.41 16.69 25.41H15.31C15.13 25.41 14.99 25.27 14.99 25.09V23.71C14.99 23.53 15.13 23.39 15.31 23.39ZM22.15 23.39C22.32 23.39 22.47 23.53 22.47 23.71V25.09C22.47 25.27 22.33 25.41 22.15 25.41H20.77C20.59 25.41 20.45 25.27 20.45 25.09V23.71C20.45 23.53 20.59 23.39 20.77 23.39H22.15ZM26.23 23.39H27.61C27.78 23.39 27.93 23.53 27.93 23.71V25.09C27.93 25.27 27.79 25.41 27.61 25.41H26.23C26.05 25.41 25.91 25.27 25.91 25.09V23.71C25.91 23.53 26.05 23.39 26.23 23.39ZM4.39001 6.47998H5.77001C5.95001 6.47998 6.09001 6.62998 6.09001 6.79998V8.17998C6.09001 8.35998 5.95001 8.49998 5.77001 8.49998H4.39001C4.21001 8.49998 4.07001 8.35998 4.07001 8.17998V6.79998C4.07001 6.61998 4.21001 6.47998 4.39001 6.47998ZM9.85003 6.47998H11.23C11.41 6.47998 11.55 6.62998 11.55 6.79998V8.17998C11.55 8.35998 11.41 8.49998 11.23 8.49998H9.85003C9.67003 8.49998 9.53003 8.35998 9.53003 8.17998V6.79998C9.53003 6.61998 9.67003 6.47998 9.85003 6.47998ZM16.69 6.47998C16.87 6.47998 17.01 6.62998 17.01 6.79998V8.17998C17.01 8.35998 16.87 8.49998 16.69 8.49998H15.31C15.13 8.49998 14.99 8.35998 14.99 8.17998V6.79998C14.99 6.61998 15.13 6.47998 15.31 6.47998H16.69ZM20.77 6.47998H22.15C22.32 6.47998 22.47 6.62998 22.47 6.79998V8.17998C22.47 8.35998 22.33 8.49998 22.15 8.49998H20.77C20.59 8.49998 20.45 8.35998 20.45 8.17998V6.79998C20.45 6.61998 20.59 6.47998 20.77 6.47998ZM27.61 6.47998C27.78 6.47998 27.93 6.62998 27.93 6.79998V8.17998C27.93 8.35998 27.79 8.49998 27.61 8.49998H26.23C26.05 8.49998 25.91 8.35998 25.91 8.17998V6.79998C25.91 6.61998 26.05 6.47998 26.23 6.47998H27.61Z" fill="#433B6B" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
7
src/front/emoji/headphone.svg
Normal file
7
src/front/emoji/headphone.svg
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5.99032 29.1445L4.05032 22.9645C3.89032 22.4345 4.12031 21.8545 4.62031 21.5745L7.14032 20.2045L10.0903 29.6345L7.24032 29.9545C6.68032 30.0245 6.16032 29.6845 5.99032 29.1445Z" fill="#998EA4" />
|
||||||
|
<path d="M26.5702 29.1445L28.5102 22.9645C28.6802 22.4345 28.4502 21.8545 27.9402 21.5745L25.4202 20.2045L22.4702 29.6345L25.3202 29.9545C25.8802 30.0245 26.4002 29.6845 26.5702 29.1445Z" fill="#998EA4" />
|
||||||
|
<path d="M26.7201 16.1106C26.6201 16.4106 26.7501 16.7406 27.0201 16.8906C28.0601 17.4406 28.4601 18.7106 27.9401 19.7806L27.3801 20.9106C27.2501 21.1806 26.9801 21.3306 26.7001 21.3306C26.5601 21.3306 26.4101 21.2806 26.2701 21.1906C25.9501 20.9806 25.8601 20.5406 26.0301 20.2006L26.5801 19.1006C26.7401 18.7806 26.6001 18.4106 26.2901 18.2406C25.3801 17.7406 24.9501 16.6506 25.2701 15.6506C25.5601 14.7406 25.7101 13.7806 25.7101 12.8106V12.7906C25.7101 11.6806 25.4101 10.5906 24.8501 9.64058C23.1301 6.71058 19.9401 4.7506 16.3001 4.7506C12.6501 4.7506 9.47007 6.71058 7.74007 9.64058C7.18007 10.5906 6.88007 11.6806 6.88007 12.7906V12.8106C6.88007 13.7806 7.03007 14.7406 7.32007 15.6506C7.65007 16.6606 7.22007 17.7406 6.30007 18.2406C5.99007 18.4106 5.85006 18.7806 6.01006 19.1006L6.56006 20.2006C6.73006 20.5406 6.64007 20.9706 6.32007 21.1906C6.19007 21.2906 6.04006 21.3306 5.89006 21.3306C5.61006 21.3306 5.34007 21.1806 5.21007 20.9106L4.65006 19.7806C4.12006 18.7206 4.53007 17.4606 5.57007 16.9006C5.84007 16.7606 5.97006 16.4306 5.87006 16.1206C5.44006 14.7906 5.28007 13.4006 5.38007 11.9906C5.57007 9.42059 6.69006 7.00059 8.50006 5.18059C10.5701 3.09059 13.3401 1.9706 16.2801 2.0006H16.3001C19.2201 1.9706 21.9501 3.07058 24.0201 5.11058C26.1001 7.15058 27.2401 9.89059 27.2401 12.8006C27.2401 13.9306 27.0601 15.0406 26.7201 16.1106Z" fill="#CDC4D6" />
|
||||||
|
<path d="M9.58021 18.3745L7.65021 18.9745C7.12021 19.1445 6.83022 19.7045 6.99022 20.2345L9.92021 29.6045C10.0902 30.1345 10.6502 30.4245 11.1802 30.2645L13.1102 29.6645C13.6402 29.4945 13.9302 28.9345 13.7702 28.4045L10.8402 19.0345C10.6802 18.5045 10.1102 18.2145 9.58021 18.3745Z" fill="#CDC4D6" />
|
||||||
|
<path d="M22.9803 18.3745L24.9103 18.9745C25.4403 19.1445 25.7303 19.7045 25.5703 20.2345L22.6403 29.6045C22.4703 30.1345 21.9103 30.4245 21.3803 30.2645L19.4503 29.6645C18.9203 29.4945 18.6303 28.9345 18.7903 28.4045L21.7203 19.0345C21.8903 18.5045 22.4503 18.2145 22.9803 18.3745Z" fill="#CDC4D6" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
BIN
src/front/updateBanners/meowthcenter.png
Normal file
BIN
src/front/updateBanners/meowthcenter.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 848 KiB |
|
@ -107,7 +107,7 @@
|
||||||
"SourceCode": "report issues, explore source code, star or fork the repo:",
|
"SourceCode": "report issues, explore source code, star or fork the repo:",
|
||||||
"PrivacyPolicy": "cobalt's privacy policy is simple: no data about you is ever collected or stored. zero, zilch, nada, nothing.\nwhat you download is solely your business, not mine or anyone else's.\n\nif your download requires live render, some non-backtraceable data is temporarily stored in server's RAM. it's necessary for this feature to function.\n\nin this case info about requested content is stored for <span class=\"text-backdrop\">20 seconds</span> and then permanently removed.\nno one (even me) has access to this data. official cobalt codebase doesn't provide a way to read it outside of processing functions.\n\nyou can check cobalt's <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">source code</a> yourself and see that everything is as stated.",
|
"PrivacyPolicy": "cobalt's privacy policy is simple: no data about you is ever collected or stored. zero, zilch, nada, nothing.\nwhat you download is solely your business, not mine or anyone else's.\n\nif your download requires live render, some non-backtraceable data is temporarily stored in server's RAM. it's necessary for this feature to function.\n\nin this case info about requested content is stored for <span class=\"text-backdrop\">20 seconds</span> and then permanently removed.\nno one (even me) has access to this data. official cobalt codebase doesn't provide a way to read it outside of processing functions.\n\nyou can check cobalt's <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">source code</a> yourself and see that everything is as stated.",
|
||||||
"ErrorYTUnavailable": "this youtube video is unavailable, it could be region or age restricted. try another one!",
|
"ErrorYTUnavailable": "this youtube video is unavailable, it could be region or age restricted. try another one!",
|
||||||
"ErrorYTTryOtherCodec": "i couldn't find anything to download with your settings. try another codec or quality!\n\nnote: youtube api sometimes acts unexpectedly. blame google for this, not me.",
|
"ErrorYTTryOtherCodec": "i couldn't find anything to download with your settings. try another codec or quality!\n\nsometimes youtube api sometimes acts unexpectedly. try again or try another settings.",
|
||||||
"SettingsCodecSubtitle": "youtube codec",
|
"SettingsCodecSubtitle": "youtube codec",
|
||||||
"SettingsCodecDescription": "h264: generally better player support, but quality tops out at 1080p.\nav1: low player support, but supports 8k & HDR.\nvp9: usually highest bitrate, preserves most detail. supports 4k & HDR.\n\npick h264 if you want best editor/player/social media compatibility.",
|
"SettingsCodecDescription": "h264: generally better player support, but quality tops out at 1080p.\nav1: low player support, but supports 8k & HDR.\nvp9: usually highest bitrate, preserves most detail. supports 4k & HDR.\n\npick h264 if you want best editor/player/social media compatibility.",
|
||||||
"SettingsAudioDub": "youtube audio track",
|
"SettingsAudioDub": "youtube audio track",
|
||||||
|
@ -145,6 +145,17 @@
|
||||||
"DataTransferSuccess": "btw, your settings have been transferred automatically :)",
|
"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.",
|
"DataTransferError": "something went wrong when transferring your preferences. you'll have to open settings and configure cobalt by hand.",
|
||||||
"SupportNotAffiliated": "cobalt is <span class=\"text-backdrop\">not affiliated</span> with any services listed above.",
|
"SupportNotAffiliated": "cobalt is <span class=\"text-backdrop\">not affiliated</span> with any services listed above.",
|
||||||
"SponsoredBy": "sponsored by"
|
"SponsoredBy": "sponsored by",
|
||||||
|
"FilenameTitle": "file name style",
|
||||||
|
"FilenamePatternClassic": "classic",
|
||||||
|
"FilenamePatternPretty": "pretty",
|
||||||
|
"FilenamePatternBasic": "basic",
|
||||||
|
"FilenamePatternNerdy": "nerdy",
|
||||||
|
"FilenameDescription": "classic: default cobalt file name pattern.\npretty: title and info in brackets.\nbasic: title and basic info in brackets.\nnerdy: title and all info in brackets.\n\nsome services don’t support rich file names and always use the classic style.",
|
||||||
|
"Preview": "preview",
|
||||||
|
"FilenamePreviewVideoTitle": "Video Title",
|
||||||
|
"FilenamePreviewAudioTitle": "Audio Title",
|
||||||
|
"FilenamePreviewAudioAuthor": "Audio Author",
|
||||||
|
"UrgentFilenameUpdate": "customizable file names!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,6 +147,17 @@
|
||||||
"DataTransferError": "при переносе настроек что-то пошло не так. придётся зайти в настройки и настроить кобальт вручную.",
|
"DataTransferError": "при переносе настроек что-то пошло не так. придётся зайти в настройки и настроить кобальт вручную.",
|
||||||
"SupportNotAffiliated": "кобальт <span class=\"text-backdrop\">не аффилирован</span> ни с одним из перечисленных выше сервисов.",
|
"SupportNotAffiliated": "кобальт <span class=\"text-backdrop\">не аффилирован</span> ни с одним из перечисленных выше сервисов.",
|
||||||
"SupportMetaNoticeRU": "деятельность meta platforms inc. (владелец instagram) запрещена на территории россии.",
|
"SupportMetaNoticeRU": "деятельность meta platforms inc. (владелец instagram) запрещена на территории россии.",
|
||||||
"SponsoredBy": "спонсируется"
|
"SponsoredBy": "спонсируется",
|
||||||
|
"FilenameTitle": "стиль названий файлов",
|
||||||
|
"FilenamePatternClassic": "классический",
|
||||||
|
"FilenamePatternPretty": "красивый",
|
||||||
|
"FilenamePatternBasic": "простой",
|
||||||
|
"FilenamePatternNerdy": "полный",
|
||||||
|
"FilenameDescription": "классический: стандартный стиль названия файлов кобальта.\nкрасивый: название и инфа в скобках.\nпростой: название и основная инфа в скобках.\nполный: название и вся инфа в скобках.\n\nнекоторые сервисы не поддерживают красивые имена файлов и всегда используют классический стиль.",
|
||||||
|
"Preview": "превью",
|
||||||
|
"FilenamePreviewVideoTitle": "Название Видео",
|
||||||
|
"FilenamePreviewAudioTitle": "Название Аудио",
|
||||||
|
"FilenamePreviewAudioAuthor": "Автор Аудио",
|
||||||
|
"UrgentFilenameUpdate": "изменяемые названия файлов!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,16 @@
|
||||||
{
|
{
|
||||||
"current": {
|
"current": {
|
||||||
|
"version": "7.6",
|
||||||
|
"date": "October 15, 2023",
|
||||||
|
"title": "customizable file names, instagram stories, and first cobalt sponsor!",
|
||||||
|
"banner": {
|
||||||
|
"file": "meowthcenter.png",
|
||||||
|
"width": 851,
|
||||||
|
"height": 640
|
||||||
|
},
|
||||||
|
"content": "as many have (very) often requested, cobalt now lets you pick between several file name format styles!\ngo to <span class=\"text-backdrop\">settings > other</span> and change it to whichever you like! there's a preview of each style, so you know how exactly files are gonna look like.\n\nif you liked file names the way they were before, don't worry: classic style is still the default :)\n\non a different but not any less important note: cobalt is now sponsored by <a class=\"text-backdrop link\" href=\"https://royalehosting.net/\" target=\"_blank\">royalehosting.net</a>!\noverall service performance and stability is gonna be better, but also more content will be possible to download thanks to geniuine server locations. and yes, still no ads or trackers.\n\nthis update also includes a bunch of other changes, check them out:\n\nservice improvements:\n*; added support for instagram stories thanks to <a class=\"text-backdrop link\" href=\"https://github.com/wukko/cobalt/pull/194\" target=\"_blank\">#194</a>.\n*; fixed reddit support thanks to <a class=\"text-backdrop link\" href=\"https://github.com/wukko/cobalt/pull/221\" target=\"_blank\">#221</a>.\n*; added support for rich file names for youtube, vimeo, soundcloud, rutube, and vk.\n*; mute and audio dub file name tags don't appear together anymore.\n*; youtube: dub file name tag doesn't appear anymore if audio track is default.\n\ninterface improvements:\n*; added a list of sponsors to about tab. if you host an instance, it's disabled by default, but can be enabled with showSponsors env variable.\n*; about button now opens about tab when no new changelog is available.\n*; fixed download button thickness on ios.\n\nyou now can reach out to cobalt via email for support! it's located in the about tab along with other socials, such as discord.\n\ni hope you enjoy this long-awaited update and have a blissful day :D"
|
||||||
|
},
|
||||||
|
"history": [{
|
||||||
"version": "7.5",
|
"version": "7.5",
|
||||||
"date": "September 16, 2023",
|
"date": "September 16, 2023",
|
||||||
"title": "support for twitch clips and rutube!",
|
"title": "support for twitch clips and rutube!",
|
||||||
|
@ -9,8 +20,7 @@
|
||||||
"height": 640
|
"height": 640
|
||||||
},
|
},
|
||||||
"content": "hey! this update (finally) adds support for twitch clips and rutube, among other smaller changes.\n\nservice improvements:\n*; added support for twitch clips. no vods, they're unnecessary. just clip whatever you want to download!\n*; added support for rutube in case you ever wanted to download something russian.\n\ninterface improvements:\n*; added a note about cobalt not being affiliated with any supported services.\n*; added a note about meta (the company) in russian.\n*; better russian localization. will keep improving it to make it sound not so robotic over time.\n\nother improvements:\n*; all official servers are now using the docker package. and so should you!\n*; moved the load balancer to poland. requests should be slightly faster now.\n*; minor codebase clean up.\n\nif you're confused about the new domain, read the older changelog! just scroll lower and press \"expand\".\n\ni hope you find this update useful and have a wonderful day :)\n\nbtw, cobalt has a pretty active community server on discord. go to about > support & source code to join!"
|
"content": "hey! this update (finally) adds support for twitch clips and rutube, among other smaller changes.\n\nservice improvements:\n*; added support for twitch clips. no vods, they're unnecessary. just clip whatever you want to download!\n*; added support for rutube in case you ever wanted to download something russian.\n\ninterface improvements:\n*; added a note about cobalt not being affiliated with any supported services.\n*; added a note about meta (the company) in russian.\n*; better russian localization. will keep improving it to make it sound not so robotic over time.\n\nother improvements:\n*; all official servers are now using the docker package. and so should you!\n*; moved the load balancer to poland. requests should be slightly faster now.\n*; minor codebase clean up.\n\nif you're confused about the new domain, read the older changelog! just scroll lower and press \"expand\".\n\ni hope you find this update useful and have a wonderful day :)\n\nbtw, cobalt has a pretty active community server on discord. go to about > support & source code to join!"
|
||||||
},
|
}, {
|
||||||
"history": [{
|
|
||||||
"version": "7.4",
|
"version": "7.4",
|
||||||
"date": "September 9, 2023",
|
"date": "September 9, 2023",
|
||||||
"title": "new domain, what's coming in future, bug fixes, and more!",
|
"title": "new domain, what's coming in future, bug fixes, and more!",
|
||||||
|
|
|
@ -35,12 +35,16 @@ const names = {
|
||||||
"📑": "boring_document",
|
"📑": "boring_document",
|
||||||
"🧮": "abacus",
|
"🧮": "abacus",
|
||||||
"😸": "cat_grin",
|
"😸": "cat_grin",
|
||||||
"📰": "newspaper"
|
"📰": "newspaper",
|
||||||
|
"🎞️": "film_frames",
|
||||||
|
"🎧": "headphone",
|
||||||
|
"📧": "email"
|
||||||
}
|
}
|
||||||
let sizing = {
|
let sizing = {
|
||||||
18: 0.8,
|
18: 0.8,
|
||||||
22: 0.4,
|
22: 0.4,
|
||||||
30: 0.7,
|
30: 0.7,
|
||||||
|
32: 0.8,
|
||||||
48: 0.9,
|
48: 0.9,
|
||||||
64: 0.9,
|
64: 0.9,
|
||||||
78: 0.9
|
78: 0.9
|
||||||
|
|
|
@ -332,7 +332,8 @@ export default function(obj) {
|
||||||
}])
|
}])
|
||||||
})
|
})
|
||||||
+ settingsCategory({
|
+ settingsCategory({
|
||||||
name: t('SettingsCodecSubtitle'),
|
name: "codec",
|
||||||
|
title: t('SettingsCodecSubtitle'),
|
||||||
body: switcher({
|
body: switcher({
|
||||||
name: "vCodec",
|
name: "vCodec",
|
||||||
explanation: t('SettingsCodecDescription'),
|
explanation: t('SettingsCodecDescription'),
|
||||||
|
@ -349,7 +350,8 @@ export default function(obj) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
+ settingsCategory({
|
+ settingsCategory({
|
||||||
name: t('SettingsVimeoPrefer'),
|
name: "vimeo",
|
||||||
|
title: t('SettingsVimeoPrefer'),
|
||||||
body: switcher({
|
body: switcher({
|
||||||
name: "vimeoDash",
|
name: "vimeoDash",
|
||||||
explanation: t('SettingsVimeoPreferDescription'),
|
explanation: t('SettingsVimeoPreferDescription'),
|
||||||
|
@ -426,6 +428,43 @@ export default function(obj) {
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
+ settingsCategory({
|
||||||
|
name: "filename",
|
||||||
|
title: t('FilenameTitle'),
|
||||||
|
body: switcher({
|
||||||
|
name: "filenamePattern",
|
||||||
|
items: [{
|
||||||
|
action: "classic",
|
||||||
|
text: t('FilenamePatternClassic')
|
||||||
|
}, {
|
||||||
|
action: "basic",
|
||||||
|
text: t('FilenamePatternBasic')
|
||||||
|
}, {
|
||||||
|
action: "pretty",
|
||||||
|
text: t('FilenamePatternPretty')
|
||||||
|
}, {
|
||||||
|
action: "nerdy",
|
||||||
|
text: t('FilenamePatternNerdy')
|
||||||
|
}]
|
||||||
|
})
|
||||||
|
+ `<div id="filename-preview">
|
||||||
|
<div id="video-filename" class="filename-item line">
|
||||||
|
${emoji('🎞️', 32, 1, 1)}
|
||||||
|
<div class="filename-container">
|
||||||
|
<div class="filename-label">${t('Preview')}</div>
|
||||||
|
<div id="video-filename-text"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="audio-filename" class="filename-item">
|
||||||
|
${emoji('🎧', 32, 1, 1)}
|
||||||
|
<div class="filename-container">
|
||||||
|
<div class="filename-label">${t('Preview')}</div>
|
||||||
|
<div id="audio-filename-text"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
+ explanation(t('FilenameDescription'))
|
||||||
|
})
|
||||||
+ settingsCategory({
|
+ settingsCategory({
|
||||||
name: "accessibility",
|
name: "accessibility",
|
||||||
title: t('Accessibility'),
|
title: t('Accessibility'),
|
||||||
|
@ -523,8 +562,8 @@ export default function(obj) {
|
||||||
<div id="popup-backdrop" onclick="hideAllPopups()"></div>
|
<div id="popup-backdrop" onclick="hideAllPopups()"></div>
|
||||||
<div id="home" style="visibility:hidden">
|
<div id="home" style="visibility:hidden">
|
||||||
${urgentNotice({
|
${urgentNotice({
|
||||||
emoji: "👾",
|
emoji: "😸",
|
||||||
text: t("UrgentFeatureUpdate71"),
|
text: t("UrgentFilenameUpdate"),
|
||||||
visible: true,
|
visible: true,
|
||||||
action: "popup('about', 1, 'changelog')"
|
action: "popup('about', 1, 'changelog')"
|
||||||
})}
|
})}
|
||||||
|
@ -574,7 +613,7 @@ export default function(obj) {
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
let apiURL = '${process.env.apiURL ? process.env.apiURL.slice(0, -1) : ''}';
|
let defaultApiUrl = '${process.env.apiURL ? process.env.apiURL : ''}';
|
||||||
const loc = ${webLoc(t,
|
const loc = ${webLoc(t,
|
||||||
[
|
[
|
||||||
'ErrorNoInternet',
|
'ErrorNoInternet',
|
||||||
|
@ -591,7 +630,10 @@ export default function(obj) {
|
||||||
'ClipboardErrorNoPermission',
|
'ClipboardErrorNoPermission',
|
||||||
'ClipboardErrorFirefox',
|
'ClipboardErrorFirefox',
|
||||||
'DataTransferSuccess',
|
'DataTransferSuccess',
|
||||||
'DataTransferError'
|
'DataTransferError',
|
||||||
|
'FilenamePreviewVideoTitle',
|
||||||
|
'FilenamePreviewAudioTitle',
|
||||||
|
'FilenamePreviewAudioAuthor'
|
||||||
])}
|
])}
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="cobalt.js"></script>
|
<script type="text/javascript" src="cobalt.js"></script>
|
||||||
|
|
78
src/modules/processing/createFilename.js
Normal file
78
src/modules/processing/createFilename.js
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
export default function(f, template, isAudioOnly, isAudioMuted) {
|
||||||
|
let filename = '';
|
||||||
|
|
||||||
|
switch(template) {
|
||||||
|
default:
|
||||||
|
case "classic":
|
||||||
|
// youtube_MMK3L4W70g4_1920x1080_h264_mute.mp4
|
||||||
|
// youtube_MMK3L4W70g4_audio.mp3
|
||||||
|
filename += `${f.service}_${f.id}`;
|
||||||
|
if (!isAudioOnly) {
|
||||||
|
if (f.resolution) filename += `_${f.resolution}`;
|
||||||
|
if (f.youtubeFormat) filename += `_${f.youtubeFormat}`;
|
||||||
|
if (!isAudioMuted && f.youtubeDubName) filename += `_${f.youtubeDubName}`;
|
||||||
|
if (isAudioMuted) filename += '_mute';
|
||||||
|
filename += `.${f.extension}`
|
||||||
|
} else {
|
||||||
|
filename += `_audio`;
|
||||||
|
if (f.youtubeDubName) filename += `_${f.youtubeDubName}`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "pretty":
|
||||||
|
// Loossemble (루셈블) - 'Sensitive' MV (1080p, h264, mute, youtube).mp4
|
||||||
|
// How secure is 256 bit security? - 3Blue1Brown (es, youtube).mp3
|
||||||
|
filename += `${f.title} `;
|
||||||
|
if (!isAudioOnly) {
|
||||||
|
filename += '('
|
||||||
|
if (f.qualityLabel) filename += `${f.qualityLabel}, `;
|
||||||
|
if (f.youtubeFormat) filename += `${f.youtubeFormat}, `;
|
||||||
|
if (!isAudioMuted && f.youtubeDubName) filename += `${f.youtubeDubName}, `;
|
||||||
|
if (isAudioMuted) filename += 'mute, ';
|
||||||
|
filename += `${f.service}`;
|
||||||
|
filename += ')';
|
||||||
|
filename += `.${f.extension}`
|
||||||
|
} else {
|
||||||
|
filename += `- ${f.author} (`;
|
||||||
|
if (f.youtubeDubName) filename += `${f.youtubeDubName}, `;
|
||||||
|
filename += `${f.service})`
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "basic":
|
||||||
|
// Loossemble (루셈블) - 'Sensitive' MV (1080p, h264, ru).mp4
|
||||||
|
// How secure is 256 bit security? - 3Blue1Brown (es).mp3
|
||||||
|
filename += `${f.title} `;
|
||||||
|
if (!isAudioOnly) {
|
||||||
|
filename += '('
|
||||||
|
if (f.qualityLabel) filename += `${f.qualityLabel}, `;
|
||||||
|
if (f.youtubeFormat) filename += `${f.youtubeFormat}`;
|
||||||
|
if (!isAudioMuted && f.youtubeDubName) filename += `, ${f.youtubeDubName}`;
|
||||||
|
if (isAudioMuted) filename += ', mute';
|
||||||
|
filename += ')';
|
||||||
|
filename += `.${f.extension}`
|
||||||
|
} else {
|
||||||
|
filename += `- ${f.author}`;
|
||||||
|
if (f.youtubeDubName) filename += ` (${f.youtubeDubName})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "nerdy":
|
||||||
|
// Loossemble (루셈블) - 'Sensitive' MV (1080p, h264, ru, youtube, MMK3L4W70g4).mp4
|
||||||
|
// Loossemble (루셈블) - 'Sensitive' MV - Loossemble (ru, youtube, MMK3L4W70g4).mp4
|
||||||
|
filename += `${f.title} `;
|
||||||
|
if (!isAudioOnly) {
|
||||||
|
filename += '('
|
||||||
|
if (f.qualityLabel) filename += `${f.qualityLabel}, `;
|
||||||
|
if (f.youtubeFormat) filename += `${f.youtubeFormat}, `;
|
||||||
|
if (!isAudioMuted && f.youtubeDubName) filename += `${f.youtubeDubName}, `;
|
||||||
|
if (isAudioMuted) filename += 'mute, ';
|
||||||
|
filename += `${f.service}, ${f.id}`;
|
||||||
|
filename += ')'
|
||||||
|
filename += `.${f.extension}`
|
||||||
|
} else {
|
||||||
|
filename += `- ${f.author} (`;
|
||||||
|
if (f.youtubeDubName) filename += `${f.youtubeDubName}, `;
|
||||||
|
filename += `${f.service}, ${f.id})`
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return filename.replace(' ,', '').replace(', )', ')').replace(',)', ')')
|
||||||
|
}
|
|
@ -22,7 +22,7 @@ import streamable from "./services/streamable.js";
|
||||||
import twitch from "./services/twitch.js";
|
import twitch from "./services/twitch.js";
|
||||||
import rutube from "./services/rutube.js";
|
import rutube from "./services/rutube.js";
|
||||||
|
|
||||||
export default async function (host, patternMatch, url, lang, obj) {
|
export default async function(host, patternMatch, url, lang, obj) {
|
||||||
try {
|
try {
|
||||||
let r, isAudioOnly = !!obj.isAudioOnly, disableMetadata = !!obj.disableMetadata;
|
let r, isAudioOnly = !!obj.isAudioOnly, disableMetadata = !!obj.disableMetadata;
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ export default async function (host, patternMatch, url, lang, obj) {
|
||||||
|
|
||||||
if (r.error) return apiJSON(0, { t: Array.isArray(r.error) ? loc(lang, r.error[0], r.error[1]) : loc(lang, r.error) });
|
if (r.error) return apiJSON(0, { t: Array.isArray(r.error) ? loc(lang, r.error[0], r.error[1]) : loc(lang, r.error) });
|
||||||
|
|
||||||
return matchActionDecider(r, host, obj.aFormat, isAudioOnly, lang, isAudioMuted, disableMetadata);
|
return matchActionDecider(r, host, obj.aFormat, isAudioOnly, lang, isAudioMuted, disableMetadata, obj.filenamePattern);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return apiJSON(0, { t: genericError(lang, host) })
|
return apiJSON(0, { t: genericError(lang, host) })
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
import { audioIgnore, services, supportedAudio } from "../config.js";
|
import { audioIgnore, services, supportedAudio } from "../config.js";
|
||||||
import { apiJSON } from "../sub/utils.js";
|
import { apiJSON } from "../sub/utils.js";
|
||||||
import loc from "../../localization/manager.js";
|
import loc from "../../localization/manager.js";
|
||||||
|
import createFilename from "./createFilename.js";
|
||||||
|
|
||||||
export default function(r, host, audioFormat, isAudioOnly, lang, isAudioMuted, disableMetadata) {
|
export default function(r, host, audioFormat, isAudioOnly, lang, isAudioMuted, disableMetadata, filenamePattern) {
|
||||||
let action,
|
let action,
|
||||||
responseType = 2,
|
responseType = 2,
|
||||||
defaultParams = {
|
defaultParams = {
|
||||||
u: r.urls,
|
u: r.urls,
|
||||||
service: host,
|
service: host,
|
||||||
filename: r.filename,
|
filename: r.filenameAttributes ?
|
||||||
|
createFilename(r.filenameAttributes, filenamePattern, isAudioOnly, isAudioMuted) : r.filename,
|
||||||
fileMetadata: !disableMetadata ? r.fileMetadata : false
|
fileMetadata: !disableMetadata ? r.fileMetadata : false
|
||||||
},
|
},
|
||||||
params = {}
|
params = {}
|
||||||
|
@ -21,10 +23,13 @@ export default function(r, host, audioFormat, isAudioOnly, lang, isAudioMuted, d
|
||||||
else action = "video";
|
else action = "video";
|
||||||
|
|
||||||
if (action === "picker" || action === "audio") {
|
if (action === "picker" || action === "audio") {
|
||||||
defaultParams.filename = r.audioFilename;
|
if (!r.filenameAttributes) defaultParams.filename = r.audioFilename;
|
||||||
defaultParams.isAudioOnly = true;
|
defaultParams.isAudioOnly = true;
|
||||||
defaultParams.audioFormat = audioFormat;
|
defaultParams.audioFormat = audioFormat;
|
||||||
}
|
}
|
||||||
|
if (isAudioMuted && !r.filenameAttributes) {
|
||||||
|
defaultParams.filename = r.filename.replace('.', '_mute.')
|
||||||
|
}
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case "photo":
|
case "photo":
|
||||||
|
@ -135,7 +140,7 @@ export default function(r, host, audioFormat, isAudioOnly, lang, isAudioMuted, d
|
||||||
} else if (audioFormat === "best") {
|
} else if (audioFormat === "best") {
|
||||||
audioFormat = "m4a";
|
audioFormat = "m4a";
|
||||||
copy = true;
|
copy = true;
|
||||||
if (r.audioFilename.includes("twitterspaces")) {
|
if (!r.filenameAttributes && r.audioFilename.includes("twitterspaces")) {
|
||||||
audioFormat = "mp3"
|
audioFormat = "mp3"
|
||||||
copy = false
|
copy = false
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,5 +20,10 @@ export default async function(obj) {
|
||||||
|
|
||||||
if (!video) return { error: 'ErrorEmptyDownload' };
|
if (!video) return { error: 'ErrorEmptyDownload' };
|
||||||
if (video.duration > maxVideoDuration) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
|
if (video.duration > maxVideoDuration) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
|
||||||
return { urls: video.url, filename: `pinterest_${pinId}.mp4`, audioFilename: `pinterest_${pinId}_audio` }
|
|
||||||
|
return {
|
||||||
|
urls: video.url,
|
||||||
|
filename: `pinterest_${pinId}.mp4`,
|
||||||
|
audioFilename: `pinterest_${pinId}_audio`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import HLS from 'hls-parser';
|
import HLS from 'hls-parser';
|
||||||
import { maxVideoDuration } from "../../config.js";
|
import { maxVideoDuration } from "../../config.js";
|
||||||
|
import { cleanString } from '../../sub/utils.js';
|
||||||
|
|
||||||
export default async function(obj) {
|
export default async function(obj) {
|
||||||
let quality = obj.quality === "max" ? "9000" : obj.quality;
|
let quality = obj.quality === "max" ? "9000" : obj.quality;
|
||||||
|
@ -20,11 +21,23 @@ export default async function(obj) {
|
||||||
if (Number(quality) < bestQuality.resolution.height) {
|
if (Number(quality) < bestQuality.resolution.height) {
|
||||||
bestQuality = m3u8.find((i) => (Number(quality) === i["resolution"].height));
|
bestQuality = m3u8.find((i) => (Number(quality) === i["resolution"].height));
|
||||||
}
|
}
|
||||||
|
let fileMetadata = {
|
||||||
|
title: cleanString(play.title.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
artist: cleanString(play.author.name.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
urls: bestQuality.uri,
|
urls: bestQuality.uri,
|
||||||
isM3U8: true,
|
isM3U8: true,
|
||||||
audioFilename: `rutube_${play.id}_audio`,
|
filenameAttributes: {
|
||||||
filename: `rutube_${play.id}_${bestQuality.resolution.width}x${bestQuality.resolution.height}.mp4`
|
service: "rutube",
|
||||||
|
id: play.id,
|
||||||
|
title: fileMetadata.title,
|
||||||
|
author: fileMetadata.artist,
|
||||||
|
resolution: `${bestQuality.resolution.width}x${bestQuality.resolution.height}`,
|
||||||
|
qualityLabel: `${bestQuality.resolution.height}p`,
|
||||||
|
extension: "mp4"
|
||||||
|
},
|
||||||
|
fileMetadata: fileMetadata
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,12 +69,19 @@ export default async function(obj) {
|
||||||
let file = await fetch(fileUrl).then(async (r) => { return (await r.json()).url }).catch(() => { return false });
|
let file = await fetch(fileUrl).then(async (r) => { return (await r.json()).url }).catch(() => { return false });
|
||||||
if (!file) return { error: 'ErrorCouldntFetch' };
|
if (!file) return { error: 'ErrorCouldntFetch' };
|
||||||
|
|
||||||
|
let fileMetadata = {
|
||||||
|
title: cleanString(json.title.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
artist: cleanString(json.user.username.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
urls: file,
|
urls: file,
|
||||||
audioFilename: `soundcloud_${json.id}`,
|
filenameAttributes: {
|
||||||
fileMetadata: {
|
service: "soundcloud",
|
||||||
title: cleanString(json.title.replace(/\p{Emoji}/gu, '').trim()),
|
id: json.id,
|
||||||
artist: cleanString(json.user.username.replace(/\p{Emoji}/gu, '').trim()),
|
title: fileMetadata.title,
|
||||||
}
|
author: fileMetadata.artist
|
||||||
|
},
|
||||||
|
fileMetadata: fileMetadata
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,11 @@ export default async function(obj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (single) {
|
if (single) {
|
||||||
return { urls: single, filename: `twitter_${obj.id}.mp4`, audioFilename: `twitter_${obj.id}_audio` }
|
return {
|
||||||
|
urls: single,
|
||||||
|
filename: `twitter_${obj.id}.mp4`,
|
||||||
|
audioFilename: `twitter_${obj.id}_audio`
|
||||||
|
}
|
||||||
} else if (multiple) {
|
} else if (multiple) {
|
||||||
return { picker: multiple }
|
return { picker: multiple }
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { maxVideoDuration } from "../../config.js";
|
import { maxVideoDuration } from "../../config.js";
|
||||||
|
import { cleanString } from '../../sub/utils.js';
|
||||||
|
|
||||||
// vimeo you're fucked in the head for this
|
|
||||||
const resolutionMatch = {
|
const resolutionMatch = {
|
||||||
"3840": "2160",
|
"3840": "2160",
|
||||||
"2732": "1440",
|
"2732": "1440",
|
||||||
|
@ -33,6 +33,11 @@ export default async function(obj) {
|
||||||
let downloadType = "dash";
|
let downloadType = "dash";
|
||||||
if (!obj.forceDash && JSON.stringify(api).includes('"progressive":[{')) downloadType = "progressive";
|
if (!obj.forceDash && JSON.stringify(api).includes('"progressive":[{')) downloadType = "progressive";
|
||||||
|
|
||||||
|
let fileMetadata = {
|
||||||
|
title: cleanString(api.video.title.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
artist: cleanString(api.video.owner.name.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
}
|
||||||
|
|
||||||
if (downloadType !== "dash") {
|
if (downloadType !== "dash") {
|
||||||
if (qualityMatch[quality]) quality = qualityMatch[quality];
|
if (qualityMatch[quality]) quality = qualityMatch[quality];
|
||||||
let all = api["request"]["files"]["progressive"].sort((a, b) => Number(b.width) - Number(a.width));
|
let all = api["request"]["files"]["progressive"].sort((a, b) => Number(b.width) - Number(a.width));
|
||||||
|
@ -43,7 +48,11 @@ export default async function(obj) {
|
||||||
if (Number(quality) < Number(bestQuality)) best = all.find(i => i["quality"].split('p')[0] === quality);
|
if (Number(quality) < Number(bestQuality)) best = all.find(i => i["quality"].split('p')[0] === quality);
|
||||||
|
|
||||||
if (!best) return { error: 'ErrorEmptyDownload' };
|
if (!best) return { error: 'ErrorEmptyDownload' };
|
||||||
return { urls: best["url"], audioFilename: `vimeo_${obj.id}_audio`, filename: `vimeo_${obj.id}_${best["width"]}x${best["height"]}.mp4` }
|
return {
|
||||||
|
urls: best["url"],
|
||||||
|
audioFilename: `vimeo_${obj.id}_audio`,
|
||||||
|
filename: `vimeo_${obj.id}_${best["width"]}x${best["height"]}.mp4`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (api.video.duration > maxVideoDuration / 1000) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
|
if (api.video.duration > maxVideoDuration / 1000) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
|
||||||
|
@ -77,8 +86,16 @@ export default async function(obj) {
|
||||||
return {
|
return {
|
||||||
urls: audioUrl ? [videoUrl, audioUrl] : videoUrl,
|
urls: audioUrl ? [videoUrl, audioUrl] : videoUrl,
|
||||||
isM3U8: audioUrl ? false : true,
|
isM3U8: audioUrl ? false : true,
|
||||||
audioFilename: `vimeo_${obj.id}_audio`,
|
fileMetadata: fileMetadata,
|
||||||
filename: `vimeo_${obj.id}_${bestVideo["width"]}x${bestVideo["height"]}.mp4`
|
filenameAttributes: {
|
||||||
|
service: "vimeo",
|
||||||
|
id: obj.id,
|
||||||
|
title: fileMetadata.title,
|
||||||
|
author: fileMetadata.artist,
|
||||||
|
resolution: `${bestVideo["width"]}x${bestVideo["height"]}`,
|
||||||
|
qualityLabel: `${bestVideo["height"]}p`,
|
||||||
|
extension: "mp4"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return { error: 'ErrorEmptyDownload' }
|
return { error: 'ErrorEmptyDownload' }
|
||||||
|
|
|
@ -2,7 +2,11 @@ export default async function(obj) {
|
||||||
let post = await fetch(`https://archive.vine.co/posts/${obj.id}.json`).then((r) => { return r.json() }).catch(() => { return false });
|
let post = await fetch(`https://archive.vine.co/posts/${obj.id}.json`).then((r) => { return r.json() }).catch(() => { return false });
|
||||||
if (!post) return { error: 'ErrorEmptyDownload' };
|
if (!post) return { error: 'ErrorEmptyDownload' };
|
||||||
|
|
||||||
if (post.videoUrl) return { urls: post.videoUrl.replace("http://", "https://"), filename: `vine_${obj.id}.mp4`, audioFilename: `vine_${obj.id}_audio` };
|
if (post.videoUrl) return {
|
||||||
|
urls: post.videoUrl.replace("http://", "https://"),
|
||||||
|
filename: `vine_${obj.id}.mp4`,
|
||||||
|
audioFilename: `vine_${obj.id}_audio`
|
||||||
|
}
|
||||||
|
|
||||||
return { error: 'ErrorEmptyDownload' }
|
return { error: 'ErrorEmptyDownload' }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
import { genericUserAgent, maxVideoDuration } from "../../config.js";
|
import { genericUserAgent, maxVideoDuration } from "../../config.js";
|
||||||
|
import { cleanString } from "../../sub/utils.js";
|
||||||
|
|
||||||
const resolutions = ["2160", "1440", "1080", "720", "480", "360", "240"];
|
const resolutions = ["2160", "1440", "1080", "720", "480", "360", "240"];
|
||||||
|
|
||||||
export default async function(o) {
|
export default async function(o) {
|
||||||
let html, url,
|
let html, url, quality = o.quality === "max" ? 2160 : o.quality;
|
||||||
quality = o.quality === "max" ? 2160 : o.quality,
|
|
||||||
filename = `vk_${o.userId}_${o.videoId}_`;
|
|
||||||
|
|
||||||
html = await fetch(`https://vk.com/video${o.userId}_${o.videoId}`, {
|
html = await fetch(`https://vk.com/video${o.userId}_${o.videoId}`, {
|
||||||
headers: { "user-agent": genericUserAgent }
|
headers: { "user-agent": genericUserAgent }
|
||||||
}).then((r) => { return r.text() }).catch(() => { return false });
|
}).then((r) => { return r.arrayBuffer() }).catch(() => { return false });
|
||||||
|
|
||||||
if (!html) return { error: 'ErrorCouldntFetch' };
|
if (!html) return { error: 'ErrorCouldntFetch' };
|
||||||
|
|
||||||
|
// decode cyrillic from windows-1251 because vk still uses apis from prehistoring times
|
||||||
|
let decoder = new TextDecoder('windows-1251');
|
||||||
|
html = decoder.decode(html);
|
||||||
|
|
||||||
if (!html.includes(`{"lang":`)) return { error: 'ErrorEmptyDownload' };
|
if (!html.includes(`{"lang":`)) return { error: 'ErrorEmptyDownload' };
|
||||||
|
|
||||||
let js = JSON.parse('{"lang":' + html.split(`{"lang":`)[1].split(']);')[0]);
|
let js = JSON.parse('{"lang":' + html.split(`{"lang":`)[1].split(']);')[0]);
|
||||||
|
@ -28,11 +32,23 @@ export default async function(o) {
|
||||||
if (Number(quality) > Number(o.quality)) quality = o.quality;
|
if (Number(quality) > Number(o.quality)) quality = o.quality;
|
||||||
|
|
||||||
url = js.player.params[0][`url${quality}`];
|
url = js.player.params[0][`url${quality}`];
|
||||||
filename += `${quality}p.mp4`
|
|
||||||
|
|
||||||
if (url && filename) return {
|
let fileMetadata = {
|
||||||
|
title: cleanString(js.player.params[0].md_title.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
artist: cleanString(js.player.params[0].md_author.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url) return {
|
||||||
urls: url,
|
urls: url,
|
||||||
filename: filename
|
filenameAttributes: {
|
||||||
|
service: "vk",
|
||||||
|
id: `${o.userId}_${o.videoId}`,
|
||||||
|
title: fileMetadata.title,
|
||||||
|
author: fileMetadata.artist,
|
||||||
|
resolution: `${quality}p`,
|
||||||
|
qualityLabel: `${quality}p`,
|
||||||
|
extension: "mp4"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return { error: 'ErrorEmptyDownload' }
|
return { error: 'ErrorEmptyDownload' }
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,13 +54,12 @@ export default async function(o) {
|
||||||
audio = adaptive_formats.find(i => checkBestAudio(i) && !i["is_dubbed"]);
|
audio = adaptive_formats.find(i => checkBestAudio(i) && !i["is_dubbed"]);
|
||||||
|
|
||||||
if (o.dubLang) {
|
if (o.dubLang) {
|
||||||
let dubbedAudio = adaptive_formats.find(i => checkBestAudio(i) && i["language"] === o.dubLang);
|
let dubbedAudio = adaptive_formats.find(i => checkBestAudio(i) && i["language"] === o.dubLang && !i["audio_track"].audio_is_default);
|
||||||
if (dubbedAudio) {
|
if (dubbedAudio) {
|
||||||
audio = dubbedAudio;
|
audio = dubbedAudio;
|
||||||
isDubbed = true
|
isDubbed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let fileMetadata = {
|
let fileMetadata = {
|
||||||
title: cleanString(info.basic_info.title.replace(/\p{Emoji}/gu, '').trim()),
|
title: cleanString(info.basic_info.title.replace(/\p{Emoji}/gu, '').trim()),
|
||||||
artist: cleanString(info.basic_info.author.replace("- Topic", "").replace(/\p{Emoji}/gu, '').trim()),
|
artist: cleanString(info.basic_info.author.replace("- Topic", "").replace(/\p{Emoji}/gu, '').trim()),
|
||||||
|
@ -72,13 +71,21 @@ export default async function(o) {
|
||||||
if (descItems[4].startsWith("Released on:")) {
|
if (descItems[4].startsWith("Released on:")) {
|
||||||
fileMetadata.date = descItems[4].replace("Released on: ", '').trim()
|
fileMetadata.date = descItems[4].replace("Released on: ", '').trim()
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
let filenameAttributes = {
|
||||||
|
service: "youtube",
|
||||||
|
id: o.id,
|
||||||
|
title: fileMetadata.title,
|
||||||
|
author: fileMetadata.artist,
|
||||||
|
youtubeDubName: isDubbed ? o.dubLang : false
|
||||||
|
}
|
||||||
|
|
||||||
if (hasAudio && o.isAudioOnly) return {
|
if (hasAudio && o.isAudioOnly) return {
|
||||||
type: "render",
|
type: "render",
|
||||||
isAudioOnly: true,
|
isAudioOnly: true,
|
||||||
urls: audio.url,
|
urls: audio.url,
|
||||||
audioFilename: `youtube_${o.id}_audio${isDubbed ? `_${o.dubLang}`:''}`,
|
filenameAttributes: filenameAttributes,
|
||||||
fileMetadata: fileMetadata
|
fileMetadata: fileMetadata
|
||||||
}
|
}
|
||||||
let checkSingle = (i) => ((qual(i) === quality || qual(i) === bestQuality) && i["mime_type"].includes(c[o.format].codec)),
|
let checkSingle = (i) => ((qual(i) === quality || qual(i) === bestQuality) && i["mime_type"].includes(c[o.format].codec)),
|
||||||
|
@ -87,21 +94,33 @@ export default async function(o) {
|
||||||
|
|
||||||
if (!o.isAudioOnly && !o.isAudioMuted && o.format === 'h264') {
|
if (!o.isAudioOnly && !o.isAudioMuted && o.format === 'h264') {
|
||||||
let single = info.streaming_data.formats.find(i => checkSingle(i));
|
let single = info.streaming_data.formats.find(i => checkSingle(i));
|
||||||
if (single) return {
|
if (single) {
|
||||||
type: "bridge",
|
filenameAttributes.qualityLabel = single.quality_label;
|
||||||
urls: single.url,
|
filenameAttributes.resolution = `${single.width}x${single.height}`;
|
||||||
filename: `youtube_${o.id}_${single.width}x${single.height}_${o.format}.${c[o.format].container}`,
|
filenameAttributes.extension = c[o.format].container;
|
||||||
fileMetadata: fileMetadata
|
filenameAttributes.youtubeFormat = o.format;
|
||||||
|
return {
|
||||||
|
type: "bridge",
|
||||||
|
urls: single.url,
|
||||||
|
filenameAttributes: filenameAttributes,
|
||||||
|
fileMetadata: fileMetadata
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
let video = adaptive_formats.find(i => ((Number(quality) > Number(bestQuality)) ? checkBestVideo(i) : checkRightVideo(i)));
|
let video = adaptive_formats.find(i => ((Number(quality) > Number(bestQuality)) ? checkBestVideo(i) : checkRightVideo(i)));
|
||||||
if (video && audio) return {
|
if (video && audio) {
|
||||||
type: "render",
|
filenameAttributes.qualityLabel = video.quality_label;
|
||||||
urls: [video.url, audio.url],
|
filenameAttributes.resolution = `${video.width}x${video.height}`;
|
||||||
filename: `youtube_${o.id}_${video.width}x${video.height}_${o.format}${isDubbed ? `_${o.dubLang}`:''}.${c[o.format].container}`,
|
filenameAttributes.extension = c[o.format].container;
|
||||||
fileMetadata: fileMetadata
|
filenameAttributes.youtubeFormat = o.format;
|
||||||
};
|
return {
|
||||||
|
type: "render",
|
||||||
|
urls: [video.url, audio.url],
|
||||||
|
filenameAttributes: filenameAttributes,
|
||||||
|
fileMetadata: fileMetadata
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return { error: 'ErrorYTTryOtherCodec' }
|
return { error: 'ErrorYTTryOtherCodec' }
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import ffmpeg from "ffmpeg-static";
|
||||||
import { ffmpegArgs, genericUserAgent } from "../config.js";
|
import { ffmpegArgs, genericUserAgent } from "../config.js";
|
||||||
import { getThreads, metadataManager } from "../sub/utils.js";
|
import { getThreads, metadataManager } from "../sub/utils.js";
|
||||||
import { request } from 'undici';
|
import { request } from 'undici';
|
||||||
|
import { create as contentDisposition } from "content-disposition-header";
|
||||||
|
|
||||||
function fail(res) {
|
function fail(res) {
|
||||||
if (!res.headersSent) res.sendStatus(500);
|
if (!res.headersSent) res.sendStatus(500);
|
||||||
|
@ -12,8 +13,7 @@ function fail(res) {
|
||||||
export async function streamDefault(streamInfo, res) {
|
export async function streamDefault(streamInfo, res) {
|
||||||
try {
|
try {
|
||||||
let format = streamInfo.filename.split('.')[streamInfo.filename.split('.').length - 1];
|
let format = streamInfo.filename.split('.')[streamInfo.filename.split('.').length - 1];
|
||||||
let regFilename = !streamInfo.mute ? streamInfo.filename : `${streamInfo.filename.split('.')[0]}_mute.${format}`;
|
res.setHeader('Content-disposition', contentDisposition(streamInfo.isAudioOnly ? `${streamInfo.filename}.${streamInfo.audioFormat}` : streamInfo.filename));
|
||||||
res.setHeader('Content-disposition', `attachment; filename="${streamInfo.isAudioOnly ? `${streamInfo.filename}.${streamInfo.audioFormat}` : regFilename}"`);
|
|
||||||
|
|
||||||
const { body: stream, headers } = await request(streamInfo.urls, {
|
const { body: stream, headers } = await request(streamInfo.urls, {
|
||||||
headers: { 'user-agent': genericUserAgent },
|
headers: { 'user-agent': genericUserAgent },
|
||||||
|
@ -59,7 +59,7 @@ export async function streamLiveRender(streamInfo, res) {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
res.setHeader('Connection', 'keep-alive');
|
res.setHeader('Connection', 'keep-alive');
|
||||||
res.setHeader('Content-Disposition', `attachment; filename="${streamInfo.filename}"`);
|
res.setHeader('Content-Disposition', contentDisposition(streamInfo.filename));
|
||||||
res.on('error', () => {
|
res.on('error', () => {
|
||||||
ffmpegProcess.kill();
|
ffmpegProcess.kill();
|
||||||
fail(res);
|
fail(res);
|
||||||
|
@ -127,7 +127,7 @@ export function streamAudioOnly(streamInfo, res) {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
res.setHeader('Connection', 'keep-alive');
|
res.setHeader('Connection', 'keep-alive');
|
||||||
res.setHeader('Content-Disposition', `attachment; filename="${streamInfo.filename}.${streamInfo.audioFormat}"`);
|
res.setHeader('Content-Disposition', contentDisposition(`${streamInfo.filename}.${streamInfo.audioFormat}`));
|
||||||
ffmpegProcess.stdio[3].pipe(res);
|
ffmpegProcess.stdio[3].pipe(res);
|
||||||
|
|
||||||
ffmpegProcess.on('disconnect', () => ffmpegProcess.kill());
|
ffmpegProcess.on('disconnect', () => ffmpegProcess.kill());
|
||||||
|
@ -163,7 +163,7 @@ export function streamVideoOnly(streamInfo, res) {
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
res.setHeader('Connection', 'keep-alive');
|
res.setHeader('Connection', 'keep-alive');
|
||||||
res.setHeader('Content-Disposition', `attachment; filename="${streamInfo.filename.split('.')[0]}${streamInfo.mute ? '_mute' : ''}.${format}"`);
|
res.setHeader('Content-Disposition', contentDisposition(streamInfo.filename));
|
||||||
ffmpegProcess.stdio[3].pipe(res);
|
ffmpegProcess.stdio[3].pipe(res);
|
||||||
|
|
||||||
ffmpegProcess.on('disconnect', () => ffmpegProcess.kill());
|
ffmpegProcess.on('disconnect', () => ffmpegProcess.kill());
|
||||||
|
|
|
@ -4,7 +4,8 @@ const apiVar = {
|
||||||
allowed: {
|
allowed: {
|
||||||
vCodec: ["h264", "av1", "vp9"],
|
vCodec: ["h264", "av1", "vp9"],
|
||||||
vQuality: ["max", "4320", "2160", "1440", "1080", "720", "480", "360", "240", "144"],
|
vQuality: ["max", "4320", "2160", "1440", "1080", "720", "480", "360", "240", "144"],
|
||||||
aFormat: ["best", "mp3", "ogg", "wav", "opus"]
|
aFormat: ["best", "mp3", "ogg", "wav", "opus"],
|
||||||
|
filenamePattern: ["classic", "pretty", "basic", "nerdy"]
|
||||||
},
|
},
|
||||||
booleanOnly: ["isAudioOnly", "isNoTTWatermark", "isTTFullAudio", "isAudioMuted", "dubLang", "vimeoDash", "disableMetadata"]
|
booleanOnly: ["isAudioOnly", "isNoTTWatermark", "isTTFullAudio", "isAudioMuted", "dubLang", "vimeoDash", "disableMetadata"]
|
||||||
}
|
}
|
||||||
|
@ -94,6 +95,7 @@ export function checkJSONPost(obj) {
|
||||||
vCodec: "h264",
|
vCodec: "h264",
|
||||||
vQuality: "720",
|
vQuality: "720",
|
||||||
aFormat: "mp3",
|
aFormat: "mp3",
|
||||||
|
filenamePattern: "classic",
|
||||||
isAudioOnly: false,
|
isAudioOnly: false,
|
||||||
isNoTTWatermark: false,
|
isNoTTWatermark: false,
|
||||||
isTTFullAudio: false,
|
isTTFullAudio: false,
|
||||||
|
|
70
src/test/testFilenamePresets.js
Normal file
70
src/test/testFilenamePresets.js
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
import createFilename from "../modules/processing/createFilename.js";
|
||||||
|
|
||||||
|
let tests = [
|
||||||
|
{
|
||||||
|
f: {
|
||||||
|
service: 'youtube',
|
||||||
|
id: 'MMK3L4W70g4',
|
||||||
|
title: "Loossemble (루셈블) - 'Sensitive' MV",
|
||||||
|
author: 'Loossemble',
|
||||||
|
youtubeDubName: false,
|
||||||
|
qualityLabel: '2160p',
|
||||||
|
resolution: '3840x2160',
|
||||||
|
extension: 'webm',
|
||||||
|
youtubeFormat: 'vp9'
|
||||||
|
},
|
||||||
|
isAudioOnly: false,
|
||||||
|
isAudioMuted: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
f: {
|
||||||
|
service: 'youtube',
|
||||||
|
id: 'MMK3L4W70g4',
|
||||||
|
title: "Loossemble (루셈블) - 'Sensitive' MV",
|
||||||
|
author: 'Loossemble',
|
||||||
|
youtubeDubName: false,
|
||||||
|
qualityLabel: '2160p',
|
||||||
|
resolution: '3840x2160',
|
||||||
|
extension: 'webm',
|
||||||
|
youtubeFormat: 'vp9'
|
||||||
|
},
|
||||||
|
isAudioOnly: true,
|
||||||
|
isAudioMuted: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
f: {
|
||||||
|
service: 'youtube',
|
||||||
|
id: 'MMK3L4W70g4',
|
||||||
|
title: "Loossemble (루셈블) - 'Sensitive' MV",
|
||||||
|
author: 'Loossemble',
|
||||||
|
youtubeDubName: false,
|
||||||
|
qualityLabel: '2160p',
|
||||||
|
resolution: '3840x2160',
|
||||||
|
extension: 'webm',
|
||||||
|
youtubeFormat: 'vp9'
|
||||||
|
},
|
||||||
|
isAudioOnly: false,
|
||||||
|
isAudioMuted: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
f: {
|
||||||
|
service: 'vimeo',
|
||||||
|
id: 'MMK3L4W70g4',
|
||||||
|
title: "Loossemble (루셈블) - 'Sensitive' MV",
|
||||||
|
author: 'Loossemble',
|
||||||
|
qualityLabel: '2160p',
|
||||||
|
resolution: '3840x2160',
|
||||||
|
extension: 'mp4'
|
||||||
|
},
|
||||||
|
isAudioOnly: false,
|
||||||
|
isAudioMuted: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for (let i = 0; i < tests.length; i++) {
|
||||||
|
console.log(`---${i}---`)
|
||||||
|
console.log(createFilename(tests[i].f, "classic", tests[i].isAudioOnly, tests[i].isAudioMuted))
|
||||||
|
console.log(createFilename(tests[i].f, "basic", tests[i].isAudioOnly, tests[i].isAudioMuted))
|
||||||
|
console.log(createFilename(tests[i].f, "pretty", tests[i].isAudioOnly, tests[i].isAudioMuted))
|
||||||
|
console.log(createFilename(tests[i].f, "nerdy", tests[i].isAudioOnly, tests[i].isAudioMuted))
|
||||||
|
}
|
Loading…
Reference in a new issue