shradio.sh - ouça rádios online
Publicado por Juliano Santos (última atualização em 09/01/2017)
[ Hits: 5.392 ]
O shradio.sh é um script com interface gtk usando o yad. Ele permite escutar rádios online através do serviço de stream. Estão disponíveis cerca de 80 gêneros musicais com centenas de rádios cada.
#!/bin/bash #------------------------------------------------------------------------------# # Data: 15 de Agosto de 2016 # Criado por: Juliano Santos [x_SHAMAN_x] # Script: shradio.sh # Página: http://www.shellscriptx.blogspot.com.br # Descrição: Script para execução de radios online atraves do serviço de stream #------------------------------------------------------------------------------# # Verifica pacotes necessários for pkg in mplayer yad curl do if ! which $pkg &>/dev/null; then echo "$(basename "$0"): Erro: '$pkg' não está instalado."; exit 1 fi done # Suprimir erros exec 2>/dev/null # script SCRIPT="$(basename "$0")" # CONF TMP_LISTEN=$(mktemp --tmpdir=/tmp shradio.XXXXXXXXXX) SITE=https://www.internet-radio.com GENRE_LIST=/tmp/genres.list #Icone ICON_APP=/usr/share/icons/HighContrast/48x48/emblems/emblem-music.png # Cria uma trap, se o script for interrompido pelo usuário trap '_exit' TERM INT # Encerra script function _exit() { # Apaga arquivo temporário rm -f $TMP_LISTEN # Mata os subshell's e shell principal kill -9 $(pidof mplayer yad) \ $(ps aux | grep -v grep | grep "$SCRIPT" | grep -v "$$" | awk '{print $2}') &>/dev/null exit 0 } function PlayRadio() { local listen=$(echo "$*" | cut -d"|" -f3) # Serviço de stream local genre=$(echo "$*" | cut -d"|" -f2) # Gênero local radio=$(echo "$*" | cut -d"|" -f1) # Nome da Radio # Se rádio for selecionada finaliza o processo 'mplayer' if [ "$listen" ]; then kill -9 $(pidof mplayer); else return 0; fi # Executa o LISTEN da rádio em segundo plano e redireciona as informações para o arquivo 'TMP_LISTEN' mplayer "$listen" &>$TMP_LISTEN & # Variáveis locais. local Music RadioName Swap # Status de seleção da rádio pelo usuário local ini=0 # Aguarda conexão com o servidor de stream for cont in $(seq 4); do echo; sleep 1; done | yad --progress \ --fixed \ --center \ --no-buttons \ --title "$radio" \ --progress-text="Conectando '$listen'..." \ --auto-close --pulsate # Atualiza a cada '3' segundos as informações da rádio e armazena as informações em # 'Music' e 'RadioName'. while true do # Sincroniza informações da 'rádio' Music="$(cat $TMP_LISTEN | grep -i 'StreamTitle' | awk 'END {print}' | cut -d'=' -f2- | cut -d';' -f1 | tr -d \'\")" RadioName="$(cat $TMP_LISTEN | egrep -i "^Name" | awk 'END {print}' | cut -d':' -f2-)" # Se a música mudou ou se a rádio foi selecionada pelo usuário, envia uma notificação # com as informações da nova faixa. if [ "$Music" != "$Swap" -o $ini -eq 0 ]; then Swap="$Music" # Música atual. Music="${Music:-Desconhecido}" # 'Desconhecido' Valor padrão RadioName="${RadioName:-Desconhecido}" # Envia notificação notify-send --app-name="shRadio" --icon=$ICON_APP "$Music" "$RadioName" ini=1 # status fi sleep 3 # N> low cpu done } # Janela principal function main() { ###### JANELA PRINCIPAL ###### COUNT=$(yad --form \ --center \ --width 300 \ --height 300 \ --fixed \ --title "[x_SHAMAN_x] - $SCRIPT" \ --image $ICON_APP \ --text "Seja bem vindo ao '<b>$SCRIPT</b>' !!!!\nSeu script de Rádio online.\nVocẽ irá encontrar os mais diversos gêneros musicais.\nA lista de rádios são obtidas apartir da fonte\n'<b>$SITE</b>'.\nPara começar, escolha o seu gẽnero músical, clicando\nno botão '<b>Gêneros</b>'\nObs: Todas as informações contidas na lista, são\nsincronizadas com a fonte." \ --field '':LBL '' \ --field "Defina o número de paginas a serem pesquisadas,\naumentando assim a quantidade de rádios encontradas.\n\nObs: Dependendo do valor, a busca poderá\ndemorar um pouco. <b>:)</b>":LBL '' \ --field 'Num. paginas.':NUM '1!1..20!1' \ --button 'Gêneros!gtk-cdrom':0 \ --button 'Limpar cache!gtk-delete':1 \ --button 'Sair!gtk-quit':252) # Retorno RETVAL=$? # Se a janela for fechada if [ $RETVAL -eq 252 ]; then _exit # Limpar cache elif [ $RETVAL -eq 1 ]; then yad --form \ --image=gtk-dialog-question \ --center \ --fixed \ --title "Limpar cache" \ --text "Essa ação irá limpar todo cache de listas de rádios \ngeradas anteriormente.\n\nDeseja continuar ?" \ --button "Sim":0 --button "Não":252 # Limpa o cache removendo todos os arquivo .list # As informações principais das rádios são armazenadas nesses arquivos # que ficam localizados na pasta '/tmp' # Cada arquivo possue a extensão .list com o prefixo do nome do gênero. [ $? -eq 0 ] && rm -f $GENRE_LIST &>/dev/null # Função principal main fi ######### LISTA DE GÊNEROS ############### # Gera arquivo de cache se ele não existir. if [ ! -e $GENRE_LIST ]; then # Lê a linha while read radio; do # Incrementa arquivo especifico ao gênero echo "$radio" >> $GENRE_LIST echo "# Adicionando: '$radio'" sleep 0.1 # Realiza um dump na 'url', aplica uma 'ER' para obter as tags dos gêneros, alimentando o while # com o padrão obtido. done < <(curl "$SITE" 2>/dev/null | sed -n 's/class="btn/\n/gp' | sed -n 's/^.*">\(.*\)<\/a> .*$/\1/pg') \ | yad --title "Gêneros" \ --text "Sincronizando gêneros musicais..." \ --center \ --no-buttons \ --auto-kill \ --auto-close \ --fixed \ --width 400 \ --progress \ --text-progress \ --pulsate fi # Lê as informações do arquivo .list redirecionando para 'yad' # Armazena saida em 'GENRE' GENRE=$(cat $GENRE_LIST | yad --title "Gêneros" \ --center \ --no-buttons \ --width 300 \ --height 600 \ --no-buttons \ --text "<b>Total: $(cat "$GENRE_LIST" | wc -l)</b>" \ --list \ --search-column 1 \ --listen \ --column "Nome") # Se a janela for fechada. [ $? -eq 252 ] && main COUNT=$(echo $COUNT | cut -d'|' -f3 | cut -d',' -f1) # Pega o(s) primeiro(s) digito(s) antes da virgula. GENRE="${GENRE/|/}" # Gênero RADIO_LIST="/tmp/$GENRE.list" # Arquivo .list tag_genre="$(echo ${GENRE/ /%20} | tr '[:upper:]' '[:lower:]')" # Se o nome do gênero conter espaço, substitui por Encondig Reference (%20). ######### LISTA DE RÁDIOS ############### # Gera arquivo de cache se ele não existir. if [ ! -e "$RADIO_LIST" ]; then for pag in $(seq $COUNT); do # Lê a linha while read radio; do # Incrementa arquivo echo "$radio" >> "$RADIO_LIST" # Envia somente o nome da rádio para o 'progress' [ "$(echo $radio | egrep -v "^http|^$GENRE$")" ] && echo "# $radio" sleep 0.1 # A url é alterada dinamicamente # Recebendo os valores do "Gênero" e "Página". # O dump é realizado na 'url', aplicando uma 'ER' que obtem as tag's que contém o nome das rádios. done < <(curl https://www.internet-radio.com/stations/$tag_genre/page$pag 2>/dev/null | \ sed -n "s/^.*?mount=\(.*\)\/listen.*title=\(.*\)&.*$/\2\n$GENRE\n\1/pg") | \ yad --title "Rádios" \ --text "Gênero: <b>$GENRE</b>\nPágina: <b>$pag</b>\nProcurando..." \ --center \ --on-top \ --no-buttons \ --progress \ --text-progress \ --auto-kill \ --auto-close \ --fixed \ --width 600 \ --pulsate done fi # Mata todos os subshell's com excessão do shell principal. kill -9 $(ps aux | grep "$SCRIPT" | egrep -v "grep|$$" | awk '{print $2}') &>/dev/null # Executa a música selecionada em segundo plano. PlayRadio $(cat "$RADIO_LIST" \ | yad --center \ --title "Rádios" \ --fixed \ --text "<b>Total: $(($(cat "$RADIO_LIST" | wc -l)/3))</b>" \ --width 600 --height 600 \ --on-top \ --no-buttons \ --list \ --listen \ --search-column 1 \ --hide-column 3 \ --column "Nome" \ --column "Gênero" \ --column "Listen" \ --separator='|') & # Principal main } main
Pequeno, simples mas interessante chat desenvolvido totalmente em shell script.
Find em arquivos compactados (grep em arquivos tgz)
Verifica quais ports necessitam de atualização
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Ocomon 6.0.1 - Problemas ao editar configurações estendidas (7)
instalar o Linux em computadores Acer novos (7)
Será possível instalar Linux Mint LMDE em Sony Vaio? (19)
O livro "Linux - Guia do Administrador do Sistema (Rubem E. Ferre... (1)