diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce0dc71..fdc13dd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,230 +4,88 @@ name: release on: push: tags: - - "[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+" # We need this to be able to create releases. permissions: contents: write jobs: - # The create-release job runs purely to initialize the GitHub release itself, - # and names the release after the `x.y.z` tag that was pushed. It's separate - # from building the release so that we only create the release once. - create-release: - name: create-release - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Get the release version from the tag - if: env.VERSION == '' - run: echo "VERSION=${{ github.ref_name }}" >> $GITHUB_ENV - - name: Show the version - run: | - echo "version is: $VERSION" - - name: Check that tag version and Cargo.toml version are the same - shell: bash - run: | - if ! grep -q "version = \"$VERSION\"" Cargo.toml; then - echo "version does not match Cargo.toml" >&2 - exit 1 - fi - - name: Create GitHub release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh release create $VERSION --draft --verify-tag --title $VERSION - outputs: - version: ${{ env.VERSION }} - - build-release: - name: build-release - needs: ['create-release'] - runs-on: ${{ matrix.os }} - env: - CARGO: cargo - # When CARGO is set to CROSS, this is set to `--target matrix.target`. - TARGET_FLAGS: - # When CARGO is set to CROSS, TARGET_DIR includes matrix.target. - TARGET_DIR: ./target - # Bump this as appropriate. We pin to a version to make sure CI - # continues to work as cross releases in the past have broken things - # in subtle ways. - CROSS_VERSION: v0.2.5 - # Emit backtraces on panics. - RUST_BACKTRACE: 1 + release: + name: Release - ${{ matrix.platform.os-name }} strategy: - fail-fast: false matrix: - include: - - build: linux - os: ubuntu-latest - rust: nightly - target: x86_64-unknown-linux-musl - strip: x86_64-linux-musl-strip - - build: stable-x86 - os: ubuntu-latest - rust: stable - target: i686-unknown-linux-gnu - strip: x86_64-linux-gnu-strip - qemu: i386 - - build: stable-aarch64 - os: ubuntu-latest - rust: stable - target: aarch64-unknown-linux-gnu - strip: aarch64-linux-gnu-strip - qemu: qemu-aarch64 - - build: stable-arm-gnueabihf - os: ubuntu-latest - rust: stable - target: armv7-unknown-linux-gnueabihf - strip: arm-linux-gnueabihf-strip - qemu: qemu-arm - - build: stable-arm-musleabihf - os: ubuntu-latest - rust: stable - target: armv7-unknown-linux-musleabihf - strip: arm-linux-musleabihf-strip - qemu: qemu-arm - - build: stable-arm-musleabi - os: ubuntu-latest - rust: stable - target: armv7-unknown-linux-musleabi - strip: arm-linux-musleabi-strip - qemu: qemu-arm - - build: stable-powerpc64 - os: ubuntu-latest - rust: stable - target: powerpc64-unknown-linux-gnu - strip: powerpc64-linux-gnu-strip - qemu: qemu-ppc64 - - build: stable-s390x - os: ubuntu-latest - rust: stable - target: s390x-unknown-linux-gnu - strip: s390x-linux-gnu-strip - qemu: qemu-s390x - - build: macos - os: macos-latest - rust: nightly - target: x86_64-apple-darwin - - build: win-msvc - os: windows-latest - rust: nightly - target: x86_64-pc-windows-msvc - - build: win-gnu - os: windows-latest - rust: nightly-x86_64-gnu - target: x86_64-pc-windows-gnu - - build: win32-msvc - os: windows-latest - rust: nightly - target: i686-pc-windows-msvc - + platform: + - os-name: freebsd-x86_64 + runs-on: ubuntu-latest + target: x86_64-unknown-freebsd + command: build + strip: true + + - os-name: linux-x86_64 + runs-on: ubuntu-latest + target: x86_64-unknown-linux-gnu + command: both + strip: true + + - os-name: linux-x86_64-musl + runs-on: ubuntu-latest + target: x86_64-unknown-linux-musl + command: both + strip: true + + - os-name: linux-aarch64 + runs-on: ubuntu-latest + target: aarch64-unknown-linux-gnu + command: both + strip: true + + - os-name: linux-aarch64-musl + runs-on: ubuntu-latest + target: aarch64-unknown-linux-musl + command: both + strip: true + + - os-name: windows-x86_64 + runs-on: windows-latest + target: x86_64-pc-windows-msvc + command: both + strip: true + + - os-name: windows-aarch64 + runs-on: windows-latest + target: aarch64-pc-windows-msvc + command: build + strip: true + + - os-name: macos-x86_64 + runs-on: macOS-latest + target: x86_64-apple-darwin + command: both + strip: true + + - os-name: macos-aarch64 + runs-on: macOS-latest + target: aarch64-apple-darwin + command: both + strip: true + + runs-on: ${{ matrix.platform.runs-on }} steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install packages (Ubuntu) - if: matrix.os == 'ubuntu-latest' - shell: bash - run: | - ci/ubuntu-install-packages - - - name: Install Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ matrix.rust }} - target: ${{ matrix.target }} - - - name: Use Cross - if: matrix.os == 'ubuntu-latest' && matrix.target != '' - shell: bash - run: | - # In the past, new releases of 'cross' have broken CI. So for now, we - # pin it. We also use their pre-compiled binary releases because cross - # has over 100 dependencies and takes a bit to compile. - dir="$RUNNER_TEMP/cross-download" - mkdir "$dir" - echo "$dir" >> $GITHUB_PATH - cd "$dir" - curl -LO "https://github.com/cross-rs/cross/releases/download/$CROSS_VERSION/cross-x86_64-unknown-linux-musl.tar.gz" - tar xf cross-x86_64-unknown-linux-musl.tar.gz - echo "CARGO=cross" >> $GITHUB_ENV - - - name: Set target variables - shell: bash - run: | - echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV - echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV - - - name: Show command used for Cargo - shell: bash - run: | - echo "cargo command is: ${{ env.CARGO }}" - echo "target flag is: ${{ env.TARGET_FLAGS }}" - echo "target dir is: ${{ env.TARGET_DIR }}" - - - name: Build release binary - shell: bash - run: | - ${{ env.CARGO }} build --verbose --release ${{ env.TARGET_FLAGS }} - if [ "${{ matrix.os }}" = "windows-latest" ]; then - bin="target/${{ matrix.target }}/release/cnova.exe" - else - bin="target/${{ matrix.target }}/release/cnova" - fi - echo "BIN=$bin" >> $GITHUB_ENV - - - name: Strip release binary (macos) - if: matrix.os == 'macos-latest' - shell: bash - run: strip "$BIN" - - - name: Strip release binary (cross) - if: env.CARGO == 'cross' - shell: bash - run: | - docker run --rm -v \ - "$PWD/target:/target:Z" \ - "ghcr.io/cross-rs/${{ matrix.target }}:main" \ - "${{ matrix.strip }}" \ - "/$BIN" - - - name: Determine archive name - shell: bash - run: | - version="${{ needs.create-release.outputs.version }}" - echo "ARCHIVE=cnova-$version-${{ matrix.target }}" >> $GITHUB_ENV - - - name: Creating directory for archive - shell: bash - run: | - mkdir -p "$ARCHIVE"/{complete,doc} - cp "$BIN" "$ARCHIVE"/ - cp {README.md,LICENSE.md} "$ARCHIVE"/ - - - name: Build archive (Windows) - shell: bash - if: matrix.os == 'windows-latest' - run: | - 7z a "$ARCHIVE.zip" "$ARCHIVE" - certutil -hashfile "$ARCHIVE.zip" SHA256 > "$ARCHIVE.zip.sha256" - echo "ASSET=$ARCHIVE.zip" >> $GITHUB_ENV - echo "ASSET_SUM=$ARCHIVE.zip.sha256" >> $GITHUB_ENV - - - name: Build archive (Unix) - shell: bash - if: matrix.os != 'windows-latest' - run: | - tar czf "$ARCHIVE.tar.gz" "$ARCHIVE" - shasum -a 256 "$ARCHIVE.tar.gz" > "$ARCHIVE.tar.gz.sha256" - echo "ASSET=$ARCHIVE.tar.gz" >> $GITHUB_ENV - echo "ASSET_SUM=$ARCHIVE.tar.gz.sha256" >> $GITHUB_ENV - - - name: Upload release archive - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - shell: bash - run: | - version="${{ needs.create-release.outputs.version }}" - gh release upload "$version" ${{ env.ASSET }} ${{ env.ASSET_SUM }} + - name: Checkout + uses: actions/checkout@v4 + - name: Build binary + uses: houseabsolute/actions-rust-cross@v0 + with: + command: ${{ matrix.platform.command }} + target: ${{ matrix.platform.target }} + args: "--locked --release" + strip: true + - name: Publish artifacts and release + uses: houseabsolute/actions-rust-release@v0 + with: + executable-name: cnova + target: ${{ matrix.platform.target }} + changes-file: "CHANGELOG.md" + release-tag-prefix: "v" + if: matrix.toolchain != 'beta' && matrix.toolchain != 'nightly' diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0aecc5f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.2.0 - 2024.12.21 + +- First more or less stable release diff --git a/Cargo.lock b/Cargo.lock index fa2e1e4..acba36e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -210,6 +210,7 @@ dependencies = [ "indoc", "lofty", "lrc", + "openssl", "reqwest", "serde", "serde_json", @@ -1042,6 +1043,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.4.1+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.104" @@ -1050,6 +1060,7 @@ checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] diff --git a/Cargo.toml b/Cargo.toml index 53e5fa2..4199087 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,3 +31,6 @@ tracing-subscriber = "0.3.19" [dev-dependencies] tempfile = "3.14.0" + +[target.'cfg(all(target_os = "linux", any(target_env = "musl", not(any(target_arch = "x86", target_arch = "x86_64")))))'.dependencies] +openssl = { version = "0.10", features = ["vendored"] } diff --git a/README.md b/README.md index ce07b68..73a8a30 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,31 @@ If you have Rust installed, simply execute ``` cargo install cnova ``` -to obtain the latest release version +to obtain the latest release version. Binaries are also available on +[releases](https://github.com/wetfloo/cnova/releases/latest) page. + +Usage +----- +In a typical usage scenario, you probably want to download lyrics for your music. +To do so, simply point `cnova` to the directory with music, like so: +``` +cnova ~/Music +``` + +`cnova` also supports downloading lyrics for single tracks, like so: +``` +cnova ~/Music/track1.flac ~/Music/track2.flac +``` + +You can also mix and match directories and files. + +When `cnova` obtains lyrics for a song, whether synced or unsynced, it will +create a corresponding `lrc`, if not present. For example, upon download lyrics +for a file `~/Music/track1.flac`, `Music/track1.lrc` will be created. Optionally, +you can force `cnova` to re-download `lrc` files, even if such files present + +If `cnova` is unable to obtain lyrics for a song +(for example, LRCLIB returns 404, or claims that a given track is instrumental), +it will create an empty `nolrc` file, corresponding to a given track. +If such file is encountered in the future, `cnova` won't attempt to download lyrics again, +unless specified.