File: qmmp.sh

package info (click to toggle)
eiskaltdcpp 2.4.2-1.3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 25,676 kB
  • sloc: cpp: 97,597; ansic: 5,004; perl: 1,897; xml: 1,440; sh: 1,313; php: 661; javascript: 257; makefile: 39
file content (172 lines) | stat: -rwxr-xr-x 6,369 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/bin/bash

# NowPlaying QMMP Script
# Author: Gustavo Alvarez <sl1pkn07@gmail.com>
# License: GPL-2
# Date: 2013-05-08

# Funciones:
# Función set_default_lang(): Selecciona el lenguaje por defecto de la aplicación. por defecto "en_EN" (inglés)
# Función set_lang(): Selecciona el lenguaje de la aplicación según la variable de sistema "${LANG}".
# Función get_data_format(): Genera arrays asociativos para determinar tipo/formato de los archivos reproducidos.
# Función generate_bar(): Crea una barra de progreso simple.
# Función get_data_play(): se ejecuta cuando el player está en funcionamiento.
# Función get_data_stop(): se ejecuta cuando el player está parado.
# Función get_data_down(): se ejecuta cuando el player está apagado.

# Define variables:
# Extrae de DBUS las cadenas necesarias.
lang_dir_path="$(dirname $0)/qmmp_langs"
player="$(qdbus org.mpris.qmmp / Identity 2>/dev/null)"
mdata="$(qdbus org.mpris.qmmp /Player GetMetadata 2>/dev/null)"
artist="$(echo "${mdata}" | sed -ne 's/^artist: \(.*\)$/\1/p')"
title="$(echo "${mdata}" | sed -ne 's/^title: \(.*\)$/\1/p')"
album="$(echo "${mdata}" | sed -ne 's/^album: \(.*\)$/\1/p')"
bitrate="$(echo "${mdata}" | sed -ne 's/^audio\-bitrate: \(.*\)$/\1/p')"
samplerate="$(echo "${mdata}" | sed -ne 's/^audio\-samplerate: \(.*\)$/\1/p')"
length="$(echo "${mdata}" | sed -ne 's/^mtime: \(.*\)$/\1/p')"
runtime="$(qdbus org.mpris.qmmp /Player PositionGet 2>/dev/null)"
type="$(echo "${mdata}"| sed -ne 's/^location: \(.*\)$/\1/p' | cut -d ":" -f1)"
ext="$(echo "${mdata}"| sed -ne 's/^location: \(.*\)$/\1/p' | awk -F . '{print $NF}')"

set_default_lang() {
  # Selecciona el lenguaje por defecto (ingles).
  source "${lang_dir_path}/en_EN"
}

set_lang() {
  # Llama a la función set_default_lang().
  set_default_lang

  # Selecciona el archivo del lenguaje según el lenguaje del sistema (seleccionado por "${lang}" o "${lang_short}").
  # si no existe el archivo del lenguaje. deja el lenguaje por defecto.
  lang="$(echo "${LANG}" | cut -d "." -f1)"
  lang_short="$(echo "${LANG}" | cut -d "." -f1 | cut -d "_" -f1)"
  if [ -d "${lang_dir_path}" ]; then
    for l in $(find "${lang_dir_path}" -type f -printf "%f "); do
      [ "${l}" = "${lang}" ] && source "${lang_dir_path}/${l}" && break
      [ "$(echo ${l} | cut -d "_" -f1)" = "${lang_short}" ] && source "${lang_dir_path}/${l}" && break
    done
  fi
}

get_data_format() {
  # Determina el formato audio:
  # primero comprueba mediante "${type}" si es CD de Audio (cdda), CUE-sheet (cue), URL Stream (http) o si es un archivo simple (file).
  # Si coincide con "file", vuelve a compararlo usando "${ext}" para determinar el formato por su extensión.

  # Genera el array "_type".
  declare -A _type=(\
  ["cdda"]="CDDA" \
  ["cue"]="CUE-sheet" \
  ["http"]="URL Stream" \
  )

  # Genera el array "_ext".
  declare -A _ext=(\
  ["flac"]="FLAC" \
  ["ape"]="MonkeyAudio" \
  ["tta"]="TrueAudio" \
  ["mp3"]="MP3" \
  ["ogg"]="Ogg-Vorbis" \
  ["aac"]="AAC" \
  ["m4a"]="Mpeg4-Audio" \
  ["mpc"]="MusePack" \
  ["wav"]="WAVE" \
  ["wv"]="WavPack" \
  ["midi"]="MIDI" \
  ["wma"]="WMA" \
  ["ac3"]="AC-3" \
  ["dts"]="DTS" \
  ["ra"]="RealAudio" \
  ["truehd"]="TrueAudio-HD" \
  ["frog"]="OptimFROG" \
  ["shn"]="Shorten" \
  ["mlp"]="Meridian" \
  )

  # Compara los distintos arrays.
  if [ "${type}" = "file" ]; then
    format="${_ext[${ext}]}"
  else
    format="${_type[${type}]}"
  fi
}

generate_bar() {
  # Genera una barra de progreso simple.
  n=10
  let n=$((rate/10))
  bar='['
  for i in $(seq 1 "${n}"); do bar+='|'; done
  for i in $(seq "${n}" 9); do bar+='-'; done
  bar+=']'
}

get_data_play() {
  # LLama a la función get_format().
  get_data_format

  # Como los Streams URL no se puede determinar la duracón, necesita generar otro tipo de ${out} para adaptarse a la nueva circustancia.
  if [ "${type}" != "http" ]; then
    # Porcentaje Transcurrido:
    # Genera el porcentaje reproducido.
    rate="$((runtime*100/length))"

    # Pone 0 a la izquierda al porcentaje si el "${_rate}" está entre 0 y 9.
    (("${rate}" < "10")) && rate="0${rate}"

    # LLama a la función generate_bar().
    generate_bar
    # Tiempo transcurrido / Duración de la pista:
    # Pasa de milisegundos a segundos (dbus devuelve el resultado de "${runtime}" y "${length}" en milisegundos) para poder ser usado con el comando "date".
    runtime="$((runtime/1000))"
    length="$((length/1000))"

    # Comprueba si la duracíon excede de 1 hora (3600 segundos). mostrando la misma y el tiempo transcurrido en formato HH:MM:SS o MM:SS.
    if (( "${length}" < "3601" )) ; then
      runtime="$(date -ud @${runtime} +%M:%S)"
      length="$(date -ud @${length} +%M:%S)"
    else
      runtime="$(date -ud @${runtime} +%X)"
      length="$(date -ud @${length} +%X)"
    fi
    # Forma los datos obtenidos y genera la variable "${out}".
    out="${msg_listen}: ${title} | ${msg_artist}: ${artist} | ${msg_album}: ${album} | ${msg_duration}: ${runtime}/${length} ${bar} ${rate}% | Meta: ${bitrate}kbps/${samplerate}Hz/${format} | ${msg_player}: ${player}"
  else
    # Extrae la URL del stream.
    stream="$(echo "${mdata}"| sed -ne 's/^location: \(.*\)$/\1/p')"
    # Al ser Stream URL, necesita otro tipo de datos, forma los datos obtenidos y genera la variable "${out}".
    out="${msg_listen}: ${title} | ${msg_artist}: ${artist} | ${msg_album}: ${album} | ${msg_stream}: ${stream} | Meta: ${bitrate}kbps/${samplerate}Hz/${format} | ${msg_player}: ${player}"
  fi
}

get_data_stop() {
  # muestra el mensaje de que el reproductor está Parado.
  out="${msg_stop}"
}

get_data_down() {
  # muestra el mensaje de que el reproductor está Apagado.
  out="${msg_down}"
}

# Selecciona el idioma llamando a set_lang().
set_lang
# Comprueba si el player está parado...
if [ "${length}" = "0" -o "${player}" = "" ] ; then
  # entonces llama a la funcion get_data_stop().
  get_data_stop
  # Si el player está en modo Streaming llama a la funcion get_data_play().
  [ "${type}" = "http" ] && get_data_play
else
  # O si el player está reproducioendo algo, llama a la funcion get_data_play().
  get_data_play
fi
# Si el player está apagado llama a la funcion get_data_down().
[ "${player}" = "" ] && get_data_down

# Muestra el el chat la salida de "${out}" generada en get_data_play().
echo "/me ${out}"

# Fin del programa.