summaryrefslogtreecommitdiff
path: root/contrib/MV_switch_channellogo.sh
blob: d2f22915613d8beb55facc375182e29f2d8c2125 (plain)
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
#!/bin/bash

# MV_switch_channellogo.sh
# Helferskript für das Skin flatPlus!
# Zweck ist, dass Kanallogos abhängig von der Uhrzeit getauscht werden, um z. B.
# bei "Comedy Central/VIVA" Immer das passende Logo anzuzeigen
# Starten beim VDR-Start und per cron.hourly!
VERSION=170214

# --- Variablen
LOGO_DIR='/etc/vdr/plugins/skinflatplus/logos'   # Pfad zu den Kanallogos
ALT_LOGO_DIR="$LOGO_DIR"                         # Pfad zu den alternativen Kanallogos
SVDRPSEND='svdrpsend'                            # VDR's svdrpsend
SELF="$(readlink /proc/$$/fd/255)" || SELF="$0"  # Eigener Pfad (besseres $0)
SELF_NAME="${SELF##*/}"                          # skript.sh
LOGFILE="/var/log/${SELF_NAME%.*}.log"           # Log-Datei
MAXLOGSIZE=$((1024*50))                          # Log-Datei: Maximale Größe in Byte
NOW="$(date +%s)"                                # Aktuelle Zeit in Sekunden
DAY_START="$(date +%s --date="0:00")"            # 0 Uhr

# --- Funktionen
f_log() {  # Gibt die Meldung auf der Konsole und im Syslog aus
  logger -s -t "$SELF_NAME" "$*"
  [[ -n "$LOGFILE" ]] && echo "$(date +'%d.%m.%Y %R') [$$] $*" >> "$LOGFILE"  # Log in Datei
}

f_change_logo() {  # Logo anpassen
  local LOGO_SRC="${1,,}" LOGO_DST="${2,,}" RLFC
  [[ $# -lt 1 ]] && return 1  # Benötigt mindestens ein Logo als Parameter
  # f_log "f_log [$1] - [${2:-LEER}]"  # DEBUG
  if [[ $# -eq 1 ]] ; then  # Ein Logo = Original Logo aktivieren
    if [[ -e "${LOGO_DIR}/${LOGO_SRC}.png.org" ]] ; then
      f_log "Aktiviere original Logo ($1)"
      mv --force "${LOGO_DIR}/${LOGO_SRC}.png.org" "${LOGO_DIR}/${LOGO_SRC}.png"
      RLFC=1  # Altes Logo aus Cache entfernen
    fi
  else  # Alternatives Logo ($2 nicht leer)
    if [[ ! -e "${LOGO_DIR}/${LOGO_SRC}.png.org" ]] ; then
      f_log "Aktiviere alternatives Logo ($1 -> $2) [${CONF[2]:0:11}]"
      cp --force --preserve "${LOGO_DIR}/${LOGO_SRC}.png" "${LOGO_DIR}/${LOGO_SRC}.png.org"  # Sichern
      cp --force --preserve "${ALT_LOGO_DIR}/${LOGO_DST}.png" "${LOGO_DIR}/${LOGO_SRC}.png"  # Alternative
      RLFC=1  # Altes Logo aus Cache entfernen
    fi
  fi
  # Aus dem Changelog von flatPlus
  # Use svdrp command "RLFC" to remove a logo from cache. Specify logo filename with extension, but without path.
  # For example: svdrpsend PLUG skinflatplus RLFC "rtl ii.png"
  if [[ -n "$RLFC" ]] ; then
    LOGO_SRC="${LOGO_SRC##*/}"  # Falls ein "/" enthalten ist nur den letzten Teil verwenden. Bsp.: comedy central/viva -> viva
    "$SVDRPSEND" PLUG skinflatplus RLFC "${LOGO_SRC}.png" >/dev/null  # Altes Logo aus Cache entfernen
  fi
}

# --- Start
# Suche Konfig im aktuellen Verzeichnis, im Verzeichnis des Skripts und im eigenen etc
CONFIG_DIRS=("." "${SELF%/*}" "${HOME}/etc") ; CONFIG_NAME="${SELF_NAME%.*}.conf"
for dir in "${CONFIG_DIRS[@]}" ; do
  CONFIG="${dir}/${CONFIG_NAME}"
  if [[ -f "$CONFIG" ]] ; then
    mapfile -t < "$CONFIG"  # Konfiguration einlesen
    CONFLOADED=1
    break  # Die erste gefundene Konfiguration wird verwendet
  fi
done

if [[ -z "$CONFLOADED" ]] ; then  # Konfiguration wurde nicht gefunden
  echo -e "\e[1;41m FEHLER \e[0;1m Keine Konfigurationsdatei gefunden!\e[0m (\"${CONFIG_DIRS[*]}\")"
  exit 1
fi

# NOW=$(date +%s --date="01:00") ; echo "$NOW"  # Test

# Auswerten der Konfiguration
for i in "${!MAPFILE[@]}" ; do  # Kanal|Alternative|Zeit
  if [[ "${MAPFILE[$i]:0:1}" == "#" || "${#MAPFILE[$i]}" -eq 0 ]] ; then
    unset -v 'MAPFILE[$i]'  # Zeile aus der Liste entfernen!
    continue  # weiter
  fi
  IFS='|' ; CONF=(${MAPFILE[$i]}) ; unset -v 'IFS'  # Zeile in Array
  [[ ${#CONF[2]} -lt 11 ]] && { echo "Zeitangabe für ${CONF[0]} fehlerhaft! (${CONF[2]]})"
                                continue ;}
  # echo "Kanal: ${CONF[0]} Alternative: ${CONF[1]} Zeit: ${CONF[2]}"
  ST="${CONF[2]:0:5}" ; ET="${CONF[2]:6:5}"  # Bsp.: 00:01-12:30
  START="$(date +%s --date="$ST")" ; END="$(date +%s --date="$ET")"
  [[ $END -eq $DAY_START ]] && ((END+=60*60*24))  # 24 Stunden dazu (86400)
  if [[ $END -lt $START ]] ; then  # Bsp.: 20:00-06:00 (Ende am nächsten Tag)
    [[ $NOW -gt $START || $NOW -lt $END ]] && ALTLOGO=1
  else                             # Bsp.: 06:00-20:00 (Ende am gleichen Tag)
    [[ $NOW -gt $START && $NOW -lt $END ]] && ALTLOGO=1
  fi
  # echo "${CONF[0]} - Zeitspanne: $ST bis $ET [ALT=${ALTLOGO:-0}] ($START $END)"
  if [[ $ALTLOGO -eq 1 ]] ; then
    # echo "Zwischen $ST und $ET [ALT=${ALTLOGO}] ($START $END)"
    f_change_logo "${CONF[0]}" "${CONF[1]}"  # Alternatives Logo
  else
    # echo "Ausserhalb $ST und $ET [ALT=${ALTLOGO}] ($START $END)"
    f_change_logo "${CONF[0]}"  # Original Logo
  fi
  unset -v 'ALTLOGO'
done

if [[ -e "$LOGFILE" ]] ; then       # Log-Datei umbenennen, wenn zu groß
  FILESIZE="$(stat -c %s "$LOGFILE")"
  [[ $FILESIZE -gt $MAXLOGSIZE ]] && mv --force "$LOGFILE" "${LOGFILE}.old"
fi

exit 0 # Ende