From 9973ccc5dfaad8b103006b5a9bbad85441526838 Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Mon, 31 Mar 2025 22:02:33 +0200 Subject: [PATCH 01/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39e85ce..356970f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ *Tidal music downloader based on the hifi-tui API* -### https://github.com/sachinsenal0x64/Hifi-Tui +### Based on [hifi-tui](https://github.com/sachinsenal0x64/Hifi-Tui) ## Requirements - `bash`, `curl`, `jq`, `awk`, `flac` From 4a60838f93f5d4478a3c3c6e2972e158a556f03a Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Sun, 20 Apr 2025 11:24:27 +0200 Subject: [PATCH 02/12] Added lyrics downloading --- src/tidler | 93 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/src/tidler b/src/tidler index e015973..57a198f 100755 --- a/src/tidler +++ b/src/tidler @@ -2,7 +2,7 @@ . tidler.conf # Load ENVs from config file -version="0.3.0" +version="0.3.1" if [ -n "$PROXY_URL" ]; then @@ -50,6 +50,7 @@ else max_attempts="10" # Default value fi + downloadTrack() { if [ "$#" -ge 1 ]; then echo "Downloading track with ID: $1" @@ -59,39 +60,56 @@ downloadTrack() { read -r id fi - if [ "$#" -ge 2 ]; then - album_dir="$2" - else - album_dir="" - fi - attempt_num=1 success=false + lrc_success=false + while [ $attempt_num -le $max_attempts ]; do json_data=$(curl -# "$proxy_url/track/?id=$id&quality=$quality") - + if [ $? -eq 0 ]; then track_name=$(echo "$json_data" | jq -r '.[0].title // empty') - + if [ -n "$track_name" ]; then artist_name=$(echo "$json_data" | jq -r '.[0].artist.name // empty') - + if [ -n "$artist_name" ]; then album_name=$(echo "$json_data" | jq -r '.[0].album.title // empty') - + if [ -n "$album_name" ]; then url=$(echo "$json_data" | jq -r '.[-1].OriginalTrackUrl // empty') - + if [ -n "$url" ]; then cover_data=$(curl -# "$proxy_url/cover/?id=$id") cover_url=$(echo "$cover_data" | jq -r '.[]["1280"] // empty') - - if [ -n "$cover_url" ]; then - track_number=$(echo "$json_data" | jq -r '.[0].trackNumber') - filename="$track_name.flac" - cover_name="cover.png" - success=true + + + if [ -n "$cover_url" ]; then + date_data=$(echo "$json_data" | jq -r '.[0].streamStartDate // empty' ) + date=$(expr substr "$date_data" 1 10) + year=$(expr substr "$date_data" 1 4) + + + if [ -n "$year" ]; then + track_number=$(echo "$json_data" | jq -r '.[0].trackNumber') + filename="$track_name.flac" + cover_name="tidler_temp_cover_$track_name.png" + success=true + + lyrics_data=$(curl -# "$proxy_url/lyrics/?id=$id") + + if [ $? -eq 0 ]; then + timed_lyrics=$(echo "$lyrics_data" | jq -r '.[0].subtitles') + + if [ -n "$timed_lyrics" ]; then + lrc_success=true + + elif [ "$timed_lyrics" == "null" ]; then + echo "Lyrics not found" + fi + fi + fi break fi fi @@ -100,45 +118,51 @@ downloadTrack() { fi fi + if [ "$success" = false ]; then echo "Attempt $attempt_num failed. Retrying..." ((attempt_num++)) - sleep "1.$(tr -cd 0-9 Date: Sun, 20 Apr 2025 11:25:59 +0200 Subject: [PATCH 03/12] Change MAX_ATTEMPTS default value --- src/tidler | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tidler b/src/tidler index 57a198f..9696694 100755 --- a/src/tidler +++ b/src/tidler @@ -44,10 +44,10 @@ if [ -n "$MAX_ATTEMPTS" ]; then echo "Bad MAX_ATTEMPTS option. Allowed are numbers from 1 to 100." echo "Using default value..." - max_attempts="10" # Default value + max_attempts="15" # Default value fi else - max_attempts="10" # Default value + max_attempts="15" # Default value fi From e0522da25e94c46f0e985af0b2b8ed55c38a7214 Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Sun, 20 Apr 2025 11:26:13 +0200 Subject: [PATCH 04/12] Change MAX_ATTEMPTS default value --- src/tidler.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tidler.conf b/src/tidler.conf index 676c976..49e42d4 100644 --- a/src/tidler.conf +++ b/src/tidler.conf @@ -12,4 +12,4 @@ QUALITY="LOSSLESS" COVER_RESOLUTION="1280" # If there is any problem with the API, Tidler will attempt to download the track again -> possible values are "1" to "100" -MAX_ATTEMPTS="10" +MAX_ATTEMPTS="15" From 8739fc245a22b52471b6d34d8ea4e271c914e346 Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Sun, 20 Apr 2025 11:26:39 +0200 Subject: [PATCH 05/12] Update scripts/ArchLinux/PKGBUILD --- scripts/ArchLinux/PKGBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ArchLinux/PKGBUILD b/scripts/ArchLinux/PKGBUILD index a5d0a4e..d3eb27a 100644 --- a/scripts/ArchLinux/PKGBUILD +++ b/scripts/ArchLinux/PKGBUILD @@ -1,8 +1,8 @@ # Maintainer: Medvidek77 pkgname=tidler -pkgver=0.3.0 -pkgrel=3 +pkgver=0.3.1 +pkgrel=1 pkgdesc="Tidal music downloader based on the hifi-tui API" arch=('any') url="https://git.medvidek77.tech/Medvidek77/tidler" From f0d59c956c452062c5dcf8e72e1de5a91b236179 Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Sun, 20 Apr 2025 11:26:56 +0200 Subject: [PATCH 06/12] Update scripts/ArchLinux/PKGBUILD-git --- scripts/ArchLinux/PKGBUILD-git | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ArchLinux/PKGBUILD-git b/scripts/ArchLinux/PKGBUILD-git index 611a132..a5a92c2 100644 --- a/scripts/ArchLinux/PKGBUILD-git +++ b/scripts/ArchLinux/PKGBUILD-git @@ -1,8 +1,8 @@ # Maintainer: Medvidek77 pkgname=tidler -pkgver=0.3.0 -pkgrel=3 +pkgver=0.3.1 +pkgrel=1 pkgdesc="Tidal music downloader based on the hifi-tui API" arch=('any') url="https://git.medvidek77.tech/Medvidek77/tidler" From 08c8f434b31ad00d4795c1ab4edaba59249fc91d Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Sun, 20 Apr 2025 11:31:04 +0200 Subject: [PATCH 07/12] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 356970f..511efba 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - Create install scripts/guides (WIP) - Migrate from Bash to a POSIX-compliant shell - Add Cover, and other metadata to vorbis tag (Almost done) -- Lyrics download (WIP) +- Lyrics download (Almost done) - Implement search & download for playlists, albums, and artists (WIP) - Support downloading multiple search results - Allow users to choose audio quality (currently defaults to LOSSLESS) From 4080cadbc763b4cda9a6f3974a10209d21e2de6b Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Sun, 20 Apr 2025 11:31:31 +0200 Subject: [PATCH 08/12] Update README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 511efba..ab9a180 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,6 @@ git clone https://git.medvidek77.tech/Medvidek77/tidler.git && cd tidler git checkout dev ``` -- Add permissions as root: -``` -chmod +x src/tidler -``` - - Run: ``` src/tidler From 3c78296e585389e6f83d08d69aa341c56a53ba2c Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Mon, 21 Apr 2025 17:51:58 +0200 Subject: [PATCH 09/12] Updated shebang and added multiple album download --- src/tidler | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/tidler b/src/tidler index 9696694..b9cfc51 100755 --- a/src/tidler +++ b/src/tidler @@ -1,8 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash . tidler.conf # Load ENVs from config file -version="0.3.1" +version="0.3.2" if [ -n "$PROXY_URL" ]; then @@ -44,10 +44,10 @@ if [ -n "$MAX_ATTEMPTS" ]; then echo "Bad MAX_ATTEMPTS option. Allowed are numbers from 1 to 100." echo "Using default value..." - max_attempts="15" # Default value + max_attempts="10" # Default value fi else - max_attempts="15" # Default value + max_attempts="10" # Default value fi @@ -108,7 +108,7 @@ downloadTrack() { elif [ "$timed_lyrics" == "null" ]; then echo "Lyrics not found" fi - fi + fi fi break fi @@ -136,6 +136,7 @@ downloadTrack() { if [ -n "$DOWNLOADS_DIR" ]; then download_dir="$DOWNLOADS_DIR" else + echo "Using current path..." download_dir="$(pwd)" fi @@ -268,18 +269,27 @@ searchAlbum() { ((attempt_num++)) sleep "1.$(tr -cd 0-9 Date: Tue, 22 Apr 2025 15:01:28 +0200 Subject: [PATCH 10/12] Added multi-selection for tracks --- src/tidler | 250 ++++++++++++++++++++++++++++------------------------- 1 file changed, 134 insertions(+), 116 deletions(-) diff --git a/src/tidler b/src/tidler index b9cfc51..7736873 100755 --- a/src/tidler +++ b/src/tidler @@ -2,54 +2,54 @@ . tidler.conf # Load ENVs from config file -version="0.3.2" +version="0.3.2-beta2" if [ -n "$PROXY_URL" ]; then - proxy_url="$PROXY_URL" + proxy_url="$PROXY_URL" else - proxy_url="https://hifi-04ed2aaea09a.herokuapp.com" # Default value + proxy_url="https://hifi-04ed2aaea09a.herokuapp.com" # Default value fi if [ -n "$QUALITY" ]; then - if [ "$QUALITY" = "LOSSLESS" -o "$QUALITY" = "HI_RES" ]; then - quality="$QUALITY" - else - echo "Bad QUALITY option. Only allowed are \"LOSSLESS\", \"HI_RES\"." - echo "Using default value..." + if [ "$QUALITY" = "LOSSLESS" -o "$QUALITY" = "HI_RES" ]; then + quality="$QUALITY" + else + echo "Bad QUALITY option. Only allowed are \"LOSSLESS\", \"HI_RES\"." + echo "Using default value..." - quality="LOSSLESS" # Default value - fi + quality="LOSSLESS" # Default value + fi else - quality="LOSSLESS" # Default value + quality="LOSSLESS" # Default value fi if [ -n "$COVER_RESOLUTION" ]; then - if [ "$COVER_RESOLUTION" = "1280" -o "$COVER_RESOLUTION" = "640" -o "$COVER_RESOLUTION" = "80" ]; then - cover_resolution="$COVER_RESOLUTION" - else - echo "Bad COVER_RESOLUTION option. Only allowed are \"1280\", \"640\", \"80\"." - echo "Using default value..." + if [ "$COVER_RESOLUTION" = "1280" -o "$COVER_RESOLUTION" = "640" -o "$COVER_RESOLUTION" = "80" ]; then + cover_resolution="$COVER_RESOLUTION" + else + echo "Bad COVER_RESOLUTION option. Only allowed are \"1280\", \"640\", \"80\"." + echo "Using default value..." - cover_resolution="1280" # Default value - fi + cover_resolution="1280" # Default value + fi else - cover_resolution="1280" # Default value + cover_resolution="1280" # Default value fi if [ -n "$MAX_ATTEMPTS" ]; then - if [ "$MAX_ATTEMPTS" -ge 1 -a "$MAX_ATTEMPTS" -le 100 ]; then - max_attempts="$MAX_ATTEMPTS" - else - echo "Bad MAX_ATTEMPTS option. Allowed are numbers from 1 to 100." - echo "Using default value..." + if [ "$MAX_ATTEMPTS" -ge 1 -a "$MAX_ATTEMPTS" -le 100 ]; then + max_attempts="$MAX_ATTEMPTS" + else + echo "Bad MAX_ATTEMPTS option. Allowed are numbers from 1 to 100." + echo "Using default value..." - max_attempts="10" # Default value - fi + max_attempts="10" # Default value + fi else - max_attempts="10" # Default value + max_attempts="10" # Default value fi - + downloadTrack() { if [ "$#" -ge 1 ]; then @@ -76,7 +76,7 @@ downloadTrack() { if [ -n "$artist_name" ]; then album_name=$(echo "$json_data" | jq -r '.[0].album.title // empty') - + if [ -n "$album_name" ]; then url=$(echo "$json_data" | jq -r '.[-1].OriginalTrackUrl // empty') @@ -104,12 +104,12 @@ downloadTrack() { if [ -n "$timed_lyrics" ]; then lrc_success=true - - elif [ "$timed_lyrics" == "null" ]; then - echo "Lyrics not found" + + elif [ "$timed_lyrics" == "null" ]; then + echo "Lyrics not found" fi - fi - fi + fi + fi break fi fi @@ -136,7 +136,7 @@ downloadTrack() { if [ -n "$DOWNLOADS_DIR" ]; then download_dir="$DOWNLOADS_DIR" else - echo "Using current path..." + echo "Using current path..." download_dir="$(pwd)" fi @@ -154,8 +154,8 @@ downloadTrack() { --set-tag="ALBUM=$album_name" \ --set-tag="TRACKNUMBER=$track_number" \ ${lrc_success:+--set-tag="LYRICS=$timed_lyrics"} \ - --set-tag="DATE=$date" \ - --set-tag="YEAR=$year" \ + --set-tag="DATE=$date" \ + --set-tag="YEAR=$year" \ --import-picture-from="/tmp/$cover_name" \ "$final_path/$filename" @@ -166,10 +166,10 @@ downloadTrack() { searchTrack() { if [ "$#" -ge 1 ]; then - track_name="$1" + track_name="$1" else - echo "Enter track name:" - read -r track_name + echo "Enter track name:" + read -r track_name fi track_name=$(echo "$track_name" | sed 's/ /%20/g') tracks=$(curl -# "$proxy_url/search/?s=$track_name" | jq -r '.items[] | "\(.id) - \(.title) by \(.artist.name)"') @@ -182,19 +182,29 @@ searchTrack() { if [ "${#tracks_list[@]}" -eq 1 ]; then echo "No tracks found :(" exit 1 - fi + else - PS3="Please select a track: " - select t in "${tracks_list[@]}"; do - if [ -n "$t" ]; then - track_id=$(echo "$t" | awk -F ' - ' '{print $1}') - echo "You selected: $t" - downloadTrack "$track_id" - break - else - echo "Invalid selection. Please try again." - fi - done + i=0 + while [ "$i" -lt "${#tracks_list[@]}" ]; do + echo "$((i + 1))) ${tracks_list["$i"]}" + + i=$(( i + 1 )) + done + read -a inp + echo "${inp[0]}" + i=0 + while [ "$i" -lt "${#inp[@]}" ]; do + inp2=$(("${inp[i]}" - 1)) + if [ "$inp2" -ge 0 ] && [ "$inp2" -lt "${#tracks_list[@]}" ]; then + track_id=$(echo "${tracks_list["$inp2"]}" | awk -F ' - ' '{print $1}') + downloadTrack "$track_id" + else + echo "Invalid selection. Please try again." + + fi + i=$(( i + 1 )) + done + fi } @@ -269,27 +279,27 @@ searchAlbum() { ((attempt_num++)) sleep "1.$(tr -cd 0-9 " - echo "" - echo "If a valid parameter is provided, the corresponding function executes. Otherwise, TiDLer enters INTERACTIVE mode!" - echo "" - echo "" - echo "" - echo "search {track_name}-optional -> search any song" - echo "" - echo "download {song_id}-optional -> download any song" - echo "" - echo "album {album_name}-optional -> search and download any album" - echo "" - echo "version -> print TiDLer version" - echo "" - echo "help -> print this message and exit" + echo "" + echo "" + echo "If a valid parameter is provided, the corresponding function executes. Otherwise, TiDLer enters INTERACTIVE mode!" + echo "" + echo "" + echo "" + echo "search {track_name}-optional -> search any song" + echo "" + echo "download {song_id}-optional -> download any song" + echo "" + echo "album {album_name}-optional -> search and download any album" + echo "" + echo "version -> print TiDLer version" + echo "" + echo "help -> print this message and exit" else - echo "### Choose function! (Enter number) ###" - echo "" - echo "1. Download single track with ID" - echo "" - echo "2. Search single track with text" - echo "" - echo "3. Search and download whole album with text" + echo "### Choose function! (Enter number) ###" + echo "" + echo "1. Download single track with ID" + echo "" + echo "2. Search single track with text" + echo "" + echo "3. Search and download whole album with text" - read option + read option + if [ "$option" -eq 1 ]; then + downloadTrack + elif [ "$option" -eq 2 ]; then + searchTrack + elif [ "$option" -eq 3 ]; then + searchAlbum + fi +fi if [ "$option" -eq 1 ]; then downloadTrack elif [ "$option" -eq 2 ]; then From aff1349fe13bba98ccfdef366bc55ee275301893 Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Tue, 22 Apr 2025 15:03:27 +0200 Subject: [PATCH 11/12] Update src/tidler --- src/tidler | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/tidler b/src/tidler index 7736873..4bd7ddf 100755 --- a/src/tidler +++ b/src/tidler @@ -183,27 +183,25 @@ searchTrack() { echo "No tracks found :(" exit 1 else - i=0 - while [ "$i" -lt "${#tracks_list[@]}" ]; do - echo "$((i + 1))) ${tracks_list["$i"]}" - + while [ "$i" -lt "${#tracks_list[@]}" ]; do + echo "$((i + 1))) ${tracks_list["$i"]}" i=$(( i + 1 )) - done - read -a inp - echo "${inp[0]}" - i=0 - while [ "$i" -lt "${#inp[@]}" ]; do - inp2=$(("${inp[i]}" - 1)) - if [ "$inp2" -ge 0 ] && [ "$inp2" -lt "${#tracks_list[@]}" ]; then - track_id=$(echo "${tracks_list["$inp2"]}" | awk -F ' - ' '{print $1}') - downloadTrack "$track_id" - else - echo "Invalid selection. Please try again." + done + read -a inp + echo "${inp[0]}" + i=0 + while [ "$i" -lt "${#inp[@]}" ]; do + inp2=$(("${inp[i]}" - 1)) + if [ "$inp2" -ge 0 ] && [ "$inp2" -lt "${#tracks_list[@]}" ]; then + track_id=$(echo "${tracks_list["$inp2"]}" | awk -F ' - ' '{print $1}') + downloadTrack "$track_id" + else + echo "Invalid selection. Please try again." - fi - i=$(( i + 1 )) - done + fi + i=$(( i + 1 )) + done fi } From 25f1d20c4758e1030bfe2c8f03b2fc1b62b512f9 Mon Sep 17 00:00:00 2001 From: Medvidek77 Date: Tue, 22 Apr 2025 15:10:22 +0200 Subject: [PATCH 12/12] Update scripts/ArchLinux/PKGBUILD-git --- scripts/ArchLinux/PKGBUILD-git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ArchLinux/PKGBUILD-git b/scripts/ArchLinux/PKGBUILD-git index a5a92c2..48ee014 100644 --- a/scripts/ArchLinux/PKGBUILD-git +++ b/scripts/ArchLinux/PKGBUILD-git @@ -1,7 +1,7 @@ # Maintainer: Medvidek77 pkgname=tidler -pkgver=0.3.1 +pkgver=0.3.2-beta2 pkgrel=1 pkgdesc="Tidal music downloader based on the hifi-tui API" arch=('any')