Compare commits
23 Commits
test
..
6dfba965ab
| Author | SHA1 | Date | |
|---|---|---|---|
| 6dfba965ab | |||
| 67a03c91ae | |||
| 5077158e7b | |||
| 064fe096ae | |||
| 2c43164e9b | |||
| b572219679 | |||
| 23c931c1dd | |||
| 575df2eaf9 | |||
| 135b7e5da8 | |||
| cccddb7045 | |||
| d9372881bf | |||
| e9add46de0 | |||
| e0728a6ab3 | |||
| bd7b0be8e6 | |||
| 70e2b73883 | |||
| c5397a501b | |||
| 542ba1b9b0 | |||
| a7cb1db0bc | |||
| fe5c02be27 | |||
| 478877475b | |||
| 0445d33adc | |||
| bb2c970a71 | |||
| b5f64677ee |
@@ -1,9 +1,10 @@
|
||||
# **Kasane Teto in Your Terminal!**
|
||||
## **Find songs nobody knows exist!**
|
||||
A small wrapper and custom list for fortune/misfortune that picks a random Teto song of the day from any of almost 28,000 original, finished songs with videos on VocaDB. Your original fortune command will remain untouched, tetosong just tells it to use a custom directory.
|
||||
A small fortune type script that picks a random Teto song of the day from any of over 28,000 original, finished songs with videos on VocaDB.
|
||||
|
||||
## **Enable Audio to Hear "Teto Song of the Day!" in your terminal from Utau, SynthV, or SynthV2 Teto!**
|
||||
Sound plays based on the song you get! Utau for Utau! SV for SV!
|
||||
|
||||
https://github.com/user-attachments/assets/bc2a9909-d24a-43fa-882a-5e785cda3020
|
||||
|
||||
## **Now With Optional Automatic Updates!**
|
||||
@@ -11,15 +12,11 @@ Disabled by default, opt-in during setup to enable a systemd user service and ti
|
||||
|
||||
|
||||
## **Dependencies**
|
||||
|
||||
NO LONGER REQUIRES FORTUNE
|
||||
### install.sh and tetosong
|
||||
fortune/fortune-mod or misfortune
|
||||
|
||||
ffmpeg -optional for speaking Teto
|
||||
|
||||
### makefortune.sh
|
||||
fortune/fortune-mod (for strfile)
|
||||
|
||||
jq
|
||||
|
||||
## *Install and Run*
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,65 +1,17 @@
|
||||
#!/usr/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cd $HOME
|
||||
|
||||
# delete old tetosong repo and replace with updated one.
|
||||
yes | rm -r tetosong
|
||||
git clone git@github.com:eric5949/tetosong.git
|
||||
cd tetosong
|
||||
ARTIST=140308 # 116 is Kasane Teto
|
||||
CHILDREN="true" # If we want child voicebanks, we do so we can get all songs from utau, sv, and sv2
|
||||
START=0 # Start at the beginning of the recordset. if i wanted to make the file in chunks to use the api less i would use this and max to get the songs in chunks. They say dont use it "thousands of times a day", getting every teto song is 280 times. I think I'm ok. maybe.
|
||||
RESULTS=100 # Max results. Limit is 100.
|
||||
MAX=30000 # when to stop, there's as of 4-23-26 over 28,000 songs featuring Kasane Teto in the recordset i have selected.
|
||||
if [ ! -f var.json ]; then # var.json has our latest date, we use it to know where to stop going back, past it the songs already exist in the fortune file.
|
||||
echo '{"lastDate": "2000-04-21T00:00:00Z"}' > var.json # if it doesn't exist, we create it with a default date back in 2000.
|
||||
fi
|
||||
PREVDATE=$(jq -r '.lastDate' var.json)
|
||||
AFTERDATE=$(date -u -d "$PREVDATE + 1 Second" +"%Y-%m-%dT%H:%M:%SZ")
|
||||
echo "Result: $AFTERDATE"
|
||||
#rm tetofortunes var.json tetofortunes.dat # during testing we will remove everything, or if we want to regenerate the fortune file from scratch.
|
||||
# setting the latest date. just pulling the latest song from the api and setting the createDate as the latest date in var.json for use when we update the fortune file again, dont want to add the same songs twice. idk how I'll handle broken links and such, maybe just regenerate the whole thing periodically.
|
||||
CURLURL="https://vocadb.net/api/songs?songTypes=Original&afterDate=${AFTERDATE}&&artistId%5B%5D=${ARTIST}&childVoicebanks=${CHILDREN}&onlyWithPvs=true&status=Finished&start=0&maxResults=1&sort=PublishDate&fields=PVs"
|
||||
echo "CURLURL: $CURLURL"
|
||||
DATA=$(curl -X 'GET' \
|
||||
$CURLURL \
|
||||
-H 'accept: application/json')
|
||||
# making sure there are songs to add.
|
||||
SONGS=$(echo "$DATA" | jq -c '.items | length')
|
||||
if [ "$SONGS" -eq 0 ]; then
|
||||
echo "Result is empty. No more songs."
|
||||
exit 0
|
||||
fi
|
||||
DATE=$(echo "$DATA" | jq -r '.items[0].publishDate')
|
||||
echo "DATE: $DATE"
|
||||
echo "{\"lastDate\": \"$DATE\"}" > var.json
|
||||
# looping the api to get all songs we need.
|
||||
while true; do
|
||||
CURLURL="https://vocadb.net/api/songs?songTypes=Original&afterDate=${AFTERDATE}&&artistId%5B%5D=${ARTIST}&childVoicebanks=${CHILDREN}&onlyWithPvs=true&status=Finished&start=${START}&maxResults=${RESULTS}&sort=PublishDate&fields=PVs"
|
||||
DATA=$(curl -X 'GET' \
|
||||
$CURLURL \
|
||||
-H 'accept: application/json')
|
||||
SONGS=$(echo "$DATA" | jq -r '.items | length')
|
||||
if [ "$SONGS" -eq 0 ]; then
|
||||
echo "Result is empty. No more songs."
|
||||
break
|
||||
else
|
||||
START=$((START + SONGS))
|
||||
echo "Found songs! Processing... (Total fetched: $START)"
|
||||
echo "$DATA" | jq -r '.items[] | [.artistString, .defaultName, .pvs[0].url] | @tsv' | while IFS=$'\t' read -r artist name url; do
|
||||
echo "TETO SONG OF THE DAY!"
|
||||
echo ""
|
||||
echo "$artist -- $name"
|
||||
echo ""
|
||||
echo "$url"
|
||||
echo ""
|
||||
echo "▼・ᴗ・▼"
|
||||
echo "%"
|
||||
done >> tetofortunes
|
||||
if [ "$START" -ge "$MAX" ]; then
|
||||
echo "Reached max results. Stopping."
|
||||
break
|
||||
fi
|
||||
echo "Done!"
|
||||
fi
|
||||
done
|
||||
# create the fortune database from tetofortunes
|
||||
rm tetofortunes.dat # delete the old database if it extists.
|
||||
strfile -c % tetofortunes tetofortunes.dat
|
||||
git commit -m "Update fortune files"
|
||||
# update vocafortunes.
|
||||
sh ./makefortune.sh -p Teto
|
||||
sh ./makefortune.sh -p Gumi
|
||||
sh ./makefortune.sh -p Miku
|
||||
|
||||
# commit update
|
||||
git add ./*
|
||||
git commit -m "Automated update of fortune files"
|
||||
git push -u origin main
|
||||
|
||||
+19
-7
@@ -1,14 +1,24 @@
|
||||
#!/usr/bin/bash
|
||||
#
|
||||
# Updated 5-1-2026 to use new vocafortunes script instead of fortune/misfortune
|
||||
#
|
||||
#
|
||||
# download custom fortunes and config file
|
||||
echo "Updating tetosong..."
|
||||
# check if the config file exists, if not download it and prompt the user for options.
|
||||
if [ ! -f ~/.local/share/tetosong/tetosong.config ]; then echo "Config file not found, downloading default..." # check if the config file exists, if not download it
|
||||
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong.config
|
||||
fi
|
||||
#### remove files from old version
|
||||
rm -rf ~/.local/share/tetosong/fortunes/
|
||||
# add new files
|
||||
mkdir -p ~/.local/share/tetosong
|
||||
|
||||
|
||||
mkdir -p ~/.local/share/tetosong/fortunes
|
||||
mkdir -p ~/.local/share/tetosong/fortunes/tetosotd
|
||||
curl -sLo ~/.local/share/tetosong/fortunes/tetosotd/tetofortunes https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/fortunes/tetosotd/tetofortunes
|
||||
curl -sLo ~/.local/sharetetosong/fortunes/tetosotd/tetofortunes.dat https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/fortunes/tetosotd/tetofortunes.dat
|
||||
mkdir -p ~/.local/share/tetosong/vocafortunes
|
||||
mkdir -p ~/.local/share/tetosong/vocafortunes/vocadb
|
||||
curl -sLo ~/.local/share/tetosong/vocafortunes/vocadb/140308 https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/140308
|
||||
if [ -f ~/.local/share/tetosong/vocafortunes/vocadb/3 ]; then echo "Gumi found, updating Gumi songs..." # update Gumi
|
||||
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/3
|
||||
fi
|
||||
AUDIO="$(. ~/.local/share/tetosong/tetosong.config; echo $AUDIO)"
|
||||
if [ "$AUDIO" = "YES" ]; then
|
||||
curl -sLo ~/.local/share/tetosong/SOTD.zip https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/audio/teto/SOTD.zip
|
||||
@@ -37,5 +47,7 @@ fi
|
||||
echo "writing tetosong to ~/.local/bin"
|
||||
mkdir -p ~/.local/bin
|
||||
curl -sLo ~/.local/bin/tetosong https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong
|
||||
curl -sLo ~/.local/bin/tetosong https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortune
|
||||
chmod +x ~/.local/bin/tetosong
|
||||
echo "Update complete"
|
||||
chmod +x ~/.local/bin/vocafortune
|
||||
echo "Make sure ~/.local/bin is in your PATH and you can get your Teto Song Of the Day by typing in tetosong or adding it to your bashrc :)"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{"lastDate": "2026-07-09T00:00:00Z"}
|
||||
@@ -0,0 +1 @@
|
||||
{"lastDate": "2026-07-09T00:00:00Z"}
|
||||
@@ -0,0 +1 @@
|
||||
{"lastDate": "2026-07-09T00:00:00Z"}
|
||||
Binary file not shown.
+16
-21
@@ -1,27 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
# check which fortune command is installed if any.
|
||||
if ! [ -x "$(command -v fortune)" ]; then
|
||||
echo 'fortune is not installed, checking for misfortune'm
|
||||
if ! [ -x "$(command -v misfortune)" ]; then
|
||||
echo 'neither program is installed, exiting'
|
||||
exit 1
|
||||
else
|
||||
echo 'misfortune found'
|
||||
fi
|
||||
else
|
||||
echo 'fortune found'
|
||||
fi
|
||||
#
|
||||
# Updated 5-1-2026 to use new vocafortunes script instead of fortune/misfortune
|
||||
#
|
||||
#
|
||||
#
|
||||
|
||||
# download custom fortunes and config file
|
||||
echo "Downloading custom fortunes and config file..."
|
||||
# download the config file and prompt the user for options.
|
||||
mkdir -p ~/.local/share/tetosong
|
||||
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/tetosong.config
|
||||
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong.config
|
||||
read -p "Do you want to hear Teto in your terminal? (y/n) " yn
|
||||
case $yn in
|
||||
[Yy]* )
|
||||
sed -i 's|^AUDIO=.*|AUDIO="YES"|' ~/.local/share/tetosong/tetosong.config
|
||||
curl -sLo /tmp/SOTD.zip https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/audio/teto/SOTD.zip
|
||||
curl -sLo /tmp/SOTD.zip https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/audio/teto/SOTD.zip
|
||||
mkdir -p ~/.local/share/tetosong/audio/
|
||||
mkdir -p ~/.local/share/tetosong/audio/teto/
|
||||
unzip -o /tmp/SOTD.zip -d ~/.local/share/tetosong/audio/teto/
|
||||
@@ -38,10 +31,10 @@ case $yn in
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
|
||||
mkdir -p ~/.local/share/tetosong/fortunes
|
||||
mkdir -p ~/.local/share/tetosong/fortunes/tetosotd
|
||||
curl -sLo ~/.local/share/tetosong/fortunes/tetosotd/tetofortunes https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/fortunes/tetosotd/tetofortunes
|
||||
curl -sLo ~/.local/share/tetosong/fortunes/tetosotd/tetofortunes.dat https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/fortunes/tetosotd/tetofortunes.dat
|
||||
mkdir -p ~/.local/share/tetosong/vocafortunes
|
||||
mkdir -p ~/.local/share/tetosong/vocafortunes/vocadb
|
||||
curl -sLo ~/.local/share/tetosong/vocafortunes/vocadb/140308 https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/140308
|
||||
|
||||
|
||||
# set up autoupdater
|
||||
# i use systemd, so i use systemd timers. I'll figure out something for non-systemd users later.
|
||||
@@ -50,8 +43,8 @@ if [ "$AUTOUPDATE" = "YES" ]; then
|
||||
# write and enable systemd service file and timer user services
|
||||
echo "Autoupdater enabled, updating service..."
|
||||
mkdir -p ~/.config/systemd/user
|
||||
curl -sLo ~/.config/systemd/user/tetosong.service https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/autoupdater/tetosong.service
|
||||
curl -sLo ~/.config/systemd/user/tetosong.timer https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/autoupdater/tetosong.timer
|
||||
curl -sLo ~/.config/systemd/user/tetosong.service https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/tetosong.service
|
||||
curl -sLo ~/.config/systemd/user/tetosong.timer https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/tetosong.timer
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable tetosong.timer
|
||||
systemctl --user start tetosong.timer
|
||||
@@ -61,6 +54,8 @@ fi
|
||||
# write tetosong to ~/.local/bin and tell the user how to use it.
|
||||
echo "writing tetosong to ~/.local/bin"
|
||||
mkdir -p ~/.local/bin
|
||||
curl -sLo ~/.local/bin/tetosong https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/test/tetosong
|
||||
curl -sLo ~/.local/bin/tetosong https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong
|
||||
curl -sLo ~/.local/bin/vocafortune https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortune
|
||||
chmod +x ~/.local/bin/tetosong
|
||||
chmod +x ~/.local/bin/vocafortune
|
||||
echo "Make sure ~/.local/bin is in your PATH and you can get your Teto Song Of the Day by typing in tetosong or adding it to your bashrc :)"
|
||||
|
||||
+51
-38
@@ -1,61 +1,74 @@
|
||||
#!/usr/bin/bash
|
||||
ARTIST=140308 # 116 is Kasane Teto
|
||||
#
|
||||
# updated 5-2-26 to use other singer IDs so i can get songs from other singer IDs, miku is 1.
|
||||
#
|
||||
while [ $# -gt 0 ]; do export "${1#-}"="$2"; shift 2; done # argument handling
|
||||
if [ -z "$s" ]; then export ARTIST=140308; else export ARTIST=$s; fi # default to Kasane Teto if no singer ID is specified
|
||||
if [ -z "$a" ]; then export ART="▼・ᴗ・▼"; else export ART="$a"; fi # default to ▼・ᴗ・▼ if no art is specified
|
||||
if [ -z "$n" ]; then export vsynth="TETO"; else export vsynth="$n"; fi # default to TETO if no vsynth is specified
|
||||
if [ -z "$p" ]; then export preset="none"; else export preset="$p"; fi # option for presetting singer ID, art, and vsynth
|
||||
|
||||
if [ $preset = "Teto" ]; then export ARTIST=140308; export ART="▼・ᴗ・▼"; export vsynth="TETO"; fi # preset for Teto
|
||||
if [ $preset = "Miku" ]; then export ARTIST=1; export ART="⎛⎝・ᴗ・⎠⎞ ა🥬"; export vsynth="MIKU"; fi # preset for Miku
|
||||
if [ $preset = "Gumi" ]; then export ARTIST=3; export ART="💚🥕🎤💚"; export vsynth="GUMI"; fi # preset for Gumi
|
||||
|
||||
echo "vsynth: $vsynth"
|
||||
echo "ARTIST: $ARTIST"
|
||||
echo "ART: $ART"
|
||||
|
||||
CHILDREN="true" # If we want child voicebanks, we do so we can get all songs from utau, sv, and sv2
|
||||
START=0 # Start at the beginning of the recordset. if i wanted to make the file in chunks to use the api less i would use this and max to get the songs in chunks. They say dont use it "thousands of times a day", getting every teto song is 280 times. I think I'm ok. maybe.
|
||||
RESULTS=100 # Max results. Limit is 100.
|
||||
MAX=30000 # when to stop, there's as of 4-23-26 over 28,000 songs featuring Kasane Teto in the recordset i have selected.
|
||||
if [ ! -f var.json ]; then # var.json has our latest date, we use it to know where to stop going back, past it the songs already exist in the fortune file.
|
||||
echo '{"lastDate": "2000-04-21T00:00:00Z"}' > var.json # if it doesn't exist, we create it with a default date back in 2000.
|
||||
MAX=100000 # when to stop, 100,000 is 1000 uses of the api, there's like 70k miku songs total so this **should** be ok. A thousand isnt thousands.
|
||||
if [ ! -f dates/${ARTIST}var.json ]; then # var.json has our latest date, we use it to know where to stop going back, past it the songs already exist in the fortune file.
|
||||
echo '{"lastDate": "2000-04-21T00:00:00Z"}' > dates/${ARTIST}var.json # if it doesn't exist, we create it with a default date back in 2000.
|
||||
fi
|
||||
PREVDATE=$(jq -r '.lastDate' var.json)
|
||||
AFTERDATE=$(date -u -d "$PREVDATE + 1 Second" +"%Y-%m-%dT%H:%M:%SZ")
|
||||
PREVDATE=$(jq -r '.lastDate' dates/${ARTIST}var.json)
|
||||
AFTERDATE=$(date -u -d "$PREVDATE -1 Day" +"%Y-%m-%dT%H:%M:%SZ") # i made it so it can process duplicate songs, and that does seem to actually work, so i moved the fetch time back a day just to make sure we dont miss songs when we update.
|
||||
echo "Result: $AFTERDATE"
|
||||
#rm tetofortunes var.json tetofortunes.dat # during testing we will remove everything, or if we want to regenerate the fortune file from scratch.
|
||||
# setting the latest date. just pulling the latest song from the api and setting the createDate as the latest date in var.json for use when we update the fortune file again, dont want to add the same songs twice. idk how I'll handle broken links and such, maybe just regenerate the whole thing periodically.
|
||||
CURLURL="https://vocadb.net/api/songs?songTypes=Original&afterDate=${AFTERDATE}&&artistId%5B%5D=${ARTIST}&childVoicebanks=${CHILDREN}&onlyWithPvs=true&status=Finished&start=0&maxResults=1&sort=PublishDate&fields=PVs"
|
||||
echo "CURLURL: $CURLURL"
|
||||
DATA=$(curl -X 'GET' \
|
||||
$CURLURL \
|
||||
-H 'accept: application/json')
|
||||
DATA=$(curl -X 'GET' "$CURLURL" -H 'accept: application/json')
|
||||
# making sure there are songs to add.
|
||||
SONGS=$(echo "$DATA" | jq -c '.items | length')
|
||||
if [ "$SONGS" -eq 0 ]; then
|
||||
echo "Result is empty. No more songs."
|
||||
exit 0
|
||||
fi
|
||||
DATE=$(echo "$DATA" | jq -r '.items[0].publishDate')
|
||||
if [ "$SONGS" -eq 0 ]; then echo "Result is empty. No more songs."; exit 0; fi
|
||||
DATE=$(date -u +%Y-%m-%dT00:00:00Z)
|
||||
echo "DATE: $DATE"
|
||||
echo "{\"lastDate\": \"$DATE\"}" > var.json
|
||||
echo "{\"lastDate\": \"$DATE\"}" > dates/${ARTIST}var.json
|
||||
# looping the api to get all songs we need.
|
||||
while true; do
|
||||
CURLURL="https://vocadb.net/api/songs?songTypes=Original&afterDate=${AFTERDATE}&&artistId%5B%5D=${ARTIST}&childVoicebanks=${CHILDREN}&onlyWithPvs=true&status=Finished&start=${START}&maxResults=${RESULTS}&sort=PublishDate&fields=PVs"
|
||||
DATA=$(curl -X 'GET' \
|
||||
$CURLURL \
|
||||
-H 'accept: application/json')
|
||||
DATA=$(curl -X 'GET' $CURLURL -H 'accept: application/json')
|
||||
SONGS=$(echo "$DATA" | jq -r '.items | length')
|
||||
if [ "$SONGS" -eq 0 ]; then
|
||||
echo "Result is empty. No more songs."
|
||||
break
|
||||
if [ "$SONGS" -eq 0 ]; then echo "Result is empty. No more songs."; break
|
||||
else
|
||||
START=$((START + SONGS))
|
||||
echo "Found songs! Processing... (Total fetched: $START)"
|
||||
echo "$DATA" | jq -r '.items[] | [.artistString, .defaultName, .pvs[0].url] | @tsv' | while IFS=$'\t' read -r artist name url; do
|
||||
echo "TETO SONG OF THE DAY!"
|
||||
echo ""
|
||||
echo "$artist -- $name"
|
||||
echo ""
|
||||
echo "$url"
|
||||
echo ""
|
||||
echo "▼・ᴗ・▼"
|
||||
echo "%"
|
||||
done >> tetofortunes
|
||||
if [ "$START" -ge "$MAX" ]; then
|
||||
echo "Reached max results. Stopping."
|
||||
break
|
||||
fi
|
||||
echo "$vsynth SONG OF THE DAY!" && echo "" && echo "$artist -- $name" && echo "" && echo "$url" && echo "" && echo "$ART" && echo "\`"
|
||||
done >> vocafortunes/vocadb/$ARTIST
|
||||
if [ "$START" -ge "$MAX" ]; then echo "Reached max results. Stopping."; break; fi
|
||||
echo "Done!"
|
||||
fi
|
||||
done
|
||||
# create the fortune database from tetofortunes
|
||||
rm tetofortunes.dat # delete the old database if it extists.
|
||||
strfile -c % tetofortunes tetofortunes.dat
|
||||
|
||||
# check for duplicates and save the file again.
|
||||
|
||||
readarray -d '`' tetosongs < vocafortunes/vocadb/$ARTIST
|
||||
readarray -td '' dups < <((( ${#tetosongs[@]} == 0 )) || printf '%s\0' "${tetosongs[@]}" | LC_ALL=C sort -z | LC_ALL=C uniq -zd)
|
||||
readarray -td '' uniq < <((( ${#tetosongs[@]} == 0 )) || printf '%s\0' "${tetosongs[@]}" | LC_ALL=C sort -z | LC_ALL=C uniq -zu)
|
||||
|
||||
echo ${#tetosongs[@]}
|
||||
if ((${#dups[@]} > 0)); then echo >&2 "array has duplicates:"; echo ${#dups[@]};fi
|
||||
if ((${#uniq[@]} > 0)); then echo >&2 "Uniques:"; echo ${#uniq[@]};fi
|
||||
|
||||
printf >&2 '%s' "${dups[@]}" > dups
|
||||
printf >&2 '%s' "${uniq[@]}" > uniq
|
||||
|
||||
cat uniq > fixed
|
||||
cat dups >> fixed
|
||||
sed -i "1,/^${vsynth} SONG OF THE DAY!$/{/^${vsynth} SONG OF THE DAY!$/!d}" fixed
|
||||
rm vocafortunes/vocadb/$ARTIST
|
||||
rm uniq dups
|
||||
mv fixed vocafortunes/vocadb/$ARTIST
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
tetosong has the following options:
|
||||
|
||||
-u : Update Tetosong
|
||||
-h : display a help message
|
||||
-p : set a singer prest. Currently supports:
|
||||
- Teto (the default preset)
|
||||
- Gumi
|
||||
- Miku (limited songs rn)
|
||||
|
||||
########################################
|
||||
|
||||
makefortune.sh has the following options:
|
||||
|
||||
-s : Define singer based on vocadb artistid (1 for Miku, 3 For Gumi, 14308 for Teto, etc.)
|
||||
-a : Define ascii/emoji art
|
||||
-n : Define singer name in caps (TETO, GUMI, MIKU, etc)
|
||||
-p : Preset option choice. Currently supports:
|
||||
- Teto
|
||||
- Gumi
|
||||
- Miku
|
||||
|
||||
########################################
|
||||
|
||||
vocafortune has the following options:
|
||||
|
||||
-l : specify the directory vocafortune should look for fortunes
|
||||
-f : specify a file for vocafortune to read
|
||||
|
||||
Vocafortune does not technically need to be used just for vocaloid songs.
|
||||
It works similar to a fortune program in that it reads a text file with a delimiter and then returns an entry from that text file. Forune uses %, I use backtick (`) because many more vocaloid songs use % in the title than do backtick. Because there are *some* songs that do use the backtick, it's not a 100% perfect solution, but literally every character I could find to use as a delimeter is used in vocaloid song names
|
||||
|
||||
########################################
|
||||
|
||||
tetosong.config supports the following options at this time:
|
||||
|
||||
AUDIO : tells tetosong if it should play audio or not. Default on.
|
||||
AUTOUPDATE : tells the installer/updater whether to install and enable systemd user service. Default off.
|
||||
@@ -1,71 +1,63 @@
|
||||
#!/usr/bin/bash
|
||||
# argument handling
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-u|--update)
|
||||
echo "Downloading tetosong updater..."
|
||||
bash <(curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/updater.sh)
|
||||
shift
|
||||
exit 0
|
||||
;;
|
||||
-h|--help)
|
||||
echo "--- TETOSONG HELP ---"
|
||||
echo ""
|
||||
echo " -h | display this message"
|
||||
echo " -u | update script and fortunes"
|
||||
echo ""
|
||||
shift
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# check if the config file exists, if not download it
|
||||
if [ ! -f ~/.local/share/tetosong/tetosong.config ]; then
|
||||
echo "Config file not found, downloading default..."
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Updated 5-1-26 to use new vocafortune script and not require fortune/misfortune.
|
||||
# Updated 5-2-26 to add Miku and Gumi presets and shorten what i can just to see if i could.
|
||||
#
|
||||
# argument handling ################# NEED TO UPDATE HELP
|
||||
while [[ $# -gt 0 ]]; do case $1 in
|
||||
-u|--update) echo "Downloading tetosong updater..." && bash <(curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/updater.sh) && exit 0 ;; # update tetosong
|
||||
-h|--help) echo -e " --- TETOSONG HELP ---\n -h | display this message \n -u | update script and fortunes \n -p SINGER | set singer preset \n Running a preset will download and install songs for the selected singer and add a command to ~/.local/bin for that singer \n Current presets and commands following installation: \n Teto: tetosong \n Miku: mikusong (song list incomplete) \n Gumi: gumisong"; exit 0 ;; # tetosong help
|
||||
*) break ;;
|
||||
esac done
|
||||
while [ $# -gt 0 ]; do export "${1#-}"="$2"; shift 2; done # additional argument handling
|
||||
if [ -z "$p" ]; then export preset="Teto"; else export preset="$p"; fi # option for presetting singer preset
|
||||
if [ ! -f ~/.local/share/tetosong/tetosong.config ]; then echo "Config file not found, downloading default..." # check if the config file exists, if not download it
|
||||
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong.config
|
||||
fi
|
||||
# check if the user wants to play audio
|
||||
AUDIO="$(. ~/.local/share/tetosong/tetosong.config; echo $AUDIO)"
|
||||
|
||||
# check which fortune command is installed if any and then run it
|
||||
if ! [ -x "$(command -v fortune)" ]; then
|
||||
if ! [ -x "$(command -v misfortune)" ]; then
|
||||
echo 'No fortune commmand is installed, exiting!'
|
||||
exit 1
|
||||
else
|
||||
misfortune ~/.local/share/tetosong/fortunes/*/* >> /tmp/fortune # fortune and misfortune handle directories differently
|
||||
if [ "$AUDIO" = "YES" ]; then # i guess i could foregoe checking and just run the audio either way since i dont download it unless the user enables it, but i want them to be ableto turn it off if they choose to
|
||||
if grep -q "SV2" /tmp/fortune; then
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "SV" /tmp/fortune; then
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/svSOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "重音テト" /tmp/fortune; then
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/utSOTD.wav 2>/dev/null >/dev/null &
|
||||
else
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null &
|
||||
fi
|
||||
fi
|
||||
cat /tmp/fortune
|
||||
rm /tmp/fortune
|
||||
fi
|
||||
else
|
||||
fortune ~/.local/share/tetosong/fortunes/* >> /tmp/fortune
|
||||
# run based on preset
|
||||
if [ "$preset" = "Teto" ]; then vocafortune -f "$HOME/.local/share/tetosong/vocafortunes/vocadb/140308" >> /tmp/fortune # Teto Preset, the default
|
||||
if [ "$AUDIO" = "YES" ]; then
|
||||
if grep -q "SV2" /tmp/fortune; then
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "SV" /tmp/fortune; then
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/svSOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "重音テト" /tmp/fortune; then
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/utSOTD.wav 2>/dev/null >/dev/null &
|
||||
else
|
||||
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null &
|
||||
if grep -q "SV2" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "SV" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/svSOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "重音テト" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/utSOTD.wav 2>/dev/null >/dev/null &
|
||||
else nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null & fi
|
||||
fi
|
||||
elif [ "$preset" = "Miku" ]; then if [ ! -f ~/.local/share/tetosong/vocafortunes/vocadb/1 ]; then echo "Miku not found, downloading..." # Miku Preset (check if her songs are installed then install if not)
|
||||
cat << 'EOF' > $HOME/.local/bin/mikusong
|
||||
#!/usr/bin/env bash
|
||||
tetosong -p Miku
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x $HOME/.local/bin/mikusong
|
||||
mkdir -p $HOME/.local/share/tetosong/audio/miku
|
||||
curl -sLo ~/.local/share/tetosong/vocafortunes/vocadb/1 https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/1 # pull miku songs, not complete but theres around 600 or so.
|
||||
if [ "$AUDIO" = "YES" ]; then curl -sLo ~/.local/share/tetosong/audio/miku/v6SOTD.wav https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/audio/miku/v6SOTD.wav; fi
|
||||
fi
|
||||
vocafortune -f "$HOME/.local/share/tetosong/vocafortunes/vocadb/1" >> /tmp/fortune
|
||||
if [ "$AUDIO" = "YES" ]; then if grep -q "MIKU" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/miku/v6SOTD.wav 2>/dev/null >/dev/null & fi fi
|
||||
elif [ "$preset" = "Gumi" ]; then if [ ! -f ~/.local/share/tetosong/vocafortunes/vocadb/3 ]; then echo "Gumi not found, downloading..." # Gumi Preset (check if her songs are installed then install if not)
|
||||
cat << 'EOF' > $HOME/.local/bin/gumisong
|
||||
#!/usr/bin/env bash
|
||||
tetosong -p Gumi
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x $HOME/.local/bin/gumisong
|
||||
mkdir -p $HOME/.local/share/tetosong/audio/gumi
|
||||
curl -sLo ~/.local/share/tetosong/vocafortunes/vocadb/3 https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/3
|
||||
if [ "$AUDIO" = "YES" ]; then curl -sLo ~/.local/share/tetosong/audio/gumi/sv2SOTD.wav https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/audio/gumi/sv2SOTD.wav; fi
|
||||
fi
|
||||
vocafortune -f "$HOME/.local/share/tetosong/vocafortunes/vocadb/3" >> /tmp/fortune
|
||||
if [ "$AUDIO" = "YES" ]; then if grep -q "GUMI" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/gumi/sv2SOTD.wav 2>/dev/null >/dev/null & fi fi
|
||||
elif [ "$preset" = "all" ]; then # All Preset, pick from any of the avaailable presets. at some point i'll probably make this just pick a random preset instead of making it every preset in one. would get wild if i added a few more voices.
|
||||
vocafortune -l "$HOME/.local/share/tetosong/vocafortunes/" >> /tmp/fortune
|
||||
if [ "$AUDIO" = "YES" ]; then
|
||||
if grep -q "SV2" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "SV" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/svSOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "重音テト" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/utSOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "MIKU" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/miku/v6SOTD.wav 2>/dev/null >/dev/null &
|
||||
elif grep -q "GUMI" /tmp/fortune; then nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/gumi/sv2SOTD.wav 2>/dev/null >/dev/null & fi
|
||||
fi
|
||||
|
||||
cat /tmp/fortune
|
||||
rm /tmp/fortune
|
||||
fi
|
||||
cat /tmp/fortune && rm /tmp/fortune
|
||||
|
||||
Executable
+11
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
# VOCAFORTUNE! Make tetosong not need fortune anymore! Updated 5-2-26 allow using a specific file instead of a directory.
|
||||
while [ $# -gt 0 ]; do export "${1#-}"="$2"; shift 2; done # now it can be -l ./vocafortunes like a proper program!!!! # argument handling # i can use this anywhere!!!!!!! save this you!!!!!!
|
||||
#fortune script
|
||||
shopt -s globstar
|
||||
if [ -z "$f" ]; then if [ -z "$l" ]; then export "DIR"="$HOME/.local/share/tetosong/vocafortunes/**"; else export "DIR"="$l/**"; fi; else export "FILE"="$f"; fi
|
||||
if [ -z "$FILE" ]; then for file in $DIR; do if [[ -f "$file" ]]; then readarray -td '`' temp < "$file"; array+=("${temp[@]}"); fi; done
|
||||
else if [[ -f "$FILE" ]]; then readarray -td '`' temp < "$FILE"; array+=("${temp[@]}"); fi; fi
|
||||
export "ITEMS"="${#array[@]}"
|
||||
export "CHOICE"="$(shuf -i 1-$ITEMS -n 1)"
|
||||
echo "${array[$CHOICE]}"
|
||||
+11737
File diff suppressed because it is too large
Load Diff
+227393
-219823
File diff suppressed because it is too large
Load Diff
+204631
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user