Compare commits

...

52 commits

Author SHA1 Message Date
Medvidek77
af36446526 Merge version 0.3.0 from dev 2025-03-22 00:38:22 +01:00
Medvidek77
5cd13fb16e Updated .deb file 2025-03-22 00:31:03 +01:00
Medvidek77
fca39791af Added random sleep time 2025-03-22 00:08:00 +01:00
Medvidek77
cf02ca95ff Add version command 2025-03-21 23:42:32 +01:00
Medvidek77
761fd94395 Update .deb package 2025-03-21 15:56:07 +01:00
Medvidek77
5f09b32e06 Update PKGBUILD files 2025-03-21 15:40:11 +01:00
6c73942d07 Update scripts/ArchLinux/PKGBUILD-git 2025-03-21 14:57:34 +01:00
Medvidek77
8842ccaa00 Updated ArchLinux PKGBUILD files 2025-03-21 14:55:20 +01:00
Medvidek77
e5357c691b Fix PKGBUILDs for ArchLinux 2025-03-21 14:00:01 +01:00
Medvidek77
8a0e16449c Add .deb file for debian-based distros 2025-03-20 21:13:52 +01:00
3f2f78b104 Update scripts/ArchLinux/PKGBUILD-git 2025-03-20 21:12:12 +01:00
e961bcecd2 Update scripts/ArchLinux/PKGBUILD 2025-03-20 21:11:58 +01:00
Medvidek77
0c17bd4123 Add .deb file for debian-based distros 2025-03-20 21:10:44 +01:00
Medvidek77
7f2ead4263 Add .deb file for debian-based distros 2025-03-20 21:08:23 +01:00
Medvidek77
6bad8f3055 Fix text and fix progress bar 2025-03-20 20:55:33 +01:00
Medvidek77
3015d24698 Updated album command(now with optional argument) 2025-03-20 20:46:02 +01:00
Medvidek77
06e2d2df77 Added some important features and update few things 2025-03-20 20:11:45 +01:00
Medvidek77
972ca07d6e Update README.md 2025-03-19 22:58:25 +01:00
Medvidek77
18b782a1f4 Fix single track download and fixed tidler.conf and edited text and added album search to interactive mode 2025-03-19 22:51:18 +01:00
f37362444e Update README.md 2025-03-09 22:37:54 +01:00
961788eb1c Update README.md 2025-03-09 22:37:23 +01:00
2073ff8011 Update README.md 2025-03-09 22:32:03 +01:00
Medvidek77
7f064b7fc4 Added help command 2025-03-09 22:29:07 +01:00
Medvidek77
0cacef6491 Update README.md 2025-03-09 16:57:04 +01:00
Medvidek77
2b06f4799e Prepare for verison 0.3.0 -> New config options, some errors handling, etc 2025-03-09 16:47:08 +01:00
Medvidek77
0192452af7 Ups 2025-03-07 10:23:53 +01:00
c0b5b1b623 Update src/tidler.conf 2025-03-07 10:17:26 +01:00
Medvidek77
a0b04529f7 Updated some important things 2025-03-07 10:16:02 +01:00
b3fb36bafe Update README.md 2025-03-05 23:38:22 +01:00
97996d12e9 Update README.md 2025-03-05 23:35:45 +01:00
Medvidek77
d5fe38b570 Added some experimental features: Album directory create, Config file, Choose files location 2025-03-05 23:24:30 +01:00
Medvidek77
b1d1d61064 Add track cover 2025-03-05 21:11:26 +01:00
9d4def943c Update README.md 2025-03-05 14:59:20 +01:00
5828667b56 Update scripts/ArchLinux/PKGBUILD-git 2025-03-05 14:58:24 +01:00
44ec08cc98 Add flac as dependency 2025-03-05 14:58:07 +01:00
145d475124 Add flac as dependency 2025-03-05 14:57:03 +01:00
c1301a6e9c Update src/tidler
Ups
2025-03-05 14:55:22 +01:00
Medvidek77
066d88dac6 Add simple metadata 2025-03-05 14:49:32 +01:00
0e7d909ea3 Update README.md 2025-03-02 15:12:31 +01:00
1b51e72fd5 Update ArchLinux scripts 2025-02-15 22:38:24 +01:00
def38db78d Update README.md 2025-02-15 22:27:26 +01:00
eb1965e0ee Hotfix 2025-02-15 01:10:16 +01:00
dcabc65190 Fix some things 2025-02-15 00:24:23 +01:00
e6ba414adc Update src/tidler 2025-02-15 00:15:05 +01:00
71c8f38ac6 Update some minor things 2025-02-15 00:07:26 +01:00
23ac878b9d Whitespaces... 2025-02-14 22:51:56 +01:00
38c11332d9 Add experimental version of album search/download 2025-02-14 22:42:33 +01:00
d382c0bc70 Update README.md 2025-02-14 20:40:18 +01:00
f2ffd58606 Ops 2 2025-02-14 20:39:47 +01:00
1495248237 Ooops 2025-02-14 20:39:11 +01:00
d37e59476f Update README.md 2025-02-14 20:38:17 +01:00
f980a0c1dd Update README.md 2025-02-14 20:27:50 +01:00
6 changed files with 357 additions and 21 deletions

View file

@ -2,23 +2,60 @@
*Tidal music downloader based on the hifi-tui API*
### https://github.com/sachinsenal0x64/Hifi-Tui
## Requirements
<<<<<<< HEAD
- `bash`, `curl`, `jq`, `awk`
=======
- `bash`, `curl`, `jq`, `awk`, `flac`
>>>>>>> dev
## TODO
- Create install scripts/guides
- Create install scripts/guides (WIP)
- Migrate from Bash to a POSIX-compliant shell
<<<<<<< HEAD
- Add vorbis tags
- Lyrics download
- Implement search & download for playlists, albums, and artists
=======
- Add Cover, and other metadata to vorbis tag (Almost done)
- Lyrics download (WIP)
- Implement search & download for playlists, albums, and artists (WIP)
>>>>>>> dev
- Support downloading multiple search results
- Allow users to choose audio quality (currently defaults to LOSSLESS)
- Add a configuration file
- Add default save directory
- Add a configuration file (Done)
- Add default save directory (Done)
- Error handling (WIP)
## Using
<<<<<<< HEAD
- Download repository: `git clone https://git.medvidek77.tech/Medvidek77/tidler.git && cd tidler`
- (Optional) use unstable version: `git checkout dev`
- Add permissions as root: `chmod +x src/tidler`
- Run: `src/tidler`
- Enjoy! :)
=======
- Download repository:
```
git clone https://git.medvidek77.tech/Medvidek77/tidler.git && cd tidler
```
- (Optional) use unstable version:
```
git checkout dev
```
- Add permissions as root:
```
chmod +x src/tidler
```
- Run:
```
src/tidler
```
- Enjoy! :)
>>>>>>> dev

View file

@ -1,6 +1,7 @@
# Maintainer: Medvidek77 <medvidek77@tuta.io>
pkgname=tidler
<<<<<<< HEAD
pkgver=0.2
pkgrel=2
pkgdesc="Tidal music downloader based on the hifi-tui API"
@ -8,11 +9,23 @@ arch=('any')
url="https://git.medvidek77.tech/Medvidek77/tidler"
license=('BSD3-Clause')
depends=('bash' 'curl' 'jq' 'awk')
=======
pkgver=0.3.0
pkgrel=3
pkgdesc="Tidal music downloader based on the hifi-tui API"
arch=('any')
url="https://git.medvidek77.tech/Medvidek77/tidler"
license=('BSD-3-Clause')
depends=('bash' 'curl' 'jq' 'awk' 'flac')
>>>>>>> dev
source=("git+$url.git#branch=stable")
sha256sums=('SKIP')
package() {
cd "$srcdir/$pkgname"
install -Dm755 src/tidler "$pkgdir/usr/bin/tidler"
install -Dm644 src/tidler.conf "$pkgdir/usr/bin/tidler.conf"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
backup=('usr/bin/tidler.conf')

View file

@ -0,0 +1,21 @@
# Maintainer: Medvidek77 <medvidek77@tuta.io>
pkgname=tidler
pkgver=0.3.0
pkgrel=3
pkgdesc="Tidal music downloader based on the hifi-tui API"
arch=('any')
url="https://git.medvidek77.tech/Medvidek77/tidler"
license=('BSD-3-Clause')
depends=('bash' 'curl' 'jq' 'awk' 'flac')
source=("git+$url.git#branch=dev")
sha256sums=('SKIP')
package() {
cd "$srcdir/$pkgname"
install -Dm755 src/tidler "$pkgdir/usr/bin/tidler"
install -Dm644 src/tidler.conf "$pkgdir/usr/bin/tidler.conf"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
backup=('usr/bin/tidler.conf')

Binary file not shown.

View file

@ -1,5 +1,55 @@
#!/bin/bash
. tidler.conf # Load ENVs from config file
version="0.3.0"
if [ -n "$PROXY_URL" ]; then
proxy_url="$PROXY_URL"
else
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..."
quality="LOSSLESS" # Default value
fi
else
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..."
cover_resolution="1280" # Default value
fi
else
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..."
max_attempts="10" # Default value
fi
else
max_attempts="10" # Default value
fi
downloadTrack() {
if [ "$#" -ge 1 ]; then
echo "Downloading track with ID: $1"
@ -8,14 +58,85 @@ downloadTrack() {
echo "Enter track ID:"
read -r id
fi
json_data=$(curl -s "https://tidal.401658.xyz/track/?id=$id&quality=LOSSLESS")
track_name=$(echo "$json_data" | jq -r '.[0].title')
artist_name=$(echo "$json_data" | jq -r '.[0].artist.name')
url=$(echo "$json_data" | jq -r '.[-1].OriginalTrackUrl')
filename="$artist_name - $track_name.flac"
filename=$(echo "$filename" | tr '/' '-')
curl "$url" -o "$filename"
if [ "$#" -ge 2 ]; then
album_dir="$2"
else
album_dir=""
fi
attempt_num=1
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
break
fi
fi
fi
fi
fi
fi
if [ "$success" = false ]; then
echo "Attempt $attempt_num failed. Retrying..."
((attempt_num++))
sleep "1.$(tr -cd 0-9 </dev/urandom | head -c 5)"
fi
done
if [ "$success" = false ]; then
echo "Failed to download after $max_attempts attempts."
exit 1
fi
if [ -n "$DOWNLOADS_DIR" ]; then
download_dir="$DOWNLOADS_DIR"
else
download_dir="$(pwd)"
fi
if [ -z "$album_dir" ]; then
final_path="$download_dir"
else
final_path="$download_dir/$album_dir"
fi
mkdir -p "$final_path"
curl -# "$url" -o "$final_path/$filename"
curl -# "$cover_url" -o "$final_path/$cover_name"
# Metadata
metaflac \
--set-tag="NAME=$track_name" \
--set-tag="ARTIST=$artist_name" \
--set-tag="ALBUM=$album_name" \
--set-tag="TRACKNUMBER=$track_number" \
--import-picture-from="$final_path/$cover_name" \
"$final_path/$filename"
}
searchTrack() {
@ -26,7 +147,7 @@ searchTrack() {
read -r track_name
fi
track_name=$(echo "$track_name" | sed 's/ /%20/g')
tracks=$(curl -s "https://tidal.401658.xyz/search/?s=$track_name" | jq -r '.items[] | "\(.id) - \(.title) by \(.artist.name)"')
tracks=$(curl -# "$proxy_url/search/?s=$track_name" | jq -r '.items[] | "\(.id) - \(.title) by \(.artist.name)"')
tracks_list=()
while IFS= read -r list; do
@ -51,7 +172,102 @@ searchTrack() {
done
}
echo "Welcome to TiDLer -> Tidal music downloader" && echo ""
downloadAlbum() {
id="$1"
if [ -n "$DOWNLOADS_DIR" ]; then
base_dir="$DOWNLOADS_DIR"
else
base_dir="$(pwd)"
fi
attempt_num=1
success=false
while [ $attempt_num -le $max_attempts ]; do
json_data=$(curl -# "$proxy_url/album/?id=$id&quality=$quality")
if [ $? -eq 0 ]; then
album_name=$(echo "$json_data" | jq -r '.[0].title')
artist_name=$(echo "$json_data" | jq -r '.[0].artist.name')
album_title="$artist_name - $album_name"
album_dir="$album_title"
album_tracks_ids=$(echo "$json_data" | jq -r '.[1].items[] | .item.id')
tracks_ids_list=()
while IFS= read -r list; do
tracks_ids_list+=("$list")
done <<< "$album_tracks_ids"
for track_id in "${tracks_ids_list[@]}"; do
downloadTrack "$track_id" "$album_dir"
done
success=true
break
else
echo "Attempt $attempt_num failed. Retrying..."
((attempt_num++))
sleep "1.$(tr -cd 0-9 </dev/urandom | head -c 5)"
fi
done
if [ "$success" = false ]; then
echo "Failed to download album after $max_attempts attempts."
exit 1
fi
}
searchAlbum() {
if [ "$#" -ge 1 ]; then
album_name="$1"
else
echo "Enter album name:"
read -r album_name
fi
album_name=$(echo "$album_name" | sed 's/ /%20/g')
attempt_num=1
success=false
while [ $attempt_num -le $max_attempts ]; do
albums=$(curl -# "$proxy_url/search/?al=$album_name" | jq -r '.albums.items[] | "\(.id): \(.title)"')
albums_list=()
while IFS= read -r list; do
albums_list+=("$list")
done <<< "$albums"
if [ "${#albums_list[@]}" -eq 0 ]; then
echo "No albums found. Retrying... (Attempt $attempt_num/$max_attempts)"
((attempt_num++))
sleep "1.$(tr -cd 0-9 </dev/urandom | head -c 5)"
else
PS3="Please select an album: "
select t in "${albums_list[@]}"; do
if [ -n "$t" ]; then
album_id=$(echo "$t" | awk -F ': ' '{print $1}')
echo "You selected: $t"
downloadAlbum "$album_id"
success=true
break
else
echo "Invalid selection. Please try again."
fi
done
if [ "$success" = true ]; then
break
fi
fi
done
if [ "$success" = false ]; then
echo "Failed to find and download album after $max_attempts attempts."
exit 1
fi
}
if [ "$1" = "search" ]; then
if [ "$#" -ge 2 ]; then
@ -67,13 +283,47 @@ elif [ "$1" = "download" ]; then
else
downloadTrack
fi
elif [ "$1" = "album" ]; then
if [ "$#" -ge 2 ]; then
shift
jsw="$*"
searchAlbum "$jsw"
else
echo "Choose 1 for download track or 2 for search track and download"
searchAlbum
fi
elif [ "$1" == "version" ]; then
echo "TiDLer $version by Medvidek77"
elif [ "$1" = "help" ]; then
echo "<MODE>"
echo ""
echo "If a valid parameter is provided, the corresponding function executes. Otherwise, TiDLer enters INTERACTIVE mode!"
echo ""
echo "<COMMANDS>"
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"
read option
if [ "$option" -eq 1 ]; then
downloadTrack
elif [ "$option" -eq 2 ]; then
searchTrack
elif [ "$option" -eq 3 ]; then
searchAlbum
fi
fi

15
src/tidler.conf Normal file
View file

@ -0,0 +1,15 @@
# Default download directory
DOWNLOADS_DIR="/home/$USER/Music"
# hifi-tui API server URL -> https://github.com/sachinsenal0x64/Hifi-Tui
# You can use "https://tidal.401658.xyz" with cache enabled
PROXY_URL="https://hifi-04ed2aaea09a.herokuapp.com"
# Set audio quality -> possible values are "LOSSLESS" and "HI_RES"
QUALITY="LOSSLESS"
# Set cover art resolution -> "1280" = 1280x1280, "640" = 640x640, "80" = 80x80
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"