shradio.sh - ouça rádios online

Publicado por Juliano Santos (última atualização em 09/01/2017)

[ Hits: 5.163 ]

Download 6550.shradio.sh




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.

  



Esconder código-fonte

#!/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&#7869; 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&#7869;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>&nbsp;.*$/\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

Scripts recomendados

Instalar última versão do Java automaticamente em "todas as plataformas"

Correção do arquivo status

Adicionar/Deletar Usuarios Samba/Sistema

Script em shell do artigo: Implementando a segurança em servicos de acesso remoto

Gerenciamento de logs em servidores de aplicação


  

Comentários
[1] Comentário enviado por fabio em 09/01/2017 - 09:35h

Muito bom o script! Parabéns.

[2] Comentário enviado por raysilva em 09/01/2017 - 13:42h

Muito bom.
Este script roda em qual S.O?

[3] Comentário enviado por x_SHAMAN_x em 09/01/2017 - 14:11h


[2] Comentário enviado por raysilva em 09/01/2017 - 13:42h

Muito bom.
Este script roda em qual S.O?


Qual S.O ou Distro ? Fiquei perdido agora. kkkkk

[4] Comentário enviado por raysilva em 09/01/2017 - 17:07h


[3] Comentário enviado por x_SHAMAN_x em 09/01/2017 - 14:11h


[2] Comentário enviado por raysilva em 09/01/2017 - 13:42h

Muito bom.
Este script roda em qual S.O?


Qual S.O ou Distro ? Fiquei perdido agora. kkkkk


Distro. kkkkk

[5] Comentário enviado por x_SHAMAN_x em 09/01/2017 - 17:34h


[4] Comentário enviado por raysilva em 09/01/2017 - 17:07h


[3] Comentário enviado por x_SHAMAN_x em 09/01/2017 - 14:11h


[2] Comentário enviado por raysilva em 09/01/2017 - 13:42h

Muito bom.
Este script roda em qual S.O?


Qual S.O ou Distro ? Fiquei perdido agora. kkkkk


Distro. kkkkk


Ele roda em qualquer distro Linux desde que os pacotes requeridos estejam instalados, que no caso são verificados no momento da execução. O único problema é o gerenciador de notificações utilizado no script (notify-send), que é responsável por informar ao usuário os detalhes da música em execução. Dependendo da distribuição utilizada pode haver variações neste gerenciador; Mas nada que não possa ser adequado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts