diff --git a/.github/workflows/build-nightly-container.yml b/.github/workflows/build-nightly-container.yml index 44be0baee..00094e5b4 100644 --- a/.github/workflows/build-nightly-container.yml +++ b/.github/workflows/build-nightly-container.yml @@ -29,7 +29,7 @@ jobs: - os: ubuntu-24.04-arm platform: linux/arm64/v8 name: "ARM64" - dockerfile: "docker/Dockerfile.arm64" + dockerfile: "docker/Dockerfile" tag_suffix: "-arm64" runs-on: ${{ matrix.os }} @@ -39,10 +39,10 @@ jobs: uses: actions/checkout@v6 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} @@ -50,7 +50,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: quay.io/invidious/invidious flavor: | @@ -62,13 +62,34 @@ jobs: quay.expires-after=12w - name: Build and push Docker ${{ matrix.name }} image for Push Event - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . - file: ${{ matrix.dockerfile }} + file: ${{ matrix.dockerfile }} platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} push: true tags: ${{ steps.meta.outputs.tags }} build-args: | "release=1" + + combine-multiarch-images: + needs: release + runs-on: ubuntu-latest + steps: + - name: Login to registry + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_PASSWORD }} + + # https://github.com/marketplace/actions/docker-manifest-create-action + - name: Create and push manifest + uses: int128/docker-manifest-create-action@v2.20.0 + with: + push: true + tags: quay.io/invidious/invidious:master + sources: | + quay.io/invidious/invidious:master + quay.io/invidious/invidious:master-arm64 diff --git a/.github/workflows/build-stable-container.yml b/.github/workflows/build-stable-container.yml index e119880d5..4297c1963 100644 --- a/.github/workflows/build-stable-container.yml +++ b/.github/workflows/build-stable-container.yml @@ -20,7 +20,7 @@ jobs: - os: ubuntu-24.04-arm platform: linux/arm64/v8 name: "ARM64" - dockerfile: "docker/Dockerfile.arm64" + dockerfile: "docker/Dockerfile" tag_suffix: "-arm64" runs-on: ${{ matrix.os }} @@ -30,10 +30,10 @@ jobs: uses: actions/checkout@v6 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: quay.io username: ${{ secrets.QUAY_USERNAME }} @@ -41,7 +41,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: quay.io/invidious/invidious flavor: | @@ -54,13 +54,34 @@ jobs: quay.expires-after=12w - name: Build and push Docker ${{ matrix.name }} image for Push Event - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . - file: ${{ matrix.dockerfile }} + file: ${{ matrix.dockerfile }} platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} push: true tags: ${{ steps.meta.outputs.tags }} build-args: | "release=1" + + combine-multiarch-images: + needs: release + runs-on: ubuntu-latest + steps: + - name: Login to registry + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_PASSWORD }} + + # https://github.com/marketplace/actions/docker-manifest-create-action + - name: Create and push manifest + uses: int128/docker-manifest-create-action@v2.20.0 + with: + push: true + tags: quay.io/invidious/invidious:latest + sources: | + quay.io/invidious/invidious:latest + quay.io/invidious/invidious:latest-arm64 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 847342f77..ee5b457c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,8 @@ jobs: - 1.16.3 - 1.17.1 - 1.18.2 + - 1.19.2 + - 1.20.1 include: - crystal: nightly stable: false @@ -58,7 +60,7 @@ jobs: shell: bash - name: Install Crystal - uses: crystal-lang/install-crystal@v1.9.1 + uses: crystal-lang/install-crystal@v1.9.2 with: crystal: ${{ matrix.crystal }} @@ -80,7 +82,7 @@ jobs: run: crystal spec - name: Build - run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr + run: crystal build --warnings all --error-on-warnings --stats --time --progress --error-trace src/invidious.cr build-docker: strategy: @@ -98,10 +100,6 @@ jobs: steps: - uses: actions/checkout@v6 - - name: Use ARM64 Dockerfile if ARM64 - if: ${{ matrix.name == 'ARM64' }} - run: sed -i 's/Dockerfile/Dockerfile.arm64/' docker-compose.yml - - name: Build Docker run: docker compose build @@ -134,7 +132,7 @@ jobs: - name: Install Crystal id: lint_step_install_crystal - uses: crystal-lang/install-crystal@v1.9.1 + uses: crystal-lang/install-crystal@v1.9.2 with: crystal: latest diff --git a/assets/js/player.js b/assets/js/player.js index e9e9038d5..455b557c2 100644 --- a/assets/js/player.js +++ b/assets/js/player.js @@ -104,14 +104,15 @@ if (video_data.params.quality === 'dash') { * * @param {String} url * @param {String} [base] + * @param {'t' | 'start'} param * @returns {URL} urlWithTimeArg */ -function addCurrentTimeToURL(url, base) { +function addCurrentTimeToURL(url, base, param = 't') { var urlUsed = new URL(url, base); urlUsed.searchParams.delete('start'); var currentTime = Math.ceil(player.currentTime()); if (currentTime > 0) - urlUsed.searchParams.set('t', currentTime); + urlUsed.searchParams.set(param, currentTime); else if (urlUsed.searchParams.has('t')) urlUsed.searchParams.delete('t'); return urlUsed; @@ -147,7 +148,7 @@ player.on('timeupdate', function () { let elem_yt_embed = document.getElementById('link-yt-embed'); if (elem_yt_embed) { let base_url_yt_embed = elem_yt_embed.getAttribute('data-base-url'); - elem_yt_embed.href = addCurrentTimeToURL(base_url_yt_embed); + elem_yt_embed.href = addCurrentTimeToURL(base_url_yt_embed, undefined, 'start'); } } diff --git a/docker/Dockerfile b/docker/Dockerfile index e2d303648..820005ba7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,7 +2,7 @@ ARG OPENSSL_VERSION='3.5.2' ARG OPENSSL_SHA256='c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec' -FROM crystallang/crystal:1.16.3-alpine AS dependabot-crystal +FROM crystallang/crystal:1.20.1-alpine AS dependabot-crystal # We compile openssl ourselves due to a memory leak in how crystal interacts # with openssl @@ -43,7 +43,7 @@ COPY ./assets/ ./assets/ COPY ./videojs-dependencies.yml ./videojs-dependencies.yml RUN crystal spec --warnings all \ - --link-flags "-lxml2 -llzma" + --link-flags "-lxml2 -llzma" ARG OPENSSL_VERSION COPY --from=openssl-builder /openssl-${OPENSSL_VERSION} /openssl-${OPENSSL_VERSION} diff --git a/docker/Dockerfile.arm64 b/docker/Dockerfile.arm64 deleted file mode 100644 index ce691c915..000000000 --- a/docker/Dockerfile.arm64 +++ /dev/null @@ -1,83 +0,0 @@ -# https://github.com/openssl/openssl/releases/tag/openssl-3.5.2 -ARG OPENSSL_VERSION='3.5.2' -ARG OPENSSL_SHA256='c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec' - -FROM alpine:3.22 AS dependabot-alpine - -# We compile openssl ourselves due to a memory leak in how crystal interacts -# with openssl -# Reference: https://github.com/iv-org/invidious/issues/1438#issuecomment-3087636228 -FROM dependabot-alpine AS openssl-builder -RUN apk add --no-cache curl perl linux-headers build-base - -WORKDIR / - -ARG OPENSSL_VERSION -ARG OPENSSL_SHA256 -RUN curl -Ls "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" --output openssl-${OPENSSL_VERSION}.tar.gz -RUN echo "${OPENSSL_SHA256} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c -RUN tar -xzvf openssl-${OPENSSL_VERSION}.tar.gz - -RUN cd openssl-${OPENSSL_VERSION} && ./Configure --openssldir=/etc/ssl && make -j$(nproc) - -FROM dependabot-alpine AS builder -RUN apk add --no-cache 'crystal=1.16.3-r0' shards \ - sqlite-static yaml-static yaml-dev \ - pcre2-static gc-static \ - libxml2-static zlib-static \ - openssl-libs-static openssl-dev musl-dev xz-static - -ARG release - -WORKDIR /invidious -COPY ./shard.yml ./shard.yml -COPY ./shard.lock ./shard.lock -RUN shards install --production - -COPY ./src/ ./src/ -# TODO: .git folder is required for building – this is destructive. -# See definition of CURRENT_BRANCH, CURRENT_COMMIT and CURRENT_VERSION. -COPY ./.git/ ./.git/ - -# Required for fetching player dependencies -COPY ./scripts/ ./scripts/ -COPY ./assets/ ./assets/ -COPY ./videojs-dependencies.yml ./videojs-dependencies.yml - -RUN crystal spec --warnings all \ - --link-flags "-lxml2 -llzma" - -ARG OPENSSL_VERSION -COPY --from=openssl-builder /openssl-${OPENSSL_VERSION} /openssl-${OPENSSL_VERSION} - -RUN --mount=type=cache,target=/root/.cache/crystal if [[ "${release}" == 1 ]] ; then \ - PKG_CONFIG_PATH=/openssl-${OPENSSL_VERSION} \ - crystal build ./src/invidious.cr \ - --release \ - --static --warnings all \ - --link-flags "-lxml2 -llzma"; \ - else \ - PKG_CONFIG_PATH=/openssl-${OPENSSL_VERSION} \ - crystal build ./src/invidious.cr \ - --static --warnings all \ - --link-flags "-lxml2 -llzma"; \ - fi - -FROM alpine:3.22 -RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata -WORKDIR /invidious -RUN addgroup -g 1000 -S invidious && \ - adduser -u 1000 -S invidious -G invidious -COPY --chown=invidious ./config/config.* ./config/ -RUN mv -n config/config.example.yml config/config.yml -RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: invidious-db/' config/config.yml -COPY ./config/sql/ ./config/sql/ -COPY ./locales/ ./locales/ -COPY --from=builder /invidious/assets ./assets/ -COPY --from=builder /invidious/invidious . -RUN chmod o+rX -R ./assets ./config ./locales - -EXPOSE 3000 -USER invidious -ENTRYPOINT ["/sbin/tini", "--"] -CMD [ "/invidious/invidious" ] diff --git a/scripts/generate_js_licenses.cr b/scripts/generate_js_licenses.cr index 1f4ffa624..7df70bf2a 100644 --- a/scripts/generate_js_licenses.cr +++ b/scripts/generate_js_licenses.cr @@ -24,7 +24,7 @@ def create_licence_tr(path, file_name, licence_name, licence_link, source_locati "
[ − ] #{child.author} - #{translate_count(locale, "comments_points_count", child.score, NumberFormatting::Separator)} - #{translate(locale, "`x` ago", recode_date(child.created_utc, locale))} - #{translate(locale, "permalink")} + #{I18n.translate_count(locale, "comments_points_count", child.score, I18n::NumberFormatting::Separator)} + #{I18n.translate(locale, "`x` ago", recode_date(child.created_utc, locale))} + #{I18n.translate(locale, "permalink")}
#{translate(locale, "Download is disabled")}
" + return "#{I18n.translate(locale, "Download is disabled")}
" end if CONFIG.dmca_content.includes?(video.id) - return "#{translate(locale, "dmca_content")}
" + return "#{I18n.translate(locale, "dmca_content")}
" end url = "/download" @@ -49,7 +49,7 @@ module Invidious::Frontend::WatchPage str << "\t