mirror of
https://github.com/imputnet/cobalt.git
synced 2024-12-28 02:26:10 +00:00
merge: svelte branch into 10
This commit is contained in:
commit
c1179e2c9b
|
@ -79,9 +79,9 @@ cobalt is a tool for easing content downloads from internet and takes ***zero li
|
|||
cobalt is ***NOT*** a piracy tool and cannot be used as such. it can only download free, publicly accessible content. such content can be easily downloaded through any browser's dev tools. pressing one button is easier, so i made a convenient, ad-less tool for such repeated actions.
|
||||
|
||||
## cobalt license
|
||||
cobalt code is licensed under [AGPL-3.0](/LICENSE).
|
||||
cobalt api code is licensed under [AGPL-3.0](/LICENSE). cobalt web code is licensed under [CC-BY-NC-SA-4.0](/web/LICENSE).
|
||||
|
||||
cobalt branding, mascots, and other related assets included in the repo are ***copyrighted*** and not covered by the AGPL-3.0 license. you ***cannot*** use them under same terms.
|
||||
cobalt branding, mascots, and other related assets included in the repo are ***copyrighted*** and not covered by the license. you ***cannot*** use them under same terms.
|
||||
|
||||
you are allowed to host an ***unmodified*** instance of cobalt with branding, but this ***does not*** give you permission to use it anywhere else, or make derivatives of it in any way.
|
||||
|
||||
|
|
|
@ -1,308 +0,0 @@
|
|||
{
|
||||
"current": {
|
||||
"version": "7.14",
|
||||
"date": "May 17, 2024",
|
||||
"title": "now helping over 1 million people monthly",
|
||||
"banner": {
|
||||
"file": "millionusers.webp",
|
||||
"alt": "collage of two photos, side by side. left photo: brown cake with 7 lit candles forming 1000000 and one ferrero rocher candy in the middle with cobalt (double greater than symbol) logo on it. right photo: chocolate cake with 7 lit candles forming 1000000 and cobalt logo formed with whipped cream on the cake. two plushes of meowth and pompompurin in party hats are seen behind the cake.",
|
||||
"width": 1736,
|
||||
"height": 1440
|
||||
},
|
||||
"content": "yesterday, cobalt hit 1 million users around the world! it's an absolutely insane milestone for us and we're incredibly grateful to everyone saving and creating what they love with help of cobalt. thank you for being our friends.\n\nin anticipation of 7 figure user count, we've revamped the cobalt codebase and infrastructure to be faster and more reliable than ever. a combination of many changes has resulted into incredible download speeds (up to 30 MB/s, as tested by both developers in europe).\n\nnote: there's no backend instance in asia just yet, so if you're there, you might experience average speeds *for now*. you can help us afford a dedicated server in asia by donating to cobalt in the \"donate\" menu.\n\n<span class=\"text-backdrop\">changes since the last major update</span>\n\nservice improvements:\n*; youtube music support on the main instance is back!\n*; added support for pinterest images and gifs.\n*; cobalt will now use original soundcloud mp3 file when available.\n*; fixed a youtube bug that prevented some videos from downloading.\n\nui/ux improvements:\n*; cobalt web app is now fully optimized for ipad. you can add it to home screen from share menu to make it act like a native app!\n*; majorly reduced vertical padding when viewing cobalt in mobile web browser, allowing for more content at once. most noticeable on smaller screens.\n*; status bar color is now dynamic in the web browser on ios and web app on android.\n*; web app on android feels way more native than before.\n*; filename style icons are no longer blurry in safari.\n*; changelog notification no longer overlaps with dynamic island on newer iphones when cobalt is installed as a web app.\n*; fixed safe area padding.\n\nother changes:\n*; added support for <a class=\"text-backdrop link\" href=\"https://github.com/imputnet/freebind.js\" target=\"_blank\">freebind</a>, made by one of the cobalt developers.\n*; rate limit and max video length limits are now customizable through <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/run-an-instance.md#variables-for-api\" target=\"_blank\">environment variables</a>.\n*; cobalt api now returns rate limit headers at all times.\n*; majorly cleaned up the codebase: removed unnecessary functions, rewrote those that were cryptic and confusing. it's way more comprehensible and contribution-friendly than ever before.\n*; moved the <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">cobalt repo</a> to our organization on github. everything stayed the same and all old links link back to it.\n\nnote for instance hosters:\nalong with cobalt repo, the docker image also moved! please update the url for it in your config along with watchtower args to include restarting containers (just in case) as seen in <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/examples/docker-compose.example.yml\" target=\"_blank\">updated docker compose example</a>. we're mirroring packages to old url for now, but it won't last forever.\n\nthat's it for now! hope you have an amazing day and share the 1 million celebration with us :)\n\njoin our <a class=\"text-backdrop link\" href=\"https://discord.gg/pQPt8HBUPu\" target=\"_blank\">discord server</a> to discuss everything cobalt there"
|
||||
},
|
||||
"history": [{
|
||||
"version": "7.13",
|
||||
"date": "May 5, 2024",
|
||||
"title": "better ux, improvements for youtube, twitter, tiktok, instagram, and more!",
|
||||
"banner": {
|
||||
"file": "meowthbusinessman.webp",
|
||||
"alt": "photo of a businessman holding hands together (merkel-raute pose) with meowth plush head.",
|
||||
"width": 1440,
|
||||
"height": 960
|
||||
},
|
||||
"content": "long time no see! well, actually, you've been using the latest version for some time now. we've moved to a rolling release scheme, allowing for speedy update rollouts :)\n\nsince 7.11, there has been a ton of changes. here are the most notable of them:\n*; youtube downloads are now faster and more reliable than ever.\n*; all posts from twitter are now downloadable, including sensitive ones.\n*; you now can download tiktok videos in 1080p h265! just enable h265 support in settings > video.\n*; added support for sharing links directly to the cobalt web app on android.\n*; added 240p and 144p quality options to the quality picker in settings (for some reason, many of you wanted this).\n*; pasting a link with additional text around it will now work; cobalt will extract the link for you (works only via the paste button).\n*; added anonymous traffic analytics by plausible. we're using a selfhosted instance and don't collect any identifiable information about you. you can learn more in about > privacy policy. you can also opt out of anonymous analytics in settings > other.\n\nservice support improvements:\n*; implemented internal streams functionality, allowing for more fine-grained file streaming and therefore proper youtube support.\n*; added fallback to m4a if opus isn't available for youtube.\n*; added a total of 7 ways to get instagram post info, including mobile api, embed, and graphql api. absolute torture.\n*; added support for reddit user posts.\n*; updated the way tiktok downloads are handled for better reliability and 1080p support.\n*; added tiktok author's username to filename.\n*; added support for rutube shorts and yappy videos.\n*; added support for m.soundcloud.com links.\n*; added support for new post and reel links from instagram.\n*; added support for photo twitter links, only used for gifs.\n*; added support for m.bilibili.com links.\n*; added support for new type of vimeo links.\n*; added support for ddinstagram.com links.\n*; updated youtube codec info in settings to display the fact that av1 is a better choice now.\n*; updated best audio picking for tiktok and soundcloud.\n*; changed the youtube client to web, since android client no longer works.\n*; removed the vimeo download type switcher, as it should've always been automatic instead.\n*; removed an ability to enable the tiktok watermark, as it no longer includes the author's username.\n\nui & ux improvements:\n*; youtube audio dub switcher is now a toggle with a much easier to understand description.\n*; meowbalt now sticks out on the left side of download popup on desktop.\n*; updated \"made with love\" text to include the research & dev team behind cobalt, imput.\n*; fixed grammar of russian localization.\n*; rounded corners are now correctly rendered across all browsers.\n*; various minor improvements, including smaller button padding.\n*; removed the notification (red dot) functionality as the most recent changelog is already always on screen.\n*; removed settings migration from the old domain.\n\nother changes:\n*; various docs updates in github repo, making sure they're functional across branches and forks.\n*; major codebase cleanup.\n\nthank you for using cobalt, and thank you for being one of our 900k friends! i hope you like this update as much as we liked making it.\n\nwe're committed to keeping cobalt the best way to save what you love without ads or invasion of your privacy. there's a ton of cool stuff to come soon; stay tuned and have an amazing rest of your day <3\n\nif you want to help our goal of a better internet for everyone, just share cobalt with a friend!\n\n(original photo of a man in a suit by benzoix on freepik)"
|
||||
}, {
|
||||
"version": "7.11",
|
||||
"date": "March 6, 2024",
|
||||
"title": "cache encryption, meowbalt, dailymotion, bilibili, and much more!",
|
||||
"banner": {
|
||||
"file": "meowth7eleven.webp",
|
||||
"alt": "meowth plush in front of 7-eleven store",
|
||||
"width": 850,
|
||||
"height": 640
|
||||
},
|
||||
"content": "cobalt may not have as many groceries as 7-eleven, but it sure does have lots of big changes in this update!\n\n*; all cached stream info is now encrypted and can only be decrypted with a link you get from cobalt.\n*; new popup style featuring meowbalt, cobalt's speedy mascot. you will see him more often from now on!\n*; added support for dailymotion (including short links).\n*; added support for bilibili.tv, fixed support for bilibili.com, and added support for all related short links.\n*; added support for unlisted vimeo links.\n*; added support for tumblr audio and revamped the entire module.\n*; added support for embed ok.ru links.\n\nwe also updated the privacy policy to reflect the addition of data encryption, go check it out.\n\nfor people with iphones:\n*; clearer ios saving tutorial.\n*; added \"save to files\" ios shortcut.\n*; updated save to photos shortcut.\n\nmake sure to save both shortcuts and read the updated tutorial!\n\nfor people who host a cobalt instance:\n*; updated all environment variables TO_BE_LIKE_THIS. time to update your configs! for now cobalt is backwards compatible with old variable names, but it won't last forever.\n*; added a list of all environment variables and their descriptions to <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/run-an-instance.md#list-of-all-environment-variables\" target=\"_blank\">run-an-instance doc</a>.\n*; updated <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/examples/cookies.example.json\" target=\"_blank\">cookie file example</a> with more services and improved examples.\n*; updated <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/examples/docker-compose.example.yml\" target=\"_blank\">docker compose example</a> with better explanations and up-to-date env variable samples.\n*; updated some packages to get rid of all unnecessary messages in console.\n\nwant to host an instance? <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/run-an-instance.md\" target=\"_blank\">learn how to do it here</a>.\n\nfrontend changes:\n*; removed migration popup.\n*; corners across ui are even more round now.\n*; bottom glass bkg in popups is no longer rounded on top right.\n*; small popup no longer stretches like gum, it's fixed in size on desktop.\n*; small popup animation no longer lags on mobile.\n*; better ui scaling across resolutions.\n*; updated donation text.\n\nthank you for using cobalt, all 750k of you. hope you like this update as much as we enjoyed making it :D"
|
||||
}, {
|
||||
"version": "7.9",
|
||||
"date": "January 17, 2024",
|
||||
"title": "twitter gifs, pinterest, ok.ru, and more!",
|
||||
"banner": {
|
||||
"file": "meowthball.webp",
|
||||
"alt": "meowth rolling on a big catnip ball",
|
||||
"width": 478,
|
||||
"height": 350
|
||||
},
|
||||
"content": "yes, you read that right. cobalt now lets you convert any twitter gif to an actual .gif file! (finally)\njust go to settings and enable this feature :)\n\nservice improvements:\n*; added an option to <a class=\"text-backdrop link\" href=\"{repo}/issues/250\" target=\"_blank\">convert gifs from twitter</a> into actual .gif format. files will be bigger and lower quality, but maybe you want that.\n*; pinterest support has been completely redone, now all videos (<a class=\"text-backdrop link\" href=\"{repo}/issues/160\" target=\"_blank\">and even pin.it links</a>) are supported.\n*; added <a class=\"text-backdrop link\" href=\"{repo}/issues/322\" target=\"_blank\">support for ok.ru</a> in case you're a russian grandma.\n*; now processing <a class=\"text-backdrop link\" href=\"{repo}/issues/318\" target=\"_blank\">all reddit links</a> (including old.reddit.com).\n*; <a class=\"text-backdrop link\" href=\"{repo}/issues/316\" target=\"_blank\">instagram live vods</a> are now supported.\n*; fixed a <a class=\"text-backdrop link\" href=\"{repo}/issues/289\" target=\"_blank\">rare vimeo bug</a> related to 1440p videos.\n\nother improvements:\n*; ui fade in animation is no longer present if you've disabled animations.\n*; all images now have alt descriptions.\n*; cobalt html is now <a class=\"text-backdrop link\" href=\"{repo}/issues/317\" target=\"_blank\">biblically correct</a> and follows the html spec.\n*; lots of cleaning up.\n\npatches since 7.8:\n*; shift+key <a class=\"text-backdrop link\" href=\"{repo}/issues/288\" target=\"_blank\">shortcuts are now ignored</a> if url bar is focused.\n*; longer soundcloud links are now supported, also catching more tiktok-related errors.\n*; removed mastodon from support links as that account is no longer active.\n*; added ability to download a specific video from multi media tweets and support for /mediaViewer links.\n*; fixed <a class=\"text-backdrop link\" href=\"{repo}/issues/309\" target=\"_blank\">modal blurriness</a> in chromium.\n*; minor html changes (road to biblically correct one).\n\nlots of long-awaited updates (especially twitter gifs), hope you enjoy them and have a great day :D"
|
||||
}, {
|
||||
"version": "7.8",
|
||||
"date": "December 25, 2023",
|
||||
"title": "new years clean up! bug fixes and fresh look for the home page",
|
||||
"banner": {
|
||||
"file": "catroomba.webp",
|
||||
"alt": "a cat riding a roomba vacuum",
|
||||
"width": 300,
|
||||
"height": 168
|
||||
},
|
||||
"content": "merry christmas and happy new year! this update fixes several (very annoying) bugs to help you enjoy your holidays better.\n\nyou might have already noticed, but we've refreshed the home page on desktop and mobile! less space wasted, more pleasant to look at. let us know if you like it or not :D\n\nservice improvements:\n*; <a class=\"text-backdrop link\" href=\"{repo}/issues/264\" target=\"_blank\">#264</a> anything that includes a period in the url should be possible to download (including instagram stories).\n*; <a class=\"text-backdrop link\" href=\"{repo}/issues/273\" target=\"_blank\">#73</a> soundcloud: falling back to mp3 instead of refusing to download the song at all.\n*; <a class=\"text-backdrop link\" href=\"{repo}/issues/275\" target=\"_blank\">#275</a> youtube: query parameters are parsed and handled correctly, all links should be supported, no matter where v query is located.\n*; tlds are parsed and validated correctly (e.g. \"pinterest.co.uk\" works now).\n*; fixvx.com links are now supported.\n\ninterface improvements:\n*; cleaner and more consistent home page layout.\n*; cleaned up support section in \"about\". also includes a link to the status page.\n\ninternal improvements:\n*; urls, subdomains, and tlds are properly validated.\n*; minor clean up.\n\nchanges since 7.7:\n*; made terms and ethics more descriptive.\n*; fix only affected twitter videos.\n*; fixed quick ⌘+V pasting on mac.\n*; now catching even more youtube-related errors.\n\nthis might not seem like a lot, but even smaller changes make a difference!\n\nenjoy this update and the rest of your day :D"
|
||||
}, {
|
||||
"version": "7.7",
|
||||
"date": "December 2, 2023",
|
||||
"title": "bugfixes and better downloads!",
|
||||
"banner": {
|
||||
"file": "meowthpolishegg.webp",
|
||||
"alt": "meowth polishing a togepi egg",
|
||||
"width": 640,
|
||||
"height": 480
|
||||
},
|
||||
"content": "this update fixes various issues with supported services. no new features yet, but twitter fix is surely something good to have in the meantime!\n\nservice improvements:\n*; broken twitter videos are now automatically fixed by cobalt.\n*; all vimeo videos and audios should now be possible to download.\n*; vimeo: fixed short resolution displayed in \"basic\" and \"pretty\" filename styles.\n\ninterface improvements:\n*; streamables are now easier to save on ios.\n\ninternal improvements:\n*; port env variable is now not strictly necessary for cobalt to run.\n*; minor clean up.\n\nchanges since 7.6:\n*; fix for an issue related to youtube dubs.\n*; fixed a memory leak related to live renders.\n*; handling all errors related to twitter downloads.\n*; fixed support for reddit links in various languages.\n*; added rich filenames support for twitch clips.\n*; updated support and donation lists.\n\nstay tuned for future updates and have a great day :D"
|
||||
}, {
|
||||
"version": "7.6",
|
||||
"date": "October 15, 2023",
|
||||
"title": "customizable file names, instagram stories, and first cobalt sponsor!",
|
||||
"banner": {
|
||||
"file": "meowthcenter.webp",
|
||||
"alt": "meowth plush in a datacenter wearing a hardhat, wielding a hammer",
|
||||
"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=\"{repo}/pull/194\" target=\"_blank\">#194</a>.\n*; fixed reddit support thanks to <a class=\"text-backdrop link\" href=\"{repo}/pull/221\" target=\"_blank\">#221</a>.\n*; added support for rich file names for youtube, vimeo, soundcloud, rutube, and vk.\n*; numbers and emoji no longer disappear from file name and metadata.\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"
|
||||
}, {
|
||||
"version": "7.5",
|
||||
"date": "September 16, 2023",
|
||||
"title": "support for twitch clips and rutube!",
|
||||
"banner": {
|
||||
"file": "twitchupdate.webp",
|
||||
"alt": "meowth plush staring into the camera, laptop with generic purple service in the background",
|
||||
"width": 851,
|
||||
"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!"
|
||||
}, {
|
||||
"version": "7.4",
|
||||
"date": "September 9, 2023",
|
||||
"title": "new domain, what's coming in future, bug fixes, and more!",
|
||||
"banner": {
|
||||
"file": "newdomain.webp",
|
||||
"alt": "text: new domain, same cobalt",
|
||||
"width": 960,
|
||||
"height": 540
|
||||
},
|
||||
"content": "cobalt is finally moving to its own domain! many of you have been anticipating this, and many kept forgetting the link due to how cryptic it was.\n\nwell, worry no more - <span class=\"text-backdrop\">cobalt.tools</span> is here.\n\nif you haven't yet, open <a class=\"text-backdrop link\" href=\"https://co.wukko.me\" target=\"_blank\">co.wukko.me</a> to transfer your settings here! no additional action from you is required. just open the old link and cobalt will do everything for you :)\n\nmake sure to <span class=\"text-backdrop\">update your bookmarks</span> and reinstall the web app!\n\nhere's what domain change means:\n*; still no ads, same owner, same features, same reliability. just a way more rememberable link (it's literally two words).\n*; cobalt.tools makes it clear that cobalt is a tool and that it's \"cobalt\", not \"wukko\".\n*; i can host various versions of cobalt on subdomains without links looking awkward.\n*; i can host cobalt-related websites without polluting my personal domain's dns (such as crowdin).\n*; i stand by same privacy policies (and in fact am using the same exact server as before).\n\nthe domain change is required for the future of cobalt.\n\nhere's what's coming soon:\n*; support for many top-requested sites, such as (but not limited to) twitch and niconico.\n*; education version of cobalt, as often requested by students and educators.\n*; major localization system upgrade, allowing for simpler community contributions.\n*; region-specific versions with 100% translations and tweaks.\n*; native clients for desktop and mobile (not sure about this one, i'm no superman).\n*; ...and more!\n\nnow, here's what's new in 7.4:\n*; tabs in popups now scroll to top on tab bar tap.\n*; padding across web app was tuned.\n*; (obviously) a migration agent. soon will be used for importing and exporting settings.\n*; some minor clean ups in codebase.\n\nif you want to help cobalt achieve goals listed above, consider donating! donations are the only way i can keep cobalt ad-less, powerful, (basically) limitless, and also 100% free.\n\nin fact, donations have helped me grow cobalt more than i've ever anticipated. just imagine how much better it will be in a year.\n\ngo to donations down below to find ways to donate!\n\nthank you for reading through all of this. i hope you enjoy this update and have a great day :D"
|
||||
}, {
|
||||
"version": "7.2 & 7.3",
|
||||
"date": "September 6, 2023",
|
||||
"title": "extended video length limit, metadata toggle, ui improvements, and more!",
|
||||
"banner": {
|
||||
"file": "meowthsnap.webp",
|
||||
"alt": "cartoon meowth pointing paw dramatically and saying something",
|
||||
"width": 500,
|
||||
"height": 280
|
||||
},
|
||||
"content": "this update gives cobalt a sharp look in chromium browsers and makes it even more useful than before. check out the full changelog below!\n\nservice improvements:\n*; increased video length limit from 3 hours to 5 hours. feel free to download lectures you need :)\n*; you can now disable file metadata in settings.\n*; fixed a bug which previously caused some downloads to end up being 0 bytes.\n\nui improvements:\n*; fixed clickable area for urgent notice (text on top).\n*; fixed blurry header in chrome.\n*; fixed blurry tab bar in chrome.\n*; fixed blurry switches in chrome.\n*; fixed weirdly rounded corners in popups.\n*; fixed 1px gap on edges of various elements in popup in chrome.\n*; fixed overscrolling in other settings tab on ios.\n*; fixed unexpected button highlight effect on phones.\n*; removed outdated fixes for tiny screens.\n\nother improvements:\n*; cobalt web & api start faster than before, additional preparation functions aren't unexpectedly run anymore.\n*; cobalt is now available as a docker package. check it out on <a class=\"text-backdrop link\" href=\"{repo}/pkgs/container/cobalt\" target=\"_blank\">github</a>.\n\nthank you for being here. i hope you have a great day :D"
|
||||
}, {
|
||||
"version": "7.1",
|
||||
"date": "August 20, 2023",
|
||||
"title": "instagram, streamable, video metadata, and more!",
|
||||
"banner": {
|
||||
"file": "meowthproductions.webp",
|
||||
"alt": "meowth roaring in a fancy circle, à la MGM studios intro",
|
||||
"width": 640,
|
||||
"height": 358
|
||||
},
|
||||
"content": "service improvements:\n*; extended instagram support: high quality photos, videos, reels. everything should work without any issues, enjoy! :)\n*; added support for streamable.com (thanks to <a class=\"text-backdrop link\" href=\"{repo}/pull/179\" target=\"_blank\">#179</a>)\n*; added video metadata to youtube videos.\n*; fixed vk video downloads.\n*; vxtwitter links are now supported.\n*; fixed support for youtube audio dubs.\n\nui improvements:\n*; fixed picker popup: it's now scrollable in all cases and clickable areas don't overlap each other.\n\nbackend improvements:\n*; cobalt will now let you know if something goes wrong during video download instead of nuking the stream.\n*; added support for cookies (thanks to <a class=\"text-backdrop link\" href=\"{repo}/pull/177\" target=\"_blank\">#177</a>)\n*; replaced got with undici (thanks to <a class=\"text-backdrop link\" href=\"{repo}/pull/182\" target=\"_blank\">#182</a>). downloads should be slightly faster and clean of garbage in headers.\n\ninternal improvements:\n*; moved host overrides into its own module.\n*; minor clean ups.\n\neven more cool stuff is coming in future updates! thank you for using cobalt :D"
|
||||
}, {
|
||||
"version": "7.0",
|
||||
"date": "August 15, 2023",
|
||||
"title": "biggest ui refresh yet!",
|
||||
"banner": {
|
||||
"file": "meowthcooking.webp",
|
||||
"alt": "meowth handling orders in a restaurant",
|
||||
"width": 640,
|
||||
"height": 360
|
||||
},
|
||||
"content": "hey! this update is huge and mostly aimed to refresh the ui, but there are also some other nice fixes/additions. read below for more info :)\n\n<span class=\"text-backdrop\">tl;dr:</span>\n*; entirety of web app has been refreshed. it's more prettier and optimized than ever, both on phone and desktop.\n*; if you're on ios, try adding cobalt to home screen! it'll look and act like a native app.\n*; all soundcloud links are now supported and audio quality is higher than before.\n*; all x (previously twitter) links are now supported and work properly.\n*; newer reddit videos are downloadable now.\n*; added some sort of eula, list of keyboard shortcuts, updated privacy policy for more clarity. check it all in refreshed about tab!\n*; cobalt now lets you know if your browser doesn't support clipboard pasting and helps you fix it.\n\n<span class=\"text-backdrop\">accessibility notice:</span>\nthis update includes animations and transparency, if you'd like to disable any or all of them, head to settings > other > accessibility.\n\n<span class=\"text-backdrop\">[full changelog]</span>\n\nservice improvements:\n*; fixed unexpected 502 errors when downloading newer reddit videos.\n*; newer reddit videos (with audio) are downloadable now.\n*; upgraded soundcloud downloads to use higher audio quality than before.\n*; all soundcloud links are now supported.\n*; added support for x.com urls.\n*; changed twitter api once again. now everything works, again.\n\nweb improvements:\n*; all-new matte glass aesthetic, applied to revamped popup headers, tab selectors, and also small popups.\n*; rounded corners everywhere! cobalt is now safe for everyone who can't handle sharp objects.\n*; paddings everywhere are smaller, more content fits on the screen at once.\n*; optimized installed web app to look and act like a native app, especially on ios.\n*; added update release dates to changelogs.\n*; cobalt now lets you know if your browser doesn't support clipboard api and helps you fix it.\n*; refreshed all popups: less padding, more content.\n*; completely remade error and download popups, they're consistent with the rest of refreshed design.\n*; refreshed the look of entire changelog tab: separated title and version/commit, made title bigger, evened out all paddings.\n*; replaced close button with back button, moved it to left.\n*; added interaction animations.\n*; added more keyboard shorcuts.\n*; added a list of keyboard shortcuts to about tab.\n*; added eula to about tab. check it out.\n*; added more accessibility options, put them all into one category. you can disable animations and transparency if you want to.\n*; added a link to self-troubleshooting guide to about tab.\n*; renamed 2160p and 4320p to 4k and 8k respectfully for better clarity.\n*; popups now work without any weird workarounds, especially on mobile. they're clean and nice.\n*; home screen now also works without any weird workarounds. it is also clean and nice.\n*; optimized css of almost all ui elements. should be even more consistent across platforms now.\n*; added ability to translate \"cobalt\" more in-depth localization. for example, in russian \"cobalt\" is now \"кобальт\", that's the style i'll be going with from now on.\n*; updated many localization strings for more clarity.\n*; removed ability to change the app name dynamically in all locations. cobalt is a sustained app name.\n*; updated donation and privacy policy texts for more clarity in both english and russian.\n*; home screen now smoothly fades in instead of popping in.\n*; proper banner loading. no more jumping text!\n*; proper banner error handling. if banner wasn't loaded, it'll simply go grey instead of disappearing.\n*; links are no longer italic and are instead underlined.\n*; collapsible lists now have corresponding emoji.\n*; donate button is now highlighted with magenta instead of white.\n*; proper dropdown arrow.\n*; removed 6.0 api fallback.\n*; fixed celebrations emoji. again.\n*; cleaned up all related frontend modules, especially page.js.\n*; urgent notice is now a js element, not a static piece of text. can be updated easily.\n\napi improvements:\n*; now catching all json api related errors.\n*; moved on demand blocks to web server, now changelog can be updated independently from preferred api server.\n*; now sending standard rate limiting headers.\n*; better readability in source.\n\nother improvements:\n*; renamed docker-compose.yml.example to docker-compose.example.yml for linting in code editors.\n*; added a wiki with wip troubleshooting guide on github. more guides are coming soon!\n\nthat's a ton of changes! i really hope you like this update as much as i do.\n\nif you experience any issues, feel free to contact me on any platform listed in about tab! i'd love to hear back from you.\n\nthank you for sticking with me and cobalt, i hope you have THE best day :D"
|
||||
}, {
|
||||
"version": "6.2",
|
||||
"date": "June 27 2023",
|
||||
"title": "all network issues have been fixed!",
|
||||
"banner": {
|
||||
"file": "meowthhammer.webp",
|
||||
"alt": "meowth plush holding a hammer in real life",
|
||||
"width": 1280,
|
||||
"height": 827
|
||||
},
|
||||
"content": "hey! there have been some hiccups in cobalt's stability lately, i was going through finals while trying to scale up the infrastructure, and that didn't really work out, lol.\nBUT i'm happy to announce that i've optimized all nodes! <span class=\"text-backdrop\">there should no longer be any networking issues</span>.\n\nenjoy stable experience while i work in background to make cobalt even better :)\n\nhere's what's new in this update:\n*; better button contrast in both themes. \n*; button highlight in light theme now actually looks like a highlight.\n*; removed ip gate for streamables and updated privacy policy to reflect this change.\n*; streamable links now last for 20 seconds instead of 2 minutes.\n*; cleaned up stream verification algorithm. now the same function doesn't run 4 times in a row.\n*; removed deprecated way of hosting a cobalt instance.\n\nthank you for sticking with cobalt, and i hope you have a great day :D\n\nbanner photo is by <a class=\"text-backdrop link\" href=\"https://twitter.com/halftroller\" target=\"_blank\">@halftroller</a> on twitter, thank you so much!"
|
||||
}, {
|
||||
"version": "6.0",
|
||||
"date": "June 7, 2023",
|
||||
"title": "better reliability, new infrastructure, pinterest support, and way more!",
|
||||
"banner": {
|
||||
"file": "catswitchboxes.webp",
|
||||
"alt": "a cat climbing into two empty boxes of asahi beer",
|
||||
"width": 600,
|
||||
"height": 314
|
||||
},
|
||||
"content": "hey! long time no see, hopefully over 40 changes will make up for it :)\n\ncobalt now has an official community discord server. you can go there for news, support, or just to chat. <a class=\"text-backdrop link\" href=\"https://discord.gg/pQPt8HBUPu\" target=\"_blank\">go check it out!</a>\n\n<span class='text-backdrop'>tl;dr</span>\n*; new infra, new hosting structure, new main instance api url. developers, <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/API.md\" target=\"_blank\">get it here.</a>\n*; added support for pinterest, vine archive, tumblr audio, youtube vr videos.\n*; better web app performance and look.\n*; better stability thanks to load balancing.\n*; (hopefully) no more random video/audio download drops.\n\nservice improvements:\n*; added support for pinterest videos and stories (pr by <a class=\"text-backdrop link\" href=\"{repo}/commit/40291c4d24cb5f441cdddfd26104f149bc4ee27c\" target=\"_blank\">@Snazzah</a>).\n*; added support for tumblr audio. sorry, tumblr.\n*; added support for youtube vr videos. please note that they're in youtube's proprietary ratio.\n*; added support for vine archive.\n*; added support for ancient vk videos in 240p.\n*; fixed an issue related to muted video downloads from tumblr.\n*; moved to twitter v2 api.\n*; soundcloud share links are now processed without errors.\n\nui improvements:\n*; lazy image loading. should significantly speed up the page load.\n*; fixed checkbox width on mobile devices.\n*; addition of a temporary urgent notice.\n*; added hover border to all buttons.\n*; less annoying donation button highlight.\n*; more consistent color scheme.\n*; added link to a discord server into about popup.\n*; remember celebratory emoji changes? they've been fixed, and are now dynamically loaded!\n*; changelog history now lets you try to load it again if first attempt failed for whatever reason.\n*; padding (everywhere) has been slightly reduced to fit in more content and be consistent across ui.\n*; added more info to the \"how to save\" popup for ios devices.\n*; crypto wallet press-to-copy buttons now look like buttons.\n*; improved ui layout for smallest screens (iphone 5, 5s, se, etc).\n*; removed partial translations for sake of clarity and consistency.\n\ninternal improvements:\n*; separated web and api servers. they're now completely independent and therefore more stress-resistant.\n*; added a dedicated script for building the web app if you don't want to reload the frontend server.\n*; web app building improvements.\n*; async localization preloading.\n*; consistent server start time reporting.\n*; dynamic stream and ip hashing salt generation.\n\ninfrastructure improvements:\n*; load balancing: your api requests are now sent to the least busy server. yes, there are now several of them with more to come in the future.\n*; when possible, server in closest region is used instead of a far-away one. this should help with download speeds.\n*; currently there are multiple servers in europe. i will let you know when (and if) i manage to get an american one.\n\nupdates for developers and instance hosters:\n*; server info api endpoint: you can now check up on the api server of choice. it reports all the basic info you may need. <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/API.md#get-apiserverinfo\" target=\"_blank\">check the api docs</a> for more info.\n*; api names: each and every api instance should have a distinctive name. this will be useful in the future :)\n*; added docker compose sample config.\n*; updated and more granular setup script.\n*; better api scalability and faster server start up thanks to web and api separation.\n*; added ability to specify ffmpeg threads. simply add ffmpegThreads to your environment variables!\n\ni'm still in awe from how popular cobalt has become. there are now over 200k of unique users monthly, and that number only keeps growing. i even had to come up with something to accommodate for larger traffic, it's absolutely insane.\n\nlove you all, have a great day :D"
|
||||
}, {
|
||||
"version": "5.4",
|
||||
"title": "instagram support, docker, and more!",
|
||||
"banner": {
|
||||
"file": "catphonestand.webp",
|
||||
"alt": "a cat holding a phone under its chin while a person plays clash of clans on it",
|
||||
"width": 451,
|
||||
"height": 272
|
||||
},
|
||||
"content": "something many of you've been waiting for is finally here! try it out and let me know what you think :)\n\n<span class='text-backdrop'>tl;dr:</span>\n*; added experimental instagram support! download any reels or videos you like, and make sure to report any issues you encounter. yes, you can convert either to audio.\n*; fixed support for on.soundcloud links.\n*; added share button to \"how to save?\" popup.\n*; added docker support.\n\nservice improvements:\n*; added experimental support for videos from instagram. currently only reels and post videos are downloadable, but i'm looking into ways to save high resolution photos too. if you experience any issues, please report them on either of support platforms.\n*; fixed support for on.soundcloud share links. should work just as well as other versions!\n*; fixed an issue that made some youtube videos impossible to download.\n\ninterface improvements:\n*; new css-only checkmark! yes, i can't stop tinkering with it because slight flashing on svg load annoyed me. now it loads instantly (and also looks slightly better).\n*; fixed copy animation.\n*; minor localization improvements.\n*; fixed the embed logo that i broke somewhere in between 5.3 and 5.4.\n\ninternal improvements:\n*; now using nanoid for live render stream ids.\n*; added support for docker. it's kind of clumsy because of how i get .git folder inside the container, but if you know how to do it better, feel free to make a pr.\n*; cobalt now checks only for existence of environment variables, not exactly the .env file.\n*; changed the way user ip address is retrieved for instances using cloudflare.\n*; added ability to disable cors, both to setup script and environment variables.\n\ni can't believe how diverse and widespread cobalt has become. it's used in all fields: music production, education, content creation, and even game development. <span class='text-backdrop'>thank you</span>. this is absolutely nuts.\nif you don't mind sharing, please tell me about your use case. i'd really love to hear how you use cobalt and how i could make it even more useful for you."
|
||||
}, {
|
||||
"version": "5.3",
|
||||
"title": "better looks, better feel",
|
||||
"banner": {
|
||||
"file": "cattired.webp",
|
||||
"alt": "a cat laying on a sofa face down, wiggling its tail",
|
||||
"width": 640,
|
||||
"height": 286
|
||||
},
|
||||
"content": "this update isn't as big as previous ones, but it still greatly enhances the cobalt experience.\n\nhere's what's up:\n*; new mode switcher! elegant and 100% clear. should no longer cause any confusion. let me know if you like it better this way :D\n*; wide paste button on mobile is back, but now it's even closer to your finger.\n*; removed the weird grey chin on changelog banners.\n*; removed left-handed layout toggle since it is no longer needed.\n*; fixed input area display in chromium 112+.\n*; centered the main action box.\n*; cleaned up css of main action box to get rid of tricks and ensure correct display on all devices.\n*; fixed a bug that'd cause notifications dots to disappear when an unrelated checkbox was checked.\n\nhopefully from now on i'll focus on adding support for more services.\nthank you for using cobalt. stay cool :)"
|
||||
}, {
|
||||
"version": "5.2",
|
||||
"title": "fastest one in the game",
|
||||
"banner": {
|
||||
"file": "catspeed.webp",
|
||||
"alt": "a cat running very fast in an exercise wheel",
|
||||
"width": 640,
|
||||
"height": 356
|
||||
},
|
||||
"content": "hey, notice anything different? well, at very least the page loaded way faster! this update includes many improvements and fixes, but also some new features.\n\n<span class=\"text-backdrop\">tl;dr:</span>\n*; twitter retweet links are now supported.\n*; all vimeo videos should now be possible to download.\n*; you now can download audio from vimeo.\n*; it's now possible to pick between preferred vimeo download method in settings.\n*; fixed issues related to tiktok, twitter, twitter spaces, and vimeo downloads.\n*; overall cobalt performance should be MUCH better.\n\nservice improvements:\n*; added support for twitter retweet links. now all kinds of tweet links are supported.\n*; fixed the issue related to periods in tiktok usernames (#96).\n*; fixed twitter spaces downloads.\n*; added support for audio downloads from vimeo.\n*; added ability to choose between \"progressive\" and \"dash\" vimeo downloads. go to settings > video to pick your preference.\n*; fixed the issue related to vimeo quality picking.\n*; fixed the issue when vimeo module wouldn't show appropriate errors and instead would fallback to default ones.\n*; improved audio only downloads for some edge cases.\n*; (hopefully) better youtube reliability.\n*; temporarily disabled douyin support due to api endpoint cut off.\n\ninterface improvements:\n*; merged clipboard and mode switcher rows into one for mobile view.\n*; added left-handed layout toggle for those who prefer to have the clipboard button on left.\n*; new custom-made clipboard icon. now it clearly indicates what it does.\n*; improved english and russian localization. both are way more direct and less bloaty.\n*; frontend page is now rendered once and is cached on disk instead of being rendered every time someone requests a page. this greatly improves page loading speeds and further reduces strain put on the server.\n*; frontend page is now minimized just like js and css files. this should minimize traffic wasted on loading the page, along with minor loading speed improvement.\n*; added proper checkbox icon for better clarity.\n*; checkboxes are now stretched edge-to-edge on phone to be easier to manage for right-handed people.\n*; removed button hover highlights on phones.\n*; fixed button press animations for safari on ios.\n*; fixed text selection on ios. previously you could select text or images anywhere, but now they're selectable in limited places, just like on other platforms.\n*; frontend platform is now marked in settings: p is for pc; m is for mobile; i is for ios. this is done for possible future debugging and issue-solving.\n*; better error messaging.\n\ninternal improvements:\n*; better rate limiting, there should be way less cases of accidental limits.\n*; added support for m3u8 playlists. this will be useful for future additions, and is currently used by vimeo module.\n*; added support for \"chop\" stream format for vimeo downloads.\n*; fixed vk user id extraction. i assumed the - in url was a separator, but it's actually a part of id.\n*; completely reworked the vimeo module. it's much cleaner and better performant now.\n*; minor clean ups across the board.\n\nnot really related to this update, but thank you for 50k monthly users! i really appreciate that you're still here, because that means i'm doing some things right :D"
|
||||
}, {
|
||||
"version": "5.1",
|
||||
"title": "the evil has been defeated",
|
||||
"banner": {
|
||||
"file": "happymeowth.webp",
|
||||
"alt": "meowth jumping up into the sky very excitedly",
|
||||
"width": 500,
|
||||
"height": 330
|
||||
},
|
||||
"content": "hey, ever wanted to download a youtube video without a hassle? cobalt is here to help. this update fixes all issues related to youtube downloads.\nnot only that, but it also introduces features never before seen in a downloader, such as youtube dub downloads! read below to see what's up :)\n\n<span class=\"text-backdrop\">tl;dr:</span>\n*; audio in youtube videos FINALLY no longer gets cut off.\n*; you now can pick any video resolution you want (from 360p to 8k) and any possible youtube video codec (h264/av1/vp9).\n*; you now can download youtube videos with dubs in your native language. just check settings > audio.\n*; youtube processing has been vastly sped up.\n\nok, now onto the nerdy part of changelog. this update is pretty huge and includes improvements across the board.\n\nservice improvements:\n*; all youtube functionality has been reworked. cobalt now relies on innertube apis, not web scraping.\n*; random audio cut off issue has been fixed, let me know if it ever occurs again. (closes #62, #66, #75, #88).\n*; added support for youtube dubs. currently it's using your browser's default language when enabled, but i have plans on making a picker. i'll ask people on twitter and mastodon if this feature is needed, and add a picker in next updates.\n*; instead of adding more quality presets, i added granular quality options. pick whatever you like, from 360p up to 4320p (for all services, not just youtube).\n*; replaced a format picker with codec picker for youtube. you can pick h264, av1, or vp9. all of them should work as expected (closes #88).\n*; youtube audio files are now properly matched to corresponding video files.\n*; it's now always possible to download pristine h264 720p/360p videos from youtube. these videos will work ANYWHERE, so they're default for mobile.\n*; youtube requests are no longer permanently cached, ram usage should drop even further.\n*; youtube video and audio file names now include codec and dub language when applicable.\n*; max video and audio duration limits have been bumped up to 3 hours.\n*; general performance of entire youtube download process has been greatly improved.\n*; vk module has been reworked to be more compact and not make use of outdated technique of quality picking. should also be way more reliable.\n\ninternal improvements:\n*; cleaned up services config, all constants have been moved directly to modules for quicker access.\n*; matching module has been slightly cleaned up.\n\ninterface improvements:\n*; many descriptions and error messages have been slightly tuned to be less wordy.\n*; unnecessary title duplications in settings have been merged into one.\n*; added more clarity to quality and codec descriptions.\n\nif you use cobalt api, please note that you have to update your creation to support new features.\n\nthis is the second batch of 5.x improvements, there's way more to come. thank you for being here, i really appreciate your support.\n\nif you want to thank me (the developer), there's a nice tab under this changelog that has \"donations\" text on it. anything helps me continue developing and hosting the friendliest media downloader :D"
|
||||
}, {
|
||||
"version": "5.0",
|
||||
"title": "it's all about attention to detail!",
|
||||
"banner": {
|
||||
"file": "valentines.webp",
|
||||
"alt": "relaxed meowth with sakura petals falling in front of them",
|
||||
"width": 489,
|
||||
"height": 374
|
||||
},
|
||||
"content": "happy valentine's day! i have an update for you, as a gift :D\n\ntl;dr: added support for <span class=\"text-backdrop\">reddit gifs</span>, fixed douyin downloads, fixed vimeo quality picking, revamped entirety of codebase, and many other fixes.\n\nhere's more info:\n\nthis update is mostly about cleaning up and polishing the codebase, but it also has some new features. here's what's up:\n\nservice-related improvements:\n*; you now can download gifs from reddit!\n*; attempting to download a video from douyin no longer throws an error (bytedance changed the api endpoint, yet again).\n*; fixed quality picking for vimeo downloads.\n*; fixed length limit check in vimeo module.\n*; fixed support for \"user view\" vk clips links.\n*; various twitter errors are now displayed correctly instead of falling back to the default error.\n*; state of all services is now tested on each commit.\n\nui improvements:\n*; cobalt social links no longer disappear if you have an aggressive ad blocking extension installed.\n*; various localization improvements for both english and russian.\n*; changed some service aliases to display full list of supported downloads.\n*; added current branch information to version text (in settings).\n*; fixed typos in older changelogs.\n\ninternal improvements:\n*; <span class=\"text-backdrop\">everything</span> has been sanitized, improved, and refactored. code is now much easier to read and maintain.\n*; rewrote and/or optimized all modules that were messy or inefficient.\n*; all git interaction functions now store info in cache instead of fetching it every time the function is called.\n*; added a test script that checks functionality of all supported services.\n*; updated deepsource config. checks are more accurate now.\n*; requests from internet explorer are now dropped entirely instead of redirecting people stuck in 90s to a proper browser download page. this was done to avoid (my) personal bias towards browsers.\n\ni put a ton of effort into this version, and i hope you like it as much as i do.\n\nthank you for using cobalt. there's so much more to come :)"
|
||||
}, {
|
||||
"version": "4.8",
|
||||
"title": "prettier than ever",
|
||||
"banner": {
|
||||
"file": "catmakeup.webp",
|
||||
"alt": "a cat being brushed with a powder makeup brush",
|
||||
"width": 394,
|
||||
"height": 266
|
||||
},
|
||||
"content": "this version brings many visual improvements and a completely revamped \"about\" tab.\n\nwhat's new in \"about\" tab:\n*; all information is now split into collapsible sections, making it easier to navigate.\n*; added privacy policy to further prove that none of your data is collected.\n*; added emoji to the page title to make it look consistent with other pages.\n*; added mastodon account handle and link.\n*; there are now short notes at the end of each section.\n*; other changes that are too small to describe. just go check it out!\n\nvisual improvements:\n*; less wasted space: paddings and margins have been reduced and optimized for usability, consistency, and overall beauty.\n*; all <a class=\"text-backdrop link\" href=\"https://youtu.be/dQw4w9WgXcQ\" target=\"_blank\">links</a> are now in italic. it's much easier to tell them apart from <span class=\"text-backdrop\">regular highlights</span>.\n*; error popup no longer looks broken and out of place.\n*; download popup now has a proper close button, not something from 2.x era.\n*; emoji are no longer selectable or draggable.\n*; better scalability: desktop layout for home screen is shown if device viewport is wide enough to fit in three action buttons.\n*; page shouldn't look broken on phones in landscape mode (i still highly recommend using cobalt in portrait mode).\n*; removed bulletpoint padding. it was unnecessary.\n*; updated some service names.\n\nas always, you can suggest features or report bugs on any platform listed in the \"support\" section of about tab.\n\nthank you for using cobalt. i hope you have a good day :)"
|
||||
}, {
|
||||
"version": "4.7",
|
||||
"title": "we're better together! thank you for bug reports.",
|
||||
"banner": {
|
||||
"file": "bettertogether.webp",
|
||||
"alt": "various different pokémon jumping in happiness",
|
||||
"width": 640,
|
||||
"height": 358
|
||||
},
|
||||
"content": "this update includes a bunch of improvements, many of which were made thanks to the community :D\n\nservice-related improvements:\n*; private soundcloud links are now supported (#68);\n*; tiktok usernames with dots in them no longer confuse cobalt (#71);\n*; .ogg files no longer wrongfully include a video channel (#67);\n*; fixed an issue that caused cobalt to freak out when user attempted to download an audio from audio-only service with \"mute video\" option enabled.\n\nui improvements:\n*; popup padding has been evened out. popups are now able to fit in more information on scroll, especially on mobile;\n*; all buttons are now of even size and are displayed without any padding issues across all modern browsers and devices;\n*; checkbox is no longer crippled on ios;\n*; many explanation texts have been simplified to get rid of unnecessary bloat (no bullshit, remember?);\n*; moved tiktok section in video settings higher due to higher priority;\n*; fixed unexpectedly displayed scrollbars on switch rows in firefox.\n\nstability improvements:\n*; ffmpeg process now should end upon finishing the render;\n*; ffmpeg should also quit when download is abruptly cut off;\n*; fixed a memory leak that was caused by misconfigured stream information caching (#63).\n\ninternal improvements:\n*; requested streams are now stored in cache for 2 minutes instead of 1000 hours (yes, 1000 hours, i fucked up);\n*; cached data is now reused if user requests same content within 2 minutes;\n*; page render module is now even cleaner than before;\n*; proper support for bullet-points in loc strings.\n\nyou can suggest features or report bugs on <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">github</a> or <a class=\"text-backdrop link\" href=\"https://twitter.com/justusecobalt\" target=\"_blank\">twitter</a>. both work just fine, use whichever you're more comfortable with.\n\nthank you for using cobalt, and thank you for reading this changelog.\n\nyou're amazing, keep it up :)"
|
||||
}, {
|
||||
"version": "4.6",
|
||||
"title": "mute videos and proper soundcloud support",
|
||||
"banner": {
|
||||
"file": "shutup.webp",
|
||||
"alt": "a cat yawning, with a crossed out loudspeaker icon next to it",
|
||||
"width": 1024,
|
||||
"height": 665
|
||||
},
|
||||
"content": "i've been longing to implement both of these things, and here they finally are.\n\nservice-related improvements:\n*; you now can download videos with no audio! simply enable the \"mute audio\" option in settings > audio.\n*; soundcloud module has been updated, and downloads should no longer break after some time.\nvisual improvements:\n*; moved some things around in settings popup, and added separators where separation is needed.\n*; updated some texts in english and russian.\n*; version and commit hash have been joined together, now they're a single unit.\ninternal improvements:\n*; updated api documentation to include isAudioMuted.\n*; simplified the startup message.\n*; created render elements for separator and explanation due to high duplication of them in the page.\n*; fully deprecated GET method for API requests.\n*; fixed some code quirks.\nhere's how soundcloud downloads got fixed:\n\npreviously, client_id was (stupidly) hardcoded. that means cobalt wasn't able to fetch song data if soundcloud web app got updated.\nnow, cobalt tries to find the up-to-date client_id, caches it in memory, and checks if web app version has changed to update the id accordingly. you can see this change for yourself on github."
|
||||
}, {
|
||||
"version": "4.5",
|
||||
"title": "better, faster, stronger, stable",
|
||||
"banner": {
|
||||
"file": "meowthstrong.webp",
|
||||
"alt": "meowth stretching",
|
||||
"width": 500,
|
||||
"height": 280
|
||||
},
|
||||
"content": "your favorite social media downloader just got even better! this update includes a ton of improvements and fixes.\n\nin fact, there are so many changes, i had to split them in sections.\n\nservice-related improvements:\n*; vimeo module has been revamped, all sorts of videos should now be supported.\n*; vimeo audio downloads! you now can download audios from more recent videos.\n*; cobalt now supports all sorts of tumblr links. (even those scary ones from the mobile app)\n*; vk clips support has been fixed. they rolled back the separation of videos and clips, so i had to do the same.\n*; youtube videos with community warnings should now be possible to download.\nuser interface improvements:\n*; list of supported services is now MUCH easier to read.\n*; banners in changelog history should no longer overlap each other.\n*; bullet points! they have a bit of extra padding, so it makes them stand out of the rest of text.\ninternal improvements:\n*; cobalt will now match the link to regex when using ?u= query for autopasting it into input area.\n*; better rate limiting: limiting now is done per minute, not per 20 minutes. this ensures less waiting and less attack area for request spammers.\n*; moved to my own fork of ytdl-core, cause main project seems to have been abandoned. go check it out on <a class=\"text-backdrop link\" href=\"https://github.com/wukko/better-ytdl-core\" target=\"_blank\">github</a> or <a class=\"text-backdrop link\" href=\"https://www.npmjs.com/package/better-ytdl-core\" target=\"_blank\">npm</a>!\n*; ALL user inputs are now properly sanitized on the server. that includes variables for POST api method, too.\n*; \"got\" package has been (mostly) replaced by native fetch api. this should greatly reduce ram usage.\n*; all unnecessary duplications of module imports have been gotten rid of. no more error passing strings from inside of service modules. you don't make mistakes only if you don't do anything, right?\n*; other code optimizations. there's less clutter overall.\nhuge update, right? seems like everything's fixed now?\n\nnope, one issue still persists: sometimes youtube server drops packets for an audio file while cobalt's rendering the video for you. this results in abrupt cuts of audio. if you want to help solving this issue, <a class=\"text-backdrop link\" href=\"{repo}/issues/62\" target=\"_blank\">please feel free to do it on github!</a>\n\nthank you for reading this, and thank you for sticking with cobalt and me."
|
||||
}, {
|
||||
"version": "4.4",
|
||||
"title": "over 1 million monthly requests. thank you.",
|
||||
"banner": {
|
||||
"file": "onemillionr.webp",
|
||||
"alt": "cobalt logo and a confetti emoji",
|
||||
"width": 1441,
|
||||
"height": 1441
|
||||
},
|
||||
"content": "this is a huge milestone for me, i cannot express enough how grateful i am for each and every one of you.\nthank you for using cobalt, and thank you for showing that people love the web that's friendly and bullshit-free. i'm hoping to never disappoint you in the future and keep up the good work.\n\nthank you <3\n\nif you want to thank ME, check out the renovated donations tab, which now is also linked alongside bottom action buttons."
|
||||
}, {
|
||||
"version": "4.3.2",
|
||||
"title": "twitter improvements & changelog overhaul",
|
||||
"content": "- you can download explicit content from twitter.\n- direct video links from twitter are properly supported (video/1, video/2, etc.).\n- changelog history got support for banners.\n- changelog categories are not messy anymore.\n- cobalt version in changelogs is now highlighted.\n- changelog history got separators to make text easier to read.\n- changelog history can be collapsed after loading.\n- download button takes less time to change back to pressable state.\n\nif you're a developer and would like to play around with cobalt's api, then read more about it in older changelogs below!"
|
||||
}, {
|
||||
"version": "4.3",
|
||||
"title": "developers, developers, developers, developers",
|
||||
"banner": {
|
||||
"file": "developers.webp",
|
||||
"alt": "steve ballmer going \"developers, developers, developers\"",
|
||||
"width": 640,
|
||||
"height": 360
|
||||
},
|
||||
"content": "this update features a TON of improvements.\n\n<a class=\"text-backdrop link\" href=\"https://www.youtube.com/watch?v=SaVTHG-Ev4k\" target=\"_blank\">developers</a>, you now can rely on cobalt for getting content from social media. the api has been revamped and <a class=\"text-backdrop link\" href=\"{repo}/tree/current/docs/API.md\" target=\"_blank\">documentation</a> is now available. you can read more about API changes down below. go crazy, and have fun :D\n\nif you're not a developer, here's a list of changes that you probably care about:\n- rate limit is now approximately 8 times bigger. no more waiting, even if you want to download entirety of your tiktok \"for you\" page.\n- some updates will now have expressive banners, just like this one.\n- fixed what was causing an error when a youtube video had no description.\n- mp4 format button text should now be displayed properly, no matter if you touched the switcher or not.\n\nnext, the star of this update — improved api!\n- main endpoint now uses POST method instead of GET.\n- internal variables for preferences have been updated to be consistent and easier to understand.\n- ip address is now hashed right upon request, not somewhere deep inside the code.\n- global stream salt variable is no longer unnecessarily passed over a billion functions.\n- url and picker keys are now separate in the json response.\n- cobalt web app now correctly processes responses with \"success\" status.\n\nif you currently have a siri shortcut or some other script that uses the GET method, make sure to update it soon. this method is deprecated, limited, and will be removed entirely in coming updates.\n\nif you ever make something using cobalt's api, make sure to mention <a class=\"text-backdrop link\" href=\"https://twitter.com/justusecobalt\" target=\"_blank\">@justusecobalt</a> on twitter, i would absolutely love to see what you made."
|
||||
}, {
|
||||
"version": "4.2",
|
||||
"title": "optimized quality picking and 8k video support",
|
||||
"content": "- this update fixes quality picking that was accidentally broken in 4.0 update.\n- you now can download videos in 8k from youtube. why would you that? no idea. but i'm more than happy to give you this option.\n- default video quality for downloads from pc is now 1440p, and 720p for phones.\n- default video format is now mp4 for everyone.\n- default audio format is now mp3 for everyone.\n\nyou can always change new defaults back to whatever you prefer in settings.\n\nother changes:\n- added more clarity to quality picker description.\n- youtube video codecs are now right in the picker.\n- setup script is now easier to understand."
|
||||
}, {
|
||||
"version": "4.1",
|
||||
"title": "better tiktok image downloads",
|
||||
"content": "here's what's up:\n- tiktok images are saved as .jpeg instead of .webp (finally, i know).\n- added support for image downloads from douyin.\n- fixed tiktok audio downloads from the image picker.\n- emoji in about button now changes on special occasions. be it halloween or christmas, cobalt will change just a tiny bit to fit in :D\n\nif you're not caught up with new stuff in cobalt 4.x yet, check out the previous changelog down below. there's a ton of stuff to like."
|
||||
}, {
|
||||
"version": "4.0",
|
||||
"title": "better and faster than ever",
|
||||
"content": "this update has a ton of improvements and new features.\n\nchanges you probably care about:\n- cobalt now has support for recorded twitter spaces! download the previous conversation no matter how long it was.\n- download speeds from youtube are at least 10 times better now. you're welcome.\n- both video and audio length limits have been extended to 2 hours.\n- audio downloads from youtube, youtube music, twitter spaces, and soundcloud now have metadata! most often it's just title and artist, but when cobalt is able to get more info, it adds that metadata too.\n- tiktok downloads have been fixed, yet again, and if they ever break in the future, cobalt will fall back to downloading a less annoyingly watermarked video.\n- soundcloud downloads have been fixed, too.\n\nless notable changes:\n- currently experimenting with using mp3 as default audio format. if you set something other than mp3 before, it'll be set to mp3. you can always change it back in settings. let me know what you think about this.\n- \"download audio\" button from image picker no longer stays on the screen after popup was closed.\n- clipboard button now shows up depending on your browser's support for it.\n- you can no longer manually hide the clipboard button, 'cause it's unnecessary.\n- small internal improvements such as separation of changelog version and title.\n- fair bit of internal clean up.\n\nif you want to help me implement covers for downloaded audios, <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">you can do it on github</a>."
|
||||
}, {
|
||||
"version": "3.7",
|
||||
"title": "support for multi media tweets is here!",
|
||||
"content": "cobalt now lets you save any of the videos or gifs in a tweet. even if there are many of them.\n\nsimply paste a link like you'd usually do and cobalt will ask what exactly you want to save.\n\nFIREFOX USERS: if you have strict tracking protection on, you might wanna turn it off for cobalt, or else twitter video previews won't load. firefox filters out twitter image cdn as if it was a tracker, which it's not. it's a false-positive.\n\nhowever, you can leave it on if you're fine with blank squares and video numbers. i have thought of that in prior, you're welcome.\n\nother changes:\n- repurposed ex tiktok-only image picker to be dynamic and adapt depending on content to pick. that's exactly how twitter multi media downloads work.\n- cobalt is now properly viewable on phones with tiny screens, such as first gen iphone se.\n- scrollbars now should be visible only where they're needed.\n- brought back proper twitter api, because other one doesn't have multi media stuff (at least yet).\n- cleaned up some internal files, including main frontend js file.\n- reorganized some files in project directory, now you won't get lost when contributing or just looking through cobalt's code."
|
||||
}, {
|
||||
"version": "3.6.2 + 3.6.3",
|
||||
"title": "less disturbance",
|
||||
"content": "changelog popup no longer annoys you after a major update! this action has been replaced with a notification dot. if you see a red dot, then there's something new.\n\nyour old setting that disabled the changelog popup now applies to notifications.\n\nnew users will see a notification dot instead of an about popup, too. this was mostly done to prevent complications if your browser is set up to clean local storage when you close it.\n\nother changes:\n- popups are now a bit wider, just so more content fits at once.\n- better interface scaling.\n- code is a bit cleaner now.\n- changed twitter api endpoint. there should no longer be any rate limits."
|
||||
}, {
|
||||
"version": "3.6",
|
||||
"title": "improvements all around!",
|
||||
"content": "- download mode switcher is moving places, it's now right next to link input area.\n- smart mode has been renamed to auto mode, because this name is easier to understand.\n- all spacings in ui have been evened out. no more eye strain.\n- added support for twitter /video/1 links\n- clipboard button exception has been redone to prepare for adoption of readtext clipboard api in firefox.\n- cobalt is now using different tiktok api endpoint, because previous one got killed, just like the one before.\n- \"other\" settings tab has been cleaned up."
|
||||
}, {
|
||||
"version": "3.5.4",
|
||||
"title": "tiktok support is back :D",
|
||||
"content": "you can download videos, sounds, and images from tiktok again!\nhuge thank you to <a class=\"text-backdrop link\" href=\"https://github.com/minzique\" target=\"_blank\">@minzique</a> for finding another api endpoint that works."
|
||||
}, {
|
||||
"version": "3.5.2",
|
||||
"title": "vk clips support, improved changelog system, and less bugs",
|
||||
"content": "new features: \n- added support for vk clips. cobalt now lets you download even more cringy videos!\n- added update history right to the changelog menu. it's not loaded by default to minimize page load time, but can be loaded upon pressing a button. probably someone will enjoy this.\n- as you've just read, cobalt now has on-demand blocks. they're rendered on server upon request and exist to prevent any unnecessary clutter by default. the first feature to use on-demand rendering is history of updates in changelog tab.\n\nchanges:\n- moved twitter entry to about tab and made it localized.\n- added clarity to what services exactly are supported in about tab.\n\nbug fixes:\n- cobalt should no longer crash to firefox users if they love to play around with user-agent switching.\n- vk videos of any resolution and aspect ratio should now be downloadable.\n- vk quality picking has been fixed after vk broke it for parsers on their side."
|
||||
}, {
|
||||
"version": "3.5",
|
||||
"title": "ui revamp and usability improvements",
|
||||
"content": "new features:\n- cobalt now lets you paste the link in your clipboard and download the file in a single press of a button.if your clipboard's latest content isn't a valid url, cobalt won't process or paste it. you can also hide the clipboard button in settings if you want to.\nunfortunately, the clipboard feature is not available to firefox users because mozilla didn't add proper support for clipboard api.\n- there's now a button to quickly clean the input area, right next to download button. it's really useful in case when you want to quickly save a bunch of videos and don't want to bother selecting text.\n- keyboard shortcuts! you love them, i love them, and now we can use them to perform quick actions in cobalt. use ctrl+v combo to paste the link without focusing the input area; press escape key to close the active popup or clean the input area; and if you didn't know, you can also press enter to download content from the link.\n\nnew looks:\n- main box has been revamped. it has lost its border, thick padding, and now feels light and fresh.\n- download button is now prettier, and has been tuned to make >> look just like the logo.\n- buttons on the bottom now actually look like buttons and are way more descriptive. no more #@+?$ bullshit. it's way easier to see and understand what each of them does.\n- bottom buttons are prettier and easier to use on a phone. they're bigger and stretch out to sides, making them easier to press.\n\nfixes:\n- it's now impossible to overlap multiple popups at once. no more mess if you decide to explore popups while waiting for request to process.\n- popup tabs have been slightly moved down to prevent popup content overlapping.\n- ui scalability has been improved."
|
||||
}]
|
||||
}
|
10
web/.gitignore
vendored
Normal file
10
web/.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
1
web/.npmrc
Normal file
1
web/.npmrc
Normal file
|
@ -0,0 +1 @@
|
|||
engine-strict=true
|
437
web/LICENSE
Normal file
437
web/LICENSE
Normal file
|
@ -0,0 +1,437 @@
|
|||
Attribution-NonCommercial-ShareAlike 4.0 International
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||
does not provide legal services or legal advice. Distribution of
|
||||
Creative Commons public licenses does not create a lawyer-client or
|
||||
other relationship. Creative Commons makes its licenses and related
|
||||
information available on an "as-is" basis. Creative Commons gives no
|
||||
warranties regarding its licenses, any material licensed under their
|
||||
terms and conditions, or any related information. Creative Commons
|
||||
disclaims all liability for damages resulting from their use to the
|
||||
fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and
|
||||
conditions that creators and other rights holders may use to share
|
||||
original works of authorship and other material subject to copyright
|
||||
and certain other rights specified in the public license below. The
|
||||
following considerations are for informational purposes only, are not
|
||||
exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are
|
||||
intended for use by those authorized to give the public
|
||||
permission to use material in ways otherwise restricted by
|
||||
copyright and certain other rights. Our licenses are
|
||||
irrevocable. Licensors should read and understand the terms
|
||||
and conditions of the license they choose before applying it.
|
||||
Licensors should also secure all rights necessary before
|
||||
applying our licenses so that the public can reuse the
|
||||
material as expected. Licensors should clearly mark any
|
||||
material not subject to the license. This includes other CC-
|
||||
licensed material, or material used under an exception or
|
||||
limitation to copyright. More considerations for licensors:
|
||||
wiki.creativecommons.org/Considerations_for_licensors
|
||||
|
||||
Considerations for the public: By using one of our public
|
||||
licenses, a licensor grants the public permission to use the
|
||||
licensed material under specified terms and conditions. If
|
||||
the licensor's permission is not necessary for any reason--for
|
||||
example, because of any applicable exception or limitation to
|
||||
copyright--then that use is not regulated by the license. Our
|
||||
licenses grant only permissions under copyright and certain
|
||||
other rights that a licensor has authority to grant. Use of
|
||||
the licensed material may still be restricted for other
|
||||
reasons, including because others have copyright or other
|
||||
rights in the material. A licensor may make special requests,
|
||||
such as asking that all changes be marked or described.
|
||||
Although not required by our licenses, you are encouraged to
|
||||
respect those requests where reasonable. More considerations
|
||||
for the public:
|
||||
wiki.creativecommons.org/Considerations_for_licensees
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||||
Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree
|
||||
to be bound by the terms and conditions of this Creative Commons
|
||||
Attribution-NonCommercial-ShareAlike 4.0 International Public License
|
||||
("Public License"). To the extent this Public License may be
|
||||
interpreted as a contract, You are granted the Licensed Rights in
|
||||
consideration of Your acceptance of these terms and conditions, and the
|
||||
Licensor grants You such rights in consideration of benefits the
|
||||
Licensor receives from making the Licensed Material available under
|
||||
these terms and conditions.
|
||||
|
||||
|
||||
Section 1 -- Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar
|
||||
Rights that is derived from or based upon the Licensed Material
|
||||
and in which the Licensed Material is translated, altered,
|
||||
arranged, transformed, or otherwise modified in a manner requiring
|
||||
permission under the Copyright and Similar Rights held by the
|
||||
Licensor. For purposes of this Public License, where the Licensed
|
||||
Material is a musical work, performance, or sound recording,
|
||||
Adapted Material is always produced where the Licensed Material is
|
||||
synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright
|
||||
and Similar Rights in Your contributions to Adapted Material in
|
||||
accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. BY-NC-SA Compatible License means a license listed at
|
||||
creativecommons.org/compatiblelicenses, approved by Creative
|
||||
Commons as essentially the equivalent of this Public License.
|
||||
|
||||
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||
closely related to copyright including, without limitation,
|
||||
performance, broadcast, sound recording, and Sui Generis Database
|
||||
Rights, without regard to how the rights are labeled or
|
||||
categorized. For purposes of this Public License, the rights
|
||||
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||
Rights.
|
||||
|
||||
e. Effective Technological Measures means those measures that, in the
|
||||
absence of proper authority, may not be circumvented under laws
|
||||
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||
Treaty adopted on December 20, 1996, and/or similar international
|
||||
agreements.
|
||||
|
||||
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||
any other exception or limitation to Copyright and Similar Rights
|
||||
that applies to Your use of the Licensed Material.
|
||||
|
||||
g. License Elements means the license attributes listed in the name
|
||||
of a Creative Commons Public License. The License Elements of this
|
||||
Public License are Attribution, NonCommercial, and ShareAlike.
|
||||
|
||||
h. Licensed Material means the artistic or literary work, database,
|
||||
or other material to which the Licensor applied this Public
|
||||
License.
|
||||
|
||||
i. Licensed Rights means the rights granted to You subject to the
|
||||
terms and conditions of this Public License, which are limited to
|
||||
all Copyright and Similar Rights that apply to Your use of the
|
||||
Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||
under this Public License.
|
||||
|
||||
k. NonCommercial means not primarily intended for or directed towards
|
||||
commercial advantage or monetary compensation. For purposes of
|
||||
this Public License, the exchange of the Licensed Material for
|
||||
other material subject to Copyright and Similar Rights by digital
|
||||
file-sharing or similar means is NonCommercial provided there is
|
||||
no payment of monetary compensation in connection with the
|
||||
exchange.
|
||||
|
||||
l. Share means to provide material to the public by any means or
|
||||
process that requires permission under the Licensed Rights, such
|
||||
as reproduction, public display, public performance, distribution,
|
||||
dissemination, communication, or importation, and to make material
|
||||
available to the public including in ways that members of the
|
||||
public may access the material from a place and at a time
|
||||
individually chosen by them.
|
||||
|
||||
m. Sui Generis Database Rights means rights other than copyright
|
||||
resulting from Directive 96/9/EC of the European Parliament and of
|
||||
the Council of 11 March 1996 on the legal protection of databases,
|
||||
as amended and/or succeeded, as well as other essentially
|
||||
equivalent rights anywhere in the world.
|
||||
|
||||
n. You means the individual or entity exercising the Licensed Rights
|
||||
under this Public License. Your has a corresponding meaning.
|
||||
|
||||
|
||||
Section 2 -- Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License,
|
||||
the Licensor hereby grants You a worldwide, royalty-free,
|
||||
non-sublicensable, non-exclusive, irrevocable license to
|
||||
exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
a. reproduce and Share the Licensed Material, in whole or
|
||||
in part, for NonCommercial purposes only; and
|
||||
|
||||
b. produce, reproduce, and Share Adapted Material for
|
||||
NonCommercial purposes only.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||
Exceptions and Limitations apply to Your use, this Public
|
||||
License does not apply, and You do not need to comply with
|
||||
its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section
|
||||
6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The
|
||||
Licensor authorizes You to exercise the Licensed Rights in
|
||||
all media and formats whether now known or hereafter created,
|
||||
and to make technical modifications necessary to do so. The
|
||||
Licensor waives and/or agrees not to assert any right or
|
||||
authority to forbid You from making technical modifications
|
||||
necessary to exercise the Licensed Rights, including
|
||||
technical modifications necessary to circumvent Effective
|
||||
Technological Measures. For purposes of this Public License,
|
||||
simply making modifications authorized by this Section 2(a)
|
||||
(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
a. Offer from the Licensor -- Licensed Material. Every
|
||||
recipient of the Licensed Material automatically
|
||||
receives an offer from the Licensor to exercise the
|
||||
Licensed Rights under the terms and conditions of this
|
||||
Public License.
|
||||
|
||||
b. Additional offer from the Licensor -- Adapted Material.
|
||||
Every recipient of Adapted Material from You
|
||||
automatically receives an offer from the Licensor to
|
||||
exercise the Licensed Rights in the Adapted Material
|
||||
under the conditions of the Adapter's License You apply.
|
||||
|
||||
c. No downstream restrictions. You may not offer or impose
|
||||
any additional or different terms or conditions on, or
|
||||
apply any Effective Technological Measures to, the
|
||||
Licensed Material if doing so restricts exercise of the
|
||||
Licensed Rights by any recipient of the Licensed
|
||||
Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or
|
||||
may be construed as permission to assert or imply that You
|
||||
are, or that Your use of the Licensed Material is, connected
|
||||
with, or sponsored, endorsed, or granted official status by,
|
||||
the Licensor or others designated to receive attribution as
|
||||
provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not
|
||||
licensed under this Public License, nor are publicity,
|
||||
privacy, and/or other similar personality rights; however, to
|
||||
the extent possible, the Licensor waives and/or agrees not to
|
||||
assert any such rights held by the Licensor to the limited
|
||||
extent necessary to allow You to exercise the Licensed
|
||||
Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this
|
||||
Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to
|
||||
collect royalties from You for the exercise of the Licensed
|
||||
Rights, whether directly or through a collecting society
|
||||
under any voluntary or waivable statutory or compulsory
|
||||
licensing scheme. In all other cases the Licensor expressly
|
||||
reserves any right to collect such royalties, including when
|
||||
the Licensed Material is used other than for NonCommercial
|
||||
purposes.
|
||||
|
||||
|
||||
Section 3 -- License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the
|
||||
following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified
|
||||
form), You must:
|
||||
|
||||
a. retain the following if it is supplied by the Licensor
|
||||
with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed
|
||||
Material and any others designated to receive
|
||||
attribution, in any reasonable manner requested by
|
||||
the Licensor (including by pseudonym if
|
||||
designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of
|
||||
warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the
|
||||
extent reasonably practicable;
|
||||
|
||||
b. indicate if You modified the Licensed Material and
|
||||
retain an indication of any previous modifications; and
|
||||
|
||||
c. indicate the Licensed Material is licensed under this
|
||||
Public License, and include the text of, or the URI or
|
||||
hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||
reasonable manner based on the medium, means, and context in
|
||||
which You Share the Licensed Material. For example, it may be
|
||||
reasonable to satisfy the conditions by providing a URI or
|
||||
hyperlink to a resource that includes the required
|
||||
information.
|
||||
3. If requested by the Licensor, You must remove any of the
|
||||
information required by Section 3(a)(1)(A) to the extent
|
||||
reasonably practicable.
|
||||
|
||||
b. ShareAlike.
|
||||
|
||||
In addition to the conditions in Section 3(a), if You Share
|
||||
Adapted Material You produce, the following conditions also apply.
|
||||
|
||||
1. The Adapter's License You apply must be a Creative Commons
|
||||
license with the same License Elements, this version or
|
||||
later, or a BY-NC-SA Compatible License.
|
||||
|
||||
2. You must include the text of, or the URI or hyperlink to, the
|
||||
Adapter's License You apply. You may satisfy this condition
|
||||
in any reasonable manner based on the medium, means, and
|
||||
context in which You Share Adapted Material.
|
||||
|
||||
3. You may not offer or impose any additional or different terms
|
||||
or conditions on, or apply any Effective Technological
|
||||
Measures to, Adapted Material that restrict exercise of the
|
||||
rights granted under the Adapter's License You apply.
|
||||
|
||||
|
||||
Section 4 -- Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that
|
||||
apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||
to extract, reuse, reproduce, and Share all or a substantial
|
||||
portion of the contents of the database for NonCommercial purposes
|
||||
only;
|
||||
|
||||
b. if You include all or a substantial portion of the database
|
||||
contents in a database in which You have Sui Generis Database
|
||||
Rights, then the database in which You have Sui Generis Database
|
||||
Rights (but not its individual contents) is Adapted Material,
|
||||
including for purposes of Section 3(b); and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share
|
||||
all or a substantial portion of the contents of the database.
|
||||
|
||||
For the avoidance of doubt, this Section 4 supplements and does not
|
||||
replace Your obligations under this Public License where the Licensed
|
||||
Rights include other Copyright and Similar Rights.
|
||||
|
||||
|
||||
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||
|
||||
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided
|
||||
above shall be interpreted in a manner that, to the extent
|
||||
possible, most closely approximates an absolute disclaimer and
|
||||
waiver of all liability.
|
||||
|
||||
|
||||
Section 6 -- Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and
|
||||
Similar Rights licensed here. However, if You fail to comply with
|
||||
this Public License, then Your rights under this Public License
|
||||
terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under
|
||||
Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided
|
||||
it is cured within 30 days of Your discovery of the
|
||||
violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||
right the Licensor may have to seek remedies for Your violations
|
||||
of this Public License.
|
||||
|
||||
c. For the avoidance of doubt, the Licensor may also offer the
|
||||
Licensed Material under separate terms or conditions or stop
|
||||
distributing the Licensed Material at any time; however, doing so
|
||||
will not terminate this Public License.
|
||||
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||
License.
|
||||
|
||||
|
||||
Section 7 -- Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different
|
||||
terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the
|
||||
Licensed Material not stated herein are separate from and
|
||||
independent of the terms and conditions of this Public License.
|
||||
|
||||
|
||||
Section 8 -- Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and
|
||||
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||
conditions on any use of the Licensed Material that could lawfully
|
||||
be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is
|
||||
deemed unenforceable, it shall be automatically reformed to the
|
||||
minimum extent necessary to make it enforceable. If the provision
|
||||
cannot be reformed, it shall be severed from this Public License
|
||||
without affecting the enforceability of the remaining terms and
|
||||
conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no
|
||||
failure to comply consented to unless expressly agreed to by the
|
||||
Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted
|
||||
as a limitation upon, or waiver of, any privileges and immunities
|
||||
that apply to the Licensor or You, including from the legal
|
||||
processes of any jurisdiction or authority.
|
||||
|
||||
=======================================================================
|
||||
|
||||
Creative Commons is not a party to its public
|
||||
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||
its public licenses to material it publishes and in those instances
|
||||
will be considered the “Licensor.” The text of the Creative Commons
|
||||
public licenses is dedicated to the public domain under the CC0 Public
|
||||
Domain Dedication. Except for the limited purpose of indicating that
|
||||
material is shared under a Creative Commons public license or as
|
||||
otherwise permitted by the Creative Commons policies published at
|
||||
creativecommons.org/policies, Creative Commons does not authorize the
|
||||
use of the trademark "Creative Commons" or any other trademark or logo
|
||||
of Creative Commons without its prior written consent including,
|
||||
without limitation, in connection with any unauthorized modifications
|
||||
to any of its public licenses or any other arrangements,
|
||||
understandings, or agreements concerning use of licensed material. For
|
||||
the avoidance of doubt, this paragraph does not form part of the
|
||||
public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
2
web/README.md
Normal file
2
web/README.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
# cobalt web
|
||||
wip
|
20
web/changelogs/2.0.md
Normal file
20
web/changelogs/2.0.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
title: "everything is new!"
|
||||
date: "Jun 28, 2022"
|
||||
---
|
||||
|
||||
- added support for: bilibili.com, youtube, youtube music, reddit, vk;
|
||||
- remade the way downloads are handled;
|
||||
- added proper website branding;
|
||||
- added settings, donations, and changelog menu;
|
||||
- added manual theme picker;
|
||||
- added format picker for youtube;
|
||||
- added quality picker for youtube and vk downloads (bilibili and twitter later);
|
||||
- improved usability;
|
||||
- upgraded the download button to be adaptive depending on current status;
|
||||
- popups are now adaptive, too;
|
||||
- better scalability;
|
||||
- took out trash;
|
||||
- moved from commonjs to ems;
|
||||
- overall revamp of backend and frontend;
|
||||
- fixed various issues that were present in older version.
|
17
web/changelogs/2.2.5.md
Normal file
17
web/changelogs/2.2.5.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
title: "remade localization system once again"
|
||||
date: "Jul 24, 2022"
|
||||
---
|
||||
|
||||
- new localization system: fast, dynamic, way more organized
|
||||
- localization strings are WAY more descriptive
|
||||
- it's now easier to add support for other languages (just one loc file instead of five)
|
||||
- localization now falls back to english if localized string isnt available
|
||||
- got rid of all static language selectors (probably)
|
||||
- slightly updated english and russian strings
|
||||
- miscellaneous settings items have been bundled together and moved to the bottom, cause they're used the least
|
||||
- bottom links should no longer touch the popup border on overflow
|
||||
- rearranged popup order in the rendered page
|
||||
- bumped version up to 2.2.5
|
||||
|
||||
if you see strings that are like this: !!EXAMPLE!! or withoutspace please file an issue on github
|
10
web/changelogs/2.2.6.md
Normal file
10
web/changelogs/2.2.6.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "tiktok is back!"
|
||||
date: "Jul 28, 2022"
|
||||
---
|
||||
|
||||
- added support for tiktok (images won't work, they're only accessible through the app)
|
||||
- hopefully main input bar is now not rounded on ios, i fucking hate apple
|
||||
- if service is not supported, a correlating error will appear, not generic one
|
||||
- removed duplicates from config that are present in package json already
|
||||
- tiny bit of clean up
|
7
web/changelogs/2.2.8.md
Normal file
7
web/changelogs/2.2.8.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: "faster and more accessible"
|
||||
date: "Jul 30, 2022"
|
||||
---
|
||||
|
||||
- spanish localization by @adrigoomy
|
||||
- cobalt should load even faster cause all loaded files are now way smaller (esbuild implementation)
|
10
web/changelogs/2.2.9.md
Normal file
10
web/changelogs/2.2.9.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "fixes"
|
||||
date: "Aug 6, 2022"
|
||||
---
|
||||
|
||||
- fixed neighbor quality picking for youtube videos
|
||||
- webm is now default for youtube downloads for all platforms except for ios
|
||||
- even more readme changes
|
||||
- a tiny bit of clean up
|
||||
- preparing stuff for next major update
|
16
web/changelogs/2.2.md
Normal file
16
web/changelogs/2.2.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
title: "beginning of 2.2"
|
||||
date: "Jul 13, 2022"
|
||||
---
|
||||
|
||||
- added download popup to solve the issue with downloads on ios
|
||||
- merged big and small popups into one
|
||||
- made buttons in donation menu act like buttons
|
||||
- began to clean up localisation
|
||||
- added ability to embed repo url into localisation strings
|
||||
- moved ffmpeg args to config for more flexibility (and hopefully future changes)
|
||||
- removed error response in stream that could result in a crash
|
||||
- removed notice for ios users from about cause it's no longer relevant
|
||||
- made error popup look and act like the rest
|
||||
- a tiny bit of clean up
|
||||
- changelog is now made out of latest commit (and doesn't break)
|
46
web/changelogs/3.0.md
Normal file
46
web/changelogs/3.0.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
---
|
||||
title: "everything what you've been waiting for. welcome to cobalt 3.0 :)"
|
||||
date: "Aug 12, 2022"
|
||||
---
|
||||
|
||||
follow cobalt's twitter account for polls, updates, and more: [@justusecobalt](https://twitter.com/justusecobalt)
|
||||
|
||||
stuff that you can notice:
|
||||
|
||||
- you can now download audio from any supported service, in any format that you set in settings (+). yes, that includes mp3, which you all have been waiting for :D
|
||||
- it's now easier to switch between download modes (just a single toggle on the bottom).
|
||||
- your youtube download format has been reset, sorry, but that was required to implement all audio downloads.
|
||||
- default download format for youtube videos on all platforms is now webm. except for ios.
|
||||
|
||||
- cobalt now has emoji, just to spice up the black and white ui. all of them have been tuned to look the best in both themes. isn't it cool?
|
||||
- about, changelog, and donation popups have been merged into just one, for covnenience.
|
||||
- changelog got a huge upgrade (as you can see), and now there are both major changes and latest commit info, just so commits can finally go back to being batshit insane.
|
||||
- changelog popup appears on every major update, but you can disable it in settings, if you want to.
|
||||
- changelog now opens by default when pressing "?" button. i don't think anyone reads "about" as often.
|
||||
- settings (+) have been split into three tabs, also for convenience and ease of use.
|
||||
|
||||
- added support for donation links. you can now donate through boosty, not only via crypto :D
|
||||
- donate popup has been rearranged and tuned just a tiny bit.
|
||||
|
||||
- you can now click away from any popup by pressing the void behind it.
|
||||
- you can also press "escape" key on keyboard to close any popup.
|
||||
|
||||
- switchers and buttons are now way easier on eye. white border is gone from where it's unneeded.
|
||||
- buttons are now very satisfying to press.
|
||||
- switchers are scrollable if there's not enough space to fit all contents on screen.
|
||||
- scaling is now even better than before.
|
||||
|
||||
internal stuff:
|
||||
|
||||
- frontend won't send video related stuff if audio mode is on.
|
||||
- matching has, yet again, gone through mitosis, and is now probably the cleanest it can get.
|
||||
- page rendering is now modular, something like what frameworks have but way lighter. this makes adding new features WAY easier.
|
||||
- removed some stuff that didn't make sense (like storing language of stream request).
|
||||
- cleaned up insides of cobalt, of course.
|
||||
- almost all links now open in new tab, just like they should have from the very beginning.
|
||||
|
||||
known issues:
|
||||
- impossible to download audio from vk. i'll try to fix it in the next update.
|
||||
- headers are not sticky in tabbed popups. maybe this is a good thing, i'll think about it.
|
||||
|
||||
if you ever notice any issues, make sure to report them on github. your report doesn't have to sound professional, just do your best to describe the issue.
|
11
web/changelogs/3.1.md
Normal file
11
web/changelogs/3.1.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: small quality of life improvements
|
||||
date: "Aug 16, 2022"
|
||||
---
|
||||
|
||||
- tiktok videos can now be downloaded without watermark, you just have to enable it in video settings (+)!
|
||||
- you now can pass "u" query to main website to fill out the input area right away (co.wukko.me?u=your_link_here).
|
||||
- added ability to select text in certain areas of website.
|
||||
- some internal stuff has been cleaned up.
|
||||
|
||||
follow cobalt's twitter account for polls, updates, and more: [@justusecobalt](https://twitter.com/justusecobalt)
|
12
web/changelogs/3.2.md
Normal file
12
web/changelogs/3.2.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
title: ukrainian localization and new error popup
|
||||
date: "Aug 19, 2022"
|
||||
---
|
||||
|
||||
- added ukrainian localization (thanks to löffel).
|
||||
- new error popup! it's now prettier, more compact, and has an easily accessible close button.
|
||||
- russian localization has been patched up a bit
|
||||
- cleaned up css a bit
|
||||
- added github contributors to made with love message.
|
||||
- emojis have been tuned to have the same shade of yellow.
|
||||
- updated translation guidelines in readme a bit.
|
15
web/changelogs/3.4.md
Normal file
15
web/changelogs/3.4.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: tiktok images and better localization
|
||||
date: "Sep 3, 2022"
|
||||
---
|
||||
|
||||
- added ability to save images from tiktok conveniently, and without watermarks.
|
||||
- it's now way easier to contribute translations to cobalt. read more on how to do it [on github](https://github.com/imputnet/cobalt#how-to-contribute-translations). in short, you don't need to fork the repo anymore, everything is handled through crowdin :D
|
||||
- updated readme in github repo to make it easier to read and understand.
|
||||
- began to add more descriptive errors, more to come soon.
|
||||
|
||||
internal stuff:
|
||||
- remade entirety of tiktok module and merged it with douyin one. now both (basically identical) platforms have perfect parity of download features.
|
||||
- cleaned up the twitter module, now it's way more compact and easy to read.
|
||||
- moved changelog out of english localization.
|
||||
- other small improvements and fixes.
|
17
web/changelogs/3.5.2.md
Normal file
17
web/changelogs/3.5.2.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
title: "vk clips support, improved changelog system, and less bugs"
|
||||
date: "Sep 11, 2022"
|
||||
---
|
||||
new features:
|
||||
- added support for vk clips. cobalt now lets you download even more cringy videos!
|
||||
- added update history right to the changelog menu. it's not loaded by default to minimize page load time, but can be loaded upon pressing a button. probably someone will enjoy this.
|
||||
- as you've just read, cobalt now has on-demand blocks. they're rendered on server upon request and exist to prevent any unnecessary clutter by default. the first feature to use on-demand rendering is history of updates in changelog tab.
|
||||
|
||||
changes:
|
||||
- moved twitter entry to about tab and made it localized.
|
||||
- added clarity to what services exactly are supported in about tab.
|
||||
|
||||
bug fixes:
|
||||
- cobalt should no longer crash to firefox users if they love to play around with user-agent switching.
|
||||
- vk videos of any resolution and aspect ratio should now be downloadable.
|
||||
- vk quality picking has been fixed after vk broke it for parsers on their side.
|
6
web/changelogs/3.5.4.md
Normal file
6
web/changelogs/3.5.4.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
title: "tiktok support is back :D"
|
||||
date: "Sep 21, 2022"
|
||||
---
|
||||
you can download videos, sounds, and images from tiktok again!
|
||||
huge thank you to [@minzique](https://github.com/minzique) for finding another api endpoint that works.
|
20
web/changelogs/3.5.md
Normal file
20
web/changelogs/3.5.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
title: "ui revamp and usability improvements"
|
||||
date: "Sep 8, 2022"
|
||||
---
|
||||
new features:
|
||||
- cobalt now lets you paste the link in your clipboard and download the file in a single press of a button.if your clipboard's latest content isn't a valid url, cobalt won't process or paste it. you can also hide the clipboard button in settings if you want to.
|
||||
unfortunately, the clipboard feature is not available to firefox users because mozilla didn't add proper support for clipboard api.
|
||||
- there's now a button to quickly clean the input area, right next to download button. it's really useful in case when you want to quickly save a bunch of videos and don't want to bother selecting text.
|
||||
- keyboard shortcuts! you love them, i love them, and now we can use them to perform quick actions in cobalt. use ctrl+v combo to paste the link without focusing the input area; press escape key to close the active popup or clean the input area; and if you didn't know, you can also press enter to download content from the link.
|
||||
|
||||
new looks:
|
||||
- main box has been revamped. it has lost its border, thick padding, and now feels light and fresh.
|
||||
- download button is now prettier, and has been tuned to make >> look just like the logo.
|
||||
- buttons on the bottom now actually look like buttons and are way more descriptive. no more #@+?$ bullshit. it's way easier to see and understand what each of them does.
|
||||
- bottom buttons are prettier and easier to use on a phone. they're bigger and stretch out to sides, making them easier to press.
|
||||
|
||||
fixes:
|
||||
- it's now impossible to overlap multiple popups at once. no more mess if you decide to explore popups while waiting for request to process.
|
||||
- popup tabs have been slightly moved down to prevent popup content overlapping.
|
||||
- ui scalability has been improved.
|
15
web/changelogs/3.6.3.md
Normal file
15
web/changelogs/3.6.3.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: "less disturbance"
|
||||
date: "Oct 5, 2022"
|
||||
---
|
||||
changelog popup no longer annoys you after a major update! this action has been replaced with a notification dot. if you see a red dot, then there's something new.
|
||||
|
||||
your old setting that disabled the changelog popup now applies to notifications.
|
||||
|
||||
new users will see a notification dot instead of an about popup, too. this was mostly done to prevent complications if your browser is set up to clean local storage when you close it.
|
||||
|
||||
other changes:
|
||||
- popups are now a bit wider, just so more content fits at once.
|
||||
- better interface scaling.
|
||||
- code is a bit cleaner now.
|
||||
- changed twitter api endpoint. there should no longer be any rate limits.
|
11
web/changelogs/3.6.md
Normal file
11
web/changelogs/3.6.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "improvements all around!"
|
||||
date: "Sep 28, 2022"
|
||||
---
|
||||
- download mode switcher is moving places, it's now right next to link input area.
|
||||
- smart mode has been renamed to auto mode, because this name is easier to understand.
|
||||
- all spacings in ui have been evened out. no more eye strain.
|
||||
- added support for twitter /video/1 links
|
||||
- clipboard button exception has been redone to prepare for adoption of readtext clipboard api in firefox.
|
||||
- cobalt is now using different tiktok api endpoint, because previous one got killed, just like the one before.
|
||||
- "other" settings tab has been cleaned up.
|
19
web/changelogs/3.7.md
Normal file
19
web/changelogs/3.7.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
title: "support for multi media tweets is here!"
|
||||
date: "Oct 9, 2022"
|
||||
---
|
||||
cobalt now lets you save any of the videos or gifs in a tweet. even if there are many of them.
|
||||
|
||||
simply paste a link like you'd usually do and cobalt will ask what exactly you want to save.
|
||||
|
||||
FIREFOX USERS: if you have strict tracking protection on, you might wanna turn it off for cobalt, or else twitter video previews won't load. firefox filters out twitter image cdn as if it was a tracker, which it's not. it's a false-positive.
|
||||
|
||||
however, you can leave it on if you're fine with blank squares and video numbers. i have thought of that in prior, you're welcome.
|
||||
|
||||
other changes:
|
||||
- repurposed ex tiktok-only image picker to be dynamic and adapt depending on content to pick. that's exactly how twitter multi media downloads work.
|
||||
- cobalt is now properly viewable on phones with tiny screens, such as first gen iphone se.
|
||||
- scrollbars now should be visible only where they're needed.
|
||||
- brought back proper twitter api, because other one doesn't have multi media stuff (at least yet).
|
||||
- cleaned up some internal files, including main frontend js file.
|
||||
- reorganized some files in project directory, now you won't get lost when contributing or just looking through cobalt's code.
|
23
web/changelogs/4.0.md
Normal file
23
web/changelogs/4.0.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "better and faster than ever"
|
||||
date: "Oct 24, 2022"
|
||||
---
|
||||
this update has a ton of improvements and new features.
|
||||
|
||||
changes you probably care about:
|
||||
- cobalt now has support for recorded twitter spaces! download the previous conversation no matter how long it was.
|
||||
- download speeds from youtube are at least 10 times better now. you're welcome.
|
||||
- both video and audio length limits have been extended to 2 hours.
|
||||
- audio downloads from youtube, youtube music, twitter spaces, and soundcloud now have metadata! most often it's just title and artist, but when cobalt is able to get more info, it adds that metadata too.
|
||||
- tiktok downloads have been fixed, yet again, and if they ever break in the future, cobalt will fall back to downloading a less annoyingly watermarked video.
|
||||
- soundcloud downloads have been fixed, too.
|
||||
|
||||
less notable changes:
|
||||
- currently experimenting with using mp3 as default audio format. if you set something other than mp3 before, it'll be set to mp3. you can always change it back in settings. let me know what you think about this.
|
||||
- "download audio" button from image picker no longer stays on the screen after popup was closed.
|
||||
- clipboard button now shows up depending on your browser's support for it.
|
||||
- you can no longer manually hide the clipboard button, 'cause it's unnecessary.
|
||||
- small internal improvements such as separation of changelog version and title.
|
||||
- fair bit of internal clean up.
|
||||
|
||||
if you want to help me implement covers for downloaded audios, [you can do it on github](https://github.com/imputnet/cobalt).
|
11
web/changelogs/4.1.md
Normal file
11
web/changelogs/4.1.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "better tiktok image downloads"
|
||||
date: "Oct 27, 2022"
|
||||
---
|
||||
here's what's up:
|
||||
- tiktok images are saved as .jpeg instead of .webp (finally, i know).
|
||||
- added support for image downloads from douyin.
|
||||
- fixed tiktok audio downloads from the image picker.
|
||||
- emoji in about button now changes on special occasions. be it halloween or christmas, cobalt will change just a tiny bit to fit in :D
|
||||
|
||||
if you're not caught up with new stuff in cobalt 4.x yet, check out the previous changelog down below. there's a ton of stuff to like.
|
16
web/changelogs/4.2.md
Normal file
16
web/changelogs/4.2.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
title: "optimized quality picking and 8k video support"
|
||||
date: "Nov 4, 2022"
|
||||
---
|
||||
- this update fixes quality picking that was accidentally broken in 4.0 update.
|
||||
- you now can download videos in 8k from youtube. why would you that? no idea. but i'm more than happy to give you this option.
|
||||
- default video quality for downloads from pc is now 1440p, and 720p for phones.
|
||||
- default video format is now mp4 for everyone.
|
||||
- default audio format is now mp3 for everyone.
|
||||
|
||||
you can always change new defaults back to whatever you prefer in settings.
|
||||
|
||||
other changes:
|
||||
- added more clarity to quality picker description.
|
||||
- youtube video codecs are now right in the picker.
|
||||
- setup script is now easier to understand.
|
14
web/changelogs/4.3.2.md
Normal file
14
web/changelogs/4.3.2.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
---
|
||||
title: "twitter improvements & changelog overhaul"
|
||||
date: "Nov 15, 2022"
|
||||
---
|
||||
- you can download explicit content from twitter.
|
||||
- direct video links from twitter are properly supported (video/1, video/2, etc.).
|
||||
- changelog history got support for banners.
|
||||
- changelog categories are not messy anymore.
|
||||
- cobalt version in changelogs is now highlighted.
|
||||
- changelog history got separators to make text easier to read.
|
||||
- changelog history can be collapsed after loading.
|
||||
- download button takes less time to change back to pressable state.
|
||||
|
||||
if you're a developer and would like to play around with cobalt's api, then read more about it in older changelogs below!
|
28
web/changelogs/4.3.md
Normal file
28
web/changelogs/4.3.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
title: "developers, developers, developers, developers"
|
||||
date: "Nov 12, 2022"
|
||||
banner:
|
||||
file: "developers.webp"
|
||||
alt: "steve ballmer going \"developers, developers, developers\""
|
||||
---
|
||||
this update features a TON of improvements.
|
||||
|
||||
[developers](https://www.youtube.com/watch?v=SaVTHG-Ev4k), you now can rely on cobalt for getting content from social media. the api has been revamped and [documentation](https://github.com/imputnet/cobalt/tree/current/docs/api.md) is now available. you can read more about API changes down below. go crazy, and have fun :D
|
||||
|
||||
if you're not a developer, here's a list of changes that you probably care about:
|
||||
- rate limit is now approximately 8 times bigger. no more waiting, even if you want to download entirety of your tiktok "for you" page.
|
||||
- some updates will now have expressive banners, just like this one.
|
||||
- fixed what was causing an error when a youtube video had no description.
|
||||
- mp4 format button text should now be displayed properly, no matter if you touched the switcher or not.
|
||||
|
||||
next, the star of this update — improved api!
|
||||
- main endpoint now uses POST method instead of GET.
|
||||
- internal variables for preferences have been updated to be consistent and easier to understand.
|
||||
- ip address is now hashed right upon request, not somewhere deep inside the code.
|
||||
- global stream salt variable is no longer unnecessarily passed over a billion functions.
|
||||
- url and picker keys are now separate in the json response.
|
||||
- cobalt web app now correctly processes responses with "success" status.
|
||||
|
||||
if you currently have a siri shortcut or some other script that uses the GET method, make sure to update it soon. this method is deprecated, limited, and will be removed entirely in coming updates.
|
||||
|
||||
if you ever make something using cobalt's api, make sure to mention [@justusecobalt](https://twitter.com/justusecobalt) on twitter, i would absolutely love to see what you made.
|
13
web/changelogs/4.4.md
Normal file
13
web/changelogs/4.4.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "over 1 million monthly requests. thank you."
|
||||
date: "Nov 20, 2022"
|
||||
banner:
|
||||
file: "onemillionr.webp"
|
||||
alt: "cobalt logo and a confetti emoji"
|
||||
---
|
||||
this is a huge milestone for me, i cannot express enough how grateful i am for each and every one of you.
|
||||
thank you for using cobalt, and thank you for showing that people love the web that's friendly and bullshit-free. i'm hoping to never disappoint you in the future and keep up the good work.
|
||||
|
||||
thank you &lt;3
|
||||
|
||||
if you want to thank ME, check out the renovated donations tab, which now is also linked alongside bottom action buttons.
|
34
web/changelogs/4.5.md
Normal file
34
web/changelogs/4.5.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
title: "better, faster, stronger, stable"
|
||||
date: "Dec 6, 2022"
|
||||
banner:
|
||||
file: "meowthstrong.webp"
|
||||
alt: "meowth stretching"
|
||||
---
|
||||
your favorite social media downloader just got even better! this update includes a ton of improvements and fixes.
|
||||
|
||||
in fact, there are so many changes, i had to split them in sections.
|
||||
|
||||
service-related improvements:
|
||||
- vimeo module has been revamped, all sorts of videos should now be supported.
|
||||
- vimeo audio downloads! you now can download audios from more recent videos.
|
||||
- cobalt now supports all sorts of tumblr links. (even those scary ones from the mobile app)
|
||||
- vk clips support has been fixed. they rolled back the separation of videos and clips, so i had to do the same.
|
||||
- youtube videos with community warnings should now be possible to download.
|
||||
user interface improvements:
|
||||
- list of supported services is now MUCH easier to read.
|
||||
- banners in changelog history should no longer overlap each other.
|
||||
- bullet points! they have a bit of extra padding, so it makes them stand out of the rest of text.
|
||||
internal improvements:
|
||||
- cobalt will now match the link to regex when using ?u= query for autopasting it into input area.
|
||||
- better rate limiting: limiting now is done per minute, not per 20 minutes. this ensures less waiting and less attack area for request spammers.
|
||||
- moved to my own fork of ytdl-core, cause main project seems to have been abandoned. go check it out on [github](https://github.com/wukko/better-ytdl-core) or [npm](https://www.npmjs.com/package/better-ytdl-core)!
|
||||
- ALL user inputs are now properly sanitized on the server. that includes variables for POST api method, too.
|
||||
- "got" package has been (mostly) replaced by native fetch api. this should greatly reduce ram usage.
|
||||
- all unnecessary duplications of module imports have been gotten rid of. no more error passing strings from inside of service modules. you don't make mistakes only if you don't do anything, right?
|
||||
- other code optimizations. there's less clutter overall.
|
||||
huge update, right? seems like everything's fixed now?
|
||||
|
||||
nope, one issue still persists: sometimes youtube server drops packets for an audio file while cobalt's rendering the video for you. this results in abrupt cuts of audio. if you want to help solving this issue, [please feel free to do it on github!](https://github.com/imputnet/cobalt/issues/62)
|
||||
|
||||
thank you for reading this, and thank you for sticking with cobalt and me.
|
26
web/changelogs/4.6.md
Normal file
26
web/changelogs/4.6.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "mute videos and proper soundcloud support"
|
||||
date: "Dec 17, 2022"
|
||||
banner:
|
||||
file: "shutup.webp"
|
||||
alt: "a cat yawning, with a crossed out loudspeaker icon next to it"
|
||||
---
|
||||
i've been longing to implement both of these things, and here they finally are.
|
||||
|
||||
service-related improvements:
|
||||
- you now can download videos with no audio! simply enable the "mute audio" option in settings > audio.
|
||||
- soundcloud module has been updated, and downloads should no longer break after some time.
|
||||
visual improvements:
|
||||
- moved some things around in settings popup, and added separators where separation is needed.
|
||||
- updated some texts in english and russian.
|
||||
- version and commit hash have been joined together, now they're a single unit.
|
||||
internal improvements:
|
||||
- updated api documentation to include isAudioMuted.
|
||||
- simplified the startup message.
|
||||
- created render elements for separator and explanation due to high duplication of them in the page.
|
||||
- fully deprecated GET method for API requests.
|
||||
- fixed some code quirks.
|
||||
here's how soundcloud downloads got fixed:
|
||||
|
||||
previously, client_id was (stupidly) hardcoded. that means cobalt wasn't able to fetch song data if soundcloud web app got updated.
|
||||
now, cobalt tries to find the up-to-date client_id, caches it in memory, and checks if web app version has changed to update the id accordingly. you can see this change for yourself on github.
|
39
web/changelogs/4.7.md
Normal file
39
web/changelogs/4.7.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
title: "we're better together! thank you for bug reports."
|
||||
date: "Jan 13, 2023"
|
||||
banner:
|
||||
file: "bettertogether.webp"
|
||||
alt: "various different pokémon jumping in happiness"
|
||||
---
|
||||
this update includes a bunch of improvements, many of which were made thanks to the community :D
|
||||
|
||||
service-related improvements:
|
||||
- private soundcloud links are now supported (#68);
|
||||
- tiktok usernames with dots in them no longer confuse cobalt (#71);
|
||||
- .ogg files no longer wrongfully include a video channel (#67);
|
||||
- fixed an issue that caused cobalt to freak out when user attempted to download an audio from audio-only service with "mute video" option enabled.
|
||||
|
||||
ui improvements:
|
||||
- popup padding has been evened out. popups are now able to fit in more information on scroll, especially on mobile;
|
||||
- all buttons are now of even size and are displayed without any padding issues across all modern browsers and devices;
|
||||
- checkbox is no longer crippled on ios;
|
||||
- many explanation texts have been simplified to get rid of unnecessary bloat (no bullshit, remember?);
|
||||
- moved tiktok section in video settings higher due to higher priority;
|
||||
- fixed unexpectedly displayed scrollbars on switch rows in firefox.
|
||||
|
||||
stability improvements:
|
||||
- ffmpeg process now should end upon finishing the render;
|
||||
- ffmpeg should also quit when download is abruptly cut off;
|
||||
- fixed a memory leak that was caused by misconfigured stream information caching (#63).
|
||||
|
||||
internal improvements:
|
||||
- requested streams are now stored in cache for 2 minutes instead of 1000 hours (yes, 1000 hours, i fucked up);
|
||||
- cached data is now reused if user requests same content within 2 minutes;
|
||||
- page render module is now even cleaner than before;
|
||||
- proper support for bullet-points in loc strings.
|
||||
|
||||
you can suggest features or report bugs on [github](https://github.com/imputnet/cobalt) or [twitter](https://twitter.com/justusecobalt). both work just fine, use whichever you're more comfortable with.
|
||||
|
||||
thank you for using cobalt, and thank you for reading this changelog.
|
||||
|
||||
you're amazing, keep it up :)
|
31
web/changelogs/4.8.md
Normal file
31
web/changelogs/4.8.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
title: "prettier than ever"
|
||||
date: "Jan 29, 2023"
|
||||
banner:
|
||||
file: "catmakeup.webp"
|
||||
alt: "a cat being brushed with a powder makeup brush"
|
||||
---
|
||||
this version brings many visual improvements and a completely revamped "about" tab.
|
||||
|
||||
what's new in "about" tab:
|
||||
- all information is now split into collapsible sections, making it easier to navigate.
|
||||
- added privacy policy to further prove that none of your data is collected.
|
||||
- added emoji to the page title to make it look consistent with other pages.
|
||||
- added mastodon account handle and link.
|
||||
- there are now short notes at the end of each section.
|
||||
- other changes that are too small to describe. just go check it out!
|
||||
|
||||
visual improvements:
|
||||
- less wasted space: paddings and margins have been reduced and optimized for usability, consistency, and overall beauty.
|
||||
- all [links](https://youtu.be/dQw4w9WgXcQ) are now in italic. it's much easier to tell them apart from <span class="text-backdrop">regular highlights</span>.
|
||||
- error popup no longer looks broken and out of place.
|
||||
- download popup now has a proper close button, not something from 2.x era.
|
||||
- emoji are no longer selectable or draggable.
|
||||
- better scalability: desktop layout for home screen is shown if device viewport is wide enough to fit in three action buttons.
|
||||
- page shouldn't look broken on phones in landscape mode (i still highly recommend using cobalt in portrait mode).
|
||||
- removed bulletpoint padding. it was unnecessary.
|
||||
- updated some service names.
|
||||
|
||||
as always, you can suggest features or report bugs on any platform listed in the "support" section of about tab.
|
||||
|
||||
thank you for using cobalt. i hope you have a good day :)
|
42
web/changelogs/5.0.md
Normal file
42
web/changelogs/5.0.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
---
|
||||
title: "it's all about attention to detail!"
|
||||
date: "Feb 13, 2023"
|
||||
banner:
|
||||
file: "valentines.webp"
|
||||
alt: "relaxed meowth with sakura petals falling in front of them"
|
||||
---
|
||||
happy valentine's day! i have an update for you, as a gift :D
|
||||
|
||||
tl;dr: added support for <span class="text-backdrop">reddit gifs</span>, fixed douyin downloads, fixed vimeo quality picking, revamped entirety of codebase, and many other fixes.
|
||||
|
||||
here's more info:
|
||||
|
||||
this update is mostly about cleaning up and polishing the codebase, but it also has some new features. here's what's up:
|
||||
|
||||
service-related improvements:
|
||||
- you now can download gifs from reddit!
|
||||
- attempting to download a video from douyin no longer throws an error (bytedance changed the api endpoint, yet again).
|
||||
- fixed quality picking for vimeo downloads.
|
||||
- fixed length limit check in vimeo module.
|
||||
- fixed support for "user view" vk clips links.
|
||||
- various twitter errors are now displayed correctly instead of falling back to the default error.
|
||||
- state of all services is now tested on each commit.
|
||||
|
||||
ui improvements:
|
||||
- cobalt social links no longer disappear if you have an aggressive ad blocking extension installed.
|
||||
- various localization improvements for both english and russian.
|
||||
- changed some service aliases to display full list of supported downloads.
|
||||
- added current branch information to version text (in settings).
|
||||
- fixed typos in older changelogs.
|
||||
|
||||
internal improvements:
|
||||
- <span class="text-backdrop">everything</span> has been sanitized, improved, and refactored. code is now much easier to read and maintain.
|
||||
- rewrote and/or optimized all modules that were messy or inefficient.
|
||||
- all git interaction functions now store info in cache instead of fetching it every time the function is called.
|
||||
- added a test script that checks functionality of all supported services.
|
||||
- updated deepsource config. checks are more accurate now.
|
||||
- requests from internet explorer are now dropped entirely instead of redirecting people stuck in 90s to a proper browser download page. this was done to avoid (my) personal bias towards browsers.
|
||||
|
||||
i put a ton of effort into this version, and i hope you like it as much as i do.
|
||||
|
||||
thank you for using cobalt. there's so much more to come :)
|
46
web/changelogs/5.1.md
Normal file
46
web/changelogs/5.1.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
---
|
||||
title: "the evil has been defeated"
|
||||
date: "Feb 26, 2023"
|
||||
banner:
|
||||
file: "happymeowth.webp"
|
||||
alt: "meowth jumping up into the sky very excitedly"
|
||||
---
|
||||
hey, ever wanted to download a youtube video without a hassle? cobalt is here to help. this update fixes all issues related to youtube downloads.
|
||||
not only that, but it also introduces features never before seen in a downloader, such as youtube dub downloads! read below to see what's up :)
|
||||
|
||||
<span class="text-backdrop">tl;dr:</span>
|
||||
- audio in youtube videos FINALLY no longer gets cut off.
|
||||
- you now can pick any video resolution you want (from 360p to 8k) and any possible youtube video codec (h264/av1/vp9).
|
||||
- you now can download youtube videos with dubs in your native language. just check settings > audio.
|
||||
- youtube processing has been vastly sped up.
|
||||
|
||||
ok, now onto the nerdy part of changelog. this update is pretty huge and includes improvements across the board.
|
||||
|
||||
service improvements:
|
||||
- all youtube functionality has been reworked. cobalt now relies on innertube apis, not web scraping.
|
||||
- random audio cut off issue has been fixed, let me know if it ever occurs again. (closes #62, #66, #75, #88).
|
||||
- added support for youtube dubs. currently it's using your browser's default language when enabled, but i have plans on making a picker. i'll ask people on twitter and mastodon if this feature is needed, and add a picker in next updates.
|
||||
- instead of adding more quality presets, i added granular quality options. pick whatever you like, from 360p up to 4320p (for all services, not just youtube).
|
||||
- replaced a format picker with codec picker for youtube. you can pick h264, av1, or vp9. all of them should work as expected (closes #88).
|
||||
- youtube audio files are now properly matched to corresponding video files.
|
||||
- it's now always possible to download pristine h264 720p/360p videos from youtube. these videos will work ANYWHERE, so they're default for mobile.
|
||||
- youtube requests are no longer permanently cached, ram usage should drop even further.
|
||||
- youtube video and audio file names now include codec and dub language when applicable.
|
||||
- max video and audio duration limits have been bumped up to 3 hours.
|
||||
- general performance of entire youtube download process has been greatly improved.
|
||||
- vk module has been reworked to be more compact and not make use of outdated technique of quality picking. should also be way more reliable.
|
||||
|
||||
internal improvements:
|
||||
- cleaned up services config, all constants have been moved directly to modules for quicker access.
|
||||
- matching module has been slightly cleaned up.
|
||||
|
||||
interface improvements:
|
||||
- many descriptions and error messages have been slightly tuned to be less wordy.
|
||||
- unnecessary title duplications in settings have been merged into one.
|
||||
- added more clarity to quality and codec descriptions.
|
||||
|
||||
if you use cobalt api, please note that you have to update your creation to support new features.
|
||||
|
||||
this is the second batch of 5.x improvements, there's way more to come. thank you for being here, i really appreciate your support.
|
||||
|
||||
if you want to thank me (the developer), there's a nice tab under this changelog that has "donations" text on it. anything helps me continue developing and hosting the friendliest media downloader :D
|
53
web/changelogs/5.2.md
Normal file
53
web/changelogs/5.2.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
---
|
||||
title: "fastest one in the game"
|
||||
date: "Mar 24, 2023"
|
||||
banner:
|
||||
file: "catspeed.webp"
|
||||
alt: "a cat running very fast in an exercise wheel"
|
||||
---
|
||||
hey, notice anything different? well, at very least the page loaded way faster! this update includes many improvements and fixes, but also some new features.
|
||||
|
||||
<span class="text-backdrop">tl;dr:</span>
|
||||
- twitter retweet links are now supported.
|
||||
- all vimeo videos should now be possible to download.
|
||||
- you now can download audio from vimeo.
|
||||
- it's now possible to pick between preferred vimeo download method in settings.
|
||||
- fixed issues related to tiktok, twitter, twitter spaces, and vimeo downloads.
|
||||
- overall cobalt performance should be MUCH better.
|
||||
|
||||
service improvements:
|
||||
- added support for twitter retweet links. now all kinds of tweet links are supported.
|
||||
- fixed the issue related to periods in tiktok usernames (#96).
|
||||
- fixed twitter spaces downloads.
|
||||
- added support for audio downloads from vimeo.
|
||||
- added ability to choose between "progressive" and "dash" vimeo downloads. go to settings > video to pick your preference.
|
||||
- fixed the issue related to vimeo quality picking.
|
||||
- fixed the issue when vimeo module wouldn't show appropriate errors and instead would fallback to default ones.
|
||||
- improved audio only downloads for some edge cases.
|
||||
- (hopefully) better youtube reliability.
|
||||
- temporarily disabled douyin support due to api endpoint cut off.
|
||||
|
||||
interface improvements:
|
||||
- merged clipboard and mode switcher rows into one for mobile view.
|
||||
- added left-handed layout toggle for those who prefer to have the clipboard button on left.
|
||||
- new custom-made clipboard icon. now it clearly indicates what it does.
|
||||
- improved english and russian localization. both are way more direct and less bloaty.
|
||||
- frontend page is now rendered once and is cached on disk instead of being rendered every time someone requests a page. this greatly improves page loading speeds and further reduces strain put on the server.
|
||||
- frontend page is now minimized just like js and css files. this should minimize traffic wasted on loading the page, along with minor loading speed improvement.
|
||||
- added proper checkbox icon for better clarity.
|
||||
- checkboxes are now stretched edge-to-edge on phone to be easier to manage for right-handed people.
|
||||
- removed button hover highlights on phones.
|
||||
- fixed button press animations for safari on ios.
|
||||
- fixed text selection on ios. previously you could select text or images anywhere, but now they're selectable in limited places, just like on other platforms.
|
||||
- frontend platform is now marked in settings: p is for pc; m is for mobile; i is for ios. this is done for possible future debugging and issue-solving.
|
||||
- better error messaging.
|
||||
|
||||
internal improvements:
|
||||
- better rate limiting, there should be way less cases of accidental limits.
|
||||
- added support for m3u8 playlists. this will be useful for future additions, and is currently used by vimeo module.
|
||||
- added support for "chop" stream format for vimeo downloads.
|
||||
- fixed vk user id extraction. i assumed the - in url was a separator, but it's actually a part of id.
|
||||
- completely reworked the vimeo module. it's much cleaner and better performant now.
|
||||
- minor clean ups across the board.
|
||||
|
||||
not really related to this update, but thank you for 50k monthly users! i really appreciate that you're still here, because that means i'm doing some things right :D
|
21
web/changelogs/5.3.md
Normal file
21
web/changelogs/5.3.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
---
|
||||
title: "better looks, better feel"
|
||||
date: "Apr 3, 2023"
|
||||
banner:
|
||||
file: "cattired.webp"
|
||||
alt: "a cat laying on a sofa face down, wiggling its tail"
|
||||
---
|
||||
this update isn't as big as previous ones, but it still greatly enhances the cobalt experience.
|
||||
|
||||
here's what's up:
|
||||
- new mode switcher! elegant and 100% clear. should no longer cause any confusion. let me know if you like it better this way :D
|
||||
- wide paste button on mobile is back, but now it's even closer to your finger.
|
||||
- removed the weird grey chin on changelog banners.
|
||||
- removed left-handed layout toggle since it is no longer needed.
|
||||
- fixed input area display in chromium 112+.
|
||||
- centered the main action box.
|
||||
- cleaned up css of main action box to get rid of tricks and ensure correct display on all devices.
|
||||
- fixed a bug that'd cause notifications dots to disappear when an unrelated checkbox was checked.
|
||||
|
||||
hopefully from now on i'll focus on adding support for more services.
|
||||
thank you for using cobalt. stay cool :)
|
35
web/changelogs/5.4.md
Normal file
35
web/changelogs/5.4.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
title: "instagram support, docker, and more!"
|
||||
date: "Apr 24, 2023"
|
||||
banner:
|
||||
file: "catphonestand.webp"
|
||||
alt: "a cat holding a phone under its chin while a person plays clash of clans on it"
|
||||
---
|
||||
something many of you've been waiting for is finally here! try it out and let me know what you think :)
|
||||
|
||||
<span class='text-backdrop'>tl;dr:</span>
|
||||
- added experimental instagram support! download any reels or videos you like, and make sure to report any issues you encounter. yes, you can convert either to audio.
|
||||
- fixed support for on.soundcloud links.
|
||||
- added share button to "how to save?" popup.
|
||||
- added docker support.
|
||||
|
||||
service improvements:
|
||||
- added experimental support for videos from instagram. currently only reels and post videos are downloadable, but i'm looking into ways to save high resolution photos too. if you experience any issues, please report them on either of support platforms.
|
||||
- fixed support for on.soundcloud share links. should work just as well as other versions!
|
||||
- fixed an issue that made some youtube videos impossible to download.
|
||||
|
||||
interface improvements:
|
||||
- new css-only checkmark! yes, i can't stop tinkering with it because slight flashing on svg load annoyed me. now it loads instantly (and also looks slightly better).
|
||||
- fixed copy animation.
|
||||
- minor localization improvements.
|
||||
- fixed the embed logo that i broke somewhere in between 5.3 and 5.4.
|
||||
|
||||
internal improvements:
|
||||
- now using nanoid for live render stream ids.
|
||||
- added support for docker. it's kind of clumsy because of how i get .git folder inside the container, but if you know how to do it better, feel free to make a pr.
|
||||
- cobalt now checks only for existence of environment variables, not exactly the .env file.
|
||||
- changed the way user ip address is retrieved for instances using cloudflare.
|
||||
- added ability to disable cors, both to setup script and environment variables.
|
||||
|
||||
i can't believe how diverse and widespread cobalt has become. it's used in all fields: music production, education, content creation, and even game development. <span class='text-backdrop'>thank you</span>. this is absolutely nuts.
|
||||
if you don't mind sharing, please tell me about your use case. i'd really love to hear how you use cobalt and how i could make it even more useful for you.
|
68
web/changelogs/6.0.md
Normal file
68
web/changelogs/6.0.md
Normal file
|
@ -0,0 +1,68 @@
|
|||
---
|
||||
title: "better reliability, new infrastructure, pinterest support, and way more!"
|
||||
date: "June 7, 2023"
|
||||
banner:
|
||||
file: "catswitchboxes.webp"
|
||||
alt: "a cat climbing into two empty boxes of asahi beer"
|
||||
---
|
||||
hey! long time no see, hopefully over 40 changes will make up for it :)
|
||||
|
||||
cobalt now has an official community discord server. you can go there for news, support, or just to chat. [go check it out!](https://discord.gg/pQPt8HBUPu)
|
||||
|
||||
<span class='text-backdrop'>tl;dr</span>
|
||||
- new infra, new hosting structure, new main instance api url. developers, [get it here](https://github.com/imputnet/cobalt/blob/current/docs/api.md).
|
||||
- added support for pinterest, vine archive, tumblr audio, youtube vr videos.
|
||||
- better web app performance and look.
|
||||
- better stability thanks to load balancing.
|
||||
- (hopefully) no more random video/audio download drops.
|
||||
|
||||
service improvements:
|
||||
- added support for pinterest videos and stories (pr by [@Snazzah](https://github.com/imputnet/cobalt/commit/40291c4d24cb5f441cdddfd26104f149bc4ee27c)).
|
||||
- added support for tumblr audio. sorry, tumblr.
|
||||
- added support for youtube vr videos. please note that they're in youtube's proprietary ratio.
|
||||
- added support for vine archive.
|
||||
- added support for ancient vk videos in 240p.
|
||||
- fixed an issue related to muted video downloads from tumblr.
|
||||
- moved to twitter v2 api.
|
||||
- soundcloud share links are now processed without errors.
|
||||
|
||||
ui improvements:
|
||||
- lazy image loading. should significantly speed up the page load.
|
||||
- fixed checkbox width on mobile devices.
|
||||
- addition of a temporary urgent notice.
|
||||
- added hover border to all buttons.
|
||||
- less annoying donation button highlight.
|
||||
- more consistent color scheme.
|
||||
- added link to a discord server into about popup.
|
||||
- remember celebratory emoji changes? they've been fixed, and are now dynamically loaded!
|
||||
- changelog history now lets you try to load it again if first attempt failed for whatever reason.
|
||||
- padding (everywhere) has been slightly reduced to fit in more content and be consistent across ui.
|
||||
- added more info to the "how to save" popup for ios devices.
|
||||
- crypto wallet press-to-copy buttons now look like buttons.
|
||||
- improved ui layout for smallest screens (iphone 5, 5s, se, etc).
|
||||
- removed partial translations for sake of clarity and consistency.
|
||||
|
||||
internal improvements:
|
||||
- separated web and api servers. they're now completely independent and therefore more stress-resistant.
|
||||
- added a dedicated script for building the web app if you don't want to reload the frontend server.
|
||||
- web app building improvements.
|
||||
- async localization preloading.
|
||||
- consistent server start time reporting.
|
||||
- dynamic stream and ip hashing salt generation.
|
||||
|
||||
infrastructure improvements:
|
||||
- load balancing: your api requests are now sent to the least busy server. yes, there are now several of them with more to come in the future.
|
||||
- when possible, server in closest region is used instead of a far-away one. this should help with download speeds.
|
||||
- currently there are multiple servers in europe. i will let you know when (and if) i manage to get an american one.
|
||||
|
||||
updates for developers and instance hosters:
|
||||
- server info api endpoint: you can now check up on the api server of choice. it reports all the basic info you may need. [check the api docs](https://github.com/imputnet/cobalt/blob/current/docs/api.md#get-apiserverinfo) for more info.
|
||||
- api names: each and every api instance should have a distinctive name. this will be useful in the future :)
|
||||
- added docker compose sample config.
|
||||
- updated and more granular setup script.
|
||||
- better api scalability and faster server start up thanks to web and api separation.
|
||||
- added ability to specify ffmpeg threads. simply add ffmpegThreads to your environment variables!
|
||||
|
||||
i'm still in awe from how popular cobalt has become. there are now over 200k of unique users monthly, and that number only keeps growing. i even had to come up with something to accommodate for larger traffic, it's absolutely insane.
|
||||
|
||||
love you all, have a great day :D
|
23
web/changelogs/6.2.md
Normal file
23
web/changelogs/6.2.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "all network issues have been fixed!"
|
||||
date: "June 27 2023"
|
||||
banner:
|
||||
file: "meowthhammer.webp"
|
||||
alt: "meowth plush holding a hammer in real life"
|
||||
---
|
||||
hey! there have been some hiccups in cobalt's stability lately, i was going through finals while trying to scale up the infrastructure, and that didn't really work out, lol.
|
||||
BUT i'm happy to announce that i've optimized all nodes! <span class="text-backdrop">there should no longer be any networking issues</span>.
|
||||
|
||||
enjoy stable experience while i work in background to make cobalt even better :)
|
||||
|
||||
here's what's new in this update:
|
||||
- better button contrast in both themes.
|
||||
- button highlight in light theme now actually looks like a highlight.
|
||||
- removed ip gate for streamables and updated privacy policy to reflect this change.
|
||||
- streamable links now last for 20 seconds instead of 2 minutes.
|
||||
- cleaned up stream verification algorithm. now the same function doesn't run 4 times in a row.
|
||||
- removed deprecated way of hosting a cobalt instance.
|
||||
|
||||
thank you for sticking with cobalt, and i hope you have a great day :D
|
||||
|
||||
banner photo is by [@halftroller](https://twitter.com/halftroller) on twitter, thank you so much!
|
83
web/changelogs/7.0.md
Normal file
83
web/changelogs/7.0.md
Normal file
|
@ -0,0 +1,83 @@
|
|||
---
|
||||
title: "biggest ui refresh yet!"
|
||||
date: "August 15, 2023"
|
||||
banner:
|
||||
file: "meowthcooking.webp"
|
||||
alt: "meowth handling orders in a restaurant"
|
||||
---
|
||||
hey! this update is huge and mostly aimed to refresh the ui, but there are also some other nice fixes/additions. read below for more info :)
|
||||
|
||||
<span class="text-backdrop">tl;dr:</span>
|
||||
- entirety of web app has been refreshed. it's more prettier and optimized than ever, both on phone and desktop.
|
||||
- if you're on ios, try adding cobalt to home screen! it'll look and act like a native app.
|
||||
- all soundcloud links are now supported and audio quality is higher than before.
|
||||
- all x (previously twitter) links are now supported and work properly.
|
||||
- newer reddit videos are downloadable now.
|
||||
- added some sort of eula, list of keyboard shortcuts, updated privacy policy for more clarity. check it all in refreshed about tab!
|
||||
- cobalt now lets you know if your browser doesn't support clipboard pasting and helps you fix it.
|
||||
|
||||
<span class="text-backdrop">accessibility notice:</span>
|
||||
this update includes animations and transparency, if you'd like to disable any or all of them, head to settings > other > accessibility.
|
||||
|
||||
<span class="text-backdrop">[full changelog]</span>
|
||||
|
||||
service improvements:
|
||||
- fixed unexpected 502 errors when downloading newer reddit videos.
|
||||
- newer reddit videos (with audio) are downloadable now.
|
||||
- upgraded soundcloud downloads to use higher audio quality than before.
|
||||
- all soundcloud links are now supported.
|
||||
- added support for x.com urls.
|
||||
- changed twitter api once again. now everything works, again.
|
||||
|
||||
web improvements:
|
||||
- all-new matte glass aesthetic, applied to revamped popup headers, tab selectors, and also small popups.
|
||||
- rounded corners everywhere! cobalt is now safe for everyone who can't handle sharp objects.
|
||||
- paddings everywhere are smaller, more content fits on the screen at once.
|
||||
- optimized installed web app to look and act like a native app, especially on ios.
|
||||
- added update release dates to changelogs.
|
||||
- cobalt now lets you know if your browser doesn't support clipboard api and helps you fix it.
|
||||
- refreshed all popups: less padding, more content.
|
||||
- completely remade error and download popups, they're consistent with the rest of refreshed design.
|
||||
- refreshed the look of entire changelog tab: separated title and version/commit, made title bigger, evened out all paddings.
|
||||
- replaced close button with back button, moved it to left.
|
||||
- added interaction animations.
|
||||
- added more keyboard shorcuts.
|
||||
- added a list of keyboard shortcuts to about tab.
|
||||
- added eula to about tab. check it out.
|
||||
- added more accessibility options, put them all into one category. you can disable animations and transparency if you want to.
|
||||
- added a link to self-troubleshooting guide to about tab.
|
||||
- renamed 2160p and 4320p to 4k and 8k respectfully for better clarity.
|
||||
- popups now work without any weird workarounds, especially on mobile. they're clean and nice.
|
||||
- home screen now also works without any weird workarounds. it is also clean and nice.
|
||||
- optimized css of almost all ui elements. should be even more consistent across platforms now.
|
||||
- added ability to translate "cobalt" more in-depth localization. for example, in russian "cobalt" is now "кобальт", that's the style i'll be going with from now on.
|
||||
- updated many localization strings for more clarity.
|
||||
- removed ability to change the app name dynamically in all locations. cobalt is a sustained app name.
|
||||
- updated donation and privacy policy texts for more clarity in both english and russian.
|
||||
- home screen now smoothly fades in instead of popping in.
|
||||
- proper banner loading. no more jumping text!
|
||||
- proper banner error handling. if banner wasn't loaded, it'll simply go grey instead of disappearing.
|
||||
- links are no longer italic and are instead underlined.
|
||||
- collapsible lists now have corresponding emoji.
|
||||
- donate button is now highlighted with magenta instead of white.
|
||||
- proper dropdown arrow.
|
||||
- removed 6.0 api fallback.
|
||||
- fixed celebrations emoji. again.
|
||||
- cleaned up all related frontend modules, especially page.js.
|
||||
- urgent notice is now a js element, not a static piece of text. can be updated easily.
|
||||
|
||||
api improvements:
|
||||
- now catching all json api related errors.
|
||||
- moved on demand blocks to web server, now changelog can be updated independently from preferred api server.
|
||||
- now sending standard rate limiting headers.
|
||||
- better readability in source.
|
||||
|
||||
other improvements:
|
||||
- renamed docker-compose.yml.example to docker-compose.example.yml for linting in code editors.
|
||||
- added a wiki with wip troubleshooting guide on github. more guides are coming soon!
|
||||
|
||||
that's a ton of changes! i really hope you like this update as much as i do.
|
||||
|
||||
if you experience any issues, feel free to contact me on any platform listed in about tab! i'd love to hear back from you.
|
||||
|
||||
thank you for sticking with me and cobalt, i hope you have THE best day :D
|
28
web/changelogs/7.1.md
Normal file
28
web/changelogs/7.1.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
title: "instagram, streamable, video metadata, and more!"
|
||||
date: "August 20, 2023"
|
||||
banner:
|
||||
file: "meowthproductions.webp"
|
||||
alt: "meowth roaring in a fancy circle, à la MGM studios intro"
|
||||
---
|
||||
service improvements:
|
||||
- extended instagram support: high quality photos, videos, reels. everything should work without any issues, enjoy! :)
|
||||
- added support for streamable.com (thanks to [#179](https://github.com/imputnet/cobalt/pull/179))
|
||||
- added video metadata to youtube videos.
|
||||
- fixed vk video downloads.
|
||||
- vxtwitter links are now supported.
|
||||
- fixed support for youtube audio dubs.
|
||||
|
||||
ui improvements:
|
||||
- fixed picker popup: it's now scrollable in all cases and clickable areas don't overlap each other.
|
||||
|
||||
backend improvements:
|
||||
- cobalt will now let you know if something goes wrong during video download instead of nuking the stream.
|
||||
- added support for cookies (thanks to [#177](https://github.com/imputnet/cobalt/pull/177))
|
||||
- replaced got with undici (thanks to [#182](https://github.com/imputnet/cobalt/pull/182)). downloads should be slightly faster and clean of garbage in headers.
|
||||
|
||||
internal improvements:
|
||||
- moved host overrides into its own module.
|
||||
- minor clean ups.
|
||||
|
||||
even more cool stuff is coming in future updates! thank you for using cobalt :D
|
45
web/changelogs/7.11.md
Normal file
45
web/changelogs/7.11.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
---
|
||||
title: "cache encryption, meowbalt, dailymotion, bilibili, and much more!"
|
||||
date: "March 6, 2024"
|
||||
banner:
|
||||
file: "meowth7eleven.webp"
|
||||
alt: "meowth plush in front of 7-eleven store"
|
||||
---
|
||||
cobalt may not have as many groceries as 7-eleven, but it sure does have lots of big changes in this update!
|
||||
|
||||
- all cached stream info is now encrypted and can only be decrypted with a link you get from cobalt.
|
||||
- new popup style featuring meowbalt, cobalt's speedy mascot. you will see him more often from now on!
|
||||
- added support for dailymotion (including short links).
|
||||
- added support for bilibili.tv, fixed support for bilibili.com, and added support for all related short links.
|
||||
- added support for unlisted vimeo links.
|
||||
- added support for tumblr audio and revamped the entire module.
|
||||
- added support for embed ok.ru links.
|
||||
|
||||
we also updated the privacy policy to reflect the addition of data encryption, go check it out.
|
||||
|
||||
for people with iphones:
|
||||
- clearer ios saving tutorial.
|
||||
- added "save to files" ios shortcut.
|
||||
- updated save to photos shortcut.
|
||||
|
||||
make sure to save both shortcuts and read the updated tutorial!
|
||||
|
||||
for people who host a cobalt instance:
|
||||
- updated all environment variables TO_BE_LIKE_THIS. time to update your configs! for now cobalt is backwards compatible with old variable names, but it won't last forever.
|
||||
- added a list of all environment variables and their descriptions to [run-an-instance doc](https://github.com/imputnet/cobalt/blob/current/docs/run-an-instance.md#list-of-all-environment-variables).
|
||||
- updated [cookie file example](https://github.com/imputnet/cobalt/blob/current/docs/examples/cookies.example.json) with more services and improved examples.
|
||||
- updated [docker compose example](https://github.com/imputnet/cobalt/blob/current/docs/examples/docker-compose.example.yml) with better explanations and up-to-date env variable samples.
|
||||
- updated some packages to get rid of all unnecessary messages in console.
|
||||
|
||||
want to host an instance? [learn how to do it here](https://github.com/imputnet/cobalt/blob/current/docs/run-an-instance.md).
|
||||
|
||||
frontend changes:
|
||||
- removed migration popup.
|
||||
- corners across ui are even more round now.
|
||||
- bottom glass bkg in popups is no longer rounded on top right.
|
||||
- small popup no longer stretches like gum, it's fixed in size on desktop.
|
||||
- small popup animation no longer lags on mobile.
|
||||
- better ui scaling across resolutions.
|
||||
- updated donation text.
|
||||
|
||||
thank you for using cobalt, all 750k of you. hope you like this update as much as we enjoyed making it :D
|
59
web/changelogs/7.13.md
Normal file
59
web/changelogs/7.13.md
Normal file
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
title: "better ux, improvements for youtube, twitter, tiktok, instagram, and more!"
|
||||
date: "May 5, 2024"
|
||||
banner:
|
||||
file: "meowthbusinessman.webp"
|
||||
alt: "photo of a businessman holding hands together (merkel-raute pose) with meowth plush head."
|
||||
---
|
||||
long time no see! well, actually, you've been using the latest version for some time now. we've moved to a rolling release scheme, allowing for speedy update rollouts :)
|
||||
|
||||
since 7.11, there has been a ton of changes. here are the most notable of them:
|
||||
- youtube downloads are now faster and more reliable than ever.
|
||||
- all posts from twitter are now downloadable, including sensitive ones.
|
||||
- you now can download tiktok videos in 1080p h265! just enable h265 support in settings > video.
|
||||
- added support for sharing links directly to the cobalt web app on android.
|
||||
- added 240p and 144p quality options to the quality picker in settings (for some reason, many of you wanted this).
|
||||
- pasting a link with additional text around it will now work; cobalt will extract the link for you (works only via the paste button).
|
||||
- added anonymous traffic analytics by plausible. we're using a selfhosted instance and don't collect any identifiable information about you. you can learn more in about > privacy policy. you can also opt out of anonymous analytics in settings > other.
|
||||
|
||||
service support improvements:
|
||||
- implemented internal streams functionality, allowing for more fine-grained file streaming and therefore proper youtube support.
|
||||
- added fallback to m4a if opus isn't available for youtube.
|
||||
- added a total of 7 ways to get instagram post info, including mobile api, embed, and graphql api. absolute torture.
|
||||
- added support for reddit user posts.
|
||||
- updated the way tiktok downloads are handled for better reliability and 1080p support.
|
||||
- added tiktok author's username to filename.
|
||||
- added support for rutube shorts and yappy videos.
|
||||
- added support for m.soundcloud.com links.
|
||||
- added support for new post and reel links from instagram.
|
||||
- added support for photo twitter links, only used for gifs.
|
||||
- added support for m.bilibili.com links.
|
||||
- added support for new type of vimeo links.
|
||||
- added support for ddinstagram.com links.
|
||||
- updated youtube codec info in settings to display the fact that av1 is a better choice now.
|
||||
- updated best audio picking for tiktok and soundcloud.
|
||||
- changed the youtube client to web, since android client no longer works.
|
||||
- removed the vimeo download type switcher, as it should've always been automatic instead.
|
||||
- removed an ability to enable the tiktok watermark, as it no longer includes the author's username.
|
||||
|
||||
ui & ux improvements:
|
||||
- youtube audio dub switcher is now a toggle with a much easier to understand description.
|
||||
- meowbalt now sticks out on the left side of download popup on desktop.
|
||||
- updated "made with love" text to include the research & dev team behind cobalt, imput.
|
||||
- fixed grammar of russian localization.
|
||||
- rounded corners are now correctly rendered across all browsers.
|
||||
- various minor improvements, including smaller button padding.
|
||||
- removed the notification (red dot) functionality as the most recent changelog is already always on screen.
|
||||
- removed settings migration from the old domain.
|
||||
|
||||
other changes:
|
||||
- various docs updates in github repo, making sure they're functional across branches and forks.
|
||||
- major codebase cleanup.
|
||||
|
||||
thank you for using cobalt, and thank you for being one of our 900k friends! i hope you like this update as much as we liked making it.
|
||||
|
||||
we're committed to keeping cobalt the best way to save what you love without ads or invasion of your privacy. there's a ton of cool stuff to come soon; stay tuned and have an amazing rest of your day &lt;3
|
||||
|
||||
if you want to help our goal of a better internet for everyone, just share cobalt with a friend!
|
||||
|
||||
(original photo of a man in a suit by benzoix on freepik)
|
43
web/changelogs/7.14.md
Normal file
43
web/changelogs/7.14.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
title: "now helping over 1 million people monthly"
|
||||
date: "May 17, 2024"
|
||||
banner:
|
||||
file: "millionusers.webp"
|
||||
alt: "collage of two photos, side by side. left photo: brown cake with 7 lit candles forming 1000000 and one ferrero rocher candy in the middle with cobalt (double greater than symbol) logo on it. right photo: chocolate cake with 7 lit candles forming 1000000 and cobalt logo formed with whipped cream on the cake. two plushes of meowth and pompompurin in party hats are seen behind the cake."
|
||||
---
|
||||
yesterday, cobalt hit 1 million users around the world! it's an absolutely insane milestone for us and we're incredibly grateful to everyone saving and creating what they love with help of cobalt. thank you for being our friends.
|
||||
|
||||
in anticipation of 7 figure user count, we've revamped the cobalt codebase and infrastructure to be faster and more reliable than ever. a combination of many changes has resulted into incredible download speeds (up to 30 MB/s, as tested by both developers in europe).
|
||||
|
||||
note: there's no backend instance in asia just yet, so if you're there, you might experience average speeds *for now*. you can help us afford a dedicated server in asia by donating to cobalt in the "donate" menu.
|
||||
|
||||
<span class="text-backdrop">changes since the last major update</span>
|
||||
|
||||
service improvements:
|
||||
- youtube music support on the main instance is back!
|
||||
- added support for pinterest images and gifs.
|
||||
- cobalt will now use original soundcloud mp3 file when available.
|
||||
- fixed a youtube bug that prevented some videos from downloading.
|
||||
|
||||
ui/ux improvements:
|
||||
- cobalt web app is now fully optimized for ipad. you can add it to home screen from share menu to make it act like a native app!
|
||||
- majorly reduced vertical padding when viewing cobalt in mobile web browser, allowing for more content at once. most noticeable on smaller screens.
|
||||
- status bar color is now dynamic in the web browser on ios and web app on android.
|
||||
- web app on android feels way more native than before.
|
||||
- filename style icons are no longer blurry in safari.
|
||||
- changelog notification no longer overlaps with dynamic island on newer iphones when cobalt is installed as a web app.
|
||||
- fixed safe area padding.
|
||||
|
||||
other changes:
|
||||
- added support for [freebind](https://github.com/imputnet/freebind.js), made by one of the cobalt developers.
|
||||
- rate limit and max video length limits are now customizable through [environment variables](https://github.com/imputnet/cobalt/blob/current/docs/run-an-instance.md#variables-for-api).
|
||||
- cobalt api now returns rate limit headers at all times.
|
||||
- majorly cleaned up the codebase: removed unnecessary functions, rewrote those that were cryptic and confusing. it's way more comprehensible and contribution-friendly than ever before.
|
||||
- moved the [cobalt repo](https://github.com/imputnet/cobalt) to our organization on github. everything stayed the same and all old links link back to it.
|
||||
|
||||
note for instance hosters:
|
||||
along with cobalt repo, the docker image also moved! please update the url for it in your config along with watchtower args to include restarting containers (just in case) as seen in [updated docker compose example](https://github.com/imputnet/cobalt/blob/current/docs/examples/docker-compose.example.yml). we're mirroring packages to old url for now, but it won't last forever.
|
||||
|
||||
that's it for now! hope you have an amazing day and share the 1 million celebration with us :)
|
||||
|
||||
join our [discord server](https://discord.gg/pQPt8HBUPu) to discuss everything cobalt there
|
30
web/changelogs/7.3.md
Normal file
30
web/changelogs/7.3.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
title: "extended video length limit, metadata toggle, ui improvements, and more!"
|
||||
date: "September 6, 2023"
|
||||
banner:
|
||||
file: "meowthsnap.webp"
|
||||
alt: "cartoon meowth pointing paw dramatically and saying something"
|
||||
---
|
||||
this update gives cobalt a sharp look in chromium browsers and makes it even more useful than before. check out the full changelog below!
|
||||
|
||||
service improvements:
|
||||
- increased video length limit from 3 hours to 5 hours. feel free to download lectures you need :)
|
||||
- you can now disable file metadata in settings.
|
||||
- fixed a bug which previously caused some downloads to end up being 0 bytes.
|
||||
|
||||
ui improvements:
|
||||
- fixed clickable area for urgent notice (text on top).
|
||||
- fixed blurry header in chrome.
|
||||
- fixed blurry tab bar in chrome.
|
||||
- fixed blurry switches in chrome.
|
||||
- fixed weirdly rounded corners in popups.
|
||||
- fixed 1px gap on edges of various elements in popup in chrome.
|
||||
- fixed overscrolling in other settings tab on ios.
|
||||
- fixed unexpected button highlight effect on phones.
|
||||
- removed outdated fixes for tiny screens.
|
||||
|
||||
other improvements:
|
||||
- cobalt web & api start faster than before, additional preparation functions aren't unexpectedly run anymore.
|
||||
- cobalt is now available as a docker package. check it out on [github](https://github.com/imputnet/cobalt/pkgs/container/cobalt).
|
||||
|
||||
thank you for being here. i hope you have a great day :D
|
45
web/changelogs/7.4.md
Normal file
45
web/changelogs/7.4.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
---
|
||||
title: "new domain, what's coming in future, bug fixes, and more!"
|
||||
date: "September 9, 2023"
|
||||
banner:
|
||||
file: "newdomain.webp"
|
||||
alt: "text: new domain, same cobalt"
|
||||
---
|
||||
cobalt is finally moving to its own domain! many of you have been anticipating this, and many kept forgetting the link due to how cryptic it was.
|
||||
|
||||
well, worry no more - <span class="text-backdrop">cobalt.tools</span> is here.
|
||||
|
||||
if you haven't yet, open [co.wukko.me](https://co.wukko.me) to transfer your settings here! no additional action from you is required. just open the old link and cobalt will do everything for you :)
|
||||
|
||||
make sure to <span class="text-backdrop">update your bookmarks</span> and reinstall the web app!
|
||||
|
||||
here's what domain change means:
|
||||
- still no ads, same owner, same features, same reliability. just a way more rememberable link (it's literally two words).
|
||||
- cobalt.tools makes it clear that cobalt is a tool and that it's "cobalt", not "wukko".
|
||||
- i can host various versions of cobalt on subdomains without links looking awkward.
|
||||
- i can host cobalt-related websites without polluting my personal domain's dns (such as crowdin).
|
||||
- i stand by same privacy policies (and in fact am using the same exact server as before).
|
||||
|
||||
the domain change is required for the future of cobalt.
|
||||
|
||||
here's what's coming soon:
|
||||
- support for many top-requested sites, such as (but not limited to) twitch and niconico.
|
||||
- education version of cobalt, as often requested by students and educators.
|
||||
- major localization system upgrade, allowing for simpler community contributions.
|
||||
- region-specific versions with 100% translations and tweaks.
|
||||
- native clients for desktop and mobile (not sure about this one, i'm no superman).
|
||||
- ...and more!
|
||||
|
||||
now, here's what's new in 7.4:
|
||||
- tabs in popups now scroll to top on tab bar tap.
|
||||
- padding across web app was tuned.
|
||||
- (obviously) a migration agent. soon will be used for importing and exporting settings.
|
||||
- some minor clean ups in codebase.
|
||||
|
||||
if you want to help cobalt achieve goals listed above, consider donating! donations are the only way i can keep cobalt ad-less, powerful, (basically) limitless, and also 100% free.
|
||||
|
||||
in fact, donations have helped me grow cobalt more than i've ever anticipated. just imagine how much better it will be in a year.
|
||||
|
||||
go to donations down below to find ways to donate!
|
||||
|
||||
thank you for reading through all of this. i hope you enjoy this update and have a great day :D
|
28
web/changelogs/7.5.md
Normal file
28
web/changelogs/7.5.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
title: "support for twitch clips and rutube!"
|
||||
date: "September 16, 2023"
|
||||
banner:
|
||||
file: "twitchupdate.webp"
|
||||
alt: "meowth plush staring into the camera, laptop with generic purple service in the background"
|
||||
---
|
||||
hey! this update (finally) adds support for twitch clips and rutube, among other smaller changes.
|
||||
|
||||
service improvements:
|
||||
- added support for twitch clips. no vods, they're unnecessary. just clip whatever you want to download!
|
||||
- added support for rutube in case you ever wanted to download something russian.
|
||||
|
||||
interface improvements:
|
||||
- added a note about cobalt not being affiliated with any supported services.
|
||||
- added a note about meta (the company) in russian.
|
||||
- better russian localization. will keep improving it to make it sound not so robotic over time.
|
||||
|
||||
other improvements:
|
||||
- all official servers are now using the docker package. and so should you!
|
||||
- moved the load balancer to poland. requests should be slightly faster now.
|
||||
- minor codebase clean up.
|
||||
|
||||
if you're confused about the new domain, read the older changelog! just scroll lower and press "expand".
|
||||
|
||||
i hope you find this update useful and have a wonderful day :)
|
||||
|
||||
btw, cobalt has a pretty active community server on discord. go to about > support & source code to join!
|
33
web/changelogs/7.6.md
Normal file
33
web/changelogs/7.6.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
title: "customizable file names, instagram stories, and first cobalt sponsor!"
|
||||
date: "October 15, 2023"
|
||||
banner:
|
||||
file: "meowthcenter.webp"
|
||||
alt: "meowth plush in a datacenter wearing a hardhat, wielding a hammer"
|
||||
---
|
||||
as many have (very) often requested, cobalt now lets you pick between several file name format styles!
|
||||
go 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.
|
||||
|
||||
if you liked file names the way they were before, don't worry: classic style is still the default :)
|
||||
|
||||
on a different but not any less important note: cobalt is now sponsored by [royalehosting.net](https://royalehosting.net/)!
|
||||
overall 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.
|
||||
|
||||
this update also includes a bunch of other changes, check them out:
|
||||
|
||||
service improvements:
|
||||
- added support for instagram stories thanks to [#194](https://github.com/imputnet/cobalt/pull/194).
|
||||
- fixed reddit support thanks to [#221](https://github.com/imputnet/cobalt/pull/221).
|
||||
- added support for rich file names for youtube, vimeo, soundcloud, rutube, and vk.
|
||||
- numbers and emoji no longer disappear from file name and metadata.
|
||||
- mute and audio dub file name tags don't appear together anymore.
|
||||
- youtube: dub file name tag doesn't appear anymore if audio track is default.
|
||||
|
||||
interface improvements:
|
||||
- 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.
|
||||
- about button now opens about tab when no new changelog is available.
|
||||
- fixed download button thickness on ios.
|
||||
|
||||
you now can reach out to cobalt via email for support! it's located in the about tab along with other socials, such as discord.
|
||||
|
||||
i hope you enjoy this long-awaited update and have a blissful day :D
|
30
web/changelogs/7.7.md
Normal file
30
web/changelogs/7.7.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
title: "bugfixes and better downloads!"
|
||||
date: "December 2, 2023"
|
||||
banner:
|
||||
file: "meowthpolishegg.webp"
|
||||
alt: "meowth polishing a togepi egg"
|
||||
---
|
||||
this update fixes various issues with supported services. no new features yet, but twitter fix is surely something good to have in the meantime!
|
||||
|
||||
service improvements:
|
||||
- broken twitter videos are now automatically fixed by cobalt.
|
||||
- all vimeo videos and audios should now be possible to download.
|
||||
- vimeo: fixed short resolution displayed in "basic" and "pretty" filename styles.
|
||||
|
||||
interface improvements:
|
||||
- streamables are now easier to save on ios.
|
||||
|
||||
internal improvements:
|
||||
- port env variable is now not strictly necessary for cobalt to run.
|
||||
- minor clean up.
|
||||
|
||||
changes since 7.6:
|
||||
- fix for an issue related to youtube dubs.
|
||||
- fixed a memory leak related to live renders.
|
||||
- handling all errors related to twitter downloads.
|
||||
- fixed support for reddit links in various languages.
|
||||
- added rich filenames support for twitch clips.
|
||||
- updated support and donation lists.
|
||||
|
||||
stay tuned for future updates and have a great day :D
|
35
web/changelogs/7.8.md
Normal file
35
web/changelogs/7.8.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
title: "new years clean up! bug fixes and fresh look for the home page"
|
||||
date: "December 25, 2023"
|
||||
banner:
|
||||
file: "catroomba.webp"
|
||||
alt: "a cat riding a roomba vacuum"
|
||||
---
|
||||
merry christmas and happy new year! this update fixes several (very annoying) bugs to help you enjoy your holidays better.
|
||||
|
||||
you might have already noticed, but we've refreshed the home page on desktop and mobile! less space wasted, more pleasant to look at. let us know if you like it or not :D
|
||||
|
||||
service improvements:
|
||||
- [#264](https://github.com/imputnet/cobalt/issues/264) anything that includes a period in the url should be possible to download (including instagram stories).
|
||||
- [#273](https://github.com/imputnet/cobalt/issues/273) soundcloud: falling back to mp3 instead of refusing to download the song at all.
|
||||
- [#275](https://github.com/imputnet/cobalt/issues/275) youtube: query parameters are parsed and handled correctly, all links should be supported, no matter where v query is located.
|
||||
- tlds are parsed and validated correctly (e.g. "pinterest.co.uk" works now).
|
||||
- fixvx.com links are now supported.
|
||||
|
||||
interface improvements:
|
||||
- cleaner and more consistent home page layout.
|
||||
- cleaned up support section in "about". also includes a link to the status page.
|
||||
|
||||
internal improvements:
|
||||
- urls, subdomains, and tlds are properly validated.
|
||||
- minor clean up.
|
||||
|
||||
changes since 7.7:
|
||||
- made terms and ethics more descriptive.
|
||||
- fix only affected twitter videos.
|
||||
- fixed quick ⌘+V pasting on mac.
|
||||
- now catching even more youtube-related errors.
|
||||
|
||||
this might not seem like a lot, but even smaller changes make a difference!
|
||||
|
||||
enjoy this update and the rest of your day :D
|
33
web/changelogs/7.9.md
Normal file
33
web/changelogs/7.9.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
title: "twitter gifs, pinterest, ok.ru, and more!"
|
||||
date: "January 17, 2024"
|
||||
banner:
|
||||
file: "meowthball.webp"
|
||||
alt: "meowth rolling on a big catnip ball"
|
||||
---
|
||||
yes, you read that right. cobalt now lets you convert any twitter gif to an actual .gif file! (finally)
|
||||
just go to settings and enable this feature :)
|
||||
|
||||
service improvements:
|
||||
- added an option to [convert gifs from twitter](https://github.com/imputnet/cobalt/issues/250) into actual .gif format. files will be bigger and lower quality, but maybe you want that.
|
||||
- pinterest support has been completely redone, now all videos ([and even pin.it links](https://github.com/imputnet/cobalt/issues/160)) are supported.
|
||||
- added [support for ok.ru](https://github.com/imputnet/cobalt/issues/322) in case you're a russian grandma.
|
||||
- now processing [all reddit links](https://github.com/imputnet/cobalt/issues/318) (including old.reddit.com).
|
||||
- [instagram live vods](https://github.com/imputnet/cobalt/issues/316) are now supported.
|
||||
- fixed a [rare vimeo bug](https://github.com/imputnet/cobalt/issues/289) related to 1440p videos.
|
||||
|
||||
other improvements:
|
||||
- ui fade in animation is no longer present if you've disabled animations.
|
||||
- all images now have alt descriptions.
|
||||
- cobalt html is now [biblically correct](https://github.com/imputnet/cobalt/issues/317) and follows the html spec.
|
||||
- lots of cleaning up.
|
||||
|
||||
patches since 7.8:
|
||||
- shift+key [shortcuts are now ignored](https://github.com/imputnet/cobalt/issues/288) if url bar is focused.
|
||||
- longer soundcloud links are now supported, also catching more tiktok-related errors.
|
||||
- removed mastodon from support links as that account is no longer active.
|
||||
- added ability to download a specific video from multi media tweets and support for /mediaViewer links.
|
||||
- fixed [modal blurriness](https://github.com/imputnet/cobalt/issues/309) in chromium.
|
||||
- minor html changes (road to biblically correct one).
|
||||
|
||||
lots of long-awaited updates (especially twitter gifs), hope you enjoy them and have a great day :D
|
9
web/eslint.config.js
Normal file
9
web/eslint.config.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
// @ts-check
|
||||
|
||||
import eslint from '@eslint/js';
|
||||
import tseslint from 'typescript-eslint';
|
||||
|
||||
export default tseslint.config(
|
||||
eslint.configs.recommended,
|
||||
...tseslint.configs.recommended,
|
||||
);
|
7
web/i18n/en/a11y/dialog.json
Normal file
7
web/i18n/en/a11y/dialog.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"picker.item.photo": "photo thumbnail",
|
||||
"picker.item.video": "video thumbnail",
|
||||
"picker.item.gif": "gif thumbnail",
|
||||
|
||||
"saving.copied": "link copied"
|
||||
}
|
3
web/i18n/en/a11y/general.json
Normal file
3
web/i18n/en/a11y/general.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"back": "go back"
|
||||
}
|
9
web/i18n/en/a11y/save.json
Normal file
9
web/i18n/en/a11y/save.json
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"linkArea": "link input area",
|
||||
"clearInput": "clear input",
|
||||
"download": "download",
|
||||
"downloadThink": "processing the link...",
|
||||
"downloadCheck": "verifying download...",
|
||||
"downloadDone": "downloading done",
|
||||
"downloadError": "downloading error"
|
||||
}
|
3
web/i18n/en/a11y/tabs.json
Normal file
3
web/i18n/en/a11y/tabs.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"tabPanel": "tabs panel"
|
||||
}
|
26
web/i18n/en/dialog.json
Normal file
26
web/i18n/en/dialog.json
Normal file
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"button.gotit": "got it",
|
||||
"button.cancel": "cancel",
|
||||
"button.reset": "reset",
|
||||
"button.done": "done",
|
||||
"button.downloadAudio": "download audio",
|
||||
"button.download": "download",
|
||||
"button.share": "share",
|
||||
"button.copy": "copy",
|
||||
"button.import": "import",
|
||||
|
||||
"reset.title": "reset all settings?",
|
||||
"reset.body": "are you sure you want to reset all settings? this action is immediate and irreversible.",
|
||||
|
||||
"picker.title": "select what to save",
|
||||
"picker.description.desktop": "click an item to save it. images can also be saved via the right click menu.",
|
||||
"picker.description.phone": "press an item to save it. images can also be saved with a long press.",
|
||||
"picker.description.ios": "press an item to save it with a shortcut. images can also be saved with a long press.",
|
||||
|
||||
"saving.title": "choose how to save",
|
||||
"saving.blocked": "cobalt tried opening the file in a new tab, but your browser blocked it. you can allow pop-ups for cobalt to prevent this from happening next time.",
|
||||
|
||||
"safety.title": "important safety notice",
|
||||
|
||||
"import.body": "importing unknown or corrupted files may unexpectedly alter or break cobalt functionality. only import files that you've personally exported and haven't modified. if you were asked to import this file by someone - don't do it.\n\nwe are not responsible for any harm caused by importing unknown setting files."
|
||||
}
|
5
web/i18n/en/error.json
Normal file
5
web/i18n/en/error.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"import.no_data": "there's nothing to load from the file. are you sure it's the right one?",
|
||||
"import.invalid": "your file doesn't have valid cobalt settings to import. are you sure it's the right one?",
|
||||
"import.unknown": "couldn't load data from the file. it may be corrupted or of wrong format. here's the error i got:\n{{ value }}"
|
||||
}
|
4
web/i18n/en/general.json
Normal file
4
web/i18n/en/general.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"cobalt": "cobalt",
|
||||
"meowbalt": "meowbalt"
|
||||
}
|
4
web/i18n/en/notification.json
Normal file
4
web/i18n/en/notification.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"update.title": "update is available!",
|
||||
"update.subtext": "press to reload"
|
||||
}
|
10
web/i18n/en/save.json
Normal file
10
web/i18n/en/save.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"paste": "paste",
|
||||
"paste.long": "paste and download",
|
||||
"auto": "auto",
|
||||
"audio": "audio",
|
||||
"mute": "mute",
|
||||
"input.placeholder": "paste the link here",
|
||||
"terms.note.agreement": "by continuing, you agree to",
|
||||
"terms.note.link": "terms and ethics of use"
|
||||
}
|
107
web/i18n/en/settings.json
Normal file
107
web/i18n/en/settings.json
Normal file
|
@ -0,0 +1,107 @@
|
|||
{
|
||||
"page.appearance": "appearance",
|
||||
"page.privacy": "privacy",
|
||||
"page.video": "video",
|
||||
"page.audio": "audio",
|
||||
"page.download": "downloading",
|
||||
"page.advanced": "advanced",
|
||||
"page.debug": "debug information",
|
||||
|
||||
"section.general": "general",
|
||||
"section.save": "save",
|
||||
|
||||
"theme": "theme",
|
||||
"theme.auto": "auto",
|
||||
"theme.light": "light",
|
||||
"theme.dark": "dark",
|
||||
"theme.description": "auto theme automatically switches between light and dark themes depending on your device's current theme.",
|
||||
|
||||
"video.quality": "video quality",
|
||||
"video.quality.max": "8k+",
|
||||
"video.quality.2160": "4k",
|
||||
"video.quality.1440": "1440p",
|
||||
"video.quality.1080": "1080p",
|
||||
"video.quality.720": "720p",
|
||||
"video.quality.480": "480p",
|
||||
"video.quality.360": "360p",
|
||||
"video.quality.240": "240p",
|
||||
"video.quality.144": "144p",
|
||||
"video.quality.description": "if preferred video quality isn't available, closest best is picked instead.",
|
||||
|
||||
"video.youtube.codec": "youtube video codec",
|
||||
"video.youtube.codec.h264": "h264 (mp4)",
|
||||
"video.youtube.codec.av1": "av1 (mp4)",
|
||||
"video.youtube.codec.vp9": "vp9 (webm)",
|
||||
"video.youtube.codec.description": "if preferred codec isn’t available, next best is picked instead. \n\nh264: best support, average detail level. max quality is 1080p. \nav1: best quality, small file size, most detail. supports 8k & HDR. \nvp9: same quality as av1, but file is approximately two times bigger. supports 4k & HDR.",
|
||||
|
||||
"video.twitter.gif": "twitter/x",
|
||||
"video.twitter.gif.title": "convert looping videos to GIF",
|
||||
"video.twitter.gif.description": "GIF conversion is very inefficient, converted file may be obnoxiously big and low quality.",
|
||||
|
||||
"video.tiktok.h265": "tiktok",
|
||||
"video.tiktok.h265.title": "prefer HEVC/H265 format",
|
||||
"video.tiktok.h265.description": "allows 1080p video downloading at cost of compatibility.",
|
||||
|
||||
"audio.format": "audio format",
|
||||
"audio.format.best": "best",
|
||||
"audio.format.mp3": "mp3",
|
||||
"audio.format.ogg": "ogg",
|
||||
"audio.format.wav": "wav",
|
||||
"audio.format.opus": "opus",
|
||||
"audio.format.description": "every format but \"best\" is converted, meaning that they're lossy. if preferred format matches best available audio, it won't be converted.",
|
||||
|
||||
"audio.youtube.dub": "youtube",
|
||||
"audio.youtube.dub.title": "use browser language for dubbed videos",
|
||||
"audio.youtube.dub.description": "works even if cobalt isn't translated to your language.",
|
||||
|
||||
"audio.tiktok.original": "tiktok",
|
||||
"audio.tiktok.original.title": "use original sound",
|
||||
"audio.tiktok.original.description": "downloads original sound used in the post without any additional changes by the post's author.",
|
||||
|
||||
"metadata.filename": "filename style",
|
||||
"metadata.filename.classic": "classic",
|
||||
"metadata.filename.basic": "basic",
|
||||
"metadata.filename.pretty": "pretty",
|
||||
"metadata.filename.nerdy": "nerdy",
|
||||
"metadata.filename.description": "filename style will only be used for files processed or proxied by cobalt. some services don't support filename styles.",
|
||||
|
||||
"metadata.filename.preview.video": "Video Title",
|
||||
"metadata.filename.preview.audio": "Audio Title - Audio Author",
|
||||
|
||||
"metadata.file": "file metadata",
|
||||
"metadata.disable.title": "disable file metadata",
|
||||
"metadata.disable.description": "title, artist, and other info will not be added to the file.",
|
||||
|
||||
"saving.title": "saving method",
|
||||
"saving.ask": "ask",
|
||||
"saving.download": "download",
|
||||
"saving.share": "share",
|
||||
"saving.copy": "copy",
|
||||
"saving.description": "preferred way of saving the file or link from cobalt. if preferred method is unavailable or something goes wrong, cobalt will ask you what to do next.",
|
||||
|
||||
"accessibility": "accessibility",
|
||||
"accessibility.transparency.title": "reduce visual transparency",
|
||||
"accessibility.transparency.description": "reduces transparency of surfaces and disables blur effects.",
|
||||
"accessibility.motion.title": "reduce motion",
|
||||
"accessibility.motion.description": "replaces animations with instant transitions when possible.",
|
||||
|
||||
"language": "language",
|
||||
"language.auto.title": "use default browser language",
|
||||
"language.auto.description": "automatically picks the best language for you. if preferred browser language isn't available, english is used instead. disable this toggle to pick a language manually.",
|
||||
"language.preferred.title": "preferred language",
|
||||
"language.preferred.description": "language used for interface and content. if any text isn’t translated to this language, it will be displayed in english.",
|
||||
|
||||
"privacy.analytics": "anonymous traffic analytics",
|
||||
"privacy.analytics.title": "don't contribute to analytics",
|
||||
"privacy.analytics.description": "we use a self-hosted plausible instance for getting an approximate number of active cobalt users. no identifiable information about you is ever stored. all processed data is anonymized and aggregated.\n\nplausible does not use any cookies and is fully compliant with GDPR, CCPA, and PECR.",
|
||||
"privacy.analytics.learnmore": "learn more about plausible's dedication to privacy.",
|
||||
|
||||
"advanced.debug": "debug",
|
||||
"advanced.debug.title": "enable debug features",
|
||||
"advanced.debug.description": "gives you access to a page with app & device info useful for debugging.",
|
||||
|
||||
"advanced.data": "settings data",
|
||||
"advanced.reset": "reset all settings",
|
||||
"advanced.import": "import",
|
||||
"advanced.export": "export"
|
||||
}
|
7
web/i18n/en/tabs.json
Normal file
7
web/i18n/en/tabs.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"save": "save",
|
||||
"settings": "settings",
|
||||
"updates": "updates",
|
||||
"donate": "donate",
|
||||
"about": "about"
|
||||
}
|
4
web/i18n/en/updates.json
Normal file
4
web/i18n/en/updates.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"button.next": "go to older changelog ({{ value }})",
|
||||
"button.previous": "go to newer changelog ({{ value }})"
|
||||
}
|
4
web/i18n/languages.json
Normal file
4
web/i18n/languages.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"en": "english",
|
||||
"ru": "русский"
|
||||
}
|
3
web/i18n/ru/a11y/general.json
Normal file
3
web/i18n/ru/a11y/general.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"back": "назад"
|
||||
}
|
9
web/i18n/ru/a11y/save.json
Normal file
9
web/i18n/ru/a11y/save.json
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"linkArea": "зона вставки ссылки",
|
||||
"clearInput": "clear input",
|
||||
"download": "скачать",
|
||||
"downloadThink": "обрабатываю ссылку...",
|
||||
"downloadCheck": "проверяю загрузку...",
|
||||
"downloadDone": "загрузка завершена!",
|
||||
"downloadError": "ошибка загрузки"
|
||||
}
|
3
web/i18n/ru/a11y/tabs.json
Normal file
3
web/i18n/ru/a11y/tabs.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"tabPanel": "панель вкладок"
|
||||
}
|
4
web/i18n/ru/general.json
Normal file
4
web/i18n/ru/general.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"cobalt": "кобальт",
|
||||
"meowbalt": "мяубальт"
|
||||
}
|
10
web/i18n/ru/save.json
Normal file
10
web/i18n/ru/save.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"paste": "вставить",
|
||||
"paste.long": "вставить и скачать",
|
||||
"auto": "авто",
|
||||
"audio": "аудио",
|
||||
"mute": "без звука",
|
||||
"input.placeholder": "вставь ссылку сюда",
|
||||
"terms.note.agreement": "продолжая, ты соглашаешься с",
|
||||
"terms.note.link": "условиями и этикой использования"
|
||||
}
|
7
web/i18n/ru/tabs.json
Normal file
7
web/i18n/ru/tabs.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"save": "скачать",
|
||||
"settings": "настройки",
|
||||
"updates": "новости",
|
||||
"donate": "донаты",
|
||||
"about": "чаво"
|
||||
}
|
3594
web/package-lock.json
generated
Normal file
3594
web/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
51
web/package.json
Normal file
51
web/package.json
Normal file
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
"name": "cobalt-web",
|
||||
"version": "0.0.1",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
||||
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
|
||||
},
|
||||
"license": "CC-BY-NC-SA-4.0",
|
||||
"engines": {
|
||||
"node": ">=20.9",
|
||||
"npm": ">=9"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/imputnet/cobalt.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/imputnet/cobalt/issues"
|
||||
},
|
||||
"homepage": "https://cobalt.tools/",
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.5.0",
|
||||
"@sveltejs/adapter-static": "^3.0.2",
|
||||
"@sveltejs/kit": "^2.0.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^3.0.0",
|
||||
"@types/eslint__js": "^8.42.3",
|
||||
"@types/node": "^20.14.10",
|
||||
"compare-versions": "^6.1.0",
|
||||
"eslint": "^8.57.0",
|
||||
"mdsvex": "^0.11.2",
|
||||
"svelte": "^4.2.7",
|
||||
"svelte-check": "^3.6.0",
|
||||
"svelte-preprocess": "^6.0.2",
|
||||
"tslib": "^2.4.1",
|
||||
"typescript": "^5.4.5",
|
||||
"typescript-eslint": "^7.13.1",
|
||||
"vite": "^5.0.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fontsource-variable/noto-sans-mono": "^5.0.20",
|
||||
"@fontsource/ibm-plex-mono": "^5.0.13",
|
||||
"@tabler/icons-svelte": "3.6.0",
|
||||
"sveltekit-i18n": "^2.4.2",
|
||||
"ts-deepmerge": "^7.0.0"
|
||||
}
|
||||
}
|
24
web/src/app.d.ts
vendored
Normal file
24
web/src/app.d.ts
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
// needed so that changelog files are appropriately
|
||||
// typed as svelte components
|
||||
declare module '*.md' {
|
||||
import type { SvelteComponentDev } from 'svelte/internal';
|
||||
|
||||
export default class Comp extends SvelteComponentDev {
|
||||
$$prop_def: {};
|
||||
}
|
||||
export const metadata: Record<string, any>;
|
||||
}
|
||||
|
||||
// See https://kit.svelte.dev/docs/types#app
|
||||
// for information about these interfaces
|
||||
declare global {
|
||||
namespace App {
|
||||
// interface Error {}
|
||||
// interface Locals {}
|
||||
// interface PageData {}
|
||||
// interface PageState {}
|
||||
// interface Platform {}
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
35
web/src/app.html
Normal file
35
web/src/app.html
Normal file
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="viewport-fit=cover, width=device-width, height=device-height, initial-scale=1, maximum-scale=1">
|
||||
|
||||
<title>cobalt</title>
|
||||
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta name="apple-mobile-web-app-title" content="cobalt">
|
||||
|
||||
<link rel="icon" href="%sveltekit.assets%/favicon.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="%sveltekit.assets%/icons/apple-touch-icon.png">
|
||||
|
||||
<link crossorigin="use-credentials" rel="manifest" href="%sveltekit.assets%/manifest.json">
|
||||
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
<style>
|
||||
body {
|
||||
background-color: black;
|
||||
}
|
||||
@media (prefers-color-scheme: light) {
|
||||
body {
|
||||
background-color: white;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<body data-sveltekit-preload-data="hover" data-sveltekit-preload-code="eager">
|
||||
<div style="display: contents">
|
||||
%sveltekit.body%
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
10
web/src/components/buttons/ActionButton.svelte
Normal file
10
web/src/components/buttons/ActionButton.svelte
Normal file
|
@ -0,0 +1,10 @@
|
|||
<script lang="ts">
|
||||
export let id: string;
|
||||
export let click = () => {
|
||||
alert("no function assigned");
|
||||
};
|
||||
</script>
|
||||
|
||||
<button id="button-{id}" class="button" on:click={click}>
|
||||
<slot></slot>
|
||||
</button>
|
56
web/src/components/buttons/ResetSettingsButton.svelte
Normal file
56
web/src/components/buttons/ResetSettingsButton.svelte
Normal file
|
@ -0,0 +1,56 @@
|
|||
<script lang="ts">
|
||||
import { t } from "$lib/i18n/translations";
|
||||
import { resetSettings } from "$lib/state/settings";
|
||||
|
||||
import IconTrash from "@tabler/icons-svelte/IconTrash.svelte";
|
||||
|
||||
import { createDialog } from "$lib/dialogs";
|
||||
|
||||
const resetDialog = () => {
|
||||
createDialog({
|
||||
id: "wipe-confirm",
|
||||
type: "small",
|
||||
icon: "warn-red",
|
||||
title: $t("dialog.reset.title"),
|
||||
bodyText: $t("dialog.reset.body"),
|
||||
buttons: [
|
||||
{
|
||||
text: $t("dialog.button.cancel"),
|
||||
main: false,
|
||||
action: () => {},
|
||||
},
|
||||
{
|
||||
text: $t("dialog.button.reset"),
|
||||
color: "red",
|
||||
main: true,
|
||||
timeout: 5000,
|
||||
action: () => resetSettings(),
|
||||
},
|
||||
],
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<button id="setting-button-reset" class="button" on:click={resetDialog}>
|
||||
<IconTrash />
|
||||
{$t("settings.advanced.reset")}
|
||||
</button>
|
||||
|
||||
<style>
|
||||
#setting-button-reset {
|
||||
background-color: var(--red);
|
||||
color: var(--white);
|
||||
width: max-content;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#setting-button-reset:hover {
|
||||
background-color: var(--dark-red);
|
||||
}
|
||||
|
||||
#setting-button-reset :global(svg) {
|
||||
stroke-width: 2px;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
}
|
||||
</style>
|
33
web/src/components/buttons/SettingsButton.svelte
Normal file
33
web/src/components/buttons/SettingsButton.svelte
Normal file
|
@ -0,0 +1,33 @@
|
|||
<script
|
||||
lang="ts"
|
||||
generics="
|
||||
Context extends Exclude<keyof CobaltSettings, 'schemaVersion'>,
|
||||
Id extends keyof CobaltSettings[Context],
|
||||
Value extends CobaltSettings[Context][Id]
|
||||
"
|
||||
>
|
||||
import settings, { updateSetting } from "$lib/state/settings";
|
||||
import type { CobaltSettings } from "$lib/types/settings";
|
||||
|
||||
export let settingContext: Context;
|
||||
export let settingId: Id;
|
||||
export let settingValue: Value;
|
||||
|
||||
$: setting = $settings[settingContext][settingId];
|
||||
$: isActive = setting === settingValue;
|
||||
</script>
|
||||
|
||||
<button
|
||||
id="setting-button-{settingContext}-{String(settingId)}-{settingValue}"
|
||||
class="button"
|
||||
class:active={isActive}
|
||||
aria-pressed={isActive}
|
||||
on:click={() =>
|
||||
updateSetting({
|
||||
[settingContext]: {
|
||||
[settingId]: settingValue,
|
||||
},
|
||||
})}
|
||||
>
|
||||
<slot></slot>
|
||||
</button>
|
69
web/src/components/buttons/SettingsToggle.svelte
Normal file
69
web/src/components/buttons/SettingsToggle.svelte
Normal file
|
@ -0,0 +1,69 @@
|
|||
<script
|
||||
lang="ts"
|
||||
generics="
|
||||
Context extends Exclude<keyof CobaltSettings, 'schemaVersion'>,
|
||||
Id extends keyof CobaltSettings[Context]
|
||||
"
|
||||
>
|
||||
import settings, { updateSetting } from "$lib/state/settings";
|
||||
import type { CobaltSettings } from "$lib/types/settings";
|
||||
|
||||
import Toggle from "$components/misc/Toggle.svelte";
|
||||
|
||||
export let settingContext: Context;
|
||||
export let settingId: Id;
|
||||
|
||||
export let title: string;
|
||||
export let description: string = "";
|
||||
|
||||
$: setting = $settings[settingContext][settingId];
|
||||
$: isEnabled = !!setting;
|
||||
</script>
|
||||
|
||||
<div id="setting-toggle-{settingContext}-{String(settingId)}" class="toggle-parent">
|
||||
<button
|
||||
class="toggle-container"
|
||||
role="switch"
|
||||
aria-checked={isEnabled}
|
||||
on:click={() =>
|
||||
updateSetting({
|
||||
[settingContext]: {
|
||||
[settingId]: !isEnabled,
|
||||
},
|
||||
})
|
||||
}
|
||||
>
|
||||
<h4 class="toggle-title">{title}</h4>
|
||||
<Toggle enabled={isEnabled} />
|
||||
</button>
|
||||
<!--
|
||||
description is repeated here because there may be several toggles per settings category,
|
||||
and each of them needs its own description. this is intended. don't "clean it up".
|
||||
-->
|
||||
{#if description}
|
||||
<div class="subtext toggle-description">{description}</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.toggle-parent {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.toggle-container {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: var(--padding);
|
||||
justify-content: space-between;
|
||||
text-align: left;
|
||||
transform: none;
|
||||
padding: calc(var(--switcher-padding) * 2) 16px;
|
||||
border-radius: var(--border-radius);
|
||||
overflow: scroll;
|
||||
}
|
||||
</style>
|
83
web/src/components/buttons/Switcher.svelte
Normal file
83
web/src/components/buttons/Switcher.svelte
Normal file
|
@ -0,0 +1,83 @@
|
|||
<script lang="ts">
|
||||
export let big: boolean = false;
|
||||
export let description: string = "";
|
||||
</script>
|
||||
|
||||
<div class="switcher-parent">
|
||||
<div class="switcher" class:big={big} role="listbox">
|
||||
<slot></slot>
|
||||
</div>
|
||||
{#if description}
|
||||
<div class="settings-content-description subtext">{description}</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.switcher-parent {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.switcher {
|
||||
display: flex;
|
||||
width: auto;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
scrollbar-width: none;
|
||||
overflow-x: scroll;
|
||||
border-radius: var(--border-radius);
|
||||
}
|
||||
|
||||
.switcher :global(.button) {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.switcher:not(.big) :global(.button:first-child) {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.switcher:not(.big) :global(.button:last-child) {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.switcher.big {
|
||||
background: var(--button);
|
||||
box-shadow: var(--button-box-shadow);
|
||||
padding: var(--switcher-padding);
|
||||
}
|
||||
|
||||
.switcher :global(.button.active) {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.switcher :global(.button.active:hover) {
|
||||
background: var(--secondary);
|
||||
}
|
||||
|
||||
.switcher.big :global(.button) {
|
||||
width: 100%;
|
||||
/* [base button height] - ([switcher padding] * [padding factor to accommodate for]) */
|
||||
height: calc(40px - var(--switcher-padding) * 1.5);
|
||||
border-radius: calc(var(--border-radius) - var(--switcher-padding));;
|
||||
}
|
||||
|
||||
.switcher.big :global(.button:not(:focus-visible)) {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.switcher.big :global(.button:not(.active, :hover, :active)) {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.switcher:not(.big) :global(.button:not(:first-child, :last-child)) {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
/* hack to get rid of double border in a list of switches */
|
||||
.switcher:not(.big) :global(:not(.button:first-child)) {
|
||||
margin-left: -1.5px;
|
||||
}
|
||||
</style>
|
44
web/src/components/buttons/VerticalActionButton.svelte
Normal file
44
web/src/components/buttons/VerticalActionButton.svelte
Normal file
|
@ -0,0 +1,44 @@
|
|||
<script lang="ts">
|
||||
export let id: string;
|
||||
export let click = () => {
|
||||
alert("no function assigned");
|
||||
};
|
||||
export let fill = false;
|
||||
export let elevated = false;
|
||||
export let ariaLabel = "";
|
||||
</script>
|
||||
|
||||
<button
|
||||
id="button-{id}"
|
||||
class="button vertical"
|
||||
class:fill
|
||||
class:elevated
|
||||
on:click={click}
|
||||
aria-label={ariaLabel}
|
||||
>
|
||||
<slot></slot>
|
||||
</button>
|
||||
|
||||
<style>
|
||||
.button.vertical {
|
||||
flex-direction: column;
|
||||
line-height: 1;
|
||||
padding: var(--padding);
|
||||
gap: calc(var(--padding) / 2);
|
||||
}
|
||||
|
||||
.button.vertical :global(svg) {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.button.vertical.fill {
|
||||
width: 100%;
|
||||
padding: var(--padding) 0;
|
||||
}
|
||||
|
||||
.button.vertical :global(svg) {
|
||||
stroke-width: 1.8px;
|
||||
color: var(--secondary);
|
||||
}
|
||||
</style>
|
190
web/src/components/changelog/ChangelogEntry.svelte
Normal file
190
web/src/components/changelog/ChangelogEntry.svelte
Normal file
|
@ -0,0 +1,190 @@
|
|||
<script lang="ts">
|
||||
import { onMount } from "svelte";
|
||||
|
||||
import type { Optional } from "$lib/types/generic";
|
||||
|
||||
import Skeleton from "$components/misc/Skeleton.svelte";
|
||||
|
||||
export let version: string;
|
||||
export let title: string = "";
|
||||
export let date: string = "";
|
||||
export let banner: Optional<{ file: string; alt: string }> = undefined;
|
||||
export let skeleton = false;
|
||||
|
||||
let bannerLoaded = false;
|
||||
|
||||
const formatDate = (dateString: string) => {
|
||||
const date = new Date(dateString);
|
||||
|
||||
const months = ["January", "February", "March", "April", "May",
|
||||
"June", "July", "August", "September", "October",
|
||||
"November", "December"];
|
||||
|
||||
return [
|
||||
months[date.getUTCMonth()],
|
||||
date.getUTCDate() + 1 + ",",
|
||||
date.getUTCFullYear(),
|
||||
].join(" ");
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
const to_focus: HTMLElement | null =
|
||||
document.querySelector("[data-first-focus]");
|
||||
to_focus?.focus();
|
||||
});
|
||||
</script>
|
||||
|
||||
<main id="changelog-parent">
|
||||
<div id="changelog-header" class:no-padding={!banner && !skeleton}>
|
||||
<div class="changelog-info">
|
||||
<div
|
||||
class="changelog-version"
|
||||
data-first-focus
|
||||
data-focus-ring-hidden
|
||||
tabindex="-1"
|
||||
>
|
||||
{version}
|
||||
</div>
|
||||
<div class="changelog-date">
|
||||
{#if skeleton}
|
||||
<Skeleton width="8em" height="16px" />
|
||||
{:else}
|
||||
{formatDate(date)}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{#if skeleton}
|
||||
<Skeleton width="100%" height="27.59px" />
|
||||
{:else}
|
||||
<h1 class="changelog-title">{title}</h1>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="changelog-content">
|
||||
{#if banner}
|
||||
<img
|
||||
src={`/update-banners/${banner.file}`}
|
||||
alt={banner.alt}
|
||||
class:loading={!bannerLoaded}
|
||||
on:load={() => bannerLoaded = true}
|
||||
class="changelog-banner"
|
||||
/>
|
||||
|
||||
<Skeleton class="big changelog-banner" hidden={bannerLoaded} />
|
||||
{/if}
|
||||
|
||||
{#if skeleton}
|
||||
<Skeleton class="big changelog-banner" width="100%" />
|
||||
{/if}
|
||||
<div class="changelog-body">
|
||||
{#if skeleton}
|
||||
{#each { length: 3 + Math.random() * 5 } as _}
|
||||
<p>
|
||||
<Skeleton
|
||||
width="100%"
|
||||
height={Math.random() * 84 + 16 + "px"}
|
||||
/>
|
||||
</p>
|
||||
{/each}
|
||||
{:else}
|
||||
<slot></slot>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<style>
|
||||
#changelog-parent {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
#changelog-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: start;
|
||||
gap: calc(var(--padding) / 2);
|
||||
padding-bottom: 1em; /* match default <p> padding */
|
||||
}
|
||||
|
||||
#changelog-header.no-padding {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.changelog-info {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
.changelog-version {
|
||||
padding: 3px 8px;
|
||||
border-radius: 6px;
|
||||
background-color: var(--secondary);
|
||||
color: var(--primary);
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.changelog-date {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: var(--gray);
|
||||
}
|
||||
|
||||
.changelog-title {
|
||||
padding: 0;
|
||||
line-height: 1.2;
|
||||
font-size: 23px;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
:global(.changelog-banner) {
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
max-height: 320pt;
|
||||
min-height: 210pt;
|
||||
width: 100%;
|
||||
aspect-ratio: 16/9;
|
||||
border-radius: var(--padding);
|
||||
}
|
||||
|
||||
.changelog-banner.loading {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.changelog-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.changelog-body {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.changelog-body,
|
||||
.changelog-body :global(*) {
|
||||
line-height: 1.7;
|
||||
font-size: 14.5px;
|
||||
font-weight: 410;
|
||||
font-family: "Noto Sans Mono Variable", "Noto Sans Mono", monospace;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
.changelog-body :global(ul) {
|
||||
padding-inline-start: 30px;
|
||||
}
|
||||
|
||||
.changelog-body :global(li) {
|
||||
padding-left: 3px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 535px) {
|
||||
.changelog-body,
|
||||
.changelog-body :global(*) {
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
</style>
|
17
web/src/components/changelog/ChangelogEntryWrapper.svelte
Normal file
17
web/src/components/changelog/ChangelogEntryWrapper.svelte
Normal file
|
@ -0,0 +1,17 @@
|
|||
<!-- Workaround for https://github.com/pngwn/MDsveX/issues/116 -->
|
||||
<script lang="ts" context="module">
|
||||
import a from "$components/misc/OuterLink.svelte";
|
||||
export { a };
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import ChangelogEntry from "$components/changelog/ChangelogEntry.svelte";
|
||||
export let version = '';
|
||||
export let title = '';
|
||||
export let date = '';
|
||||
export let banner = undefined;
|
||||
</script>
|
||||
|
||||
<ChangelogEntry {version} {title} {date} {banner}>
|
||||
<slot></slot>
|
||||
</ChangelogEntry>
|
18
web/src/components/dialog/DialogBackdropClose.svelte
Normal file
18
web/src/components/dialog/DialogBackdropClose.svelte
Normal file
|
@ -0,0 +1,18 @@
|
|||
<script lang="ts">
|
||||
export let closeFunc: () => void;
|
||||
</script>
|
||||
|
||||
<div
|
||||
id="dialog-backdrop-close"
|
||||
aria-hidden="true"
|
||||
on:click={() => closeFunc()}
|
||||
></div>
|
||||
|
||||
<style>
|
||||
#dialog-backdrop-close {
|
||||
position: inherit;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
z-index: -1;
|
||||
}
|
||||
</style>
|
55
web/src/components/dialog/DialogButton.svelte
Normal file
55
web/src/components/dialog/DialogButton.svelte
Normal file
|
@ -0,0 +1,55 @@
|
|||
<script lang="ts">
|
||||
import { onDestroy } from "svelte";
|
||||
import type { DialogButton } from "$lib/types/dialog";
|
||||
|
||||
export let button: DialogButton;
|
||||
export let closeFunc: () => void;
|
||||
|
||||
let disabled = false;
|
||||
let seconds = 0;
|
||||
|
||||
if (button.timeout) {
|
||||
disabled = true;
|
||||
seconds = Math.round(button.timeout / 1000);
|
||||
|
||||
let interval = setInterval(() => {
|
||||
seconds--;
|
||||
if (seconds <= 0) {
|
||||
clearInterval(interval);
|
||||
disabled = false;
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
onDestroy(() => clearInterval(interval));
|
||||
}
|
||||
</script>
|
||||
|
||||
<button
|
||||
class="button elevated popup-button {button.color}"
|
||||
class:color={button.color}
|
||||
class:active={button.main}
|
||||
{disabled}
|
||||
on:click={async () => {
|
||||
await button.action();
|
||||
closeFunc();
|
||||
}}
|
||||
>
|
||||
{button.text}{seconds ? ` (${seconds})` : ""}
|
||||
</button>
|
||||
|
||||
<style>
|
||||
.popup-button {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
transition: 0.2s opacity;
|
||||
}
|
||||
|
||||
.popup-button.red {
|
||||
background-color: var(--red);
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.popup-button[disabled] {
|
||||
opacity: 0.6;
|
||||
}
|
||||
</style>
|
25
web/src/components/dialog/DialogButtons.svelte
Normal file
25
web/src/components/dialog/DialogButtons.svelte
Normal file
|
@ -0,0 +1,25 @@
|
|||
<script lang="ts">
|
||||
import type { DialogButton as DialogButtonType } from "$lib/types/dialog";
|
||||
import DialogButton from "$components/dialog/DialogButton.svelte";
|
||||
|
||||
export let buttons: DialogButtonType[];
|
||||
export let closeFunc: () => void;
|
||||
</script>
|
||||
|
||||
<div class="popup-buttons">
|
||||
{#each buttons as button}
|
||||
<DialogButton {button} {closeFunc} />
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.popup-buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
gap: calc(var(--padding) / 2);
|
||||
overflow: scroll;
|
||||
border-radius: var(--border-radius);
|
||||
min-height: 40px;
|
||||
}
|
||||
</style>
|
36
web/src/components/dialog/DialogContainer.svelte
Normal file
36
web/src/components/dialog/DialogContainer.svelte
Normal file
|
@ -0,0 +1,36 @@
|
|||
<script lang="ts">
|
||||
import { tick } from "svelte";
|
||||
import { killDialog } from "$lib/dialogs";
|
||||
|
||||
import DialogBackdropClose from "$components/dialog/DialogBackdropClose.svelte";
|
||||
|
||||
export let id: string;
|
||||
|
||||
let dialogParent: HTMLDialogElement;
|
||||
|
||||
let open = false;
|
||||
let closing = false;
|
||||
|
||||
export const close = () => {
|
||||
if (dialogParent) {
|
||||
closing = true;
|
||||
open = false;
|
||||
setTimeout(() => {
|
||||
dialogParent.close();
|
||||
killDialog();
|
||||
}, 150);
|
||||
}
|
||||
};
|
||||
|
||||
$: if (dialogParent) {
|
||||
dialogParent.showModal();
|
||||
tick().then(() => {
|
||||
open = true;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<dialog id="dialog-{id}" bind:this={dialogParent} class:closing class:open>
|
||||
<slot></slot>
|
||||
<DialogBackdropClose closeFunc={close} />
|
||||
</dialog>
|
187
web/src/components/dialog/DialogHolder.svelte
Normal file
187
web/src/components/dialog/DialogHolder.svelte
Normal file
|
@ -0,0 +1,187 @@
|
|||
<script lang="ts">
|
||||
import dialogs from "$lib/dialogs";
|
||||
|
||||
import SmallDialog from "$components/dialog/SmallDialog.svelte";
|
||||
import PickerDialog from "$components/dialog/PickerDialog.svelte";
|
||||
import SavingDialog from "$components/dialog/SavingDialog.svelte";
|
||||
|
||||
$: backdropVisible = $dialogs.length > 0;
|
||||
</script>
|
||||
|
||||
<!--
|
||||
this is the cleanest way of passing props without typescript throwing a fit.
|
||||
more info here: https://github.com/microsoft/TypeScript/issues/46680
|
||||
-->
|
||||
<div id="dialog-holder">
|
||||
{#each $dialogs as dialog}
|
||||
{#if dialog.type === "small"}
|
||||
<SmallDialog {...dialog} />
|
||||
{:else if dialog.type === "picker"}
|
||||
<PickerDialog {...dialog} />
|
||||
{:else if dialog.type === "saving"}
|
||||
<SavingDialog {...dialog} />
|
||||
{/if}
|
||||
{/each}
|
||||
<div id="dialog-backdrop" class:visible={backdropVisible}></div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
:global(dialog) {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background: none;
|
||||
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: none;
|
||||
pointer-events: all;
|
||||
|
||||
inset-inline-start: unset;
|
||||
inset-inline-end: unset;
|
||||
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
:global(dialog:modal) {
|
||||
inset-block-start: 0;
|
||||
inset-block-end: 0;
|
||||
}
|
||||
|
||||
:global(dialog:modal::backdrop) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 535px) {
|
||||
:global(dialog) {
|
||||
justify-content: end;
|
||||
}
|
||||
}
|
||||
|
||||
#dialog-holder {
|
||||
position: absolute;
|
||||
padding-top: env(safe-area-inset-bottom);
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
z-index: 99;
|
||||
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#dialog-backdrop {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
z-index: -1;
|
||||
|
||||
background-color: var(--dialog-backdrop);
|
||||
|
||||
backdrop-filter: blur(7px);
|
||||
-webkit-backdrop-filter: blur(7px);
|
||||
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s;
|
||||
}
|
||||
|
||||
#dialog-backdrop.visible {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
:global([data-reduce-transparency="true"]) #dialog-backdrop {
|
||||
backdrop-filter: none !important;
|
||||
-webkit-backdrop-filter: none !important;
|
||||
}
|
||||
|
||||
:global(.dialog-body) {
|
||||
--dialog-padding: 18px;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
||||
background: var(--popup-bg);
|
||||
box-shadow:
|
||||
0 0 0 2px var(--popup-stroke) inset,
|
||||
0 0 60px 10px var(--popup-bg);
|
||||
border-radius: 29px;
|
||||
|
||||
padding: var(--dialog-padding);
|
||||
|
||||
position: relative;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
:global(dialog.open .dialog-body) {
|
||||
animation: modal-in 0.35s;
|
||||
}
|
||||
|
||||
:global(dialog.closing .dialog-body) {
|
||||
animation: modal-out 0.15s;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 535px) {
|
||||
:global(dialog.open .dialog-body) {
|
||||
animation: modal-in-mobile 0.4s;
|
||||
}
|
||||
|
||||
:global(dialog .dialog-body) {
|
||||
margin-bottom: calc(
|
||||
var(--padding) / 2 + env(safe-area-inset-bottom)
|
||||
) !important;
|
||||
box-shadow: 0 0 0 2px var(--popup-stroke) inset;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes modal-in {
|
||||
from {
|
||||
transform: scale(0.8);
|
||||
opacity: 0;
|
||||
}
|
||||
30% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.005);
|
||||
}
|
||||
100% {
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes modal-out {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
transform: scale(0.9);
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes modal-in-mobile {
|
||||
from {
|
||||
transform: translateY(200px);
|
||||
opacity: 0;
|
||||
}
|
||||
30% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0px);
|
||||
}
|
||||
}
|
||||
</style>
|
182
web/src/components/dialog/PickerDialog.svelte
Normal file
182
web/src/components/dialog/PickerDialog.svelte
Normal file
|
@ -0,0 +1,182 @@
|
|||
<script lang="ts">
|
||||
import { device } from "$lib/device";
|
||||
import { t } from "$lib/i18n/translations";
|
||||
|
||||
import type { Optional } from "$lib/types/generic";
|
||||
import type { DialogButton } from "$lib/types/dialog";
|
||||
import type { DialogPickerItem } from "$lib/types/dialog";
|
||||
|
||||
import DialogContainer from "$components/dialog/DialogContainer.svelte";
|
||||
|
||||
import PickerItem from "$components/dialog/PickerItem.svelte";
|
||||
import DialogButtons from "$components/dialog/DialogButtons.svelte";
|
||||
|
||||
import IconBoxMultiple from "@tabler/icons-svelte/IconBoxMultiple.svelte";
|
||||
|
||||
export let id: string;
|
||||
export let items: Optional<DialogPickerItem[]> = undefined;
|
||||
export let buttons: Optional<DialogButton[]> = undefined;
|
||||
|
||||
let dialogDescription = "dialog.picker.description.";
|
||||
|
||||
if (device.is.iOS) {
|
||||
dialogDescription += "ios";
|
||||
} else if (device.is.mobile) {
|
||||
dialogDescription += "phone";
|
||||
} else {
|
||||
dialogDescription += "desktop";
|
||||
}
|
||||
|
||||
let close: () => void;
|
||||
</script>
|
||||
|
||||
<DialogContainer {id} bind:close>
|
||||
<div
|
||||
class="dialog-body picker-dialog"
|
||||
class:three-columns={items && items.length <= 3}
|
||||
>
|
||||
<div class="popup-header">
|
||||
<div class="popup-title-container">
|
||||
<IconBoxMultiple />
|
||||
<h2 class="popup-title" tabindex="-1">
|
||||
{$t("dialog.picker.title")}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="subtext popup-description">
|
||||
{$t(dialogDescription)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="picker-body">
|
||||
{#if items}
|
||||
{#each items as item, i}
|
||||
<PickerItem {item} number={i + 1} />
|
||||
{/each}
|
||||
{/if}
|
||||
</div>
|
||||
{#if buttons}
|
||||
<DialogButtons {buttons} closeFunc={close} />
|
||||
{/if}
|
||||
</div>
|
||||
</DialogContainer>
|
||||
|
||||
<style>
|
||||
.picker-dialog {
|
||||
--picker-item-size: 120px;
|
||||
gap: var(--padding);
|
||||
max-height: calc(
|
||||
90% - env(safe-area-inset-bottom) - env(safe-area-inset-top)
|
||||
);
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.popup-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 3px;
|
||||
max-width: calc(var(--picker-item-size) * 4);
|
||||
}
|
||||
|
||||
.popup-title-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: calc(var(--padding) / 2);
|
||||
color: var(--secondary);
|
||||
}
|
||||
|
||||
.popup-title-container :global(svg) {
|
||||
height: 21px;
|
||||
width: 21px;
|
||||
}
|
||||
|
||||
.popup-title {
|
||||
font-size: 18px;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.popup-description {
|
||||
font-size: 13px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.popup-title:focus-visible {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.picker-body {
|
||||
overflow-y: scroll;
|
||||
display: grid;
|
||||
justify-items: center;
|
||||
grid-template-columns: 1fr 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.three-columns .picker-body {
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.three-columns .popup-header {
|
||||
max-width: calc(var(--picker-item-size) * 3);
|
||||
}
|
||||
|
||||
:global(.picker-item) {
|
||||
width: var(--picker-item-size);
|
||||
height: var(--picker-item-size);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 535px) {
|
||||
.picker-body {
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.popup-header {
|
||||
max-width: calc(var(--picker-item-size) * 3);
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 400px) {
|
||||
.picker-dialog {
|
||||
--picker-item-size: 115px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 380px) {
|
||||
.picker-dialog {
|
||||
--picker-item-size: 110px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 365px) {
|
||||
.picker-dialog {
|
||||
--picker-item-size: 105px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 350px) {
|
||||
.picker-dialog {
|
||||
--picker-item-size: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 335px) {
|
||||
.picker-body,
|
||||
.three-columns .picker-body {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
|
||||
.popup-header {
|
||||
max-width: calc(var(--picker-item-size) * 3);
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 255px) {
|
||||
.picker-dialog {
|
||||
--picker-item-size: 120px;
|
||||
}
|
||||
|
||||
.picker-body,
|
||||
.three-columns .picker-body {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
</style>
|
109
web/src/components/dialog/PickerItem.svelte
Normal file
109
web/src/components/dialog/PickerItem.svelte
Normal file
|
@ -0,0 +1,109 @@
|
|||
<script lang="ts">
|
||||
import { t } from "$lib/i18n/translations";
|
||||
|
||||
import { downloadFile } from "$lib/download";
|
||||
import type { DialogPickerItem } from "$lib/types/dialog";
|
||||
|
||||
import Skeleton from "$components/misc/Skeleton.svelte";
|
||||
|
||||
import IconMovie from "@tabler/icons-svelte/IconMovie.svelte";
|
||||
import IconPhoto from "@tabler/icons-svelte/IconPhoto.svelte";
|
||||
import IconGif from "@tabler/icons-svelte/IconGif.svelte";
|
||||
|
||||
export let item: DialogPickerItem;
|
||||
export let number: number;
|
||||
|
||||
let imageLoaded = false;
|
||||
|
||||
$: itemType = item.type ?? "photo";
|
||||
</script>
|
||||
|
||||
<button class="picker-item" on:click={() => downloadFile(item.url)}>
|
||||
<div class="picker-type">
|
||||
{#if itemType === "video"}
|
||||
<IconMovie />
|
||||
{:else if itemType === "gif"}
|
||||
<IconGif />
|
||||
{:else}
|
||||
<IconPhoto />
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<img
|
||||
class="picker-image"
|
||||
src={item.thumb ?? item.url}
|
||||
|
||||
class:loading={!imageLoaded}
|
||||
class:video-thumbnail={["video", "gif"].includes(itemType)}
|
||||
on:load={() => imageLoaded = true}
|
||||
|
||||
alt="{$t(`a11y.dialog.picker.item.${itemType}`)} {number}"
|
||||
/>
|
||||
<Skeleton class="picker-image elevated" hidden={imageLoaded} />
|
||||
</button>
|
||||
|
||||
<style>
|
||||
.picker-item {
|
||||
position: relative;
|
||||
background: none;
|
||||
padding: 2px;
|
||||
box-shadow: none;
|
||||
border-radius: calc(var(--border-radius) / 2 + 2px);
|
||||
}
|
||||
|
||||
:global(.picker-image) {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
aspect-ratio: 1/1;
|
||||
pointer-events: all;
|
||||
|
||||
object-fit: cover;
|
||||
border-radius: calc(var(--border-radius) / 2);
|
||||
}
|
||||
|
||||
.picker-image.loading {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.picker-image.video-thumbnail {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
:global(.picker-item:active .picker-image) {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
:global(.picker-item:hover .picker-image) {
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
.picker-type {
|
||||
position: absolute;
|
||||
color: var(--white);
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
z-index: 9;
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
top: 6px;
|
||||
left: 6px;
|
||||
|
||||
border-radius: 6px;
|
||||
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.picker-type :global(svg) {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
}
|
||||
</style>
|
173
web/src/components/dialog/SavingDialog.svelte
Normal file
173
web/src/components/dialog/SavingDialog.svelte
Normal file
|
@ -0,0 +1,173 @@
|
|||
<script lang="ts">
|
||||
import { t } from "$lib/i18n/translations";
|
||||
|
||||
import { device } from "$lib/device";
|
||||
import { copyURL, openURL, shareURL } from "$lib/download";
|
||||
|
||||
import DialogContainer from "$components/dialog/DialogContainer.svelte";
|
||||
|
||||
import Meowbalt from "$components/misc/Meowbalt.svelte";
|
||||
import DialogButtons from "$components/dialog/DialogButtons.svelte";
|
||||
import VerticalActionButton from "$components/buttons/VerticalActionButton.svelte";
|
||||
|
||||
import IconShare2 from "@tabler/icons-svelte/IconShare2.svelte";
|
||||
import IconDownload from "@tabler/icons-svelte/IconDownload.svelte";
|
||||
import IconFileDownload from "@tabler/icons-svelte/IconFileDownload.svelte";
|
||||
|
||||
import CopyIcon from "$components/misc/CopyIcon.svelte";
|
||||
|
||||
export let id: string;
|
||||
export let url: string;
|
||||
export let bodyText: string = "";
|
||||
|
||||
let close: () => void;
|
||||
|
||||
let copied = false;
|
||||
|
||||
$: if (copied) {
|
||||
setTimeout(() => {
|
||||
copied = false;
|
||||
}, 1500);
|
||||
}
|
||||
</script>
|
||||
|
||||
<DialogContainer {id} bind:close>
|
||||
<div class="dialog-body popup-body">
|
||||
<div class="meowbalt-container">
|
||||
<Meowbalt emotion="question" />
|
||||
</div>
|
||||
<div class="dialog-inner-container">
|
||||
<div class="popup-header">
|
||||
<IconFileDownload />
|
||||
<h2 class="popup-title" tabindex="-1">
|
||||
{$t("dialog.saving.title")}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="action-buttons">
|
||||
{#if device.supports.directDownload}
|
||||
<VerticalActionButton
|
||||
id="save-download"
|
||||
fill
|
||||
elevated
|
||||
click={() => openURL(url)}
|
||||
>
|
||||
<IconDownload />
|
||||
{$t("dialog.button.download")}
|
||||
</VerticalActionButton>
|
||||
{/if}
|
||||
|
||||
{#if device.supports.share}
|
||||
<VerticalActionButton
|
||||
id="save-share"
|
||||
fill
|
||||
elevated
|
||||
click={async () => await shareURL(url)}
|
||||
>
|
||||
<IconShare2 />
|
||||
{$t("dialog.button.share")}
|
||||
</VerticalActionButton>
|
||||
{/if}
|
||||
|
||||
<VerticalActionButton
|
||||
id="save-copy"
|
||||
fill
|
||||
elevated
|
||||
click={async () => {
|
||||
copyURL(url);
|
||||
copied = true;
|
||||
}}
|
||||
ariaLabel={copied ? $t("a11y.dialog.saving.copied") : ""}
|
||||
>
|
||||
<CopyIcon check={copied} />
|
||||
{$t("dialog.button.copy")}
|
||||
</VerticalActionButton>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{#if bodyText}
|
||||
<div class="body-text">
|
||||
{bodyText}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<DialogButtons
|
||||
buttons={[
|
||||
{
|
||||
text: $t("dialog.button.done"),
|
||||
main: true,
|
||||
action: () => {},
|
||||
},
|
||||
]}
|
||||
closeFunc={close}
|
||||
/>
|
||||
</div>
|
||||
</DialogContainer>
|
||||
|
||||
<style>
|
||||
.popup-body,
|
||||
.dialog-inner-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--padding);
|
||||
}
|
||||
|
||||
.dialog-inner-container {
|
||||
overflow-y: scroll;
|
||||
gap: 8px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.popup-body {
|
||||
max-width: 340px;
|
||||
width: calc(100% - var(--padding) - var(--dialog-padding) * 2);
|
||||
max-height: 50%;
|
||||
margin: calc(var(--padding) / 2);
|
||||
}
|
||||
|
||||
.meowbalt-container {
|
||||
position: absolute;
|
||||
top: -126px;
|
||||
right: 0;
|
||||
/* simulate meowbalt being behind the popup */
|
||||
clip-path: inset(0px 0px 14px 0px);
|
||||
}
|
||||
|
||||
.popup-header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: calc(var(--padding) / 2);
|
||||
color: var(--secondary);
|
||||
}
|
||||
|
||||
.popup-header :global(svg) {
|
||||
height: 21px;
|
||||
width: 21px;
|
||||
}
|
||||
|
||||
.popup-title {
|
||||
color: var(--secondary);
|
||||
font-size: 19px;
|
||||
}
|
||||
|
||||
.popup-title:focus-visible {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: calc(var(--padding) / 2);
|
||||
overflow-x: scroll;
|
||||
}
|
||||
|
||||
.body-text {
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
line-height: 1.5;
|
||||
color: var(--gray);
|
||||
white-space: pre-wrap;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
</style>
|
121
web/src/components/dialog/SmallDialog.svelte
Normal file
121
web/src/components/dialog/SmallDialog.svelte
Normal file
|
@ -0,0 +1,121 @@
|
|||
<script lang="ts">
|
||||
import type { Optional } from "$lib/types/generic";
|
||||
import type { MeowbaltEmotions } from "$lib/types/meowbalt";
|
||||
import type { DialogButton, SmallDialogIcons } from "$lib/types/dialog";
|
||||
|
||||
import DialogContainer from "$components/dialog/DialogContainer.svelte";
|
||||
|
||||
import Meowbalt from "$components/misc/Meowbalt.svelte";
|
||||
import DialogButtons from "$components/dialog/DialogButtons.svelte";
|
||||
|
||||
import IconAlertTriangle from "@tabler/icons-svelte/IconAlertTriangle.svelte";
|
||||
|
||||
export let id: string;
|
||||
export let meowbalt: Optional<MeowbaltEmotions> = undefined;
|
||||
export let icon: Optional<SmallDialogIcons> = undefined;
|
||||
export let title = "";
|
||||
export let bodyText = "";
|
||||
export let bodySubText = "";
|
||||
export let buttons: Optional<DialogButton[]> = undefined;
|
||||
|
||||
let close: () => void;
|
||||
</script>
|
||||
|
||||
<DialogContainer {id} bind:close>
|
||||
<div class="dialog-body small-dialog" class:meowbalt-visible={meowbalt}>
|
||||
{#if meowbalt}
|
||||
<div class="meowbalt-container">
|
||||
<Meowbalt emotion={meowbalt} />
|
||||
</div>
|
||||
{/if}
|
||||
<div class="dialog-inner-container">
|
||||
{#if title || icon}
|
||||
<div class="popup-header">
|
||||
{#if icon === "warn-red"}
|
||||
<div class="popup-icon {icon}">
|
||||
<IconAlertTriangle />
|
||||
</div>
|
||||
{/if}
|
||||
{#if title}
|
||||
<h2 class="popup-title" tabindex="-1">{title}</h2>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
{#if bodyText}
|
||||
<div class="body-text" tabindex="-1">{bodyText}</div>
|
||||
{/if}
|
||||
{#if bodySubText}
|
||||
<div class="subtext">{bodySubText}</div>
|
||||
{/if}
|
||||
</div>
|
||||
{#if buttons}
|
||||
<DialogButtons {buttons} closeFunc={close} />
|
||||
{/if}
|
||||
</div>
|
||||
</DialogContainer>
|
||||
|
||||
<style>
|
||||
.small-dialog,
|
||||
.dialog-inner-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--padding);
|
||||
}
|
||||
|
||||
.dialog-inner-container {
|
||||
overflow-y: scroll;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.small-dialog {
|
||||
text-align: center;
|
||||
max-width: 340px;
|
||||
width: calc(100% - var(--padding) - var(--dialog-padding) * 2);
|
||||
max-height: 50%;
|
||||
margin: calc(var(--padding) / 2);
|
||||
}
|
||||
|
||||
.small-dialog.meowbalt-visible {
|
||||
padding-top: calc(var(--padding) * 4);
|
||||
}
|
||||
|
||||
.meowbalt-container {
|
||||
position: absolute;
|
||||
top: -120px;
|
||||
}
|
||||
|
||||
.popup-title {
|
||||
color: var(--secondary);
|
||||
font-size: 19px;
|
||||
}
|
||||
|
||||
.popup-header,
|
||||
.popup-icon {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.popup-icon.warn-red :global(svg) {
|
||||
stroke-width: 1.5px;
|
||||
height: 50px;
|
||||
width: 50px;
|
||||
stroke: var(--red);
|
||||
}
|
||||
|
||||
.body-text {
|
||||
font-size: 14.5px;
|
||||
font-weight: 500;
|
||||
line-height: 1.7;
|
||||
color: var(--gray);
|
||||
white-space: pre-wrap;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
.body-text:focus-visible,
|
||||
.popup-title:focus-visible {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
</style>
|
54
web/src/components/misc/CopyIcon.svelte
Normal file
54
web/src/components/misc/CopyIcon.svelte
Normal file
|
@ -0,0 +1,54 @@
|
|||
<script lang="ts">
|
||||
import IconCopy from "@tabler/icons-svelte/IconCopy.svelte";
|
||||
import IconCheck from "@tabler/icons-svelte/IconCheck.svelte";
|
||||
|
||||
export let check = false;
|
||||
</script>
|
||||
|
||||
<div id="copy-animation" class:check>
|
||||
<div class="icon-copy">
|
||||
<IconCopy />
|
||||
</div>
|
||||
<div class="icon-check">
|
||||
<IconCheck />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#copy-animation {
|
||||
position: relative;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
#copy-animation :global(svg) {
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.icon-copy,
|
||||
.icon-check {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
transition: transform 0.25s, opacity 0.25s;
|
||||
}
|
||||
|
||||
.icon-copy {
|
||||
transform: none;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.icon-check {
|
||||
transform: scale(0.4);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.check .icon-copy {
|
||||
transform: scale(0.4);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.check .icon-check {
|
||||
transform: none;
|
||||
opacity: 1;
|
||||
}
|
||||
</style>
|
35
web/src/components/misc/Meowbalt.svelte
Normal file
35
web/src/components/misc/Meowbalt.svelte
Normal file
|
@ -0,0 +1,35 @@
|
|||
<script lang="ts">
|
||||
import { t } from "$lib/i18n/translations";
|
||||
|
||||
import type { MeowbaltEmotions } from "$lib/types/meowbalt";
|
||||
|
||||
export let emotion: MeowbaltEmotions;
|
||||
</script>
|
||||
|
||||
<img
|
||||
class="meowbalt {emotion}"
|
||||
src="/meowbalt/{emotion}.png"
|
||||
height="152"
|
||||
alt={$t('general.meowbalt')}
|
||||
aria-hidden="true"
|
||||
/>
|
||||
|
||||
<style>
|
||||
.meowbalt {
|
||||
display: block;
|
||||
margin: 0;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.error {
|
||||
height: 160px;
|
||||
}
|
||||
|
||||
.question {
|
||||
height: 140px;
|
||||
}
|
||||
|
||||
.error {
|
||||
margin-left: 25px;
|
||||
}
|
||||
</style>
|
99
web/src/components/misc/NotchSticker.svelte
Normal file
99
web/src/components/misc/NotchSticker.svelte
Normal file
|
@ -0,0 +1,99 @@
|
|||
<script lang="ts">
|
||||
import { onMount } from "svelte";
|
||||
|
||||
import CobaltSticker from "$lib/icons/CobaltSticker.svelte";
|
||||
|
||||
// please add a source link (https://github.com/imputnet/cobalt) if you use this implementation
|
||||
// i spent 4 hours switching between simulators and devices to get the best way to do this
|
||||
|
||||
$: safeAreaTop = 0;
|
||||
$: state = "hidden"; // "notch", "island", "notch x"
|
||||
|
||||
const islandValues = [
|
||||
59, // regular & plus: default
|
||||
48, // regular: larger text
|
||||
51, // plus only: larger text
|
||||
];
|
||||
|
||||
const xNotch = [44];
|
||||
|
||||
const getSafeAreaTop = () => {
|
||||
const root = document.documentElement;
|
||||
return getComputedStyle(root)
|
||||
.getPropertyValue("--safe-area-inset-top")
|
||||
.trim();
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
safeAreaTop = Number(getSafeAreaTop().replace("px", ""));
|
||||
});
|
||||
|
||||
$: if (safeAreaTop > 20) {
|
||||
state = "notch";
|
||||
if (islandValues.includes(safeAreaTop)) {
|
||||
state = "island";
|
||||
}
|
||||
if (xNotch.includes(safeAreaTop)) {
|
||||
state = "notch x";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if state !== "hidden"}
|
||||
<div id="cobalt-notch-sticker" aria-hidden="true" class={state}>
|
||||
<CobaltSticker />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
#cobalt-notch-sticker {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
#cobalt-notch-sticker.island {
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
#cobalt-notch-sticker.notch {
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
#cobalt-notch-sticker.notch.x :global(svg) {
|
||||
height: 28px;
|
||||
}
|
||||
|
||||
#cobalt-notch-sticker :global(svg) {
|
||||
width: 100px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
/* regular iphone size, larger text display mode */
|
||||
@media screen and (max-width: 350px) {
|
||||
#cobalt-notch-sticker.notch :global(svg) {
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
#cobalt-notch-sticker.island {
|
||||
padding-top: 9px;
|
||||
}
|
||||
}
|
||||
|
||||
/* plus iphone size, dynamic island, larger text display mode */
|
||||
@media screen and (max-width: 375px) {
|
||||
#cobalt-notch-sticker.island {
|
||||
padding-top: 11px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (orientation: landscape) {
|
||||
#cobalt-notch-sticker {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
12
web/src/components/misc/OuterLink.svelte
Normal file
12
web/src/components/misc/OuterLink.svelte
Normal file
|
@ -0,0 +1,12 @@
|
|||
<script lang="ts">
|
||||
export let href: string;
|
||||
|
||||
// rel is passed by MDsveX, but we don't need it, so we just ignore it
|
||||
// no way to change this behavior atm (https://github.com/pngwn/MDsveX/issues/609)
|
||||
export let rel: string = "";
|
||||
rel;
|
||||
</script>
|
||||
|
||||
<a target="_blank" rel="noopener noreferrer" {href}>
|
||||
<slot></slot>
|
||||
</a>
|
19
web/src/components/misc/Placeholder.svelte
Normal file
19
web/src/components/misc/Placeholder.svelte
Normal file
|
@ -0,0 +1,19 @@
|
|||
<script>
|
||||
import Meowbalt from "$components/misc/Meowbalt.svelte";
|
||||
|
||||
export let pageName;
|
||||
</script>
|
||||
|
||||
<div id="placeholder-container" class="center-column-container">
|
||||
<Meowbalt emotion="smile" />
|
||||
<div tabindex="-1" data-first-focus data-focus-ring-hidden>
|
||||
{`${pageName} page is not ready yet!`}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#placeholder-container {
|
||||
gap: calc(var(--padding) * 2);
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
78
web/src/components/misc/Skeleton.svelte
Normal file
78
web/src/components/misc/Skeleton.svelte
Normal file
|
@ -0,0 +1,78 @@
|
|||
<script lang="ts">
|
||||
import type { Optional } from "$lib/types/generic";
|
||||
|
||||
export let width: Optional<string> = undefined;
|
||||
export let height: Optional<string> = undefined;
|
||||
export let hidden: Optional<boolean> = undefined;
|
||||
|
||||
let _class = '';
|
||||
export { _class as class };
|
||||
|
||||
$: style = [
|
||||
width && `width: ${width}`,
|
||||
height && `height: ${height}`
|
||||
].filter(a => a).join(';');
|
||||
</script>
|
||||
|
||||
{#if hidden !== true}
|
||||
<div
|
||||
class="skeleton {_class}"
|
||||
{style}
|
||||
{...$$restProps}
|
||||
></div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
.skeleton {
|
||||
border-radius: calc(var(--border-radius) / 2);
|
||||
background-color: var(--button);
|
||||
background-image: var(--skeleton-gradient);
|
||||
background-size: 200px 100%;
|
||||
background-repeat: no-repeat;
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
animation: skeleton 1.2s ease-in-out infinite;
|
||||
line-height: 1;
|
||||
font-size: 1em;
|
||||
text-align: center;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
:global([data-theme=light]) .skeleton {
|
||||
background-color: var(--button-hover);
|
||||
}
|
||||
|
||||
.skeleton.elevated {
|
||||
background-image: var(--skeleton-gradient-elevated);
|
||||
background-color: var(--button-elevated);
|
||||
}
|
||||
|
||||
:global([data-reduce-motion="true"]) .skeleton {
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
.skeleton.big {
|
||||
border-radius: var(--border-radius);
|
||||
background-size: 400px 100%;
|
||||
animation: skeleton-big 1.2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes skeleton {
|
||||
0% {
|
||||
background-position: -200px 0;
|
||||
}
|
||||
100% {
|
||||
background-position: calc(200px + 100%) 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes skeleton-big {
|
||||
0% {
|
||||
background-position: -400px 0;
|
||||
}
|
||||
100% {
|
||||
background-position: calc(400px + 100%) 0;
|
||||
}
|
||||
}
|
||||
</style>
|
42
web/src/components/misc/Toggle.svelte
Normal file
42
web/src/components/misc/Toggle.svelte
Normal file
|
@ -0,0 +1,42 @@
|
|||
<script lang="ts">
|
||||
export let enabled;
|
||||
</script>
|
||||
|
||||
<div class="toggle" class:enabled={enabled}>
|
||||
<div class="toggle-switcher"></div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.toggle {
|
||||
--base-size: 22px;
|
||||
--ratio-factor: 0.9;
|
||||
|
||||
display: flex;
|
||||
justify-content: start;
|
||||
align-items: center;
|
||||
min-width: calc(var(--base-size) * (1 + var(--ratio-factor)));
|
||||
padding: 2px;
|
||||
aspect-ratio: 2/1;
|
||||
border-radius: 5px;
|
||||
border-radius: 100px;
|
||||
background: var(--toggle-bg);
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.toggle-switcher {
|
||||
height: var(--base-size);
|
||||
width: var(--base-size);
|
||||
background: var(--white);
|
||||
border-radius: 100px;
|
||||
transform: translateX(0%);
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
|
||||
.toggle.enabled {
|
||||
background: var(--toggle-bg-enabled);
|
||||
}
|
||||
|
||||
.toggle.enabled .toggle-switcher {
|
||||
transform: translateX(calc(100% * var(--ratio-factor)));
|
||||
}
|
||||
</style>
|
102
web/src/components/misc/UpdateNotification.svelte
Normal file
102
web/src/components/misc/UpdateNotification.svelte
Normal file
|
@ -0,0 +1,102 @@
|
|||
<script lang="ts">
|
||||
import { t } from "$lib/i18n/translations";
|
||||
|
||||
import IconComet from "@tabler/icons-svelte/IconComet.svelte";
|
||||
</script>
|
||||
|
||||
<div id="update-notification">
|
||||
<button class="update-button" on:click={() => window.location.reload()}>
|
||||
<div class="update-icon">
|
||||
<IconComet />
|
||||
</div>
|
||||
<div class="update-text">
|
||||
<div>{$t("notification.update.title")}</div>
|
||||
<div class="subtext">{$t("notification.update.subtext")}</div>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#update-notification {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
justify-content: end;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
pointer-events: none;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.update-button {
|
||||
padding: 8px 12px 8px 8px;
|
||||
pointer-events: all;
|
||||
gap: 8px;
|
||||
margin: var(--padding);
|
||||
margin-top: calc(env(safe-area-inset-top) + var(--padding));
|
||||
box-shadow:
|
||||
var(--button-box-shadow),
|
||||
0 0 10px 0px var(--button-elevated-hover);
|
||||
border-radius: 14px;
|
||||
animation: slide-in-top 0.4s;
|
||||
}
|
||||
|
||||
.update-icon {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: var(--button-elevated-hover);
|
||||
padding: 3px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.update-icon :global(svg) {
|
||||
stroke-width: 1.5px;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.update-text {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
text-align: left;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.subtext {
|
||||
padding: 0;
|
||||
user-select: none;
|
||||
-webkit-user-select: none;
|
||||
}
|
||||
|
||||
.update-text,
|
||||
.subtext {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
@keyframes slide-in-top {
|
||||
from {
|
||||
transform: translateY(-150px);
|
||||
}
|
||||
100% {
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 535px) {
|
||||
#update-notification {
|
||||
bottom: var(--sidebar-height-mobile);
|
||||
justify-content: center;
|
||||
animation: slide-in-bottom 0.4s;
|
||||
}
|
||||
|
||||
@keyframes slide-in-bottom {
|
||||
from {
|
||||
transform: translateY(300px);
|
||||
}
|
||||
100% {
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue