6 Commits

Author SHA1 Message Date
c0c642892b added first eggs 2026-04-24 18:29:58 -04:00
02d064ceef Update tetosong 2026-04-24 11:10:22 -04:00
c4d479f161 fix install and update
no tetosong folder = cant download config
2026-04-24 11:07:43 -04:00
e1f9f755c2 Update updater.sh 2026-04-24 10:58:21 -04:00
8d3f5d6f63 update branch links 2026-04-24 10:56:53 -04:00
f7e8931630 moving things around
prepwork for easter eggs
2026-04-24 10:41:37 -04:00
20 changed files with 220911 additions and 221977 deletions

View File

@@ -2,15 +2,11 @@
## **Find songs nobody knows exist!** ## **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 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.
## **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 https://github.com/user-attachments/assets/bc2a9909-d24a-43fa-882a-5e785cda3020
## **Now With Optional Automatic Updates!** ## **Now With Optional Automatic Updates!**
Disabled by default, opt-in during setup to enable a systemd user service and timer to update the script and song list every Sunday at 5AM UTC. I check for new songs and push new tetofortunes from my server every Sunday at 3AM UTC Disabled by default, opt-in during setup to enable a systemd user service and timer to update the script and song list every Sunday at 5AM UTC. I check for new songs and push new tetofortunes from my server every Sunday at 3AM UTC
## **Dependencies** ## **Dependencies**
### install.sh and tetosong ### install.sh and tetosong
@@ -28,7 +24,7 @@ jq
Install the tetosong command with: Install the tetosong command with:
```bash ```bash
bash <(curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/installer.sh) bash <(curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/installer.sh)
``` ```
once installed, make sure you add ~/.local/bin to your $PATH if it is not already there. once installed, make sure you add ~/.local/bin to your $PATH if it is not already there.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,101 +0,0 @@
#!/usr/bin/env bash
cd $HOME
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 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' dates/${ARTIST}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=$(date -u +%Y-%m-%dT00:00:00Z)
echo "DATE: $DATE"
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')
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 >> vocafortunes/vocadb/$ARTIST
if [ "$START" -ge "$MAX" ]; then
echo "Reached max results. Stopping."
break
fi
echo "Done!"
fi
done
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,/^TETO SONG OF THE DAY!/{/^TETO SONG OF THE DAY!$/!d}' fixed
rm vocafortunes/vocadb/$ARTIST
rm uniq dups
mv fixed vocafortunes/vocadb/$ARTIST
# create the fortune database from tetofortunes
git add vocafortunes/vocadb/$ARTIST dates/${ARTIST}var.json
git commit -m "Update fortune files"
git push -u origin main

View File

@@ -1,7 +0,0 @@
[Unit]
Description=tetofortunes autoupdater
Wants=makefortune.timer
[Service]
Type=oneshot
ExecStart=%h/.local/bin/automakefortune.sh

View File

@@ -1,10 +0,0 @@
[Unit]
Description=Run automakefortune.sh once a week
[Timer]
OnCalendar=Sun *-*-* 03:00:00
Persistent=true
Unit=makefortune.service
[Install]
WantedBy=timers.target

View File

@@ -4,4 +4,4 @@ Wants=tetosong.timer
[Service] [Service]
Type=oneshot Type=oneshot
ExecStart=/usr/bin/bash -c "curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/updater.sh | bash" ExecStart=/usr/bin/bash -c "curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/autoupdater/updater.sh | bash"

View File

@@ -1,28 +1,22 @@
#!/usr/bin/bash #!/usr/bin/env bash
#
# Updated 5-1-2026 to use new vocafortunes script instead of fortune/misfortune
#
#
# download custom fortunes and config file # download custom fortunes and config file
echo "Updating tetosong..." echo "Updating tetosong..."
# check if the config file exists, if not download it and prompt the user for options.
#### remove files from old version # past here is a modified installer.sh, if i build an update option into installer.sh i cant get it to run correctly with the curl command
rm -rf ~/.local/share/tetosong/fortunes/
# add new files # check if the config file exists, if not download it and prompt the user for options.
mkdir -p ~/.local/share/tetosong mkdir -p ~/.local/share/tetosong/
mkdir -p ~/.local/share/tetosong/vocafortunes if [ ! -f ~/.local/share/tetosong/tetosong.config ]; then
mkdir -p ~/.local/share/tetosong/vocafortunes/vocadb echo "Config file not found, downloading default..."
curl -sLo ~/.local/share/tetosong/vocafortunes/vocadb/140308 https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/140308 curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/tetosong.config
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
mkdir -p ~/.local/share/tetosong/audio/
mkdir -p ~/.local/share/tetosong/audio/teto/
unzip -o ~/.local/share/tetosong/SOTD.zip -d ~/.local/share/tetosong/audio/teto/
rm ~/.local/share/tetosong/SOTD.zip
fi fi
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/eggs/fortunes/tetosotd/tetofortunes
curl -sLo ~/.local/share/tetosong/fortunes/tetosotd/tetofortunes.dat https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/fortunes/tetosotd/tetofortunes.dat
curl -sLo ~/.local/share/tetosong/sv2SOTD.wav https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/sv2SOTD.wav
# set up autoupdater # set up autoupdater
# # i use systemd, so i use systemd timers. I'll figure out something for non-systemd users later. # # i use systemd, so i use systemd timers. I'll figure out something for non-systemd users later.
AUTOUPDATE="$(. ~/.local/share/tetosong/tetosong.config; echo $AUTOUPDATE)" AUTOUPDATE="$(. ~/.local/share/tetosong/tetosong.config; echo $AUTOUPDATE)"
@@ -30,8 +24,8 @@ if [ "$AUTOUPDATE" = "YES" ]; then
# write and enable systemd service file and timer user services # write and enable systemd service file and timer user services
echo "Auto-Updater enabled, updating service..." echo "Auto-Updater enabled, updating service..."
mkdir -p ~/.config/systemd/user mkdir -p ~/.config/systemd/user
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.service https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/autoupdater/tetosong.service
curl -sLo ~/.config/systemd/user/tetosong.timer https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/tetosong.timer curl -sLo ~/.config/systemd/user/tetosong.timer https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/autoupdater/tetosong.timer
systemctl --user daemon-reload systemctl --user daemon-reload
systemctl --user enable tetosong.timer systemctl --user enable tetosong.timer
systemctl --user start tetosong.timer systemctl --user start tetosong.timer
@@ -41,8 +35,6 @@ fi
# write tetosong to ~/.local/bin and tell the user how to use it. # write tetosong to ~/.local/bin and tell the user how to use it.
echo "writing tetosong to ~/.local/bin" echo "writing tetosong to ~/.local/bin"
mkdir -p ~/.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/eggs/tetosong
curl -sLo ~/.local/bin/tetosong https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortune
chmod +x ~/.local/bin/tetosong chmod +x ~/.local/bin/tetosong
chmod +x ~/.local/bin/vocafortune echo "Update complete"
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 :)"

View File

@@ -1 +0,0 @@
{"lastDate": "2026-05-02T00:00:00Z"}

26
fortunes/eggs/eggs Normal file
View File

@@ -0,0 +1,26 @@
TETO SONG OF THE DAY!
There is no song of the day! I'm on strike!
▼ >ᴗ< ▼
%
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡖⣉⡬⣷⣦⠶⠶⠞⠙⡦⠖⠒⠒⠒⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⢤⣠⠔⢦⡀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡞⢉⣩⢯⡴⠃⢀⡴⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠓⢦⡀⠀⠀⠀⠀⠀⠀⠀⠻⡀⠀⠁⠀⢀⡇⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⡜⡿⠉⠲⣵⠘⡆⠴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢦⡀⠀⠀⣀⣀⣀⠀⠙⣆⠀⡠⠎⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⡤⠞⠓⠓⠲⢄⡘⠃⠹⡄⠀⠀⠀⢀⡀⠀⠀⠀⡀⠀⠀⠀⢀⠀⠀⠈⢳⡀⠹⡄⢀⡇⢀⡞⠀⠀⠈⡏⠁⠀⠀⠀⠀
⠀⠀⠀⠀⢀⡴⠋⠀⠀⠀⠀⣀⡤⠽⠂⠀⠧⡄⣀⢀⡏⣇⠀⠀⢀⡿⣄⠀⢀⠈⣇⠀⠀⠀⠙⡆⢁⡟⢁⡞⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣠⠞⠁⠀⠀⠀⠀⠀⠘⢧⡤⠖⢒⠿⡆⠹⡬⠻⣦⡘⢆⠀⡼⠀⣈⡽⠫⣀⠈⡆⠀⠀⠀⠓⡼⢀⡿⠚⠉⠉⢹⠀⠀⠀⠀⠀⠀⠀
⠀⢰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡖⣱⠁⠱⡞⠱⡤⣄⡉⠀⠹⡇⠀⠁⢀⣠⠎⠙⢷⠀⠀⠀⢠⠃⠀⠀⠀⣠⠤⠚⠃⠀⠀⠀⠀⠀⠀
⠀⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠀⡇⠐⢄⠟⡆⠳⡄⢙⣦⠀⠀⠀⠾⣍⡀⠀⠀⢸⡀⠀⢀⡏⠀⠀⡴⠋⠈⠉⠓⠦⡀⠀⠀⠀⠀⠀
⢸⠁⢀⡴⠂⠀⠀⠀⠀⡀⠀⡏⠀⢰⢁⡔⠋⠳⣷⠀⠙⡍⢰⠒⠚⡇⠀⠀⠙⠂⠀⣼⠃⣠⡜⠀⠀⡞⠁⠀⠀⠀⠀⠀⠈⠳⡄⠀⠀⠀
⣧⢞⡏⠀⠀⠀⠀⠀⡼⣇⠀⡇⠀⢸⠎⠀⡤⠖⠚⡧⠀⢳⠈⠓⠚⠁⠀⠀⠀⢀⡤⠿⠋⣰⠃⠀⣜⠁⠀⠀⠀⠀⠀⠀⠀⠀⠘⣆⠀⠀
⠀⢸⠀⠀⠀⠀⠀⠀⡇⠈⠳⠇⠀⠀⠀⡞⠁⠀⠀⠹⡔⠌⣇⡀⠀⠀⣀⡤⠞⠉⠀⠀⢀⡇⠀⣰⠃⠙⢦⠀⠀⠀⠀⠀⣤⣄⡀⢸⠀⠀
⠀⢸⡀⠀⠀⠀⠀⠀⡇⠀⠀⠀⢀⣔⣲⠟⠲⣄⣀⡠⠟⢻⢑⣏⡟⢩⡁⢀⡟⠦⣀⣀⣾⣄⣰⠃⠀⠀⠀⠱⡄⠀⠀⠀⠀⡇⠹⠃⠀⠀
⠀⠀⠑⠦⣄⡀⠀⠀⣧⠀⠀⢀⠏⣷⠃⠀⠀⠀⠉⠳⣄⡞⢯⡘⡖⣆⠳⣼⠀⠀⠉⠳⣴⠃⠉⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⢳⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠉⠉⠉⠁⠀⠀⢸⠀⠛⠀⠀⠀⠀⠀⢀⣈⡽⣶⡵⠃⠈⠙⠺⣄⠤⠀⠀⠘⢦⡀⠀⠀⠀⠠⠟⠚⡇⠀⠀⢰⡏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠓⠦⠤⠤⠒⠖⢊⡝⠀⠀⠀⠀⠀⠀⠀⠀⢛⠖⠦⠖⠋⠉⠀⠀⠀⠀⠀⣠⣞⡥⠤⠤⠞⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠤⡯⠤⠤⠤⠤⠤⠤⠤⠤⠤⢼⠀⠀⠐⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⣇⠀⣄⠀⠀⠀⠀⠀⢀⡞⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠞⠁⠉⠉⠉⠉⢦⡞⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
%

BIN
fortunes/eggs/eggs.dat Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,40 +1,39 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# # check which fortune command is installed if any.
# Updated 5-1-2026 to use new vocafortunes script instead of fortune/misfortune 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
# download custom fortunes and config file # download custom fortunes and config file
echo "Downloading custom fortunes and config file..." echo "Downloading custom fortunes and config file..."
# download the config file and prompt the user for options. # download the config file and prompt the user for options.
mkdir -p ~/.local/share/tetosong mkdir -p ~/.local/share/tetosong/
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong.config curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/tetosong.config
read -p "Do you want to hear Teto in your terminal? (y/n) " yn read -p "Do you want to hear Teto in your terminal? (y/n) " yn
case $yn in case $yn in
[Yy]* ) [Yy]* ) sed -i 's|^AUDIO=.*|AUDIO="YES"|' ~/.local/share/tetosong/tetosong.config ;;
sed -i 's|^AUDIO=.*|AUDIO="YES"|' ~/.local/share/tetosong/tetosong.config
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/
rm /tmp/SOTD.zip
;;
[Nn]* ) sed -i 's|^AUDIO=.*|AUDIO="NO"|' ~/.local/share/tetosong/tetosong.config ;; [Nn]* ) sed -i 's|^AUDIO=.*|AUDIO="NO"|' ~/.local/share/tetosong/tetosong.config ;;
* ) echo "Please answer yes or no.";; * ) echo "Please answer yes or no.";;
esac esac
read -p "Do you want to enable automatic updates? (y/n) " yn read -p "Do you want to enable automatic updates? (y/n) " yn
case $yn in case $yn in
[Yy]* ) [Yy]* ) sed -i 's|^AUTOUPDATE=.*|AUTOUPDATE="YES"|' ~/.local/share/tetosong/tetosong.config ;;
sed -i 's|^AUTOUPDATE=.*|AUTOUPDATE="YES"|' ~/.local/share/tetosong/tetosong.config ;;
[Nn]* ) sed -i 's|^AUTOUPDATE=.*|AUTOUPDATE="NO"|' ~/.local/share/tetosong/tetosong.config ;; [Nn]* ) sed -i 's|^AUTOUPDATE=.*|AUTOUPDATE="NO"|' ~/.local/share/tetosong/tetosong.config ;;
* ) echo "Please answer yes or no.";; * ) echo "Please answer yes or no.";;
esac esac
mkdir -p ~/.local/share/tetosong/fortunes
mkdir -p ~/.local/share/tetosong/vocafortunes mkdir -p ~/.local/share/tetosong/fortunes/tetosotd
mkdir -p ~/.local/share/tetosong/vocafortunes/vocadb curl -sLo ~/.local/share/tetosong/fortunes/tetosotd/tetofortunes https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/fortunes/tetosotd/tetofortunes
curl -sLo ~/.local/share/tetosong/vocafortunes/vocadb/140308 https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/vocafortunes/vocadb/140308 curl -sLo ~/.local/share/tetosong/fortunes/tetosotd/tetofortunes.dat https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/fortunes/tetosotd/tetofortunes.dat
curl -sLo ~/.local/share/tetosong/sv2SOTD.wav https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/sv2SOTD.wav
# set up autoupdater # set up autoupdater
# i use systemd, so i use systemd timers. I'll figure out something for non-systemd users later. # i use systemd, so i use systemd timers. I'll figure out something for non-systemd users later.
@@ -43,8 +42,8 @@ if [ "$AUTOUPDATE" = "YES" ]; then
# write and enable systemd service file and timer user services # write and enable systemd service file and timer user services
echo "Autoupdater enabled, updating service..." echo "Autoupdater enabled, updating service..."
mkdir -p ~/.config/systemd/user mkdir -p ~/.config/systemd/user
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.service https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/autoupdater/tetosong.service
curl -sLo ~/.config/systemd/user/tetosong.timer https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/tetosong.timer curl -sLo ~/.config/systemd/user/tetosong.timer https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/autoupdater/tetosong.timer
systemctl --user daemon-reload systemctl --user daemon-reload
systemctl --user enable tetosong.timer systemctl --user enable tetosong.timer
systemctl --user start tetosong.timer systemctl --user start tetosong.timer
@@ -54,8 +53,6 @@ fi
# write tetosong to ~/.local/bin and tell the user how to use it. # write tetosong to ~/.local/bin and tell the user how to use it.
echo "writing tetosong to ~/.local/bin" echo "writing tetosong to ~/.local/bin"
mkdir -p ~/.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/eggs/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/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 :)" 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 :)"

View File

@@ -1,13 +1,13 @@
#!/usr/bin/bash #!/usr/bin/env bash
ARTIST=140308 # 116 is Kasane Teto 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 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. 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. 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. 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 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. 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"}' > dates/${ARTIST}var.json # if it doesn't exist, we create it with a default date back in 2000. 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 fi
PREVDATE=$(jq -r '.lastDate' dates/${ARTIST}var.json) PREVDATE=$(jq -r '.lastDate' var.json)
AFTERDATE=$(date -u -d "$PREVDATE + 1 Second" +"%Y-%m-%dT%H:%M:%SZ") AFTERDATE=$(date -u -d "$PREVDATE + 1 Second" +"%Y-%m-%dT%H:%M:%SZ")
echo "Result: $AFTERDATE" 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. #rm tetofortunes var.json tetofortunes.dat # during testing we will remove everything, or if we want to regenerate the fortune file from scratch.
@@ -23,9 +23,9 @@ if [ "$SONGS" -eq 0 ]; then
echo "Result is empty. No more songs." echo "Result is empty. No more songs."
exit 0 exit 0
fi fi
DATE=$(date -u +%Y-%m-%dT00:00:00Z) DATE=$(echo "$DATA" | jq -r '.items[0].publishDate')
echo "DATE: $DATE" echo "DATE: $DATE"
echo "{\"lastDate\": \"$DATE\"}" > dates/${ARTIST}var.json echo "{\"lastDate\": \"$DATE\"}" > var.json
# looping the api to get all songs we need. # looping the api to get all songs we need.
while true; do 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" 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"
@@ -47,8 +47,8 @@ while true; do
echo "$url" echo "$url"
echo "" echo ""
echo "▼・ᴗ・▼" echo "▼・ᴗ・▼"
echo "\`" echo "%"
done >> vocafortunes/vocadb/$ARTIST done >> fortunes/tetosotd/tetofortunes
if [ "$START" -ge "$MAX" ]; then if [ "$START" -ge "$MAX" ]; then
echo "Reached max results. Stopping." echo "Reached max results. Stopping."
break break
@@ -56,42 +56,6 @@ while true; do
echo "Done!" echo "Done!"
fi fi
done done
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,/^TETO SONG OF THE DAY!/{/^TETO SONG OF THE DAY!$/!d}' fixed
rm vocafortunes/vocadb/$ARTIST
rm uniq dups
mv fixed vocafortunes/vocadb/$ARTIST
# create the fortune database from tetofortunes # create the fortune database from tetofortunes
#rm tetofortunes.dat # delete the old database if it extists. rm fortunes/tetofortunes.dat # delete the old database if it extists.
#strfile -c % tetofortunes tetofortunes.dat strfile -c % fortunes/tetofortunes fortunes/tetofortunes.dat

View File

@@ -1,18 +1,13 @@
#!/usr/bin/bash #!/usr/bin/env bash
#
# Updated 5-1-26 to use new vocafortune script and not require fortune/misfortune.
#
#
# argument handling # argument handling
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case $1 in case $1 in
-u|--update) -u|--update)
echo "Downloading tetosong updater..." echo "Downloading tetosong updater..."
bash <(curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/autoupdater/updater.sh) bash <(curl -s https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/autoupdater/updater.sh)
shift shift
exit 0 exit 0
;; ;;
-h|--help) -h|--help)
echo "--- TETOSONG HELP ---" echo "--- TETOSONG HELP ---"
echo "" echo ""
@@ -30,23 +25,26 @@ done
# check if the config file exists, if not download it # check if the config file exists, if not download it
if [ ! -f ~/.local/share/tetosong/tetosong.config ]; then if [ ! -f ~/.local/share/tetosong/tetosong.config ]; then
echo "Config file not found, downloading default..." echo "Config file not found, downloading default..."
curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/main/tetosong.config curl -sLo ~/.local/share/tetosong/tetosong.config https://raw.githubusercontent.com/eric5949/tetosong/refs/heads/eggs/tetosong.config
fi fi
# check if the user wants to play audio # check if the user wants to play audio
AUDIO="$(. ~/.local/share/tetosong/tetosong.config; echo $AUDIO)" AUDIO="$(. ~/.local/share/tetosong/tetosong.config; echo $AUDIO)"
vocafortune >> /tmp/fortune # check which fortune command is installed if any and then run it
if [ "$AUDIO" = "YES" ]; then if ! [ -x "$(command -v fortune)" ]; then
if grep -q "SV2" /tmp/fortune; then if ! [ -x "$(command -v misfortune)" ]; then
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null & echo 'No fortune commmand is installed, exiting!'
elif grep -q "SV" /tmp/fortune; then exit 1
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/svSOTD.wav 2>/dev/null >/dev/null & else
elif grep -q "重音テト" /tmp/fortune; then if [ "$AUDIO" = "YES" ]; then
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/utSOTD.wav 2>/dev/null >/dev/null & nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/sv2SOTD.wav 2>/dev/null >/dev/null &
else fi
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/audio/teto/sv2SOTD.wav 2>/dev/null >/dev/null & misfortune ~/.local/share/tetosong/fortunes/**/*/* # fortune doesnt care if you give it a directory, apparently misfortune does. watch this be a problem when i go to add easter eggs in a separate file...
fi
else
if [ "$AUDIO" = "YES" ]; then
nohup ffplay -nodisp -autoexit -v quiet ~/.local/share/tetosong/sv2SOTD.wav 2>/dev/null >/dev/null &
fi fi
fortune ~/.local/share/tetosong/fortunes/**/*/
fi fi
cat /tmp/fortune
rm /tmp/fortune

1
var.json Normal file
View File

@@ -0,0 +1 @@
{"lastDate": "2026-04-24T00:00:00Z"}

View File

@@ -1,10 +0,0 @@
#!/usr/bin/env bash
# VOCAFORTUNE! Make tetosong not need fortune anymore!
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 "$l" ]; then export "DIR"="$HOME/.local/share/tetosong/vocafortunes/**"; else export "DIR"="$l/**"; fi
for file in $DIR; do if [[ -f "$file" ]]; then readarray -td '`' temp < "$file"; array+=("${temp[@]}"); fi; done
export "ITEMS"="${#array[@]}"
export "CHOICE"="$(shuf -i 1-$ITEMS -n 1)"
echo "${array[$CHOICE]}"