diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f0b9262..5445036 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,8 +3,8 @@ updates: - package-ecosystem: "gomod" directory: "/" schedule: - interval: "weekly" + interval: "daily" - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" \ No newline at end of file + interval: "daily" \ No newline at end of file diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 842f599..a60699e 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.20" + go-version: stable - name: Run golangci-lint uses: golangci/golangci-lint-action@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4244a9e..20dbf49 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.20" + go-version: stable - name: Bump tag version id: bumpTag uses: anothrNick/github-tag-action@1.67.0 @@ -33,11 +33,19 @@ jobs: run: | echo "GOLANG_VERSION=$(go version)" >> $GITHUB_ENV echo "BUILT_BY=$(whoami)@$(hostname)" >> $GITHUB_ENV + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - uses: goreleaser/goreleaser-action@v5 with: distribution: goreleaser version: latest - args: release --clean + args: release --clean --skip=validate env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GOLANG_VERSION: ${{ env.GOLANG_VERSION }} diff --git a/.goreleaser.yml b/.goreleaser.yml index 212ba7a..410fb2a 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,6 +1,8 @@ +version: 1 before: hooks: - go mod tidy + builds: - env: - CGO_ENABLED=0 @@ -12,30 +14,13 @@ builds: - -X 'github.com/{{.Env.GITHUB_REPOSITORY}}/cmd.BuildDate={{.Date}}' - -X 'github.com/{{.Env.GITHUB_REPOSITORY}}/cmd.BuiltWithGoVersion={{.Env.GOLANG_VERSION}}' - -X 'github.com/{{.Env.GITHUB_REPOSITORY}}/cmd.BuiltBy={{.Env.BUILT_BY}}' - targets: - - darwin_amd64 - - darwin_arm64 - - linux_386 - - linux_amd64 - - linux_amd64_v3 - - linux_arm_5 - - linux_arm_6 - - linux_arm_7 - - linux_arm64 - # - linux_mips_softfloat - # - linux_mips_hardfloat - # - linux_mipsle_softfloat - # - linux_mipsle_hardfloat - # - linux_mips64 - # - linux_mips64le - # - linux_s390x - # - linux_riscv64 - # - freebsd_386 - # - freebsd_amd64 - - windows_386 - - windows_amd64 - - windows_amd64_v3 - - windows_arm64 + goos: + - linux + - windows + - darwin + goarch: + - amd64 + - arm64 archives: - wrap_in_directory: false @@ -43,9 +28,48 @@ archives: format_overrides: - goos: windows format: zip + checksum: name_template: "checksums.txt" + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + release: draft: true prerelease: auto - name_template: "{{.ProjectName}}-v{{.Version}}-{{.Date}}" \ No newline at end of file + name_template: "{{.ProjectName}}-v{{.Version}}-{{.Date}}" + +dockers: + - use: buildx + goos: linux + goarch: amd64 + dockerfile: Dockerfile + image_templates: + - "ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }}-amd64" + - "ghcr.io/cxjava/{{ .ProjectName }}:latest-amd64" + build_flag_templates: + - --platform=linux/amd64 + - use: buildx + goos: linux + goarch: arm64 + dockerfile: Dockerfile + image_templates: + - "ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }}-arm64v8" + - "ghcr.io/cxjava/{{ .ProjectName }}:latest-arm64v8" + build_flag_templates: + - --platform=linux/arm64/v8 + +docker_manifests: + - name_template: ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }} + image_templates: + - ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }}-amd64 + - ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }}-arm64v8 + - name_template: ghcr.io/cxjava/{{ .ProjectName }}:latest + image_templates: + - ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }}-amd64 + - ghcr.io/cxjava/{{ .ProjectName }}:{{ .Version }}-arm64v8 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c0bb855 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM scratch +WORKDIR / +COPY m3u8-downloader / +USER 65534 +ENTRYPOINT ["/m3u8-downloader"] \ No newline at end of file diff --git a/README.md b/README.md index 9046e6e..30f8a96 100644 --- a/README.md +++ b/README.md @@ -33,19 +33,29 @@ m3u8 downloader by Golang - [ ] Delete error CDN IP -## Installation +# Installation -### Linux / macOS +* install from [jpillora/installer](https://github.com/jpillora/installer) -This [godownloader](https://github.com/kamilsk/godownloader) script will query GitHub for the latest release and download the correct binary for your platform into the directory set with the `-b` flag. +```sh +#install to /usr/local/bin +curl https://i.jpillora.com/cxjava/m3u8-downloader! | bash +# or +curl https://gobin.fly.dev/cxjava/m3u8-downloader! | bash +``` + +## Via [goblin.run](https://goblin.run) -#### System-wide Install +```shell +# binary will be /usr/local/bin/m3u8-downloader +curl -sSfL https://goblin.run/github.com/cxjava/m3u8-downloader | sh -```bash -wget -O - https://raw.githubusercontent.com/cxjava/m3u8-downloader/main/install.sh | sh -s -- -b /usr/local/bin +# to put to a custom path +curl -sSfL https://goblin.run/github.com/cxjava/m3u8-downloader | PREFIX=/tmp sh ``` + ## Ping command ``` shell diff --git a/install.sh b/install.sh deleted file mode 100644 index 367a477..0000000 --- a/install.sh +++ /dev/null @@ -1,389 +0,0 @@ -#!/bin/sh -set -e -# Code generated by godownloader on 2023-02-14T12:55:52Z. DO NOT EDIT. -# - -usage() { - this=$1 - cat </dev/null -} -echoerr() { - echo "$@" 1>&2 -} -log_prefix() { - echo "$0" -} -_logp=6 -log_set_priority() { - _logp="$1" -} -log_priority() { - if test -z "$1"; then - echo "$_logp" - return - fi - [ "$1" -le "$_logp" ] -} -log_tag() { - case $1 in - 0) echo "emerg" ;; - 1) echo "alert" ;; - 2) echo "crit" ;; - 3) echo "err" ;; - 4) echo "warning" ;; - 5) echo "notice" ;; - 6) echo "info" ;; - 7) echo "debug" ;; - *) echo "$1" ;; - esac -} -log_debug() { - log_priority 7 || return 0 - echoerr "$(log_prefix)" "$(log_tag 7)" "$@" -} -log_info() { - log_priority 6 || return 0 - echoerr "$(log_prefix)" "$(log_tag 6)" "$@" -} -log_err() { - log_priority 3 || return 0 - echoerr "$(log_prefix)" "$(log_tag 3)" "$@" -} -log_crit() { - log_priority 2 || return 0 - echoerr "$(log_prefix)" "$(log_tag 2)" "$@" -} -uname_os() { - os=$(uname -s | tr '[:upper:]' '[:lower:]') - case "$os" in - cygwin_nt*) os="windows" ;; - mingw*) os="windows" ;; - msys_nt*) os="windows" ;; - esac - echo "$os" -} -uname_arch() { - arch=$(uname -m) - case $arch in - x86_64) arch="amd64" ;; - x86) arch="386" ;; - i686) arch="386" ;; - i386) arch="386" ;; - aarch64) arch="arm64" ;; - armv5*) arch="armv5" ;; - armv6*) arch="armv6" ;; - armv7*) arch="armv7" ;; - esac - echo ${arch} -} -uname_os_check() { - os=$(uname_os) - case "$os" in - darwin) return 0 ;; - dragonfly) return 0 ;; - freebsd) return 0 ;; - linux) return 0 ;; - android) return 0 ;; - nacl) return 0 ;; - netbsd) return 0 ;; - openbsd) return 0 ;; - plan9) return 0 ;; - solaris) return 0 ;; - windows) return 0 ;; - esac - log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" - return 1 -} -uname_arch_check() { - arch=$(uname_arch) - case "$arch" in - 386) return 0 ;; - amd64) return 0 ;; - arm64) return 0 ;; - armv5) return 0 ;; - armv6) return 0 ;; - armv7) return 0 ;; - ppc64) return 0 ;; - ppc64le) return 0 ;; - mips) return 0 ;; - mipsle) return 0 ;; - mips64) return 0 ;; - mips64le) return 0 ;; - s390x) return 0 ;; - amd64p32) return 0 ;; - esac - log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" - return 1 -} -untar() { - tarball=$1 - case "${tarball}" in - *.tar.gz | *.tgz) tar --no-same-owner -xzf "${tarball}" ;; - *.tar) tar --no-same-owner -xf "${tarball}" ;; - *.zip) unzip "${tarball}" ;; - *) - log_err "untar unknown archive format for ${tarball}" - return 1 - ;; - esac -} -http_download_curl() { - local_file=$1 - source_url=$2 - header=$3 - if [ -z "$header" ]; then - code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") - else - code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") - fi - if [ "$code" != "200" ]; then - log_debug "http_download_curl received HTTP status $code" - return 1 - fi - return 0 -} -http_download_wget() { - local_file=$1 - source_url=$2 - header=$3 - if [ -z "$header" ]; then - wget -q -O "$local_file" "$source_url" - else - wget -q --header "$header" -O "$local_file" "$source_url" - fi -} -http_download() { - log_debug "http_download $2" - if is_command curl; then - http_download_curl "$@" - return - elif is_command wget; then - http_download_wget "$@" - return - fi - log_crit "http_download unable to find wget or curl" - return 1 -} -http_copy() { - tmp=$(mktemp) - http_download "${tmp}" "$1" "$2" || return 1 - body=$(cat "$tmp") - rm -f "${tmp}" - echo "$body" -} -github_release() { - owner_repo=$1 - version=$2 - test -z "$version" && version="latest" - giturl="https://github.com/${owner_repo}/releases/${version}" - json=$(http_copy "$giturl" "Accept:application/json") - test -z "$json" && return 1 - version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') - test -z "$version" && return 1 - echo "$version" -} -hash_sha256() { - TARGET=${1:-/dev/stdin} - if is_command gsha256sum; then - hash=$(gsha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command sha256sum; then - hash=$(sha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command shasum; then - hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command openssl; then - hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f a - else - log_crit "hash_sha256 unable to find command to compute sha-256 hash" - return 1 - fi -} -hash_sha256_verify() { - TARGET=$1 - checksums=$2 - if [ -z "$checksums" ]; then - log_err "hash_sha256_verify checksum file not specified in arg2" - return 1 - fi - BASENAME=${TARGET##*/} - want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) - if [ -z "$want" ]; then - log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" - return 1 - fi - got=$(hash_sha256 "$TARGET") - if [ "$want" != "$got" ]; then - log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" - return 1 - fi -} -cat /dev/null <