- updated readme: added info about new services, sorted the list alphabetically, replaced emoji with checkmarks, added info about ncsd (#101), and more.
- fixed typos in vk and setup modules.
- removed unused variables from css.
This commit is contained in:
wukko 2023-05-08 14:40:38 +06:00
parent a25615982c
commit 71cc5305b4
5 changed files with 53 additions and 61 deletions

101
README.md
View file

@ -1,70 +1,60 @@
# cobalt # cobalt
Best way to save what you love. Best way to save what you love.
Main instance: [co.wukko.me](https://co.wukko.me/)
Live: [co.wukko.me](https://co.wukko.me/) ![cobalt logo with repeated logo pattern background](https://raw.githubusercontent.com/wukko/cobalt/current/src/front/icons/pattern.png "cobalt logo with repeated logo pattern background")
![cobalt logo with repeated logo pattern background](https://raw.githubusercontent.com/wukko/cobalt/current/src/front/icons/pattern.png "cobalt logo with repeated logo pattern background")
[![Crowdin](https://badges.crowdin.net/cobalt/localized.svg)](https://crowdin.com/project/cobalt) [![DeepSource](https://deepsource.io/gh/wukko/cobalt.svg/?label=active+issues&token=MsmsJ9zUOKwcQor0yaiFot84)](https://deepsource.io/gh/wukko/cobalt/?ref=repository-badge) [![DeepSource](https://deepsource.io/gh/wukko/cobalt.svg/?label=resolved+issues&token=MsmsJ9zUOKwcQor0yaiFot84)](https://deepsource.io/gh/wukko/cobalt/?ref=repository-badge) [![Crowdin](https://badges.crowdin.net/cobalt/localized.svg)](https://crowdin.com/project/cobalt) [![DeepSource](https://deepsource.io/gh/wukko/cobalt.svg/?label=active+issues&token=MsmsJ9zUOKwcQor0yaiFot84)](https://deepsource.io/gh/wukko/cobalt/?ref=repository-badge) [![DeepSource](https://deepsource.io/gh/wukko/cobalt.svg/?label=resolved+issues&token=MsmsJ9zUOKwcQor0yaiFot84)](https://deepsource.io/gh/wukko/cobalt/?ref=repository-badge)
## What's cobalt? ## What's cobalt?
cobalt is a social and media platform downloader that doesn't piss you off. cobalt is a social and media platform downloader that doesn't piss you off.
It's fast, friendly, and doesn't have any bullshit that modern web is filled with: no ads, trackers, or analytics. Paste the link, get the video, move on. It's that simple. Just how it should be. It's fast, friendly, and doesn't have any bullshit that modern web is filled with: no ads, trackers, or analytics.
Paste the link, get the video, move on. It's that simple. Just how it should be.
## Supported services ## Supported services
| Service | Video + Audio | Only audio | Additional features | | Service | Video + Audio | Only audio | Only video | Additional notes or features |
| -------- | :---: | :---: | :----- | | -------- | :---: | :---: | :---: | :----- |
| Twitter | ✅ | ✅ | Ability to save multiple videos/GIFs from a single tweet. | | bilibili.com | [x] | [x] | [x] | |
| Twitter Spaces | ❌️ | ✅ | Audio metadata. | | Instagram | [x] | [x] | [x] | Ability to pick what to save from multi-media posts. |
| YouTube & Shorts | ✅ | ✅ | Support for 8K, 4K, HDR, and high FPS videos. Audio metadata & dubs. h264/av1/vp9 codecs. | | Instagram Reels | [x] | [x] | [x] | |
| YouTube Music | ❌ | ✅ | Audio metadata. | | Reddit | [x] | [x] | [x] | Support for GIFs and videos. |
| Reddit | ✅ | ✅ | GIFs and videos. | | SoundCloud | - | [x] | - | Audio metadata, downloads from private links. |
| TikTok | ✅ | ✅ | Video downloads with or without watermark; image slideshow downloads without watermark. Full audio downloads. | | TikTok | [x] | [x] | [x] | Supports downloads of: videos with or without watermark, images from slideshow without watermark, full (original) audios. |
| SoundCloud | ❌ | ✅ | Audio metadata, downloads from private links. | | Tumblr | [x] | [x] | [x] | |
| bilibili.com | ✅ | ✅ | | | Twitter | [x] | [x] | [x] | Ability to pick what to save from multi-media tweets. |
| Tumblr | ✅ | ✅ | | | Twitter Spaces | [x] | [x] | [x] | Audio metadata with all participants and other info. |
| Vimeo | ✅ | ❌️ | | | Vimeo | [x] | [x] | [x] | Audio downloads are only available for dash files. |
| VK Videos & Clips | ✅ | ❌️ | | | Vine Archive | [x] | [x] | [x] | |
| VK Videos | [x] | [ ] | [ ] | |
| VK Clips | [x] | [ ] | [ ] | |
| YouTube Videos & Shorts | [x] | [x] | [x] | Support for 8K, 4K, HDR, and high FPS videos. Audio metadata & dubs. h264/av1/vp9 codecs. |
| YouTube Music | - | [x] | - | Audio metadata. |
This list is not final and keeps expanding over time, make sure to check it once in a while!
## cobalt API ## cobalt API
cobalt has an open API that you can use for free. It's easy and straightforward to use, [check out the docs](https://github.com/wukko/cobalt/blob/current/docs/API.md) and see for yourself. cobalt has an open API that you can use in your projects for **free**.
It's easy and straightforward to use, [check out the docs](https://github.com/wukko/cobalt/blob/current/docs/API.md) and see for yourself.
## How to contribute translations ## How to contribute translations
You can translate cobalt to any language you want on [cobalt's Crowdin](https://crowdin-co.wukko.me/). Feel free to ignore QA errors if you think you know better. If you don't see a language you want to translate cobalt to, open an issue, and I'll add it to Crowdin. You can translate cobalt to any language you want on [cobalt's Crowdin](https://crowdin-co.wukko.me/). Feel free to ignore QA errors if you think you know better. If you don't see a language you want to translate cobalt to, open an issue, and I'll add it to Crowdin.
### Translation guidelines: ### Translation guidelines:
- All text is **ALWAYS** stylized as **lowercase** unless it's STRESSED LIKE THIS or is an internal value like `{ContactLink}` or `{appName}`. - Text is **ALWAYS** stylized as **lowercase** unless it's STRESSED LIKE THIS or is an internal value like `{ContactLink}` or `{appName}`.
- Example: "`this is a live video, i am yet to learn how to look into future. wait for the stream to finish and try again!`". - Example: "`this is a live video, i am yet to learn how to look into future. wait for the stream to finish and try again!`".
Notice how **everything is lowercase**, no matter the punctuation marks? Yes, that's cobalt's style and you have to follow it. *Notice how **everything is lowercase**, no matter the punctuation marks? Yes, that's cobalt's style and you have to follow it.*
- Avoid formal language. Leave it for big and classy tech companies. Use informal language wherever possible. - Avoid extremely formal language, leave it for big and classy tech companies. Use informal language wherever possible.
- Keep translations lively, friendly, and fun. Translate strings as if the user was your buddy.
- You can (and should) rephrase sentences as long as they keep the same sense and send the same message as original. - You can (and should) rephrase sentences as long as they keep the same sense and send the same message as original.
- You can add wordplays or puns if it feels natural to do so.
- Do **NOT** use offensive or explicit vocabulary. - Do **NOT** use offensive or explicit vocabulary.
- Check if there are issues in UI with your localization, and optimize it accordingly. If impossible, open an issue. - Check if there are issues in UI with your localization and optimize it accordingly. If impossible, open an issue.
- Be nice. - Be nice.
## Host an instance yourself ## Host an instance yourself
You might find cobalt's source code a bit messy, but I do my best to improve it with every commit.
### Requirements ### Requirements
- Node.js 17.5 or above - Node.js 18 or above
- git - git
### npm modules
- cors
- dotenv
- esbuild
- express
- express-rate-limit
- ffmpeg-static
- got
- node-cache
- url-pattern
- xml-js
- youtubei.js
Setup script installs all needed `npm` dependencies, but you have to install `Node.js` and `git` yourself. Setup script installs all needed `npm` dependencies, but you have to install `Node.js` and `git` yourself.
1. Clone the repo: `git clone https://github.com/wukko/cobalt` 1. Clone the repo: `git clone https://github.com/wukko/cobalt`
@ -72,20 +62,27 @@ Setup script installs all needed `npm` dependencies, but you have to install `No
3. Run cobalt via `npm start` 3. Run cobalt via `npm start`
4. Done. 4. Done.
### Ubuntu 22.04+ workaround
`nscd` needs to be installed and running so that the `ffmpeg-static` binary can resolve DNS ([#101](https://github.com/wukko/cobalt/issues/101#issuecomment-1494822258)):
```bash
sudo apt install nscd
sudo service nscd start
```
### Docker ### Docker
It's also possible to host cobalt via a Docker image, but in that case you'd need to set all environment variables by yourself. It's also possible to run cobalt via Docker, but you **need** to set all environment variables yourself:
That includes:
| Variable | Example | | Variable | Description | Example |
| -------- | :--- | | -------- | :--- | :--- |
| `selfURL` | `https://co.wukko.me/` | | `selfURL` | Instance URL | `http://localhost:9000/` or `https://co.wukko.me/` or etc |
| `port` | `9000` | | `port` | Instance port | `9000` |
| `streamSalt` | `randomly generated sha512 hash` | | `cors` | CORS toggle | `0` |
| `cors` | `0` |
## Disclaimer ## Disclaimer
cobalt is my passion project, so update release schedule depends solely on my motivation, free time, and mood. Don't expect any consistency in that. cobalt is my passion project, so update schedule depends solely on my free time, motivation, and mood.
Don't expect any consistency in that.
## License ## License
cobalt is under [AGPL-3.0](https://github.com/wukko/cobalt/blob/current/LICENSE) license. cobalt is under [AGPL-3.0](https://github.com/wukko/cobalt/blob/current/LICENSE) license.
[Fluent Emoji](https://github.com/microsoft/fluentui-emoji) used in the project is under [MIT](https://github.com/microsoft/fluentui-emoji/blob/main/LICENSE) license. [Fluent Emoji](https://github.com/microsoft/fluentui-emoji) used in the project is under [MIT](https://github.com/microsoft/fluentui-emoji/blob/main/LICENSE) license.

View file

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

View file

@ -7,7 +7,6 @@
--padding-1: 0.75rem; --padding-1: 0.75rem;
--line-height: 1.65rem; --line-height: 1.65rem;
--red: rgb(255, 0, 61); --red: rgb(255, 0, 61);
--color: rgb(107, 67, 139);
--gap: 0.6rem; --gap: 0.6rem;
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@ -19,7 +18,6 @@
--accent-unhover: rgb(100, 100, 100); --accent-unhover: rgb(100, 100, 100);
--accent-unhover-2: rgb(110, 110, 110); --accent-unhover-2: rgb(110, 110, 110);
--background: rgb(0, 0, 0); --background: rgb(0, 0, 0);
--checkmark: url(vectorIcons/checkmark_b.svg);
} }
} }
@media (prefers-color-scheme: light) { @media (prefers-color-scheme: light) {
@ -31,7 +29,6 @@
--accent-unhover: rgb(190, 190, 190); --accent-unhover: rgb(190, 190, 190);
--accent-unhover-2: rgb(110, 110, 110); --accent-unhover-2: rgb(110, 110, 110);
--background: rgb(255, 255, 255); --background: rgb(255, 255, 255);
--checkmark: url(vectorIcons/checkmark.svg);
} }
} }
[data-theme="dark"] { [data-theme="dark"] {
@ -42,7 +39,6 @@
--accent-unhover: rgb(100, 100, 100); --accent-unhover: rgb(100, 100, 100);
--accent-unhover-2: rgb(110, 110, 110); --accent-unhover-2: rgb(110, 110, 110);
--background: rgb(0, 0, 0); --background: rgb(0, 0, 0);
--checkmark: url(vectorIcons/checkmark_b.svg);
} }
[data-theme="light"] { [data-theme="light"] {
--accent: rgb(25, 25, 25); --accent: rgb(25, 25, 25);
@ -52,7 +48,6 @@
--accent-unhover: rgb(190, 190, 190); --accent-unhover: rgb(190, 190, 190);
--accent-unhover-2: rgb(110, 110, 110); --accent-unhover-2: rgb(110, 110, 110);
--background: rgb(255, 255, 255); --background: rgb(255, 255, 255);
--checkmark: url(vectorIcons/checkmark.svg);
} }
html, html,
body { body {

View file

@ -44,7 +44,7 @@ export default async function(o) {
if (Number(bestQuality._attributes.id) > Number(quality)) bestQuality = repr[quality]; if (Number(bestQuality._attributes.id) > Number(quality)) bestQuality = repr[quality];
url = js.player.params[0][`url${resolutionMatch[bestQuality._attributes[resolutionPick]]}`]; url = js.player.params[0][`url${resolutionMatch[bestQuality._attributes[resolutionPick]]}`];
filename = `${bestQuality._attributes.width}x${bestQuality._attributes.height}.mp4` filename += `${bestQuality._attributes.width}x${bestQuality._attributes.height}.mp4`
} else if (js.player.params[0]["url240"]) { // fallback for when video is too old } else if (js.player.params[0]["url240"]) { // fallback for when video is too old
url = js.player.params[0]["url240"]; url = js.player.params[0]["url240"];

View file

@ -1,6 +1,6 @@
import { existsSync, unlinkSync, appendFileSync } from "fs"; import { existsSync, unlinkSync, appendFileSync } from "fs";
import { createInterface } from "readline"; import { createInterface } from "readline";
import { Cyan, Bright, Green } from "./sub/consoleText.js"; import { Cyan, Bright } from "./sub/consoleText.js";
import { execSync } from "child_process"; import { execSync } from "child_process";
let envPath = './.env'; let envPath = './.env';
@ -42,7 +42,7 @@ rl.question(q, r1 => {
if (r2) ob['port'] = r2 if (r2) ob['port'] = r2
if (!r1 && r2) ob['selfURL'] = `http://localhost:${r2}/` if (!r1 && r2) ob['selfURL'] = `http://localhost:${r2}/`
console.log(Bright("\nWould you like to enable CORS? It allows other websites and extensions to use your instance's API.\n y/n (n)")) console.log(Bright("\nWould you like to enable CORS? It allows other websites and extensions to use your instance's API.\ny/n (n)"))
rl.question(q, r3 => { rl.question(q, r3 => {
if (r3.toLowerCase() !== 'y') ob['cors'] = '0' if (r3.toLowerCase() !== 'y') ob['cors'] = '0'