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