LibreELEC Kodi bequem updaten

Für bewegte Bilder auf der Glotze ist bei mir Kodi auf einem Raspberry Pi2 zuständig. Ich nutze dafür die Testbuilds von Milhouse weil man damit auch den Streaming Dienst von Amazon nutzen kann. Wie man das initial einrichtet erklärt Christoph von bei Linuxundich ganz gut. Da es sich um Testbuilds handelt macht es Sinn öfter mal ein Update einzuspielen. Wenn man das händisch macht ist es halt mit viel Arbeit verbunden und Arbeit sollten man vermeiden wo es nur geht. Deshalb habe ich ein kleines Script gebastelt welches mir diese Arbeit abnimmt. Die Geschichte ist natürlich bei weitem nicht perfekt. Ich habe aufgehört als es funktioniert hat.

Wichtig: mein Script lädt die Files für den Raspberry PI2 /3 wenn du einen Raspberry Pi 1 hast solltest Du dieses Script auf keinen Fall verwenden!

Benötigte Software

Um das ganze zum laufen zu bringen brauchst du PHP und Bash.

Die Scripte liegen in einem Repo auf Github wenn Du dir das genauer anschauen magst.

Falls nicht mußt du nur dieses Phar File  und ein Bash Script downloaden und in ein bin folder legen – $USER/bin wäre ein schöner Ort dafür.

Nun muß noch das executable flag gesetzt werden:

chmod +x today-release.phar 
chmod +x update-kodi.sh

Nutzung

Einfach das Script mit dem ssh String zum Raspberry aufrufen

update-kodi.sh kodi@192.168.0.89

Tipps zur Nutzung

  • Generell solltest Du Deinen public SSH Key auf dem Raspberry ablegen. Das erspart das Eintippen des Passworts bei jedem Aufruf. Zu dem Thema gibt es wohl eine Million Blog Posts. Hier ist einer.
  • Das SSH Config File nutzen.
  • Einen Cronjob in der Nacht einrichten der dann die Arbeit für einen erledigt –  00 00 * * * $HOME/bin/update-kodi.sh kodi

Was noch fehlt

Die Geschichte mit den Scripts ist schon ein wenig smelly. Eigentlich wollte ich mir das mit Ansible aufsetzen und das ADHS hat mich gezwungen  diese Scripte zu erzeugen. Sinnvoll wäre es auch, wenn vor dem Einspielen des Updates die /etc/issue geprüft wird um zu schauen ob das Gerät schon auf der aktuellen Version läuft.

Hat jemand einen Tipp für mich?

Ich parse die Url http://milhouse.libreelec.tv/builds/master/RPi2/ das ist ziemlich unelegant wie ich finde. Gibt es da vielleicht eine Art Http Standard um sowas direkt lesen zu können?

 

Wiedergabe pausieren in Kodi

Ich schaue mir gerne TV Streams mit meinem Kodi an. Um Bandbreite zu sparen ist es ganz nett diesen auch zu pausieren, wenn man das TV ausschaltet und nicht nur wenn man den Stop Befehl per Fernbedienung sendet. Dieses Verhalten läßt sich sehr leicht konfigurieren. Unter Einstellungen -> System -> Eingabegeräte die Option „Wiedergabe pausieren, wenn eine andere Quelle ausgewählt wird“ aktivieren.

screenshot002

 

Screenshots mit Kodi

Ich nutze Kodi auf einem Raspberry Pi2 ohne Keyboard.In dieser Konstellation erstellt man Screenshots am einfachsten per API Request.
http://192.168.0.148:8080/jsonrpc?request={%20%22jsonrpc%22:%20%222.0%22,%20%22id%22:%201,%20%22method%22:%20%22Input.ExecuteAction%22,%20%22params%22:%20{%20%22action%22:%20%22screenshot%22%20}}

Damit das klappt muß in den Settings ein Pfad gesetzt werden.

Einstellungen -> System -> Debugging
Einstellungen -> System -> Debugging

Ich ziehe die Bilder danach bequem scp oder Nautilus Caja auf den Rechner.

Kodi: Fehlende Videos identifizieren

Ich stehe des öfteren vor der Problematik, daß die Scraper in Kodi neu hinzugefügte Filme und Serien nicht finden kann. Der Ablauf um dies zu beheben ist immer der gleiche:

  1. Videos die nicht in der Library sind identifizieren
  2. umbenennen
  3. Library updaten und zurück zu Schritt 1 bis alles in der Library ist.

Um das ganze ein wenig bequemer zu gestalten und sinnloses Bewegen zwischen TV und Rechner zu vermeiden mache ich das auf der Kommandozeile.

Benötigte Programme

Falls nicht vorhanden muß sqlite3 installiert sein. Kodi läuft bei mir über OSMC auf dem Rasberry Pi 2 – da gibt es apt-get :):

sudo apt-get install sqlite3

je nach OS wird das anders installiert.

Fehlende Videos finden

Im gut organisierten Kodi Wiki findet man zwar einen Befehl samt cut Anweisung der aber eher schlecht als recht bei mir arbeitet. Abhilfe schafft ein Script aus gleicher Quelle bei dem die Pfade ein wenig angepasst werden müssen. Ich habe eine weitere Variable reingetan um das ganze zu vereinfachen:

#!/bin/bash
#
# Kodi Orphans and Widows
# v1.1
#
# created by BaerMan for XBMC-community
# includes improvements from deathinator
# This script may be used for any purposes.
# You may change, sell, print or even sing it
# but you have to use it at your own risk!
#
# This script is ugly and may under certain circumstances crash your
# computer, kill your cat and/or drink your beer.
# Use it at your own risk!
#
# This script searches for media files (actually video files only) and
# checkes for
# 1) files that are not in the library
# 2) files that are in library only
# 3) entries in the library that are 'stacked' ones
 
# To Do:
#
# * examine wether a path is marked as defined content or excluded from
# scanning (strContent=None)
# * rewrite the whole thing in python
 
# Discussion and latest version:
# http://forum.kodi.tv/showthread.php?t=62058
# http://wiki.xbmc.org/?title=Linux-Script_To_Find_Not_Scraped_Movies
 
################
### Settings ###
################
#enter the path to your homedirectory
HOMEDIR="/home/osmc"
### Full path to the video-database ; may be absolute (preceeded by a
### slash "/") or relative form the current directory
DBPATH="${HOMEDIR}/.kodi/userdata/Database/MyVideos*.db"
 
### Filenames for results and intermediate data
### You may change these to any name and place you like but beware not to
### overwrite or delete files you may still need
PREFIX="${HOMEDIR}/xbmc_"
DBPATHLIST="${PREFIX}db_path.lst"
DBFILESLIST="${PREFIX}db_files.lst"
FINDLIST="${PREFIX}find.lst"
DIFFLIST="${PREFIX}diff.lst"
DBONLYLIST="${PREFIX}db-only.lst"
FSONLYLIST="${PREFIX}fs-only.lst"
STACKEDLIST="${PREFIX}db-stacked.lst"
 
### Programs used ; either absolute path or command only if path to the
### binary is in variable $PATH ; each command may be extended by optional
### arguments - refer to the specific manpage for details
SQLITECMD="sqlite3" ; FINDCMD="find" ; SORTCMD="sort"
GREPCMD="grep" ; RMCMD="rm" ; UNIQCMD="uniq"
DIFFCMD="diff -a -b -B -U 0 -d"
 
#######################################
### Changes within the working code ###
#######################################
 
### There is a list of suffixes, that we will search for. You may add,
### delete or modify any entry to fit your needs, but respect the
### correct escaping of newlines
 
### We don't want to descent into subdirectories as they are usually
### represented by their own path-entry in the database. Deep scans would
### lead to multiple hits on the same file. But if for some reason not all
### path elements are represented in the database, you may find and delete
### the following string and force $FINDCMD to look into all subdirectories
### in any given path
### "-maxdepth 1"
 
####################
### working code ###
####################
${RMCMD} ${DBPATHLIST} ${DBFILESLIST} ${FINDLIST} ${DIFFLIST} ${STACKEDLIST} ${FSONLYLIST} ${DBONLYLIST} 2>/dev/null
${SQLITECMD} -list -separator '' ${DBPATH} \
 "select strPath from path order by strPath;" \
  | ${SORTCMD} > ${DBPATHLIST}
${SQLITECMD} -list -separator '' ${DBPATH} \
 "select strPath, strFilename from path, files where path.idPath = files.idPath order by strPath, strFilename;" \
  | ${SORTCMD} > ${DBFILESLIST}
IFS='
'
for fPATH in $(<${DBPATHLIST}) ; do
    ${FINDCMD} ${fPATH} -maxdepth 1 \( \
 -name '*.avi' -o \
 -name '*.divx' -o \
 -name '*.iso' -o \
 -name '*.m2v' -o \
 -name '*.mkv' -o \
 -name '*.mp4' -o \
 -name '*.mpeg' -o \
 -name '*.mpg' -o \
 -name '*.ogm' -o \
 -name '*.vob' \
    \) | ${SORTCMD} >> ${FINDLIST}
done
unset IFS
${DIFFCMD} ${FINDLIST} ${DBFILESLIST} | ${GREPCMD} -v "^@@" | ${GREPCMD} -v [+-]\\{3\\} | ${SORTCMD} -k 1.2 | ${UNIQCMD} -s 1 > ${DIFFLIST}
${GREPCMD} ^+ < ${DIFFLIST} | ${GREPCMD} -v '://' | ${GREPCMD} -v '^+/$' > ${DBONLYLIST}
${GREPCMD} ^- < ${DIFFLIST} > ${FSONLYLIST}
${GREPCMD} "stack:///" < ${DIFFLIST} > ${STACKEDLIST}
${RMCMD} ${DBPATHLIST} ${DBFILESLIST} ${FINDLIST} ${DIFFLIST} 2>/dev/null

Wer noch keine Erfahrung mit Bash Skripten hat sollte im wirklich schön geschriebenen Ubuntuusers Wiki Artikel nachschauen.
Das Skript legt 3 Files in Deinem Homeverzeichniss an:

  • xbmc_db-only.lst
  • xbmc_db-stacked.lst
  • xbmc_fs-only.lst

Interessant ist die Datei xbmc_fs-only.lst dort wird aufgelistet was nicht in der Library ist.

Videos umbenennen

Ich suche eigentlich nur nach Typos und versuche die Naming Conventions von Kodi einzuhalten

Library updaten

Um die Befehle aus diesem Beitrag auszuführen mußt Du per SSH auf der Kiste sein und die Http-Api aktiviert haben. Bei mir läuft das nicht auf Port 9191 wie im Wiki sondern auf Port 8080.

 curl --data-binary '{ "jsonrpc": "2.0", "method": "VideoLibrary.Scan", "id": "mybash"}' -H 'content-type: application/json;' http://localhost:8080/jsonrpc

Click’N’Load per Tunnelbau an die Pyload Maschine weiterleiten

Wer ab und an bei Sharehostern Dateien lädt kennt sicherlich Click’n’Load. Nach dem Klick auf einen Button im Browser füllt sich die Queue des Downloadmanagers mit neuen Files. Dabei werden Informationen zu Dateien per Http POST vom lokal laufenden Download Programm wie jDownloader oder PyLoad entegengenommen. Dies geschieht durch einen kleinen Webserver der auf dem Port 9666 lauscht. Wenn der Downloadmanager nicht lokal läuft funktioniert der Mechanismus leider nicht.

Mit einem SSH-Tunnel kann man den POST Request an einen anderen Rechner weitleiten. Dort muß neben dem Downloadmanager auch ein SSH-Server laufen.

In meinem kleinen Beispiel läuft Pyload auf einem Pi mit der Ip 192.168.0.110. Um den Tunnel nachzubauen mußt Du also nur die Ip anpassen:

ms@debian:/home/ms# ssh -L 127.0.0.1:9666:192.168.0.110:9666  pi@192.168.0.110 -N

Den Tunnel kannst du mit diesem Link testen.

Nachtrag 21.06.2014
Die Arbeit mit ssh kann man sich generell einfacher machen wenn man ein Configfile für das Tool benutzt. Dort kann man Aliase für Server definieren, deklarieren auf welchem Port sshd läuft oder welcher Key zur Authentifizierung genutzt werden soll. Nähere Informationen dazu gibt es bei den Ubuntuusers oder Nerderati.

Debian Wheezy auf dem Raspberry Pi installieren

Seit etwa einem Jahr nutze ich einen Raspberry Pi um mir damit Filme und Serien anzuschauen.Läuft ganz gut und mit OpenElec etwas flüssiger in der Menüführung als Raspbmc.Wenn weitere Dienste laufen wird das Filmvergnügen leider ein wenig ausgebremst weshalb ich mir ein zweites Gerät zugelegt habe.Auf dem neuen Raspberry Pi soll nun Debian seine Dienste verrichten und mir als Pyload Server und digitales Tor zu meiner Bude via sshd dienen.

Ich habe keine Lust den Pi mit Monitor und Tastatur zu schmücken, deshalb wird das System als Image auf eine SD Karte geschrieben und gut ist.

Die Debian Version für den Pi nennt sich Raspbian und läßt sich auf der Homepage des Projekts downloaden.

Eine Variante von Debian für den Pi nennt sich Raspbian und läßt sich auf der Homepage des Projekts downloaden.

1. Image auf die SD Karte schreiben, Pi starten

Die Blocksize war in der offiziellen Anleitung leider falsch angegeben.

root@debian:/home/ms/Downloads# dd bs=1M if=2014-01-07-wheezy-raspbian.img of=/dev/mmcblk0
root@debian:/home/ms/Downloads# sync

Pi vom Stromnetz trennen, Karte einstecken. Wenn nur eine rote LED leuchtet ist etwas schief gegangen
Nun dem Pi ein wenig Zeit zum booten geben und per nmap nach neuen Geräten suchen

ms@debian:~$ nmap -sP 192.168.0/24

2. Initiale Konfiguration

Per SSH einloggen, Konfiguration ausführen

#default password raspberry
ms@debian:~/Downloads$ ssh pi@192.168.0.110
pi@raspberrypi ~ $ sudo raspi-config

Erstmal Vim und Screen installieren

pi@raspberrypi ~ $ sudo su
root@raspberrypi:/home/pi# apt-get update
root@raspberrypi:/home/pi# apt-get install vim screen

Swap anpassen

root@raspipy:/home/pi# echo "CONF_SWAPSIZE=512" > /etc/dphys-swapfile
root@raspipy:/home/pi# dphys-swapfile setup
want /var/swap=512MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 512MBytes
root@raspipy:/home/pi# dphys-swapfile swapon

3. NFS Freigaben einrichten

Ich nutze für Dateifreigaben nur noch nfs, das ist schneller als Samba und man hält sich den M$ Mist aus dem Netz. Mußte den Daemon ein wenig anpassen (Kernel Version 3.10 vom 2014-01-07).

NEED_STATD auf YES setzen in /etc/init.d/nfs-common
Einmal alles bezüglich NFS neustarten oder rebooten.

Die Shares einrichten und mounten (die uninteressanten Dinge aus fstab habe ich entfernt):

root@raspipy:/home/pi# cat /etc/fstab
192.168.0.50:/media_movies /media/nfs_movies nfs auto,rw 0 0 
192.168.0.50:/media_serien /media/nfs_serien nfs auto,rw 0 0
192.168.0.50:/downloads /media/downloads nfs auto,rw 0 0
root@raspipy:/home/pi# mkdir /media/nfs_movies
root@raspipy:/home/pi# mkdir /media/nfs_serien
root@raspipy:/home/pi# mkdir /media/downloads
root@raspipy:/home/pi# mount -a

Das wars soweit mit der Einrichtung von Debian. Ich habe zusätzlich den Port 22 am Router auf den Pi weitergeleitet und in /etc/ssh/sshd_config Logins mit Passwort verboten. Demnächst gehts weiter mit der Einrichtung von Pyload oder was Anderem wenn es mir nicht taugt :).

Und noch ein Rechner in der Bude – Raspberry Pi

Ich mag ja kleine Rechner mit und auch ohne Linux drauf, egal ob das Ding jetzt Pogoplug,Nslu2 oder mbed heißt. Inzwischen habe ich mehr Rechner – mit ARM Cpu am laufen als klassische x86. Deshalb habe ich das Erscheinen des Raspberry Pi sehr entspannt verfolgt. Es gibt hier einfach zuviele davon…

Meine Meinung änderte sich jedoch mit dem Erscheinen einer stabilen Version von Raspbmc, einer Linux Distribution mit der XBMC Software. Das wollte ich schon immer haben und wartete eigentlich nur auf den Hack der aktuellen AppleTV Generation.

Der Pi war schneller und für den Preis einer mittelschweren Zecherei  ~ 60 Eur hab ich nun so ein Teil, inklusive Netzteil, Gehäuse und Kühlrippen (wer’s denn braucht).

Gekauft habe ich beim PI3g Shop (kein subventionierter Link).

Die Installation ging leicht von der Hand – Image auf eine SD-Karte schreiben, rein in den Pi, Netzwerk dran, HDMI, Spannung anlegen und einen Kaffee trinken.

Kaffee grabben

Im Anschluss erstmal ein xvid und einen mkv (1080p DTS) Container getestet – läuft tadellos. Die ARD Mediathek ist einfach zu installieren und  läßt sich sehr gut bedienen. Youtube streikt, aber das scheint bekannt zu sein und leicht behebbar. Damit kann das Gerät schon mehr als mein jetziger Player, der mir in seiner Beschissenheit echt die Lust am Basteln geraubt hat. Bedienen tue ich den Spaß mit der Official XBMC Remote. Geht gut von der Hand. Um Texteingaben vom Mobiltelefon an das  Xbmc zu senden mußte ich Username + Passwort festelegen. Das manifestiert sich praktischerweise in einem .htaccess Zugriffsschutz, womit ich den Port sorgenlos in die Weiten des Netzes forwarden kann.  Per ssh kommt man per usr=pwd=raspberry auf den Rechner. Hier ein paar interessante Ausgaben:

 

pi@raspbmc:~$ uname -a
Linux raspbmc 3.6.11 #1 PREEMPT Sun Feb 3 04:42:21 UTC 2013 armv6l GNU/Linux
pi@raspbmc:~$ cat /etc/issue
Raspbmc by Sam Nazarko
http://www.raspbmc.com
pi@raspbmc:~$ cat /proc/cpuinfo
Processor       : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 531.66
Features        : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7
 
Hardware        : BCM2708
Revision        : 000e
Serial          : 0000000063099a57
pi@raspbmc:~$ ssh
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

Ich habe noch die Skriptsprache meiner Wahl in der Cli Version installiert – dank Wheezy sogar in Version 5.4.4-12. Samba läuft bereits und gibt /home/pi sowie USB Laufwerke lesend wie schreibend frei.

Unterm Strich habe ich mit 0 Aufwand ein funktionierendes System zum Abspielen von Webinhalten und Sachen die ich aus dem Internet gezogen habe eingerichtet. Als Nächstes werde ich schauen, wie es mit DVB-* aussieht und ob die kleine Kiste auch noch Pyload schafft. Sehr interessant scheint webiopi damit lassen sich die I/O Pins des PI sehr leicht per Web ansteuern was sehr zum Basteln motiviert.