From c8c41c8aaf60b27386c46e6fc270f7c3353b05f4 Mon Sep 17 00:00:00 2001 From: Tanner Sommers Date: Mon, 16 Sep 2024 12:14:10 -0500 Subject: [PATCH] (mostly) remove references to cobalt. Some still remain in code --- .github/ISSUE_TEMPLATE/bug-main-instance.yml | 47 -- .github/ISSUE_TEMPLATE/bug-report.yml | 47 -- .github/ISSUE_TEMPLATE/config.yml | 7 - .github/ISSUE_TEMPLATE/feature-request.yml | 22 - .github/ISSUE_TEMPLATE/hosting-help.yml | 21 - .github/ISSUE_TEMPLATE/service-request.yml | 39 -- .github/test.sh | 67 -- .github/workflows/docker-develop.yml | 55 -- .github/workflows/docker.yml | 59 -- .github/workflows/fast-forward.yml | 22 - .github/workflows/test-services.yml | 33 - .github/workflows/test.yml | 34 - CONTRIBUTING.md | 39 -- LICENSE | 661 ------------------ README.md | 122 ---- api/LICENSE | 661 ------------------ api/README.md | 22 - api/package.json | 12 +- api/src/cobalt.js | 2 +- api/src/config.js | 49 +- api/src/core/api.js | 4 +- api/src/util/setup.js | 158 +++-- docs/api.md | 110 --- docs/examples/cookies.example.json | 14 - docs/examples/docker-compose.example.yml | 33 - .../troubleshooting/clipboard/config.png | Bin 4154 -> 0 bytes .../images/troubleshooting/clipboard/risk.png | Bin 17944 -> 0 bytes .../troubleshooting/clipboard/search.png | Bin 6867 -> 0 bytes .../troubleshooting/clipboard/toggle.png | Bin 18725 -> 0 bytes .../troubleshooting/clipboard/toggled.png | Bin 17312 -> 0 bytes docs/run-an-instance.md | 81 --- docs/troubleshooting.md | 37 - package.json | 2 +- web/LICENSE | 437 ------------ web/README.md | 45 -- web/changelogs/10.0.md | 56 -- web/changelogs/2.0.md | 20 - web/changelogs/2.2.5.md | 17 - web/changelogs/2.2.6.md | 10 - web/changelogs/2.2.8.md | 7 - web/changelogs/2.2.9.md | 10 - web/changelogs/2.2.md | 16 - web/changelogs/3.0.md | 46 -- web/changelogs/3.1.md | 11 - web/changelogs/3.2.md | 12 - web/changelogs/3.4.md | 15 - web/changelogs/3.5.2.md | 17 - web/changelogs/3.5.4.md | 6 - web/changelogs/3.5.md | 20 - web/changelogs/3.6.3.md | 15 - web/changelogs/3.6.md | 11 - web/changelogs/3.7.md | 19 - web/changelogs/4.0.md | 23 - web/changelogs/4.1.md | 11 - web/changelogs/4.2.md | 16 - web/changelogs/4.3.2.md | 14 - web/changelogs/4.3.md | 28 - web/changelogs/4.4.md | 13 - web/changelogs/4.5.md | 34 - web/changelogs/4.6.md | 26 - web/changelogs/4.7.md | 39 -- web/changelogs/4.8.md | 31 - web/changelogs/5.0.md | 42 -- web/changelogs/5.1.md | 47 -- web/changelogs/5.2.md | 54 -- web/changelogs/5.3.md | 21 - web/changelogs/5.4.md | 36 - web/changelogs/6.0.md | 69 -- web/changelogs/6.2.md | 23 - web/changelogs/7.0.md | 84 --- web/changelogs/7.1.md | 28 - web/changelogs/7.11.md | 45 -- web/changelogs/7.13.md | 59 -- web/changelogs/7.14.md | 43 -- web/changelogs/7.3.md | 30 - web/changelogs/7.4.md | 45 -- web/changelogs/7.5.md | 28 - web/changelogs/7.6.md | 33 - web/changelogs/7.7.md | 30 - web/changelogs/7.8.md | 35 - web/changelogs/7.9.md | 33 - web/i18n/en/about.json | 2 +- web/i18n/en/dialog.json | 10 +- web/i18n/en/error.json | 12 +- web/i18n/en/save.json | 6 +- web/i18n/en/settings.json | 16 +- web/package.json | 8 +- 87 files changed, 167 insertions(+), 4157 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug-main-instance.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml delete mode 100644 .github/ISSUE_TEMPLATE/hosting-help.yml delete mode 100644 .github/ISSUE_TEMPLATE/service-request.yml delete mode 100644 .github/test.sh delete mode 100644 .github/workflows/docker-develop.yml delete mode 100644 .github/workflows/docker.yml delete mode 100644 .github/workflows/fast-forward.yml delete mode 100644 .github/workflows/test-services.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 api/LICENSE delete mode 100644 api/README.md delete mode 100644 docs/api.md delete mode 100644 docs/examples/cookies.example.json delete mode 100644 docs/examples/docker-compose.example.yml delete mode 100644 docs/images/troubleshooting/clipboard/config.png delete mode 100644 docs/images/troubleshooting/clipboard/risk.png delete mode 100644 docs/images/troubleshooting/clipboard/search.png delete mode 100644 docs/images/troubleshooting/clipboard/toggle.png delete mode 100644 docs/images/troubleshooting/clipboard/toggled.png delete mode 100644 docs/run-an-instance.md delete mode 100644 docs/troubleshooting.md delete mode 100644 web/LICENSE delete mode 100644 web/README.md delete mode 100644 web/changelogs/10.0.md delete mode 100644 web/changelogs/2.0.md delete mode 100644 web/changelogs/2.2.5.md delete mode 100644 web/changelogs/2.2.6.md delete mode 100644 web/changelogs/2.2.8.md delete mode 100644 web/changelogs/2.2.9.md delete mode 100644 web/changelogs/2.2.md delete mode 100644 web/changelogs/3.0.md delete mode 100644 web/changelogs/3.1.md delete mode 100644 web/changelogs/3.2.md delete mode 100644 web/changelogs/3.4.md delete mode 100644 web/changelogs/3.5.2.md delete mode 100644 web/changelogs/3.5.4.md delete mode 100644 web/changelogs/3.5.md delete mode 100644 web/changelogs/3.6.3.md delete mode 100644 web/changelogs/3.6.md delete mode 100644 web/changelogs/3.7.md delete mode 100644 web/changelogs/4.0.md delete mode 100644 web/changelogs/4.1.md delete mode 100644 web/changelogs/4.2.md delete mode 100644 web/changelogs/4.3.2.md delete mode 100644 web/changelogs/4.3.md delete mode 100644 web/changelogs/4.4.md delete mode 100644 web/changelogs/4.5.md delete mode 100644 web/changelogs/4.6.md delete mode 100644 web/changelogs/4.7.md delete mode 100644 web/changelogs/4.8.md delete mode 100644 web/changelogs/5.0.md delete mode 100644 web/changelogs/5.1.md delete mode 100644 web/changelogs/5.2.md delete mode 100644 web/changelogs/5.3.md delete mode 100644 web/changelogs/5.4.md delete mode 100644 web/changelogs/6.0.md delete mode 100644 web/changelogs/6.2.md delete mode 100644 web/changelogs/7.0.md delete mode 100644 web/changelogs/7.1.md delete mode 100644 web/changelogs/7.11.md delete mode 100644 web/changelogs/7.13.md delete mode 100644 web/changelogs/7.14.md delete mode 100644 web/changelogs/7.3.md delete mode 100644 web/changelogs/7.4.md delete mode 100644 web/changelogs/7.5.md delete mode 100644 web/changelogs/7.6.md delete mode 100644 web/changelogs/7.7.md delete mode 100644 web/changelogs/7.8.md delete mode 100644 web/changelogs/7.9.md diff --git a/.github/ISSUE_TEMPLATE/bug-main-instance.yml b/.github/ISSUE_TEMPLATE/bug-main-instance.yml deleted file mode 100644 index 5763dbe..0000000 --- a/.github/ISSUE_TEMPLATE/bug-main-instance.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: main instance bug report -description: "report an issue with cobalt.tools or api.cobalt.tools" -labels: ["main instance issue"] -body: - - type: textarea - id: bug-description - attributes: - label: bug description - description: "clear and concise description of what the issue is." - validations: - required: true - - type: textarea - id: repro-steps - attributes: - label: reproduction steps - description: steps to reproduce the described behavior. - placeholder: | - 1. go to '...' - 2. click on '....' - 3. download [media type] from [service] - 4. see error - validations: - required: true - - type: textarea - id: screenshots - attributes: - label: screenshots - description: if applicable, add screenshots or screen recordings to support your explanation. - - type: textarea - id: links - attributes: - label: links - description: if applicable, add links that cause the issue. more = better. - render: shell - - type: input - id: platform - attributes: - label: platform information - description: "the operating system, browser and their versions where you encounter the issue" - placeholder: safari 7 on mac os x 10.8 - validations: - required: true - - type: textarea - id: more-context - attributes: - label: additional context - description: add any other context about the problem here if applicable. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml deleted file mode 100644 index 3161dcd..0000000 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: bug report -description: report a global issue with the cobalt codebase -labels: ["bug"] -body: - - type: textarea - id: bug-description - attributes: - label: bug description - description: "clear and concise description of what the issue is." - validations: - required: true - - type: textarea - id: repro-steps - attributes: - label: reproduction steps - description: steps to reproduce the described behavior. - placeholder: | - 1. go to '...' - 2. click on '....' - 3. download [media type] from [service] - 4. see error - validations: - required: true - - type: textarea - id: screenshots - attributes: - label: screenshots - description: if applicable, add screenshots or screen recordings to support your explanation. - - type: textarea - id: links - attributes: - label: links - description: if applicable, add links that cause the issue. more = better. - render: shell - - type: input - id: platform - attributes: - label: platform information - description: "the operating system, browser and their versions where you encounter the issue" - placeholder: safari 7 on mac os x 10.8 - validations: - required: true - - type: textarea - id: more-context - attributes: - label: additional context - description: add any other context about the problem here if applicable. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index dfa685c..0000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,7 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: discord community - url: https://discord.gg/pQPt8HBUPu - about: | - ask questions and discuss cobalt with others at any time. - usually faster responses as more people are there to help. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml deleted file mode 100644 index f91c730..0000000 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: feature request -description: suggest a feature for cobalt -labels: ["feature request"] -body: - - type: markdown - attributes: - value: | - thanks for taking the time to make a feature request! - before you start, please make to read the "adding features or support for services" section of - our [contributor guidelines](https://github.com/imputnet/cobalt/blob/main/CONTRIBUTING.md#adding-features-or-support-for-services) to make sure your request is a good fit for cobalt. - - type: textarea - id: feat-description - attributes: - label: describe the feature you'd like to see - description: "clear and concise description of the feature you want to see in cobalt." - validations: - required: true - - type: textarea - id: more-context - attributes: - label: additional context - description: add any other context about the problem here if applicable. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/hosting-help.yml b/.github/ISSUE_TEMPLATE/hosting-help.yml deleted file mode 100644 index ea0e43f..0000000 --- a/.github/ISSUE_TEMPLATE/hosting-help.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: instance hosting help -description: ask any question regarding cobalt instance hosting -labels: ["instance hosting help"] -body: - - type: textarea - id: problem-description - attributes: - label: problem description - description: | - describe what issue you're having, clearly and concisely. - support your description with screenshots/links/etc when needed. - validations: - required: true - - type: textarea - id: configuration - attributes: - label: your instance configuration - description: | - if applicable, add or describe your instance configuration (e.g. compose file) or any changes you made to it. - please **do not share senstive information** such as secret keys or the contents of your cookies file! - render: shell \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/service-request.yml b/.github/ISSUE_TEMPLATE/service-request.yml deleted file mode 100644 index 068ac5a..0000000 --- a/.github/ISSUE_TEMPLATE/service-request.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: service request -description: "request service support in cobalt" -title: "add support for [service name]" -labels: ["service request"] -body: - - type: markdown - attributes: - value: | - thanks for taking the time to make a service request! - before you start, please make to read the "adding features or support for services" section of - our [contributor guidelines](https://github.com/imputnet/cobalt/blob/main/CONTRIBUTING.md#adding-features-or-support-for-services) to make sure your request is a good fit for cobalt. - - type: input - id: service-name - attributes: - label: service name - validations: - required: true - - type: textarea - id: service-description - attributes: - label: service description - description: a brief description of what the service is and/or what it provides - validations: - required: true - - type: textarea - id: link-samples - attributes: - label: link samples - description: | - list of links that cobalt should recognize. - could be regular video link, shared video link, mobile video link, shortened link, etc. - render: shell - validations: - required: true - - type: textarea - id: more-context - attributes: - label: additional context - description: any additional context or screenshots should go here. diff --git a/.github/test.sh b/.github/test.sh deleted file mode 100644 index 3d175da..0000000 --- a/.github/test.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash -set -e - -# thx: https://stackoverflow.com/a/27601038 -waitport() { - ATTEMPTS=50 - while [ $((ATTEMPTS-=1)) -gt 0 ] && ! nc -z localhost $1; do - sleep 0.1 - done - - [ "$ATTEMPTS" != 0 ] || exit 1 -} - -test_api() { - waitport 3000 - curl -m 3 http://localhost:3000/ - API_RESPONSE=$(curl -m 10 http://localhost:3000/ \ - -X POST \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -d '{"url":"https://www.tiktok.com/@fatfatmillycat/video/7195741644585454894"}') - - echo "API_RESPONSE=$API_RESPONSE" - STATUS=$(echo "$API_RESPONSE" | jq -r .status) - STREAM_URL=$(echo "$API_RESPONSE" | jq -r .url) - [ "$STATUS" = tunnel ] || exit 1; - S=$(curl -I -m 10 "$STREAM_URL") - - CONTENT_LENGTH=$(echo "$S" \ - | grep -i content-length \ - | cut -d' ' -f2 \ - | tr -d '\r') - - echo "$CONTENT_LENGTH" - [ "$CONTENT_LENGTH" = 0 ] && exit 1 - if [ "$CONTENT_LENGTH" -lt 512 ]; then - exit 1 - fi -} - -setup_api() { - export API_PORT=3000 - export API_URL=http://localhost:3000 - timeout 10 pnpm run --prefix api start & - API_PID=$! -} - -setup_web() { - pnpm run --prefix web build -} - -cd "$(git rev-parse --show-toplevel)" -pnpm install --frozen-lockfile - -if [ "$1" = "api" ]; then - setup_api - test_api - [ "$API_PID" != "" ] \ - && kill "$API_PID" -elif [ "$1" = "web" ]; then - setup_web -else - echo "usage: $0 " >&2 - exit 1 -fi - -wait || exit $? diff --git a/.github/workflows/docker-develop.yml b/.github/workflows/docker-develop.yml deleted file mode 100644 index e89eeae..0000000 --- a/.github/workflows/docker-develop.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build Docker development image - -on: - workflow_dispatch: - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - -jobs: - build-and-push-image: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get release metadata - id: release-meta - run: | - version=$(cat package.json | jq -r .version) - echo "commit_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - echo "version=$version" >> $GITHUB_OUTPUT - echo "major_version=$(echo "$version" | cut -d. -f1)" >> $GITHUB_OUTPUT - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - tags: type=raw,value=develop - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - - - name: Build and push Docker image - uses: docker/build-push-action@v6 - with: - context: . - platforms: linux/amd64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index 8dadd1d..0000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Build Docker image - -on: - workflow_dispatch: - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - -jobs: - build-and-push-image: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get release metadata - id: release-meta - run: | - version=$(cat api/package.json | jq -r .version) - echo "commit_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - echo "version=$version" >> $GITHUB_OUTPUT - echo "major_version=$(echo "$version" | cut -d. -f1)" >> $GITHUB_OUTPUT - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v5 - with: - tags: | - type=raw,value=latest - type=raw,value=${{ steps.release-meta.outputs.version }} - type=raw,value=${{ steps.release-meta.outputs.major_version }} - type=raw,value=${{ steps.release-meta.outputs.version }}-${{ steps.release-meta.outputs.commit_short }} - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - - - name: Build and push Docker image - uses: docker/build-push-action@v6 - with: - context: . - platforms: linux/amd64,linux/arm64,linux/arm/v7 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/.github/workflows/fast-forward.yml b/.github/workflows/fast-forward.yml deleted file mode 100644 index adda8f3..0000000 --- a/.github/workflows/fast-forward.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: fast-forward -on: - issue_comment: - types: [created, edited] -jobs: - fast-forward: - # Only run if the comment contains the /fast-forward command. - if: ${{ contains(github.event.comment.body, '/fast-forward') - && github.event.issue.pull_request }} - runs-on: ubuntu-latest - - permissions: - contents: write - pull-requests: write - issues: write - - steps: - - name: Fast forwarding - uses: sequoia-pgp/fast-forward@v1 - with: - merge: true - comment: 'on-error' \ No newline at end of file diff --git a/.github/workflows/test-services.yml b/.github/workflows/test-services.yml deleted file mode 100644 index 6291c73..0000000 --- a/.github/workflows/test-services.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Run service tests - -on: - pull_request: - push: - paths: - - api/** - - packages/** - -jobs: - check-services: - name: test service functionality - runs-on: ubuntu-latest - outputs: - services: ${{ steps.checkServices.outputs.service_list }} - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - id: checkServices - run: pnpm i --frozen-lockfile && echo "service_list=$(node api/src/util/test-ci get-services)" >> "$GITHUB_OUTPUT" - - test-services: - needs: check-services - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - service: ${{ fromJson(needs.check-services.outputs.services) }} - name: "test service: ${{ matrix.service }}" - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - run: pnpm i --frozen-lockfile && node api/src/util/test-ci run-tests-for ${{ matrix.service }} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 2843936..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Run tests - -on: - pull_request: - push: - -jobs: - check-lockfile: - name: check lockfile correctness - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - name: Check that lockfile does not need an update - run: pnpm install --frozen-lockfile - - test-web: - name: web sanity check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 'lts/*' - - uses: pnpm/action-setup@v4 - - run: .github/test.sh web - - test-api: - name: api sanity check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - run: .github/test.sh api \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 2668242..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,39 +0,0 @@ -# contributing to cobalt -if you're reading this, you are probably interested in contributing to cobalt, which we are very thankful for :3 - -this document serves as a guide to help you make contributions that we can merge into the cobalt codebase. - -## translations -currently, we are **not accepting** translations of cobalt. this is because we are making significant changes to the frontend, and the currently used localization structure is being completely reworked. if this changes, this document will be updated. - -## adding features or support for services -before putting in the effort to implement a feature, it's worth considering whether it would be appropriate to add it to cobalt. the cobalt api is built to assist people **only with downloading freely accessible content**. other functionality, such as: -- downloading paid / not publicly accessible content -- downloading content protected by DRM -- scraping unrelated information & exposing it outside of file metadata - -will not be reviewed or merged. - -if you plan on adding a feature or support for a service, but are unsure whether it would be appropriate, it's best to open an issue and discuss it beforehand. - -## git -when contributing code to cobalt, there are a few guidelines in place to ensure that the code history is readable and comprehensible. - -### clean commit messages -internally, we use a format similar to [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) - the first part signifies which part of the code you are changing (the *scope*), and the second part explains the change. for inspiration on how to write appropriate commit titles, you can take a look at the [commit history](https://github.com/imputnet/cobalt/commits/). - -the scope is not strictly defined, you can write whatever you find most fitting for the particular change. suppose you are changing a small part of a more significant part of the codebase. in that case, you can specify both the larger and smaller scopes in the commit message for clarity (e.g., if you were changing something in internal streams, the commit could be something like `stream/internal: fix object not being handled properly`). - -if you think a change deserves further explanation, we encourage you to write a short explanation in the commit message ([example](https://github.com/imputnet/cobalt/commit/d2e5b6542f71f3809ba94d56c26f382b5cb62762)), which will save both you and us time having to enquire about the change, and you explaining the reason behind it. - -if your contribution has uninformative commit titles, you may be asked to interactively rebase your branch and amend each commit to include a meaningful title. - -### clean commit history -if your branch is out of date and/or has some merge conflicts with the `current` branch, you should **rebase** it instead of merging. this prevents meaningless merge commits from being included in your branch, which would then end up in the cobalt git history. - -if you find a mistake or bug in your code before it's merged or reviewed, instead of making a brand new commit to fix it, it would be preferable to amend that specific commit where the mistake was first introduced. this also helps us easily revert a commit if we discover that it introduced a bug or some unwanted behavior. -- if the commit you are fixing is the latest one, you can add your files to staging and then use `git commit --amend` to apply the change. -- if the commit is somewhere deeper in your branch, you can use `git commit --fixup=HASH`, where *`HASH`* is the commit you are fixing. - - afterward, you must interactively rebase your branch with `git rebase -i current --autosquash`. - this will open up an editor, but you don't need to do anything else except save the file and exit. -- once you do either of these things, you will need to do a **force push** to your branch with `git push --force-with-lease`. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 7d1945a..0000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - save what you love with cobalt. - Copyright (C) 2024 imput - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/README.md b/README.md deleted file mode 100644 index 5bf8ae8..0000000 --- a/README.md +++ /dev/null @@ -1,122 +0,0 @@ -
-
-

- cobalt logo -

-

- best way to save what you love -
- - cobalt.tools - -

-

- - 💬 community discord server - - - 🐦 twitter/x - -

-
-
- -cobalt is a media 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 paywalls***. - -paste the link, get the file, move on. it's that simple. just how it should be. - -### supported services -this list is not final and keeps expanding over time. if support for a service you want is missing, create an issue (or a pull request 👀). - -| service | video + audio | only audio | only video | metadata | rich file names | -| :-------- | :-----------: | :--------: | :--------: | :------: | :-------------: | -| bilibili | ✅ | ✅ | ✅ | ➖ | ➖ | -| bluesky | ✅ | ✅ | ✅ | ➖ | ➖ | -| dailymotion | ✅ | ✅ | ✅ | ✅ | ✅ | -| instagram | ✅ | ✅ | ✅ | ➖ | ➖ | -| facebook | ✅ | ❌ | ✅ | ➖ | ➖ | -| loom | ✅ | ❌ | ✅ | ✅ | ➖ | -| ok.ru | ✅ | ❌ | ✅ | ✅ | ✅ | -| pinterest | ✅ | ✅ | ✅ | ➖ | ➖ | -| reddit | ✅ | ✅ | ✅ | ❌ | ❌ | -| rutube | ✅ | ✅ | ✅ | ✅ | ✅ | -| snapchat | ✅ | ✅ | ✅ | ➖ | ➖ | -| soundcloud | ➖ | ✅ | ➖ | ✅ | ✅ | -| streamable | ✅ | ✅ | ✅ | ➖ | ➖ | -| tiktok | ✅ | ✅ | ✅ | ❌ | ❌ | -| tumblr | ✅ | ✅ | ✅ | ➖ | ➖ | -| twitch clips | ✅ | ✅ | ✅ | ✅ | ✅ | -| twitter/x | ✅ | ✅ | ✅ | ➖ | ➖ | -| vimeo | ✅ | ✅ | ✅ | ✅ | ✅ | -| vine | ✅ | ✅ | ✅ | ➖ | ➖ | -| vk videos & clips | ✅ | ❌ | ✅ | ✅ | ✅ | -| youtube | ✅ | ✅ | ✅ | ✅ | ✅ | - -| emoji | meaning | -| :-----: | :---------------------- | -| ✅ | supported | -| ➖ | impossible/unreasonable | -| ❌ | not supported | - -### additional notes or features (per service) -| service | notes or features | -| :-------- | :----- | -| instagram | supports reels, photos, and videos. lets you pick what to save from multi-media posts. | -| facebook | supports public accessible videos content only. | -| pinterest | supports photos, gifs, videos and stories. | -| reddit | supports gifs and videos. | -| snapchat | supports spotlights and stories. lets you pick what to save from stories. | -| rutube | supports yappy & private links. | -| soundcloud | supports private links. | -| tiktok | supports videos with or without watermark, images from slideshow without watermark, and full (original) audios. | -| twitter/x | lets you pick what to save from multi-media posts. may not be 100% reliable due to current management. | -| vimeo | audio downloads are only available for dash. | -| youtube | supports videos, music, and shorts. 8K, 4K, HDR, VR, and high FPS videos. rich metadata & dubs. h264/av1/vp9 codecs. | - -### partners -cobalt is sponsored by [royalehosting.net](https://royalehosting.net/?partner=cobalt), all main instances are currently hosted on their network :) - -### ethics and disclaimer -cobalt is a tool for easing content downloads from internet and takes ***zero liability***. you are responsible for what you download, how you use and distribute that content. please be mindful when using content of others and always credit original creators. fair use and credits benefit everyone. - -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 -for relevant licensing information, see the [api](api/README.md) and [web](web/README.md) READMEs. -unless specified otherwise, the remainder of this repository is licensed under [AGPL-3.0](LICENSE). - -## acknowledgements -### ffmpeg -cobalt heavily relies on ffmpeg for converting and merging media files. it's an absolutely amazing piece of software offered for anyone for free, yet doesn't receive as much credit as it should. - -you can [support ffmpeg here](https://ffmpeg.org/donations.html)! - -#### ffmpeg-static -we use [ffmpeg-static](https://github.com/eugeneware/ffmpeg-static) to get binaries for ffmpeg depending on the platform. - -you can support the developer via various methods listed on their github page! (linked above) - -### youtube.js -cobalt relies on [youtube.js](https://github.com/LuanRT/YouTube.js) for interacting with the innertube api, it wouldn't have been possible without it. - -you can support the developer via various methods listed on their github page! (linked above) - -### many others -cobalt also depends on: - -- [content-disposition-header](https://www.npmjs.com/package/content-disposition-header) to simplify the provision of `content-disposition` headers. -- [cors](https://www.npmjs.com/package/cors) to manage cross-origin resource sharing within expressjs. -- [dotenv](https://www.npmjs.com/package/dotenv) to load environment variables from the `.env` file. -- [esbuild](https://www.npmjs.com/package/esbuild) to minify the frontend files. -- [express](https://www.npmjs.com/package/express) as the backbone of cobalt servers. -- [express-rate-limit](https://www.npmjs.com/package/express-rate-limit) to rate limit api endpoints. -- [hls-parser](https://www.npmjs.com/package/hls-parser) to parse `m3u8` playlists for certain services. -- [ipaddr.js](https://www.npmjs.com/package/ipaddr.js) to parse ip addresses (for rate limiting). -- [nanoid](https://www.npmjs.com/package/nanoid) to generate unique (temporary) identifiers for each requested stream. -- [node-cache](https://www.npmjs.com/package/node-cache) to cache stream info in server ram for a limited amount of time. -- [psl](https://www.npmjs.com/package/psl) as the domain name parser. -- [set-cookie-parser](https://www.npmjs.com/package/set-cookie-parser) to parse cookies that cobalt receives from certain services. -- [undici](https://www.npmjs.com/package/undici) for making http requests. -- [url-pattern](https://www.npmjs.com/package/url-pattern) to match provided links with supported patterns. - -...and many other packages that these packages rely on. diff --git a/api/LICENSE b/api/LICENSE deleted file mode 100644 index 7d1945a..0000000 --- a/api/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - save what you love with cobalt. - Copyright (C) 2024 imput - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/api/README.md b/api/README.md deleted file mode 100644 index 5c28124..0000000 --- a/api/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# cobalt api - -## license -cobalt api code is licensed under [AGPL-3.0](LICENSE). - -this license allows you to modify, distribute and use the code for any purpose -as long as you: -- give appropriate credit to the original repo when using or modifying any parts of the code, -- provide a link to the license and indicate if changes to the code were made, and -- release the code under the **same license** - -## running your own instance -if you want to run your own instance for whatever purpose, [follow this guide](/docs/run-an-instance.md). -it's *highly* recommended to use a docker compose method unless you run for developing/debugging purposes. - -## accessing the api -currently, there is no publicly accessible main api. we plan on providing a public api for -cobalt 10 in some form in the future. we recommend deploying your own instance if you wish -to use the latest api. you can access [the documentation](/docs/api.md) for it here. - -if you are looking for the documentation for the old (7.x) api, you can find -it [here](https://github.com/imputnet/cobalt/blob/7/docs/api.md) \ No newline at end of file diff --git a/api/package.json b/api/package.json index 8ebe4c7..2330b8a 100644 --- a/api/package.json +++ b/api/package.json @@ -1,8 +1,8 @@ { - "name": "@imput/cobalt-api", - "description": "save what you love", + "name": "teamhydra-videodl-api", + "description": "Team Hydra's video downloader (API)", "version": "10.0.0", - "author": "imput", + "author": "Team Hydra", "exports": "./src/cobalt.js", "type": "module", "engines": { @@ -16,13 +16,9 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/imputnet/cobalt.git" + "url": "git+https://teamhydra.io/Team-Hydra/Video-Downloader.git" }, "license": "AGPL-3.0", - "bugs": { - "url": "https://github.com/imputnet/cobalt/issues" - }, - "homepage": "https://github.com/imputnet/cobalt#readme", "dependencies": { "@imput/version-info": "workspace:^", "content-disposition-header": "0.6.0", diff --git a/api/src/cobalt.js b/api/src/cobalt.js index c548e79..09b1707 100644 --- a/api/src/cobalt.js +++ b/api/src/cobalt.js @@ -20,7 +20,7 @@ if (env.apiURL) { runAPI(express, app, __dirname) } else { console.log( - Red(`cobalt wasn't configured yet or configuration is invalid.\n`) + Red(`Team Hydra Video DL wasn't configured yet or configuration is invalid.\n`) + Bright(`please run the setup script to fix this: `) + Green(`npm run setup`) ) diff --git a/api/src/config.js b/api/src/config.js index fc1d5d2..5ea07d0 100644 --- a/api/src/config.js +++ b/api/src/config.js @@ -1,14 +1,16 @@ -import { getVersion } from "@imput/version-info"; -import { services } from "./processing/service-config.js"; +import { getVersion } from '@imput/version-info'; +import { services } from './processing/service-config.js'; const version = await getVersion(); const disabledServices = process.env.DISABLED_SERVICES?.split(',') || []; -const enabledServices = new Set(Object.keys(services).filter(e => { - if (!disabledServices.includes(e)) { - return e; - } -})); +const enabledServices = new Set( + Object.keys(services).filter((e) => { + if (!disabledServices.includes(e)) { + return e; + } + }), +); const env = { apiURL: process.env.API_URL || '', @@ -22,15 +24,23 @@ const env = { cookiePath: process.env.COOKIE_PATH, - rateLimitWindow: (process.env.RATELIMIT_WINDOW && parseInt(process.env.RATELIMIT_WINDOW)) || 60, - rateLimitMax: (process.env.RATELIMIT_MAX && parseInt(process.env.RATELIMIT_MAX)) || 20, - - durationLimit: (process.env.DURATION_LIMIT && parseInt(process.env.DURATION_LIMIT)) || 10800, + rateLimitWindow: + (process.env.RATELIMIT_WINDOW && + parseInt(process.env.RATELIMIT_WINDOW)) || + 60, + rateLimitMax: + (process.env.RATELIMIT_MAX && parseInt(process.env.RATELIMIT_MAX)) || + 20, + + durationLimit: + (process.env.DURATION_LIMIT && parseInt(process.env.DURATION_LIMIT)) || + 10800, streamLifespan: 90, - processingPriority: process.platform !== 'win32' - && process.env.PROCESSING_PRIORITY - && parseInt(process.env.PROCESSING_PRIORITY), + processingPriority: + process.platform !== 'win32' && + process.env.PROCESSING_PRIORITY && + parseInt(process.env.PROCESSING_PRIORITY), externalProxy: process.env.API_EXTERNAL_PROXY, @@ -39,13 +49,14 @@ const env = { jwtLifetime: process.env.JWT_EXPIRY || 120, enabledServices, -} +}; -const genericUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; -const cobaltUserAgent = `cobalt/${version} (+https://github.com/imputnet/cobalt)`; +const genericUserAgent = + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'; +const teamHydraUserAgent = `teamhydravideodl/${version} (support@hep.gg)`; export { env, genericUserAgent, - cobaltUserAgent, -} + teamHydraUserAgent as cobaltUserAgent, // lol +}; diff --git a/api/src/core/api.js b/api/src/core/api.js index 51ec169..b1ad25b 100644 --- a/api/src/core/api.js +++ b/api/src/core/api.js @@ -44,7 +44,7 @@ export const runAPI = (express, app, __dirname) => { const startTimestamp = startTime.getTime(); const serverInfo = JSON.stringify({ - cobalt: { + videodl: { version: version, url: env.apiURL, startTime: `${startTimestamp}`, @@ -309,7 +309,7 @@ export const runAPI = (express, app, __dirname) => { app.listen(env.apiPort, env.listenAddress, () => { console.log(`\n` + - Bright(Cyan("cobalt ")) + Bright("API ^ω⁠^") + "\n" + + Bright(Cyan("Team Hydra Video DL")) + Bright("API :3") + "\n" + "~~~~~~\n" + Bright("version: ") + version + "\n" + diff --git a/api/src/util/setup.js b/api/src/util/setup.js index e9d1bea..3cb25a8 100644 --- a/api/src/util/setup.js +++ b/api/src/util/setup.js @@ -1,10 +1,10 @@ -import { existsSync, unlinkSync, appendFileSync } from "fs"; -import { createInterface } from "readline"; -import { Cyan, Bright } from "../misc/console-text.js"; -import { loadJSON } from "../misc/load-from-fs.js"; -import { execSync } from "child_process"; +import { existsSync, unlinkSync, appendFileSync } from 'fs'; +import { createInterface } from 'readline'; +import { Cyan, Bright } from '../misc/console-text.js'; +import { loadJSON } from '../misc/load-from-fs.js'; +import { execSync } from 'child_process'; -const { version } = loadJSON("./package.json"); +const { version } = loadJSON('./package.json'); let envPath = './.env'; let q = `${Cyan('?')} \x1b[1m`; @@ -15,91 +15,141 @@ let final = () => { if (existsSync(envPath)) unlinkSync(envPath); for (let i in ob) { - appendFileSync(envPath, `${i}=${ob[i]}\n`) + appendFileSync(envPath, `${i}=${ob[i]}\n`); } console.log(Bright("\nAwesome! I've created a fresh .env file for you.")); - console.log(`${Bright("Now I'll run")} ${Cyan("npm install")} ${Bright("to install all dependencies. It shouldn't take long.\n\n")}`); + console.log( + `${Bright("Now I'll run")} ${Cyan('npm install')} ${Bright( + "to install all dependencies. It shouldn't take long.\n\n", + )}`, + ); execSync('npm install', { stdio: [0, 1, 2] }); - console.log(`\n\n${Cyan("All done!\n")}`); - console.log(Bright("You can re-run this script at any time to update the configuration.")); - console.log(Bright("\nYou're now ready to start cobalt. Simply run ") + Cyan("npm start") + Bright('!\nHave fun :)')); - rl.close() -} + console.log(`\n\n${Cyan('All done!\n')}`); + console.log( + Bright( + 'You can re-run this script at any time to update the configuration.', + ), + ); + console.log( + Bright( + "\nYou're now ready to start team hydra video downloader. Simply run ", + ) + + Cyan('npm start') + + Bright('!\nHave fun :)'), + ); + rl.close(); +}; console.log( - `${Cyan(`Hey, this is cobalt v.${version}!`)}\n${Bright("Let's start by creating a new ")}${Cyan(".env")}${Bright(" file. You can always change it later.")}` -) + `${Cyan(`Hey, this is teamhydra video downloader v.${version}!`)}\n${Bright( + "Let's start by creating a new ", + )}${Cyan('.env')}${Bright(' file. You can always change it later.')}`, +); function setup() { - console.log(Bright("\nWhat kind of server will this instance be?\nOptions: api, web.")); + console.log( + Bright( + '\nWhat kind of server will this instance be?\nOptions: api, web.', + ), + ); - rl.question(q, r1 => { + rl.question(q, (r1) => { switch (r1.toLowerCase()) { case 'api': - console.log(Bright("\nCool! What's the domain this API instance will be running on? (localhost)\nExample: api.cobalt.tools")); + console.log( + Bright( + "\nCool! What's the domain this API instance will be running on? (localhost)\nExample: videodlapi.hep.gg", + ), + ); - rl.question(q, apiURL => { + rl.question(q, (apiURL) => { ob.API_URL = `http://localhost:9000/`; ob.API_PORT = 9000; - if (apiURL && apiURL !== "localhost") ob.API_URL = `https://${apiURL.toLowerCase()}/`; + if (apiURL && apiURL !== 'localhost') + ob.API_URL = `https://${apiURL.toLowerCase()}/`; - console.log(Bright("\nGreat! Now, what port will it be running on? (9000)")); + console.log( + Bright( + '\nGreat! Now, what port will it be running on? (9000)', + ), + ); - rl.question(q, apiPort => { + rl.question(q, (apiPort) => { if (apiPort) ob.API_PORT = apiPort; - if (apiPort && (apiURL === "localhost" || !apiURL)) ob.API_URL = `http://localhost:${apiPort}/`; + if (apiPort && (apiURL === 'localhost' || !apiURL)) + ob.API_URL = `http://localhost:${apiPort}/`; - console.log(Bright("\nWhat will your instance's name be? Usually it's something like eu-nl aka region-country. (local)")); + console.log( + Bright( + "\nWhat will your instance's name be? Usually it's something like eu-nl aka region-country. (local)", + ), + ); - rl.question(q, apiName => { + rl.question(q, (apiName) => { ob.API_NAME = apiName.toLowerCase(); - if (!apiName || apiName === "local") ob.API_NAME = "local"; + if (!apiName || apiName === 'local') + ob.API_NAME = 'local'; - console.log(Bright("\nOne last thing: would you like to enable CORS? It allows other websites and extensions to use your instance's API.\ny/n (n)")); + console.log( + Bright( + "\nOne last thing: would you like to enable CORS? It allows other websites and extensions to use your instance's API.\ny/n (n)", + ), + ); - rl.question(q, apiCors => { + rl.question(q, (apiCors) => { let answCors = apiCors.toLowerCase().trim(); - if (answCors !== "y" && answCors !== "yes") ob.CORS_WILDCARD = '0' - final() - }) - }) + if (answCors !== 'y' && answCors !== 'yes') + ob.CORS_WILDCARD = '0'; + final(); + }); + }); }); - - }) + }); break; case 'web': - console.log(Bright("\nAwesome! What's the domain this web app instance will be running on? (localhost)\nExample: cobalt.tools")); - - rl.question(q, webURL => { + console.log( + Bright( + "\nAwesome! What's the domain this web app instance will be running on? (localhost)\nExample: dl.hep.gg", + ), + ); + + rl.question(q, (webURL) => { ob.WEB_URL = `http://localhost:9001/`; ob.WEB_PORT = 9001; - if (webURL && webURL !== "localhost") ob.WEB_URL = `https://${webURL.toLowerCase()}/`; - + if (webURL && webURL !== 'localhost') + ob.WEB_URL = `https://${webURL.toLowerCase()}/`; + console.log( - Bright("\nGreat! Now, what port will it be running on? (9001)") - ) - rl.question(q, webPort => { + Bright( + '\nGreat! Now, what port will it be running on? (9001)', + ), + ); + rl.question(q, (webPort) => { if (webPort) ob.WEB_PORT = webPort; - if (webPort && (webURL === "localhost" || !webURL)) ob.WEB_URL = `http://localhost:${webPort}/`; + if (webPort && (webURL === 'localhost' || !webURL)) + ob.WEB_URL = `http://localhost:${webPort}/`; console.log( - Bright("\nOne last thing: what default API domain should be used? (api.cobalt.tools)\nIf it's hosted locally, make sure to include the port:") + Cyan(" localhost:9000") + Bright( + "\nOne last thing: what default API domain should be used? (videodlapi.hep.gg)\nIf it's hosted locally, make sure to include the port:", + ) + Cyan(' localhost:9000'), ); - rl.question(q, apiURL => { + rl.question(q, (apiURL) => { ob.API_URL = `https://${apiURL.toLowerCase()}/`; - if (apiURL.includes(':')) ob.API_URL = `http://${apiURL.toLowerCase()}/`; - if (!apiURL) ob.API_URL = "https://api.cobalt.tools/"; - final() - }) + if (apiURL.includes(':')) + ob.API_URL = `http://${apiURL.toLowerCase()}/`; + if (!apiURL) + ob.API_URL = 'https://api.cobalt.tools/'; + final(); + }); }); - }); break; default: - console.log(Bright("\nThis is not an option. Try again.")); - setup() + console.log(Bright('\nThis is not an option. Try again.')); + setup(); } - }) + }); } -setup() +setup(); diff --git a/docs/api.md b/docs/api.md deleted file mode 100644 index fc09a44..0000000 --- a/docs/api.md +++ /dev/null @@ -1,110 +0,0 @@ -# cobalt api documentation -this document provides info about methods and acceptable variables for all cobalt api requests. - -> if you are looking for the documentation for the old (7.x) api, you can find -> it [here](https://github.com/imputnet/cobalt/blob/7/docs/api.md) - - -## POST: `/` -cobalt's main processing endpoint. - -request body type: `application/json` -response body type: `application/json` - -``` -⚠️ you must include Accept and Content-Type headers with every `POST /` request. - -Accept: application/json -Content-Type: application/json -``` - -### request body -| key | type | expected value(s) | default | description | -|:-----------------------------|:----------|:-----------------------------------|:----------|:--------------------------------------------------------------------------------| -| `url` | `string` | URL to download | -- | **must** be included in every request. | -| `videoQuality` | `string` | `144 / ... / 2160 / 4320 / max` | `1080` | `720` quality is recommended for phones. | -| `audioFormat` | `string` | `best / mp3 / ogg / wav / opus` | `mp3` | | -| `audioBitrate` | `string` | `320 / 256 / 128 / 96 / 64 / 8` | `128` | specifies the bitrate to use for the audio. applies only to audio conversion. | -| `filenameStyle` | `string` | `classic / pretty / basic / nerdy` | `classic` | changes the way files are named. previews can be seen in the web app. | -| `downloadMode` | `string` | `auto / audio / mute` | `auto` | `audio` downloads only the audio, `mute` skips the audio track in videos. | -| `youtubeVideoCodec` | `string` | `h264 / av1 / vp9` | `h264` | `h264` is recommended for phones. | -| `youtubeDubLang` | `string` | `en / ru / cs / ja / ...` | -- | specifies the language of audio to download, when the youtube video is dubbed | -| `youtubeDubBrowserLang` | `boolean` | `true / false` | `false` | uses value from the Accept-Language header for `youtubeDubLang`. | -| `alwaysProxy` | `boolean` | `true / false` | `false` | tunnels all downloads through the processing server, even when not necessary. | -| `disableMetadata` | `boolean` | `true / false` | `false` | disables file metadata when set to `true`. | -| `tiktokFullAudio` | `boolean` | `true / false` | `false` | enables download of original sound used in a tiktok video. | -| `tiktokH265` | `boolean` | `true / false` | `false` | changes whether 1080p h265 videos are preferred or not. | -| `twitterGif` | `boolean` | `true / false` | `true` | changes whether twitter gifs are converted to .gif | - -### response -the response will always be a JSON object containing the `status` key, which will be one of: -- `error` - something went wrong -- `picker` - we have multiple items to choose from -- `redirect` - you are being redirected to the direct service URL -- `tunnel` - cobalt is proxying the download for you - -### tunnel/redirect response -| key | type | values | -|:-------------|:---------|:------------------------------------------------------------| -| `status` | `string` | `tunnel / redirect` | -| `url` | `string` | url for the cobalt tunnel, or redirect to an external link | -| `filename` | `string` | cobalt-generated filename for the file being downloaded | - -### picker response -| key | type | values | -|:----------------|:---------|:-------------------------------------------------------------------------------------------------| -| `status` | `string` | `picker` | -| `audio` | `string` | **optional** returned when an image slideshow (such as on tiktok) has a general background audio | -| `audioFilename` | `string` | **optional** cobalt-generated filename, returned if `audio` exists | -| `picker` | `array` | array of objects containing the individual media | - -#### picker object -| key | type | values | -|:-------------|:----------|:------------------------------------------------------------| -| `type` | `string` | `photo` / `video` / `gif` | -| `url` | `string` | | -| `thumb` | `string` | **optional** thumbnail url | - -### error response -| key | type | values | -|:-------------|:---------|:------------------------------------------------------------| -| `status` | `string` | `error` | -| `error` | `object` | contains more context about the error | - -#### error object -| key | type | values | -|:-------------|:---------|:------------------------------------------------------------| -| `code` | `string` | machine-readable error code explaining the failure reason | -| `context` | `object` | **optional** container for providing more context | - -#### error.context object -| key | type | values | -|:-------------|:---------|:---------------------------------------------------------------------------------------------------------------| -| `service` | `string` | **optional**, stating which service was being downloaded from | -| `limit` | `number` | **optional** number providing the ratelimit maximum number of requests, or maximum downloadable video duration | - -## GET: `/` -returns current basic server info. -response body type: `application/json` - -### response body -| key | type | variables | -|:------------|:---------|:---------------------------------------------------------| -| `cobalt` | `object` | information about the cobalt instance | -| `git` | `object` | information about the codebase that is currently running | - -#### cobalt object -| key | type | description | -|:----------------|:-----------|:-----------------------------------------------| -| `version` | `string` | current version | -| `url` | `string` | server url | -| `startTime` | `string` | server start time in unix milliseconds | -| `durationLimit` | `number` | maximum downloadable video length in seconds | -| `services` | `string[]` | array of services which this instance supports | - -#### git object -| key | type | variables | -|:------------|:---------|:------------------| -| `commit` | `string` | commit hash | -| `branch` | `string` | git branch | -| `remote` | `string` | git remote | diff --git a/docs/examples/cookies.example.json b/docs/examples/cookies.example.json deleted file mode 100644 index 73f3378..0000000 --- a/docs/examples/cookies.example.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "instagram": [ - "mid=; ig_did=; csrftoken=; ds_user_id=; sessionid=" - ], - "instagram_bearer": [ - "token=", "token=IGT:2:" - ], - "reddit": [ - "client_id=; client_secret=; refresh_token=" - ], - "twitter": [ - "auth_token=; ct0=" - ] -} diff --git a/docs/examples/docker-compose.example.yml b/docs/examples/docker-compose.example.yml deleted file mode 100644 index 7d3442d..0000000 --- a/docs/examples/docker-compose.example.yml +++ /dev/null @@ -1,33 +0,0 @@ -services: - cobalt-api: - image: ghcr.io/imputnet/cobalt:10 - restart: unless-stopped - container_name: cobalt-api - - init: true - - ports: - - 9000:9000/tcp - # if you're using a reverse proxy, uncomment the next line and remove the one above (9000:9000/tcp): - #- 127.0.0.1:9000:9000 - - environment: - # replace https://api.cobalt.tools/ with your instance's target url in same format - API_URL: "https://api.cobalt.tools/" - # if you want to use cookies when fetching data from services, uncomment the next line and the lines under volume - # COOKIE_PATH: "/cookies.json" - # see docs/run-an-instance.md for more information - labels: - - com.centurylinklabs.watchtower.scope=cobalt - - # if you want to use cookies when fetching data from services, uncomment volumes and next line - #volumes: - #- ./cookies.json:/cookies.json - - # update the cobalt image automatically with watchtower - watchtower: - image: ghcr.io/containrrr/watchtower - restart: unless-stopped - command: --cleanup --scope cobalt --interval 900 --include-restarting - volumes: - - /var/run/docker.sock:/var/run/docker.sock diff --git a/docs/images/troubleshooting/clipboard/config.png b/docs/images/troubleshooting/clipboard/config.png deleted file mode 100644 index b0c0a04803397f14957aef152d84e3449757f3d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4154 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 OK>9i+=yKHc$o~VoUOguO diff --git a/docs/images/troubleshooting/clipboard/risk.png b/docs/images/troubleshooting/clipboard/risk.png deleted file mode 100644 index 1948f0eb48baad049c38a83297ecf8709d94c275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17944 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 cYpKC;r0VcLr9Su7T2?+_Es)~Xx2?;3z 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 diff --git a/docs/images/troubleshooting/clipboard/toggle.png b/docs/images/troubleshooting/clipboard/toggle.png deleted file mode 100644 index 32060dc7f9e01dd447d66db8b6e493e47997e3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18725 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 diff --git a/docs/images/troubleshooting/clipboard/toggled.png b/docs/images/troubleshooting/clipboard/toggled.png deleted file mode 100644 index 6afa0ace793db75be3e30184f2a2a2d96ea9b4bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17312 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 diff --git a/docs/run-an-instance.md b/docs/run-an-instance.md deleted file mode 100644 index 8144c03..0000000 --- a/docs/run-an-instance.md +++ /dev/null @@ -1,81 +0,0 @@ -# how to host a cobalt instance yourself -## using docker compose and package from github (recommended) -to run the cobalt docker package, you need to have `docker` and `docker-compose` installed and configured. - -if you need help with installing docker, follow *only the first step* of these tutorials by digitalocean: -- [how to install docker](https://www.digitalocean.com/community/tutorial-collections/how-to-install-and-use-docker) -- [how to install docker compose](https://www.digitalocean.com/community/tutorial-collections/how-to-install-docker-compose) - -## how to run a cobalt docker package: -1. create a folder for cobalt config file, something like this: - ```sh - mkdir cobalt - ``` - -2. go to cobalt folder, and create a docker compose config file: - ```sh - cd cobalt && nano docker-compose.yml - ``` - i'm using `nano` in this example, it may not be available in your distro. you can use any other text editor. - -3. copy and paste the [sample config from here](examples/docker-compose.example.yml) for either web or api instance (or both, if you wish) and edit it to your needs. - make sure to replace default URLs with your own or cobalt won't work correctly. - -4. finally, start the cobalt container (from cobalt directory): - ```sh - docker compose up -d - ``` - -if you want your instance to support services that require authentication to view public content, create `cookies.json` file in the same directory as `docker-compose.yml`. example cookies file [can be found here](examples/cookies.example.json). - -cobalt package will update automatically thanks to watchtower. - -it's highly recommended to use a reverse proxy (such as nginx) if you want your instance to face the public internet. look up tutorials online. - -## run cobalt api outside of docker (useful for local development) -requirements: -- node.js >= 18 -- git -- pnpm - -1. clone the repo: `git clone https://github.com/imputnet/cobalt`. -2. go to api/src directory: `cd cobalt/api/src`. -3. install dependencies: `pnpm install`. -4. create `.env` file in the same directory. -5. add needed environment variables to `.env` file. only `API_URL` is required to run cobalt. - - if you don't know what api url to use for local development, use `http://localhost:9000/`. -6. run cobalt: `pnpm start`. - -### ubuntu 22.04 workaround -`nscd` needs to be installed and running so that the `ffmpeg-static` binary can resolve DNS ([#101](https://github.com/imputnet/cobalt/issues/101#issuecomment-1494822258)): - -```bash -sudo apt install nscd -sudo service nscd start -``` - -## list of all environment variables -### variables for api -| variable name | default | example | description | -|:----------------------|:----------|:------------------------|:------------| -| `API_PORT` | `9000` | `9000` | changes port from which api server is accessible. | -| `API_LISTEN_ADDRESS` | `0.0.0.0` | `127.0.0.1` | changes address from which api server is accessible. **if you are using docker, you usually don't need to configure this.** | -| `API_URL` | ➖ | `https://api.cobalt.tools/` | changes url from which api server is accessible.
***REQUIRED TO RUN THE API***. | -| `API_NAME` | `unknown` | `ams-1` | api server name that is shown in `/api/serverInfo`. | -| `API_EXTERNAL_PROXY` | ➖ | `http://user:password@127.0.0.1:8080`| url of the proxy that will be passed to [`ProxyAgent`](https://undici.nodejs.org/#/docs/api/ProxyAgent) and used for all external requests. HTTP(S) only. | -| `CORS_WILDCARD` | `1` | `0` | toggles cross-origin resource sharing.
`0`: disabled. `1`: enabled. | -| `CORS_URL` | not used | `https://cobalt.tools` | cross-origin resource sharing url. api will be available only from this url if `CORS_WILDCARD` is set to `0`. | -| `COOKIE_PATH` | not used | `/cookies.json` | path for cookie file relative to main folder. | -| `PROCESSING_PRIORITY` | not used | `10` | changes `nice` value* for ffmpeg subprocess. available only on unix systems. | -| `FREEBIND_CIDR` | ➖ | `2001:db8::/32` | IPv6 prefix used for randomly assigning addresses to cobalt requests. only supported on linux systems. see below for more info. | -| `RATELIMIT_WINDOW` | `60` | `120` | rate limit time window in **seconds**. | -| `RATELIMIT_MAX` | `20` | `30` | max requests per time window. requests above this amount will be blocked for the rate limit window duration. | -| `DURATION_LIMIT` | `10800` | `18000` | max allowed video duration in **seconds**. | - -\* the higher the nice value, the lower the priority. [read more here](https://en.wikipedia.org/wiki/Nice_(Unix)). - -#### FREEBIND_CIDR -setting a `FREEBIND_CIDR` allows cobalt to pick a random IP for every download and use it for all -requests it makes for that particular download. to use freebind in cobalt, you need to follow its [setup instructions](https://github.com/imputnet/freebind.js?tab=readme-ov-file#setup) first. if you configure this option while running cobalt -in a docker container, you also need to set the `API_LISTEN_ADDRESS` env to `127.0.0.1`, and set -`network_mode` for the container to `host`. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md deleted file mode 100644 index 4c97511..0000000 --- a/docs/troubleshooting.md +++ /dev/null @@ -1,37 +0,0 @@ -# self-troubleshooting cobalt -``` -🚧 this page is work-in-progress. expect more guides to be added in the future! -``` -if any issues occur while using cobalt, you can fix many of them yourself. this document aims to provide guides on how to fix most complicated of them. -use wiki navigation on right to jump between solutions. - -## how to fix clipboard pasting in older versions of firefox -``` -🎉 firefox finally supports pasting by default starting from version 125. - -👍 you don't need to follow this tutorial if you're on the latest version of firefox. -``` -you can fix this issue by changing a single preference in `about:config`. - -### steps to enable clipboard functionality -1. go to `about:config`: - ![screenshot showing about:config entered into address bar](images/troubleshooting/clipboard/config.png) - -2. if asked, read what firefox has to say and press "accept the risk and continue". - ⚠ tinkering with other preferences may break your browser. **do not** edit them unless you know what you're doing. - - ![screenshot showing about:config security warning that reads: "proceed with caution. changing advanced configuration preferences can impact firefox performance or security." lower there's a pre-checked checkbox that says: "warn me when i attempt to access these preferences". lowest element is a blue button that says "accept the risk and continue"](images/troubleshooting/clipboard/risk.png) - -3. search for `dom.events.asyncClipboard.readText` - - ![screenshot showing "dom.events.asyncclipboard.readtext" entered into search on about:config page](images/troubleshooting/clipboard/search.png) - -4. press the toggle button on very right. - - ![screenshot showing "dom.events.asyncclipboard.readtext" preference on about:config page with highlighted toggle button on very right](images/troubleshooting/clipboard/toggle.png) - -5. "false" should change to "true". - - ![screenshot showing "dom.events.asyncclipboard.readtext" preference on about:config page, this one with "true" text highlighted](images/troubleshooting/clipboard/toggled.png) - -6. go back to cobalt, reload the page, press `paste` button again. this time it works! enjoy simpler downloading experience :) diff --git a/package.json b/package.json index e55c9ca..ffe7c31 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "cobalt", + "name": "teamhydra-videodl", "packageManager": "pnpm@9.6.0", "engines": { "pnpm": ">=9" diff --git a/web/LICENSE b/web/LICENSE deleted file mode 100644 index bfef380..0000000 --- a/web/LICENSE +++ /dev/null @@ -1,437 +0,0 @@ -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. \ No newline at end of file diff --git a/web/README.md b/web/README.md deleted file mode 100644 index b4122d3..0000000 --- a/web/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# cobalt web -the cobalt frontend is a static web app built with -[sveltekit](https://kit.svelte.dev/) + [vite](https://vitejs.dev/). - -## configuring -- to run a dev environment, run `pnpm run dev`. -- to make a release build of the frontend, run `pnpm run build`. - -## environment variables -the frontend has several build-time environment variables for configuring various features. to use -them, you must specify them when building the frontend (or running a vite server for development). - -| name | example | description | -|:---------------------|:----------------------------|:---------------------------------------------------------------------------------------------------------| -| `WEB_HOST` | `cobalt.tools` | domain on which the frontend will be running. used for meta tags and configuring plausible. | -| `WEB_PLAUSIBLE_HOST` | `plausible.io`* | enables plausible analytics with provided hostname as receiver backend. | -| `WEB_DEFAULT_API` | `https://api.cobalt.tools/` | changes url which is used for api requests by frontend clients. | -| `WEB_TURNSTILE_KEY` | `1x00000000000000000000AA` | [cloudflare turnstile](https://www.cloudflare.com/products/turnstile/) public key for antibot protection | - -\* don't use plausible.io as receiver backend unless you paid for their cloud service. - use your own domain when hosting community edition of plausible. refer to their [docs](https://plausible.io/docs) when needed. - -## license -cobalt web code is licensed under [CC-BY-NC-SA-4.0](LICENSE). - -this license allows you to: -- copy and redistribute the code in any medium or format, and -- remix, transform, use and build upon the code - -as long as you: -- give appropriate credit to the original repo, -- provide a link to the license and indicate if changes to the code were made, -- release the code under the **same license**, and -- **don't use the code for any commercial purposes**. - -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 for **non-commercial purposes**, but this ***does not*** give you permission to use the branding anywhere else, or make derivatives of it in any way. - -when making an alternative version of the project, please replace or remove all branding (including the name). - -## 3rd party licenses -- [Fluent Emoji by Microsoft](https://github.com/microsoft/fluentui-emoji) (used in cobalt) is under [MIT](https://github.com/microsoft/fluentui-emoji/blob/main/LICENSE) license. -- [Noto Sans Mono](https://fonts.google.com/noto/specimen/Noto+Sans+Mono/) fonts (used in cobalt) are licensed under the [OFL](https://fonts.google.com/noto/specimen/Noto+Sans+Mono/about) license. -- many update banners were taken from [tenor.com](https://tenor.com/). diff --git a/web/changelogs/10.0.md b/web/changelogs/10.0.md deleted file mode 100644 index 1a178b7..0000000 --- a/web/changelogs/10.0.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "cobalt, reborn" -date: "9 Sept, 2024" -banner: - file: "cobalt10.png" - alt: "image of meowbalt smiling and loafing in front of a wall of text." ---- - -everything is new! this update marks the start of the latest chapter for cobalt. we spent the entire summer working hard to deliver the best experience ever, and we really hope you enjoy the rebirth of cobalt. - -before we list the new features, we also added support for a couple of new services: facebook, bluesky, loom, and snapchat. - -cobalt already supports downloading videos from bluesky and will continue to do so after they're officially released. we also added support for saving images from all supported services (such as twitter). - -now, here's the gist of what's new in the web app: - -- the web app was rebuilt from the ground up with usability & accessibility in mind. everyone will enjoy using the new web app, even if they rely on screen readers or other accessibility tools. -- [on-device remuxing (beta)](/remux). this feature solves all compatibility issues with old software. just drop the file into the remux page, and it'll fix it up to make it work with your favorite apps! vegas pro, logic pro, fl studio, you name it. -- [all-new settings page](/settings). settings are now way easier to understand and use. everything is appropriately labeled, categorized, and described. -- [custom audio bitrate](/settings/audio#audio-bitrate). you can now choose what bitrate to use when processing audio. -- [community instances (beta)](/settings/instances#community), right in the main web app. just go to instance settings and use a custom processing server if you wish. make sure to read the important safety message. -- [tunnel all files (beta)](/settings/privacy#tunnel). this feature will hide your ip address, browser info, and bypass local network restrictions. all downloaded files will also have pretty filenames. -- new localization system. this allowed us to implement a [language picker](/settings/appearance#language) right into cobalt. expect more languages in the future! -- more granular error messages with proper context. no more grouped errors such as "this happened or this or that idk lol guess". -- [settings data management](/settings/advanced#data). you can now export, import, or wipe settings. -- [new donate page](/donate). the donation page has been completely reimagined, with more ways to support us than ever (via stripe and liberapay), and via sharing cobalt with a friend. -- [comprehensive about page](/about). the new about page includes more info than ever before, and we will be progressively adding more content there to make sure there is no more confusion, period. -- convenient updates page (*you're here*). the new updates page is comfortable to read and navigate. we have also moved to using markdown so that we can do *this* and **this** and ~~that~~. it also includes more changelogs than ever before. -- tab key navigation across the entire web app. -- new navigation system with proper routing, history, and all other benefits. it is now persistent and always stays on the screen. -- new dialog system. dialogs now use native html elements, meaning that they work as you'd expect. no more finnicky navigation. -- new picker dialog. pretty, easy to use, and works beautifully on all devices. - -...and this is just the tip of the iceberg. we couldn't possibly list all changes. just go and take a look around, don't be scared to press all buttons you see. - -and for nerds, we have a giant list of backend changes (that we are also excited about): -- completely restructured API schema and endpoints. -- API now has error codes instead of messages that used to contain HTML, and the error responses also include a separated error context that is much easier to parse. -- server info endpoint returns a lot more contextual information about each instance. -- API and web codebases have been completely separated. -- support for OAuth2 tokens for youtube. -- implemented JWT sessions, which are generated based on a Turnstile challenge or in the future by an API key. -- streams are now tunnels. -- API now returns the filename in the response instead of just as content-disposition for tunnels. -- range requests are now supported for direct tunnels, which means these requests are also pauseable and resumable. -- a ton of refactoring in continuous effort to make the codebase readable for everyone. - -this update allows us to actually innovate and develop new & exciting features. we are no longer held back by the legacy codebase. first feature of such kind is on-device remuxing. go check it out! - -oh yeah, we now have 2.5 million monthly users. kind of insane. - -we hope you enjoy this update as much as we enjoyed making it. it was a really fun summer project for both of us. - -have a lovely day :D - -~ your friends at imput diff --git a/web/changelogs/2.0.md b/web/changelogs/2.0.md deleted file mode 100644 index 0e77800..0000000 --- a/web/changelogs/2.0.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/2.2.5.md b/web/changelogs/2.2.5.md deleted file mode 100644 index 11fde1c..0000000 --- a/web/changelogs/2.2.5.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -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 diff --git a/web/changelogs/2.2.6.md b/web/changelogs/2.2.6.md deleted file mode 100644 index 02ce1a2..0000000 --- a/web/changelogs/2.2.6.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/changelogs/2.2.8.md b/web/changelogs/2.2.8.md deleted file mode 100644 index ba054ad..0000000 --- a/web/changelogs/2.2.8.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -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) \ No newline at end of file diff --git a/web/changelogs/2.2.9.md b/web/changelogs/2.2.9.md deleted file mode 100644 index ef54654..0000000 --- a/web/changelogs/2.2.9.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/changelogs/2.2.md b/web/changelogs/2.2.md deleted file mode 100644 index 768094e..0000000 --- a/web/changelogs/2.2.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -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) \ No newline at end of file diff --git a/web/changelogs/3.0.md b/web/changelogs/3.0.md deleted file mode 100644 index 37c2d5e..0000000 --- a/web/changelogs/3.0.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.1.md b/web/changelogs/3.1.md deleted file mode 100644 index 8b4bff7..0000000 --- a/web/changelogs/3.1.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -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) \ No newline at end of file diff --git a/web/changelogs/3.2.md b/web/changelogs/3.2.md deleted file mode 100644 index 5896eb0..0000000 --- a/web/changelogs/3.2.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.4.md b/web/changelogs/3.4.md deleted file mode 100644 index c781af1..0000000 --- a/web/changelogs/3.4.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.5.2.md b/web/changelogs/3.5.2.md deleted file mode 100644 index 22e8f91..0000000 --- a/web/changelogs/3.5.2.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.5.4.md b/web/changelogs/3.5.4.md deleted file mode 100644 index a0e863b..0000000 --- a/web/changelogs/3.5.4.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.5.md b/web/changelogs/3.5.md deleted file mode 100644 index 834d7a0..0000000 --- a/web/changelogs/3.5.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.6.3.md b/web/changelogs/3.6.3.md deleted file mode 100644 index 8015049..0000000 --- a/web/changelogs/3.6.3.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.6.md b/web/changelogs/3.6.md deleted file mode 100644 index cc494e7..0000000 --- a/web/changelogs/3.6.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/3.7.md b/web/changelogs/3.7.md deleted file mode 100644 index ada689d..0000000 --- a/web/changelogs/3.7.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/4.0.md b/web/changelogs/4.0.md deleted file mode 100644 index cad3208..0000000 --- a/web/changelogs/4.0.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -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). \ No newline at end of file diff --git a/web/changelogs/4.1.md b/web/changelogs/4.1.md deleted file mode 100644 index 3d6e2af..0000000 --- a/web/changelogs/4.1.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/4.2.md b/web/changelogs/4.2.md deleted file mode 100644 index f9dd460..0000000 --- a/web/changelogs/4.2.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/4.3.2.md b/web/changelogs/4.3.2.md deleted file mode 100644 index 07e8a6a..0000000 --- a/web/changelogs/4.3.2.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -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! \ No newline at end of file diff --git a/web/changelogs/4.3.md b/web/changelogs/4.3.md deleted file mode 100644 index 0d66468..0000000 --- a/web/changelogs/4.3.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -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/main/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. \ No newline at end of file diff --git a/web/changelogs/4.4.md b/web/changelogs/4.4.md deleted file mode 100644 index 06e0019..0000000 --- a/web/changelogs/4.4.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/4.5.md b/web/changelogs/4.5.md deleted file mode 100644 index a15c10d..0000000 --- a/web/changelogs/4.5.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/4.6.md b/web/changelogs/4.6.md deleted file mode 100644 index 89a1638..0000000 --- a/web/changelogs/4.6.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -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. \ No newline at end of file diff --git a/web/changelogs/4.7.md b/web/changelogs/4.7.md deleted file mode 100644 index 089b135..0000000 --- a/web/changelogs/4.7.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -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 :) \ No newline at end of file diff --git a/web/changelogs/4.8.md b/web/changelogs/4.8.md deleted file mode 100644 index ae0118d..0000000 --- a/web/changelogs/4.8.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -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 regular highlights. -- 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 :) \ No newline at end of file diff --git a/web/changelogs/5.0.md b/web/changelogs/5.0.md deleted file mode 100644 index b259921..0000000 --- a/web/changelogs/5.0.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -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 reddit gifs, 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: -- everything 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 :) \ No newline at end of file diff --git a/web/changelogs/5.1.md b/web/changelogs/5.1.md deleted file mode 100644 index 27b0c37..0000000 --- a/web/changelogs/5.1.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -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 :) - -tl;dr: - -- 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 \ No newline at end of file diff --git a/web/changelogs/5.2.md b/web/changelogs/5.2.md deleted file mode 100644 index 36fd9ea..0000000 --- a/web/changelogs/5.2.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -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. - -tl;dr: - -- 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 \ No newline at end of file diff --git a/web/changelogs/5.3.md b/web/changelogs/5.3.md deleted file mode 100644 index 1aa2adb..0000000 --- a/web/changelogs/5.3.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -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 :) \ No newline at end of file diff --git a/web/changelogs/5.4.md b/web/changelogs/5.4.md deleted file mode 100644 index d5e0824..0000000 --- a/web/changelogs/5.4.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -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 :) - -tl;dr: - -- 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. thank you. 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. \ No newline at end of file diff --git a/web/changelogs/6.0.md b/web/changelogs/6.0.md deleted file mode 100644 index 3d9d1c1..0000000 --- a/web/changelogs/6.0.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -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) - -tl;dr - -- new infra, new hosting structure, new main instance api url. developers, [get it here](https://github.com/imputnet/cobalt/blob/main/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/main/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 \ No newline at end of file diff --git a/web/changelogs/6.2.md b/web/changelogs/6.2.md deleted file mode 100644 index 5b3ef6f..0000000 --- a/web/changelogs/6.2.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -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! there should no longer be any networking issues. - -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! \ No newline at end of file diff --git a/web/changelogs/7.0.md b/web/changelogs/7.0.md deleted file mode 100644 index 6b65b93..0000000 --- a/web/changelogs/7.0.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -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 :) - -tl;dr: - -- 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. - -accessibility notice: -this update includes animations and transparency, if you'd like to disable any or all of them, head to settings > other > accessibility. - -[full changelog] - -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 \ No newline at end of file diff --git a/web/changelogs/7.1.md b/web/changelogs/7.1.md deleted file mode 100644 index 18814c8..0000000 --- a/web/changelogs/7.1.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/changelogs/7.11.md b/web/changelogs/7.11.md deleted file mode 100644 index 6791905..0000000 --- a/web/changelogs/7.11.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -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/main/docs/run-an-instance.md#list-of-all-environment-variables). -- updated [cookie file example](https://github.com/imputnet/cobalt/blob/main/docs/examples/cookies.example.json) with more services and improved examples. -- updated [docker compose example](https://github.com/imputnet/cobalt/blob/main/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/main/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 \ No newline at end of file diff --git a/web/changelogs/7.13.md b/web/changelogs/7.13.md deleted file mode 100644 index fa78c53..0000000 --- a/web/changelogs/7.13.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -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) \ No newline at end of file diff --git a/web/changelogs/7.14.md b/web/changelogs/7.14.md deleted file mode 100644 index b41ec08..0000000 --- a/web/changelogs/7.14.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -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. - -changes since the last major update - -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/main/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/main/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 \ No newline at end of file diff --git a/web/changelogs/7.3.md b/web/changelogs/7.3.md deleted file mode 100644 index c89738d..0000000 --- a/web/changelogs/7.3.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/changelogs/7.4.md b/web/changelogs/7.4.md deleted file mode 100644 index a61af8e..0000000 --- a/web/changelogs/7.4.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -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 - cobalt.tools 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 update your bookmarks 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 \ No newline at end of file diff --git a/web/changelogs/7.5.md b/web/changelogs/7.5.md deleted file mode 100644 index 420beeb..0000000 --- a/web/changelogs/7.5.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -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! \ No newline at end of file diff --git a/web/changelogs/7.6.md b/web/changelogs/7.6.md deleted file mode 100644 index 02cb3b1..0000000 --- a/web/changelogs/7.6.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -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 settings > other 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 \ No newline at end of file diff --git a/web/changelogs/7.7.md b/web/changelogs/7.7.md deleted file mode 100644 index 220d2a7..0000000 --- a/web/changelogs/7.7.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/changelogs/7.8.md b/web/changelogs/7.8.md deleted file mode 100644 index 16a9fcf..0000000 --- a/web/changelogs/7.8.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/changelogs/7.9.md b/web/changelogs/7.9.md deleted file mode 100644 index 4a79172..0000000 --- a/web/changelogs/7.9.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -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 \ No newline at end of file diff --git a/web/i18n/en/about.json b/web/i18n/en/about.json index e566faa..914c5cf 100644 --- a/web/i18n/en/about.json +++ b/web/i18n/en/about.json @@ -1,5 +1,5 @@ { - "page.general": "what's cobalt?", + "page.general": "what's team hydra video downloader?", "page.faq": "FAQ", "page.community": "community & support", diff --git a/web/i18n/en/dialog.json b/web/i18n/en/dialog.json index a2688f6..11980ac 100644 --- a/web/i18n/en/dialog.json +++ b/web/i18n/en/dialog.json @@ -8,18 +8,18 @@ "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.", - "saving.timeout": "cobalt tried saving the file automatically, but your browser stopped it. you have to select a preferred method manually.", + "saving.blocked": "team hydra video downloader tried opening the file in a new tab, but your browser blocked it. you can allow pop-ups for team hydra video downloader to prevent this from happening next time.", + "saving.timeout": "team hydra video downloader tried saving the file automatically, but your browser stopped it. you have to select a preferred method manually.", "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.", + "import.body": "importing unknown or corrupted files may unexpectedly alter or break team hydra video downloader 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.", "api.override.title": "processing instance override", "api.override.body": "{{ value }} is now the processing instance. if you don't trust it, press \"cancel\" and it'll be ignored.\n\nyou can change your choice later in processing settings.", - "safety.custom_instance.body": "custom instances can potentially pose privacy & safety risks.\n\nbad instances can:\n1. redirect you away from cobalt and try to scam you.\n2. log all information about your requests, store it forever, and use it to track you.\n3. serve you malicious files (such as malware).\n4. force you to watch ads, or make you pay for downloading.\n\nafter this point, we can't protect you. please be mindful of what instances to use and always trust your gut. if anything feels off, come back to this page, reset the custom instance, and report it to us on github.", + "safety.custom_instance.body": "custom instances can potentially pose privacy & safety risks.\n\nbad instances can:\n1. redirect you away from team hydra video downloader and try to scam you.\n2. log all information about your requests, store it forever, and use it to track you.\n3. serve you malicious files (such as malware).\n4. force you to watch ads, or make you pay for downloading.\n\nafter this point, we can't protect you. please be mindful of what instances to use and always trust your gut. if anything feels off, come back to this page, reset the custom instance, and report it to us on github.", - "processing.ongoing": "cobalt is currently processing media in this tab. going away will abort it. are you sure you want to do this?", + "processing.ongoing": "team hydra video downloader is currently processing media in this tab. going away will abort it. are you sure you want to do this?", "processing.title.ongoing": "processing will be cancelled" } diff --git a/web/i18n/en/error.json b/web/i18n/en/error.json index 6a73005..4469590 100644 --- a/web/i18n/en/error.json +++ b/web/i18n/en/error.json @@ -1,10 +1,10 @@ { "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.invalid": "your file doesn't have valid team hydra video downloader 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\n{{ value }}", "remux.corrupted": "couldn't read the metadata from this file, it may be corrupted.", - "remux.out_of_resources": "cobalt ran out of resources and can't continue with on-device processing. this is related to limitations on your browser's side. try refreshing or reopening the app and trying again. some devices can only process tiny files.", + "remux.out_of_resources": "team hydra video downloader ran out of resources and can't continue with on-device processing. this is related to limitations on your browser's side. try refreshing or reopening the app and trying again. some devices can only process tiny files.", "tunnel.probe": "couldn't verify whether you can download this file. try again in a few seconds!", @@ -16,13 +16,13 @@ "api.unreachable": "couldn't connect to the processing server. check your internet connection and try again.", "api.timed_out": "the processing server took way too long to respond. it may be overwhelmed at the moment, try again in a few seconds!", "api.rate_exceeded": "you're making way too many requests. try again in {{ limit }} seconds!", - "api.capacity": "cobalt is at capacity and can't process your request at the moment. try again in a few seconds. if it still doesn't work, let us know and we'll try to help!", + "api.capacity": "team hydra video downloader is at capacity and can't process your request at the moment. try again in a few seconds. if it still doesn't work, let us know and we'll try to help!", "api.generic": "something went wrong and i couldn't get anything for you. try again in a few seconds, but if issue sticks, let us know and we'll try to help!", - "api.unknown_response": "couldn't parse the response from the server. this could be caused by a version mismatch. are you sure you're on the latest version of cobalt?", + "api.unknown_response": "couldn't parse the response from the server. this could be caused by a version mismatch. are you sure you're on the latest version of team hydra video downloader?", "api.service.unsupported": "this service is not supported yet. have you pasted the right link?", - "api.service.disabled": "this service is supported by cobalt, but it's disabled on this instance. try a link from another service!", + "api.service.disabled": "this service is supported by team hydra video downloader, but it's disabled on this instance. try a link from another service!", "api.link.invalid": "your link is invalid or this service is not supported yet. have you pasted the right link?", "api.link.unsupported": "{{ service }} is supported, but i couldn't recognize your link. have you pasted the right one?", @@ -30,7 +30,7 @@ "api.fetch.fail": "something went wrong when fetching info from {{ service }} and i couldn't find anything for you. are you sure your link works? if it does and you still see this error, let us know and we'll try to help!", "api.fetch.critical": "the {{ service }} module returned an error that i don't recognize. try again in a few seconds, but if issue sticks, let us know!", "api.fetch.empty": "couldn't find any media that i could download for you. are you sure you pasted the right link?", - "api.fetch.rate": "the cobalt processing server got rate limited by the {{ service }} api. try again in a few seconds!", + "api.fetch.rate": "the team hydra video downloader processing server got rate limited by the {{ service }} api. try again in a few seconds!", "api.fetch.short_link": "couldn't get link info from the short link. are you sure it works? if it does and you still get this error, let us know, and we'll try to help!", "api.content.too_long": "the media you requested is too long. current duration limit is {{ limit }} minutes. try something shorter instead!", diff --git a/web/i18n/en/save.json b/web/i18n/en/save.json index 79a65df..6327388 100644 --- a/web/i18n/en/save.json +++ b/web/i18n/en/save.json @@ -10,14 +10,14 @@ "services.title": "supported services", "services.title_show": "show supported services", "services.title_hide": "hide supported services", - "services.disclaimer": "cobalt is not affiliated with any of the services listed above.", + "services.disclaimer": "team hydra video downloader is not affiliated with any of the services listed above.", "tutorial.title": "how to save on ios?", "tutorial.intro": "to save media conveniently on ios, you'll need to use a companion siri shortcut from the share sheet.", "tutorial.step.1": "add companion siri shortcuts:", - "tutorial.step.2": "press the \"share\" button in cobalt's saving dialog.", + "tutorial.step.2": "press the \"share\" button in team hydra video downloader's saving dialog.", "tutorial.step.3": "select the respective shortcut in the share sheet.", - "tutorial.outro": "these shortcuts will work only from the cobalt app, sharing links from other apps will not work.", + "tutorial.outro": "these shortcuts will work only from the team hydra video downloader app, sharing links from other apps will not work.", "tutorial.shortcut.photos": "to photos", "tutorial.shortcut.files": "to files" } diff --git a/web/i18n/en/settings.json b/web/i18n/en/settings.json index fea15d2..99b18ad 100644 --- a/web/i18n/en/settings.json +++ b/web/i18n/en/settings.json @@ -50,22 +50,22 @@ "audio.bitrate": "audio bitrate", "audio.bitrate.kbps": "kb/s", - "audio.bitrate.description": "bitrate applies only to audio conversion. cobalt can't improve the source audio quality, so choosing a bitrate over 128kbps may inflate the file size with no audible difference. perceived quality may vary by format.", + "audio.bitrate.description": "bitrate applies only to audio conversion. team hydra video downloader can't improve the source audio quality, so choosing a bitrate over 128kbps may inflate the file size with no audible difference. perceived quality may vary by format.", "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.youtube.dub.description": "works even if team hydra video downloader isn't translated to your language.", "audio.tiktok.original": "tiktok", "audio.tiktok.original.title": "download original sound", - "audio.tiktok.original.description": "cobalt will download the sound from the video without any changes by the post's author.", + "audio.tiktok.original.description": "team hydra video downloader will download the sound from the video without any 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 tunneled by cobalt. some services don't support filename styles other than classic.", + "metadata.filename.description": "filename style will only be used for files tunneled by team hydra video downloader. some services don't support filename styles other than classic.", "metadata.filename.preview.video": "Video Title", "metadata.filename.preview.audio": "Audio Title - Audio Author", @@ -79,7 +79,7 @@ "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.", + "saving.description": "preferred way of saving the file or link from team hydra video downloader. if preferred method is unavailable or something goes wrong, team hydra video downloader will ask you what to do next.", "accessibility": "accessibility", "accessibility.transparency.title": "reduce visual transparency", @@ -95,12 +95,12 @@ "privacy.analytics": "anonymous traffic analytics", "privacy.analytics.title": "don't contribute to analytics", - "privacy.analytics.description": "anonymous traffic analytics are needed to get an approximate number of active cobalt users. no identifiable information about you is ever stored. all processed data is anonymized and aggregated.\n\nwe use a self-hosted plausible instance that doesn't use cookies and is fully compliant with GDPR, CCPA, and PECR.", + "privacy.analytics.description": "anonymous traffic analytics are needed to get an approximate number of active team hydra video downloader users. no identifiable information about you is ever stored. all processed data is anonymized and aggregated.\n\nwe use a self-hosted plausible instance that doesn't use cookies and is fully compliant with GDPR, CCPA, and PECR.", "privacy.analytics.learnmore": "learn more about plausible's dedication to privacy.", "privacy.tunnel": "tunneling", "privacy.tunnel.title": "always tunnel files", - "privacy.tunnel.description": "cobalt will hide your ip address, browser info, and bypass local network restrictions. when enabled, files will also have readable filenames that otherwise would be gibberish.", + "privacy.tunnel.description": "team hydra video downloader will hide your ip address, browser info, and bypass local network restrictions. when enabled, files will also have readable filenames that otherwise would be gibberish.", "advanced.debug": "debug", "advanced.debug.title": "enable debug features", @@ -115,7 +115,7 @@ "processing.community": "community instances", "processing.enable_custom.title": "use a custom processing server", - "processing.enable_custom.description": "cobalt will use a custom processing server if you choose to. even though cobalt has some security measures in place, we are not responsible for any damages done via a community instance, as we have no control over them.\n\nplease be mindful of what instances you use and make sure they're hosted by people you trust.", + "processing.enable_custom.description": "team hydra video downloader will use a custom processing server if you choose to. even though team hydra video downloader has some security measures in place, we are not responsible for any damages done via a community instance, as we have no control over them.\n\nplease be mindful of what instances you use and make sure they're hosted by people you trust.", "processing.custom.placeholder": "custom instance domain" } diff --git a/web/package.json b/web/package.json index 67c779b..b53f3ac 100644 --- a/web/package.json +++ b/web/package.json @@ -1,5 +1,5 @@ { - "name": "@imput/cobalt-web", + "name": "teamhydra-videodl-web", "version": "10.0.0", "type": "module", "private": true, @@ -17,12 +17,8 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/imputnet/cobalt.git" + "url": "git+https://teamhydra.io/Team-Hydra/Video-Downloader.git" }, - "bugs": { - "url": "https://github.com/imputnet/cobalt/issues" - }, - "homepage": "https://cobalt.tools/", "devDependencies": { "@eslint/js": "^9.5.0", "@fontsource/redaction-10": "^5.0.2",