From fb1b589f8da41cb4dfb7680d10aedbd3cad46bf6 Mon Sep 17 00:00:00 2001 From: LailaTheElf Date: Wed, 22 Oct 2025 17:16:34 +0200 Subject: [PATCH] add music shuffle and concept for main menu --- private_dot_config/menu_main/hr | 1 + private_dot_config/menu_main/hr_rts.sh | 4 + private_dot_config/menu_main/main | 2 + private_dot_config/menu_main/proj | 126 +++++++++++++++++++++ private_dot_local/bin/executable_menu_main | 37 +++++- private_dot_local/bin/executable_shuffle | 81 +++++++++++++ 6 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 private_dot_config/menu_main/hr create mode 100644 private_dot_config/menu_main/hr_rts.sh create mode 100644 private_dot_config/menu_main/main create mode 100644 private_dot_config/menu_main/proj create mode 100644 private_dot_local/bin/executable_shuffle diff --git a/private_dot_config/menu_main/hr b/private_dot_config/menu_main/hr new file mode 100644 index 0000000..7c8dfdf --- /dev/null +++ b/private_dot_config/menu_main/hr @@ -0,0 +1 @@ +real time systems:exec:./hr/rts.sh \ No newline at end of file diff --git a/private_dot_config/menu_main/hr_rts.sh b/private_dot_config/menu_main/hr_rts.sh new file mode 100644 index 0000000..228082a --- /dev/null +++ b/private_dot_config/menu_main/hr_rts.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +codium $HOME/projects/hr/rts10_reports/ +flatpak run md.obsidian.Obsidian $HOME/projects/hr/rts10_reports/ diff --git a/private_dot_config/menu_main/main b/private_dot_config/menu_main/main new file mode 100644 index 0000000..759c991 --- /dev/null +++ b/private_dot_config/menu_main/main @@ -0,0 +1,2 @@ +Hoogeschool Rotterdam:menu:hr +projects:menu:proj diff --git a/private_dot_config/menu_main/proj b/private_dot_config/menu_main/proj new file mode 100644 index 0000000..650b19a --- /dev/null +++ b/private_dot_config/menu_main/proj @@ -0,0 +1,126 @@ +ems31_2024-2025_groep_2_ccs:exec:kgx --working-directory=$HOME/projects/ems31_2024-2025_groep_2_ccs +ems31_2024-2025_groep_2_wsl:exec:kgx --working-directory=$HOME/projects/ems31_2024-2025_groep_2_wsl +escaperoom/pages:exec:kgx --working-directory=$HOME/projects/escaperoom/pages +ffmpeg:exec:kgx --working-directory=$HOME/projects/ffmpeg +freenen/3dprinter_profiles:exec:kgx --working-directory=$HOME/projects/freenen/3dprinter_profiles +freenen/ansible-authelia:exec:kgx --working-directory=$HOME/projects/freenen/ansible-authelia +freenen/ansible-codimd:exec:kgx --working-directory=$HOME/projects/freenen/ansible-codimd +freenen/ansible-collabora:exec:kgx --working-directory=$HOME/projects/freenen/ansible-collabora +freenen/ansible-docker:exec:kgx --working-directory=$HOME/projects/freenen/ansible-docker +freenen/ansible-firefly-iii:exec:kgx --working-directory=$HOME/projects/freenen/ansible-firefly-iii +freenen/ansible-git:exec:kgx --working-directory=$HOME/projects/freenen/ansible-git +freenen/ansible-gitea:exec:kgx --working-directory=$HOME/projects/freenen/ansible-gitea +freenen/ansible-gitea-act-runner:exec:kgx --working-directory=$HOME/projects/freenen/ansible-gitea-act-runner +freenen/ansible-grafana:exec:kgx --working-directory=$HOME/projects/freenen/ansible-grafana +freenen/ansible-lamp:exec:kgx --working-directory=$HOME/projects/freenen/ansible-lamp +freenen/ansible-minecraft-server:exec:kgx --working-directory=$HOME/projects/freenen/ansible-minecraft-server +freenen/ansible-mqtt:exec:kgx --working-directory=$HOME/projects/freenen/ansible-mqtt +freenen/ansible-mysql:exec:kgx --working-directory=$HOME/projects/freenen/ansible-mysql +freenen/ansible-nextcloud:exec:kgx --working-directory=$HOME/projects/freenen/ansible-nextcloud +freenen/ansible-pi-hole:exec:kgx --working-directory=$HOME/projects/freenen/ansible-pi-hole +freenen/ansible-prometheus:exec:kgx --working-directory=$HOME/projects/freenen/ansible-prometheus +freenen/ansible-proxymanager:exec:kgx --working-directory=$HOME/projects/freenen/ansible-proxymanager +freenen/ansible-rustdesk:exec:kgx --working-directory=$HOME/projects/freenen/ansible-rustdesk +freenen/ansible-server-base:exec:kgx --working-directory=$HOME/projects/freenen/ansible-server-base +freenen/ansible-vscode-server:exec:kgx --working-directory=$HOME/projects/freenen/ansible-vscode-server +freenen/ansible-zigbee2mqtt:exec:kgx --working-directory=$HOME/projects/freenen/ansible-zigbee2mqtt +freenen/astrid:exec:kgx --working-directory=$HOME/projects/freenen/astrid +freenen/babaisyousolver:exec:kgx --working-directory=$HOME/projects/freenen/babaisyousolver +freenen/bakje:exec:kgx --working-directory=$HOME/projects/freenen/bakje +freenen/contacts:exec:kgx --working-directory=$HOME/projects/freenen/contacts +freenen/dasbob:exec:kgx --working-directory=$HOME/projects/freenen/dasbob +freenen/dasbob_qmk:exec:kgx --working-directory=$HOME/projects/freenen/dasbob_qmk +freenen/dometimer:exec:kgx --working-directory=$HOME/projects/freenen/dometimer +freenen/downloads:exec:kgx --working-directory=$HOME/projects/freenen/downloads +freenen/elfos:exec:kgx --working-directory=$HOME/projects/freenen/elfos +freenen/elven_cli:exec:kgx --working-directory=$HOME/projects/freenen/elven_cli +freenen/embassy:exec:kgx --working-directory=$HOME/projects/freenen/embassy +freenen/energyPulseCounter:exec:kgx --working-directory=$HOME/projects/freenen/energyPulseCounter +freenen/hasio-addons:exec:kgx --working-directory=$HOME/projects/freenen/hasio-addons +freenen/keycounter:exec:kgx --working-directory=$HOME/projects/freenen/keycounter +freenen/keys:exec:kgx --working-directory=$HOME/projects/freenen/keys +freenen/kicad-build:exec:kgx --working-directory=$HOME/projects/freenen/kicad-build +freenen/kladjes:exec:kgx --working-directory=$HOME/projects/freenen/kladjes +freenen/kladjes.html:exec:kgx --working-directory=$HOME/projects/freenen/kladjes.html +freenen/klippertoolboard:exec:kgx --working-directory=$HOME/projects/freenen/klippertoolboard +freenen/labvoeding-front:exec:kgx --working-directory=$HOME/projects/freenen/labvoeding-front +freenen/makitapowerbank:exec:kgx --working-directory=$HOME/projects/freenen/makitapowerbank +freenen/maps:exec:kgx --working-directory=$HOME/projects/freenen/maps +freenen/mbc_barritoolpcb:exec:kgx --working-directory=$HOME/projects/freenen/mbc_barritoolpcb +freenen/minecraft-clone:exec:kgx --working-directory=$HOME/projects/freenen/minecraft-clone +freenen/Monikers:exec:kgx --working-directory=$HOME/projects/freenen/Monikers +freenen/mp3_pcb:exec:kgx --working-directory=$HOME/projects/freenen/mp3_pcb +freenen/mqttAutomation:exec:kgx --working-directory=$HOME/projects/freenen/mqttAutomation +freenen/mqttclient:exec:kgx --working-directory=$HOME/projects/freenen/mqttclient +freenen/mqttClock:exec:kgx --working-directory=$HOME/projects/freenen/mqttClock +freenen/mr-iot:exec:kgx --working-directory=$HOME/projects/freenen/mr-iot +freenen/mute_experiment:exec:kgx --working-directory=$HOME/projects/freenen/mute_experiment +freenen/nixconfig:exec:kgx --working-directory=$HOME/projects/freenen/nixconfig +freenen/noteapp:exec:kgx --working-directory=$HOME/projects/freenen/noteapp +freenen/notes:exec:kgx --working-directory=$HOME/projects/freenen/notes +freenen/obsidian_fr-calendar:exec:kgx --working-directory=$HOME/projects/freenen/obsidian_fr-calendar +freenen/oscilloscoop:exec:kgx --working-directory=$HOME/projects/freenen/oscilloscoop +freenen/pages:exec:kgx --working-directory=$HOME/projects/freenen/pages +freenen/penningbot:exec:kgx --working-directory=$HOME/projects/freenen/penningbot +freenen/portfolioWebsite:exec:kgx --working-directory=$HOME/projects/freenen/portfolioWebsite +freenen/pringels_config:exec:kgx --working-directory=$HOME/projects/freenen/pringels_config +freenen/qmk_firmware:exec:kgx --working-directory=$HOME/projects/freenen/qmk_firmware +freenen/QR_knowledgebase:exec:kgx --working-directory=$HOME/projects/freenen/QR_knowledgebase +freenen/rcrf-wifi:exec:kgx --working-directory=$HOME/projects/freenen/rcrf-wifi +freenen/relayclient:exec:kgx --working-directory=$HOME/projects/freenen/relayclient +freenen/rotoryencoder:exec:kgx --working-directory=$HOME/projects/freenen/rotoryencoder +freenen/rp2040_c:exec:kgx --working-directory=$HOME/projects/freenen/rp2040_c +freenen/rp2040_projects:exec:kgx --working-directory=$HOME/projects/freenen/rp2040_projects +freenen/rp2040-project-template:exec:kgx --working-directory=$HOME/projects/freenen/rp2040-project-template +freenen/rustlings:exec:kgx --working-directory=$HOME/projects/freenen/rustlings +freenen/rzh-server:exec:kgx --working-directory=$HOME/projects/freenen/rzh-server +freenen/scrum-board:exec:kgx --working-directory=$HOME/projects/freenen/scrum-board +freenen/servermanager:exec:kgx --working-directory=$HOME/projects/freenen/servermanager +freenen/soldeerstation:exec:kgx --working-directory=$HOME/projects/freenen/soldeerstation +freenen/sshkeys:exec:kgx --working-directory=$HOME/projects/freenen/sshkeys +freenen/stofzuiger:exec:kgx --working-directory=$HOME/projects/freenen/stofzuiger +freenen/taklift:exec:kgx --working-directory=$HOME/projects/freenen/taklift +freenen/tasky:exec:kgx --working-directory=$HOME/projects/freenen/tasky +freenen/tempmeter:exec:kgx --working-directory=$HOME/projects/freenen/tempmeter +freenen/tmc_control:exec:kgx --working-directory=$HOME/projects/freenen/tmc_control +freenen/viool:exec:kgx --working-directory=$HOME/projects/freenen/viool +freenen/voltarush:exec:kgx --working-directory=$HOME/projects/freenen/voltarush +freenen/webtemplate:exec:kgx --working-directory=$HOME/projects/freenen/webtemplate +freenen/webtemplate_differant:exec:kgx --working-directory=$HOME/projects/freenen/webtemplate_differant +gridfinity-rebuilt-openscad:exec:kgx --working-directory=$HOME/projects/gridfinity-rebuilt-openscad +hedgedoc:exec:kgx --working-directory=$HOME/projects/hedgedoc +hr/ane10.2_pcb1:exec:kgx --working-directory=$HOME/projects/hr/ane10.2_pcb1 +hr/ane10.3_pcb1:exec:kgx --working-directory=$HOME/projects/hr/ane10.3_pcb1 +hr/ane10.3_pcb2:exec:kgx --working-directory=$HOME/projects/hr/ane10.3_pcb2 +hr/ane10_pcb1:exec:kgx --working-directory=$HOME/projects/hr/ane10_pcb1 +hr/ane21_cm4:exec:kgx --working-directory=$HOME/projects/hr/ane21_cm4 +hr/csc10_labs:exec:kgx --working-directory=$HOME/projects/hr/csc10_labs +hr/dis10:exec:kgx --working-directory=$HOME/projects/hr/dis10 +hr/eep71_code:exec:kgx --working-directory=$HOME/projects/hr/eep71_code +hr/ems20_handshake:exec:kgx --working-directory=$HOME/projects/hr/ems20_handshake +hr/ems31:exec:kgx --working-directory=$HOME/projects/hr/ems31 +hr/ems31_ccs:exec:kgx --working-directory=$HOME/projects/hr/ems31_ccs +hr/ems31_eindopdracht2:exec:kgx --working-directory=$HOME/projects/hr/ems31_eindopdracht2 +hr/ems31_submodules:exec:kgx --working-directory=$HOME/projects/hr/ems31_submodules +hr/ems31_wsl:exec:kgx --working-directory=$HOME/projects/hr/ems31_wsl +hr/eps10:exec:kgx --working-directory=$HOME/projects/hr/eps10 +hr/hwp01_labs:exec:kgx --working-directory=$HOME/projects/hr/hwp01_labs +hr/pee20_motioncontroller:exec:kgx --working-directory=$HOME/projects/hr/pee20_motioncontroller +hr/pee30_belasting:exec:kgx --working-directory=$HOME/projects/hr/pee30_belasting +hr/PEE51_formula_documents:exec:kgx --working-directory=$HOME/projects/hr/PEE51_formula_documents +hr/pee51_gan_motor_driver:exec:kgx --working-directory=$HOME/projects/hr/pee51_gan_motor_driver +hr/pee51_pcb:exec:kgx --working-directory=$HOME/projects/hr/pee51_pcb +hr/pee71_documents:exec:kgx --working-directory=$HOME/projects/hr/pee71_documents +hr/pee71_eeprom_test:exec:kgx --working-directory=$HOME/projects/hr/pee71_eeprom_test +hr/rts10_assignment_project_files:exec:kgx --working-directory=$HOME/projects/hr/rts10_assignment_project_files +hr/rts10_labs:exec:kgx --working-directory=$HOME/projects/hr/rts10_labs +hr/rts10_rust:exec:kgx --working-directory=$HOME/projects/hr/rts10_rust +hr/rts10_verslagen:exec:kgx --working-directory=$HOME/projects/hr/rts10_verslagen +hr/spc_stabilisatie_firmware:exec:kgx --working-directory=$HOME/projects/hr/spc_stabilisatie_firmware +hr/stg30_notes:exec:kgx --working-directory=$HOME/projects/hr/stg30_notes +Kompas:exec:kgx --working-directory=$HOME/projects/Kompas +pico-examples:exec:kgx --working-directory=$HOME/projects/pico-examples +volta/wan-party-website:exec:kgx --working-directory=$HOME/projects/volta/wan-party-website +volta/webgenerator:exec:kgx --working-directory=$HOME/projects/volta/webgenerator +volta/website:exec:kgx --working-directory=$HOME/projects/volta/website +volta/website-wp-thema:exec:kgx --working-directory=$HOME/projects/volta/website-wp-thema diff --git a/private_dot_local/bin/executable_menu_main b/private_dot_local/bin/executable_menu_main index 262fd29..e178545 100644 --- a/private_dot_local/bin/executable_menu_main +++ b/private_dot_local/bin/executable_menu_main @@ -1,4 +1,37 @@ -#!/usr/bin/foot fish +#!/usr/bin/env bash -open "$(find $HOME/Music | fzf)" & +function run_menu() { + menu="$1" + if [[ -z "$menu" ]] + then + menu="main" + fi + items="$(cat "$XDG_CONFIG_HOME/menu_main/$menu")" + + echo "$XDG_CONFIG_HOME/menu_main/$menu" + echo "$items" + + item="$(echo "$items" | sed -e 's|:.*$||' | walker --dmenu)" + + action="$(echo "$items" | grep "^$item" | sed 's|^[^:]*:||' )" + + exec_item "$action" +} + +function exec_item() { + if [[ "$(echo "$action" | sed -e 's|:.*$||')" == "menu" ]] + then + menu_main "$(echo "$action" | sed -e 's|^[^:]*:||')" + exit + fi + + if [[ "$(echo "$action" | sed -e 's|:.*$||')" == "exec" ]] + then + cd $XDG_CONFIG_HOME/menu_main + $(echo "$action" | sed -e 's|^[^:]*:||') + fi + +} + +run_menu "$1" diff --git a/private_dot_local/bin/executable_shuffle b/private_dot_local/bin/executable_shuffle new file mode 100644 index 0000000..9ec7e65 --- /dev/null +++ b/private_dot_local/bin/executable_shuffle @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +PLAYLIST="$1" + +set -e + +SONGS="$(find $HOME/Music -type f)" +SONG_COUNT="$(echo "$SONGS" | wc -l)" + +function pick_song() { + num=$(( 1 + $RANDOM % $SONG_COUNT )) + echo "$SONGS" | sed "${num}q;d" +} + +function get_flags() { + path="$1" + meuadata="flac" + genre="$(ffmpeg -i "${path}" 2>&1 | grep GENRE | sed -e 's/^.*: //')" + if [[ "$(echo "${path}" | sed -e 's/^.*\.\([^\.]*\)$/\1/')" == "mp3" ]] + then + metadata="mp3" + genre="$(id3v2 -l "${path}" | grep '^TCON' | sed -e 's/^.*: //')" + fi + echo $genre +} + +function in_playlist() { + flags="$1" + playlist="$2" + + playlists=" + ALL:(HE|ME|LE) + HE:HE + MHE:(ME|HE) + ME:ME + LME:(LE|ME) + LO:LO + LOFI:LOFI + LE_LOFI:(LE|LOFI) + " + query="$(echo "$playlists" | grep --ignore-case " ${playlist}:" | sed 's/^.*://')" + + if [[ "$(echo "$flags" | grep -E --no-ignore-case "$query")" != "" ]] + then + echo true + else + echo false + fi +} + +function get_like_level() { + flags="$1" + + level="$(echo "$flags" | sed -e 's/^.*L\([0-3]\).*$/\1/')" + if [[ "$level" == "$(echo "$level" | tr -dc '0-3')" ]] + then + echo $level + fi +} + +function shuffle() { + playlist="$1" + + song="$(pick_song)" + flags="$(get_flags "$song")" + in_list=$(in_playlist "$flags" "$playlist") + like=$(get_like_level "$flags") + like_min=$(( 1 + $RANDOM % 3 )) + + if [[ "$in_list" == "false" || "$like" -lt "$like_min" ]] + then + shuffle "$playlist" + else + mpd_song="$(echo "$song" | sed -e 's|.*/Music/||')" + echo "$mpd_song" + mpc add "$mpd_song" + fi +} + +echo "$(shuffle $PLAYLIST)" +