Compare commits
9 commits
Author | SHA1 | Date | |
---|---|---|---|
3c78296e58 | |||
4080cadbc7 | |||
08c8f434b3 | |||
f0d59c956c | |||
8739fc245a | |||
e0522da25e | |||
55c5ffd110 | |||
4a60838f93 | |||
9973ccc5df |
5 changed files with 95 additions and 54 deletions
|
@ -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`
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Maintainer: Medvidek77 <medvidek77@tuta.io>
|
||||
|
||||
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"
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Maintainer: Medvidek77 <medvidek77@tuta.io>
|
||||
|
||||
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"
|
||||
|
|
130
src/tidler
130
src/tidler
|
@ -1,8 +1,8 @@
|
|||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
. tidler.conf # Load ENVs from config file
|
||||
|
||||
version="0.3.0"
|
||||
version="0.3.2"
|
||||
|
||||
|
||||
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,52 @@ downloadTrack() {
|
|||
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)"
|
||||
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
|
||||
echo "Using current path..."
|
||||
download_dir="$(pwd)"
|
||||
fi
|
||||
|
||||
if [ -z "$album_dir" ]; then
|
||||
final_path="$download_dir"
|
||||
else
|
||||
final_path="$download_dir/$album_dir"
|
||||
fi
|
||||
|
||||
final_path="$download_dir/$artist_name/$album_name"
|
||||
|
||||
mkdir -p "$final_path"
|
||||
|
||||
curl -# "$url" -o "$final_path/$filename"
|
||||
curl -# "$cover_url" -o "$final_path/$cover_name"
|
||||
curl -# "$cover_url" -o "/tmp/$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" \
|
||||
${lrc_success:+--set-tag="LYRICS=$timed_lyrics"} \
|
||||
--set-tag="DATE=$date" \
|
||||
--set-tag="YEAR=$year" \
|
||||
--import-picture-from="/tmp/$cover_name" \
|
||||
"$final_path/$filename"
|
||||
|
||||
rm "/tmp/$cover_name"
|
||||
|
||||
}
|
||||
|
||||
|
||||
searchTrack() {
|
||||
if [ "$#" -ge 1 ]; then
|
||||
track_name="$1"
|
||||
|
@ -244,18 +269,27 @@ searchAlbum() {
|
|||
((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
|
||||
i=0
|
||||
while [ "$i" -lt "${#albums_list[@]}" ]; do
|
||||
echo "$((i + 1))) ${albums_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 "${#albums_list[@]}" ]; then
|
||||
album_id=$(echo "${albums_list["$inp2"]}" | awk -F ': ' '{print $1}')
|
||||
downloadAlbum "$album_id"
|
||||
else
|
||||
echo "Invalid selection. Please try again."
|
||||
|
||||
fi
|
||||
i=$(( i + 1 ))
|
||||
done
|
||||
success=true
|
||||
if [ "$success" = true ]; then
|
||||
break
|
||||
fi
|
||||
|
@ -268,6 +302,13 @@ searchAlbum() {
|
|||
fi
|
||||
}
|
||||
|
||||
#searchArtist() {
|
||||
|
||||
#}
|
||||
|
||||
#downloadArtist() {
|
||||
|
||||
#}
|
||||
|
||||
if [ "$1" = "search" ]; then
|
||||
if [ "$#" -ge 2 ]; then
|
||||
|
@ -277,12 +318,14 @@ if [ "$1" = "search" ]; then
|
|||
else
|
||||
searchTrack
|
||||
fi
|
||||
|
||||
elif [ "$1" = "download" ]; then
|
||||
if [ "$#" -ge 2 ]; then
|
||||
downloadTrack "$2"
|
||||
else
|
||||
downloadTrack
|
||||
fi
|
||||
|
||||
elif [ "$1" = "album" ]; then
|
||||
if [ "$#" -ge 2 ]; then
|
||||
shift
|
||||
|
@ -291,6 +334,7 @@ elif [ "$1" = "album" ]; then
|
|||
else
|
||||
searchAlbum
|
||||
fi
|
||||
|
||||
elif [ "$1" == "version" ]; then
|
||||
echo "TiDLer $version by Medvidek77"
|
||||
|
||||
|
@ -318,7 +362,9 @@ else
|
|||
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
|
||||
|
@ -326,4 +372,4 @@ else
|
|||
elif [ "$option" -eq 3 ]; then
|
||||
searchAlbum
|
||||
fi
|
||||
fi
|
||||
fi
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue