Suche

lichtschattenblog

Kategorie

Tipps und Tricks

unbeaufsichtigte Installation von Kodi unter Windows

Vorab: Bei Verwendung der hier genannten Skripte und eventuell resultierenden Schäden übernehme ich keine Haftung. Jegliche Verwendung erfolgt auf eigene Gefahr.

 

Zur unbeaufsichtigten Installation und Deinstallation von Kodi gibt es ein paar Möglichkeiten dies auszuführen.

Wichtig ist vorab die Logik zur Konfiguration von Kodi zu verstehen. Die zusammenfassend sind:

  • eine Installation von Kodi im Silent Mode kann mit dem Argument /S durchgeführt werden
  • Anpassungen von Kodi werden unter Windows unterhalb %appdata% des jeweiligen Benutzers gespeichert
  • für eine angepasste Installation und Konfiguration müssen alle wichtigen Dateien zu den vorgenommen Anpassungen erkannt und gespeichert werden. Dies kann ggf. nur durch ausprobieren erfolgen
  • teilweise können Konfigurationsdateien aus älteren Kodi-Versionen problemlos übernommen werden. Ggf. erfolgt eine automatische Aktualisierung einiger Dateien, wie db-Dateien

In meinem Fall wurde ein Kodi in Version 17.6 verwendet. Abweichend zur Standardinstallation liegen Anpassungen zur Verwendung von tvheadend (pvr.hts), deutscher Oberfläche, dem Skin, reduzierten Menüs (keine Bilder, keine Musikdatenbank, keine Videodatenbank), reduzierten Benutzerrechten (aktiviertem Master-Password) und Verwendung einer Hama-Fernbedienung vor. In diesem Fall sind die Anpassungen in den folgenden Dateien gespeichert:

Wie kann nun die unbeaufsichtigte Installation erfolgen?

Zunächst kopieren wir das Verzeichnis kodi aus %appdata% bzw. c:\users\<dein benutzername>\AppData\Roaming in eine geeignete Freigabe (bei Verwendung meiner Skripte zusätzlich in den Unterordner appdata) auf einem Server und löschen alle nicht relevanten Dateien und Ordner in der Kopie. Wer Anpassungen in weiteren Addons durchgeführt hat, muss speziell die Dateien unterhalb …\kodi\userdata\addon_data berücksichtigen.

Anschließend kann die Verteilung automatisiert über eine Gruppenrichtlinie (gpo) oder wie in meinem Fall über einen Remoteinstallationsserver (Remote Installer von Firma emco software: https://emcosoftware.com/) erfolgen. Vorteil ist die Installation und Aktualisierung von Programmen zum laufenden Betrieb.

Anbei die von mir selbst erstellten Skripte. Die Verwendung mit diesen Skripten bei Installation von Kodi 17.6 war bisher unter Windows 10 problemlos. Unter Windows 7 gab es wenige Rechner wo die Installation nicht möglich war, da ein notwendiges Windows-Update nicht installiert werden konnte (bei manueller Installation erscheint eine Fehlermeldung die mit <Enter> bestätigt werden muss). In diesem Fall und Einsatz von Gruppenrichtlinien würde die Installation nicht erfolgreich sein und erst nach 15 Minuten zum Rechnerstart die Installation abgebrochen werden. Daher empfehle ich unter Windows 7 Kodi 16.

Anbei die drei Skripte, welche in der Freigabe gespeichert werden. In diesem Verzeichnis gibt es die Installationsdatei kodi-17.6-Krypton-x86.exe und das Unterverzeichnis appdata mit den entsprechenden Dateien vom kodi (<Verzeichnis als Freigabe>\appdata\kodi).

Hinweis: In meinen Skripten ist das Verzeichnis kodi unterhalb %appdata% weiterhin vorhanden!

 

install_kodi.bat

@echo off

set "install_file=%~dp0kodi-17.6-Krypton-x86.exe"
set "refresh_appdata_script=%~dp0kodi_refresh_appdata.bat"
set "win10_kodi_lnk=C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Kodi\Kodi.lnk"


:KILL_KODI_PROCESS
taskkill /F /IM kodi.exe /T > nul


:INSTALL_KODI
"%install_file%" /S


:REFRESH_APPDATA_KODI
call "%refresh_appdata_script%"


:CREATE_KODI_LNK
REM needs admin rights
if EXIST "%win10_kodi_lnk%" (

xcopy "%win10_kodi_lnk%" "%allusersprofile%\Desktop" /R /Y > nul

)

 

kodi_refresh_appdata.bat

@echo off

set "appdata_source=\\<servername>\kodi$\appdata"

if NOT "%ProgramFiles(x86)%" == "" (
if EXIST "%ProgramFiles(x86)%\kodi\kodi.exe" GOTO REFRESH_APPDATA_KODI
) else (
if EXIST "%ProgramFiles%\kodi\kodi.exe" GOTO REFRESH_APPDATA_KODI
)

GOTO END


:REFRESH_APPDATA_KODI
if NOT "%appdata_source%" == "" (
for /F "delims=*" %%a in ('dir /B c:\Users ^| find /V /I "TEMP" ^| find /V /I "Public" ^| find /V /I "Default.migrated"') do (
if EXIST "c:\users\%%a\AppData\Roaming\" (
echo try: xcopy "%appdata_source%" "c:\users\%%a\AppData\Roaming\" /E /C /I /R /Y
xcopy "%appdata_source%" "c:\users\%%a\AppData\Roaming\" /E /C /I /R /Y
)
)
)

:END

remove_kodi.bat

@echo off

set "win10_kodi_lnk=C:\Users\Public\Desktop\Kodi.lnk"


:KILL_KODI_PROCESS
taskkill /F /IM kodi.exe /T > nul


:START_UNINSTALL_KODI
if NOT "%ProgramFiles(x86)%" == "" (
if EXIST "%ProgramFiles(x86)%\kodi\uninstall.exe" ( "%ProgramFiles(x86)%\kodi\uninstall.exe" /S )
) else (
if EXIST "%ProgramFiles%\kodi\uninstall.exe" ( "%ProgramFiles%\kodi\kodi.exe" /S )
)

:CLEAN_APPDATA_KODI

for /F "delims=*" %%a in ('dir /B c:\Users ^| find /V /I "TEMP" ^| find /V /I "Public" ^| find /V /I "Default.migrated"') do (
if EXIST "c:\users\%%a\AppData\Roaming\Kodi" (
echo try: rmdir /S /Q "c:\users\%%a\AppData\Roaming\Kodi\"
rmdir /S /Q "c:\users\%%a\AppData\Roaming\Kodi\"
)
)

:REMOVE_DESKTOP_LINK
if EXIST "%win10_kodi_lnk%" (
del "%win10_kodi_lnk%"
)

 

Anbei ein paar Erläuterungen zum Skript install_kodi.bat:

  • %~dp0 bedeutet das Verzeichnis indem sich die install_kodi.bat befindet
  • %~dp0kodi-17.6-Krypton-x86.exe ist somit bei Ausführung \\<servername>\<freigabe>\kodi-17.6-Krypton-x86.exe
  • zu Beginn wird ein ggf. bestehender Kodi-Prozess beendet
  • die Installation von Kodi mit Option /S wird durchgeführt (großes S !!!)
  • kodi_refresh_appdata.bat wird gestartet
  • Verknüpfung zum Aufruf von Kodi wird auf den Desktop für alle Benutzer kopiert
  • mit diesem Skript kann auch eine Aktualisierung oder Neuinstallation von Kodi erfolgen

Ein paar Erläuterungen zum kodi_refresh_appdata.bat:

  • zu Beginn wird das Verzeichnis mit der AppData-Kopie von kodi definiert
  • Hinweis: sofern mehrere Verzeichnisse mit abweichender AppData-Kopie definiert werden müssen (Beispiel mehrere TVHeadend-Server), kann dies ggf. durch Abgleich mit dem Standardgateway erfolgen:
    ipconfig | find /I „192.168.x.x“ if %ERRORLEVEL% == 0 ( set „appdata_source=\\<servername>\kodi$\appdata_standort1“ )
  • es wird geprüft ob Kodi installiert ist und wenn ja werden die Kodi-Konfigurationsdateien für alle Benutzer auf dem jeweiligen System (außer Public, Temp und Default.Migrated) aktualisiert
  • dieses Skript kann separat bei einer bereits erfolgten Installation zur Konfigurationsaktualisierung verwendet werden
  • die Verwendung erfordert vollen administrativen Zugriff auf die Verzeichnisse der verschiedenen Benutzer

Ein paar WICHTIGE Erläuterungen zu remove_kodi.bat:

  • zu Beginn wird ein ggf. bestehender Kodi-Prozess beendet
  • die Deinstallation von kodi über uninstall.exe mit Option /S wird durchgeführt (großes S !!!)
  • für alle Benutzerprofile auf dem PC werden die Konfigurationsdateien vom Kodi gelöscht
    Wer dies nicht möchte muss die Zeile:
    rmdir /S /Q „c:\users\%%a\AppData\Roaming\Kodi\“
    löschen oder REM zu Beginn der Zeile:
    rmdir /S /Q „c:\users\%%a\AppData\Roaming\Kodi\“
    schreiben.
    also: REM rmdir /S /Q „c:\users\%%a\AppData\Roaming\Kodi\“
    Bei falscher Anwendung und Anpassung dieser Zeile besteht die Möglichkeit von Datenverlust. Ggf. diese Zeile löschen!!!
  • es wird die Desktop-Verknüpfung von Kodi gelöscht

PRTG – Skript zur Abfrage am Remote MS Windows Server – XML-Datensatz

Zur Überwachung des Lastenausgleichs einer Citrix XenApp-Server-Umgebung war es notwendig die Befehlsausgabe von qfarm /load via XML im PRTG einzulesen. Es besteht hierbei natürlich die Möglichkeit dies für andere Systeme und Befehle zu verwenden.

Eine typische Ausgabe von qfarm /load ist:

prtg_gfarm_load_example

Bei meinen Tests habe ich zwei Varianten erfolgreich testen können. Ich persönlich bevorzuge Variante 1 mit PowerShell. Variante 2 via batch-Skripte und Freigabe hat den Nachtteil, das ggf. das Skript per Hand gestartet und zusätzlich die Ausführung überwacht werden muss. Kann aber im Bedarfsfall ein guter Ersatz sein.

Variante 1 – via Powershell-Skript:

Bei dieser Variante mittels Powershell muss zunächst sichergestellt werden, dass der Remote-Server sogenannte Invoke-Commands erfolgreich akzeptiert. Dies machen wir auf unserem PRTG-Server mittels dem Powershell-Befehl:

  • test-wsman <Remote-Server>

Wenn die Konfiguration noch nicht korrekt ist, erhalten wir folgende Meldung:

prtg_powershell_test

In diesem Fall führen wir die folgenden Befehle aus:

  • Enable-PSRemoting -Force
  • Set-Item wsman:\localhost\client\trustedhosts *
  • Restart-Service WinRM

Wer nicht allen Systemen die Remote-Ausführung von PowerShell-Befehlen gestatten will muss das * im zweiten Befehl mit einer Liste der gewünschten Systeme austauschen.

  • Set-Item wsman:\localhost\client\trustedhosts „server01, server02“

Hinweis: Bei jeder Änderung muss der dritte Befehl erneut ausgeführt werden.

Wenn die Konfiguration korrekt ist erhalten wir zur Ausführung des PowerShell-Befehls:

  • test-wsman <Remote-Server>

prtg_powershell_test_success

Hinweis: Zum erweiterten Test, mit der Möglichkeit PowerShell-Befehle direkt auf dem Remote-Server ausführen zu können und dass die bestehenden Rechte ausreichend sind, stehen folgende PowerShell-Befehle zur Verfügung:

  • Enter-PSSession -ComputerName
  • Enter-PSSession -ComputerName <Remote-Server> -Credential <Remote-Username>

Jetzt erstellen wir auf unserem Remote-Server ein geeignetes Verzeichnis und hinterlegen dort eine entsprechende Skript-Datei. In meinem Fall C:\PRTG und:

  • prtg_get_qfarm_load.ps1

In dieser Datei hinterlegen wir folgenden Code:

Set-ExecutionPolicy Unrestricted

[string]$cmd = 'qfarm'
[string]$par = '/load'

[array]$cmdoutput = & $cmd $par

$cmdoutput = $cmdoutput[3..($cmdoutput.length)]

Write-Host '<?xml version="1.0" encoding="Windows-1252" ?>'
Write-Host '<prtg>'

foreach ($line in $cmdoutput) {

 $line = $line -replace '\s+', ' '

 $lineparts = $line.Split(' ')

 Write-Host ' <result>'
 Write-Host -Separator '' '  <channel>'$lineparts[0]' - LOAD</channel>'
 Write-Host -Separator '' '  <value>'$lineparts[1]'</value>'
 Write-Host '  <unit>Load</unit>'
 Write-Host '  <float>0</float>'
 Write-Host '  <LimitMaxError>10000</LimitMaxError>'
 Write-Host '  <LimitErrorMsg>Server'$lineparts[0]'ist maximal ausgelastet. Prozessorlast bzw. RAM-Nutzung zu hoch. Bitte korrigieren!</LimitErrorMsg>'
 Write-Host '  <showChart>1</showChart>'
 Write-Host '  <showTable>1</showTable>'
 Write-Host '  <LimitMode>1</LimitMode>'

 Write-Host ' </result>'

}

Write-Host '</prtg>'

Führen wir nun die Datei in der powershell aus bekommen wir eine Ausgabe ähnlich:

prtg_qfarm_load_ps1_test

Jetzt müssen wir nur noch auf unserem PRTG-Server dafür sorgen, dass dieses Skript remote aufgerufen wird. Hierzu erstellen wir auf unserem PRTG-Server im Verzeichnis:

C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML

eine entsprechende PowerShell-Datei. In meinem Fall:

  • prtg_get_qfarm_load_remote.ps1

In dieser Datei fügen wir folgenden kurzen Code ein:

Invoke-Command -ComputerName $args[0] -ScriptBlock { & C:\PRTG\prtg_get_qfarm_load.ps1 }

Hinweis: Ggf. den Namen der PowerShell-Datei auf dem Remote-Server anpassen!

Zum Test wechseln wir in die Powershell und rufen das Skript mit dem Computernamen des Remoteservers als alleiniges Argument auf:

& 'C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\prtg_get_qfarm_load_remote.ps1' <Remote-Server>

und erhalten als Beispiel:

prtg_qfarm_load_remote_ps1_test

Hinweis: Zur Ausführung des Befehls auf meinem PRTG-Server steht oben rechts PS. Wenn durch Tests mit Eurem Remote-Server dort dessen Name zu sehen ist, arbeitet ihr in der PowerShell auf dem falschen System!

Im PRTG selbst fügen wir bei unserem bestehenden Server einen neuen Sensor vom Typ:

  • Programm/Skript (erweitert)

hinzu. Im zweiten Schritt ist zwingend darauf zu achten, dass der Sicherheitskontext auf „Die Anmeldedaten für Windows des übergeordneten Geräts verwenden“ gesetzt ist und unser Skript ausgewählt ist. Bitte beachten dass ggf. die Anmeldeinformationen vom Server gesetzt werden müssen.

prtg_qfarm_load_add_sensor.jpg

Nach zweimaliger Ausführung des Skripts durch den Server sehen wir nun:

prtg_qfarm_load_final_sensor_v2

 

Variante 2 – via batch-Skripte und Freigabe

Eine zweite Variante, die ich mir im Vorfeld überlegt und getestet habe, ist die lokale Ausführung eines batch-Skriptes, in einer Schleife, auf dem Remote-Server.

Hierzu habe ich auf dem Remote-Server ein Verzeichnis PRTG angelegt und als PRTG$-Freigabe für den PRTG-Server verfügbar gemacht.

In das Verzeichnis habe ich eine Datei: prtg_get_qfarm_load.bat erstellt.

@echo off

SET "TEMPOUTPUTFILE=C:\PRTG\prtg_get_qfarm_load.tmp"
SET "OUTPUTFILE=C:\PRTG\prtg_get_qfarm_load.xml"

:LOOP

if NOT "%OUTPUTFILE%" == "" (

 (

 echo ^<?xml version="1.0" encoding="Windows-1252" ?^>
 echo ^<prtg^>

 for /f "skip=2 tokens=1,2 delims= " %%a in ('qfarm /load ^| findstr /v /r /i "^--"') do (

  echo ^<result^>
  echo  ^<channel^>%%a - LOAD^</channel^>
  echo  ^<value^>%%b^</value^>
  echo  ^<unit^>Load^</unit^>
  echo  ^<float^>0^</float^>
  echo  ^<LimitMaxError^>10000^</LimitMaxError^>
  echo  ^<LimitErrorMsg^>Server %%a ist maximal ausgelastet. Prozessorlast bzw. RAM-Nutzung zu hoch. Bitte korrigieren! ^</LimitErrorMsg^>
  echo  ^<showChart^>1^</showChart^>
  echo  ^<showTable^>1^</showTable^>
  echo  ^<LimitMode^>1^</LimitMode^>
  echo ^</result^>

  )

 echo ^</prtg^>
 ) > "%TEMPOUTPUTFILE%"

move %TEMPOUTPUTFILE% %OUTPUTFILE%

TIMEOUT /T 10 /NOBREAK > nul
GOTO LOOP

)

 

Zur Ausführung der Skript-Datei wird eine Temp-Datei als XML erzeugt, da die Ausführungszeit von qfarm /load ggf. zu lang ist und das Ergebnis vom PRTG-Server nicht vollständig gelesen wird. In diesem Fall hätten wir einen Fehler im PRTG. Nach Abschluss der Generierung der Temp-Datei wird diese in die Zieldatei umbenannt und die alte XML-Datei überschrieben. Das Skript führt die Schleife alle 10 Sekunden aus.

Damit diese Batch-Datei auf dem Server nicht sichtbar ist, habe ich diese mit dem Tool Bat-To-Exe-Converter, Portable Variante, mit folgendem Befehl in eine exe-Datei umgewandelt:

Bat_To_Exe_Converter.exe -bat c:\prtg\prtg_get_qfarm_load.bat -save c:\prtg\prtg_get_qfarm_load.exe -invisible

Durch einmalige manuelle Ausführung der prtg_get_qfarm_load.exe-Datei wird nun alle 10 Sekunden die gewünschte XML-Datei generiert.

Hinweis: Um diesen Vorgang beenden zu können, muss der laufende Prozess prtg_get_qfarm_load.exe über den TaskManager oder taskkill-Befehl beendet werden (Bsp.: taskkill /F /IM prtg_get_qfarm_load.exe /T).

Hinweis: Meine ursprüngliche Idee war die Erstellung eines Dienstes mit dem Befehl sc create. Leider war dies nicht erfolgreich. Wer hierzu erfolgreich eine exe-Datei als Dienst aktivieren konnte, mir bitte einen Kommentar senden. Gerne hinterlege ich hier die funktionierende Variante.

Zum Abruf der Daten in der XML-Datei ist erforderlich dies über ein Skript ans PRTG zu übergeben. Nach Auskunft vom PRTG-Support besteht nicht die Möglichkeit XML-Dateien direkt einzulesen.

Auf dem PRTG-Server, im Verzeichnis C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML habe ich eine Datei read_prtg_get_qfarm_load.bat erstellt, deren Aufgabe lediglich die Ausgabe des Dateiinhaltes ist.

@echo off
type \\<remote-server>\prtg$\prtg_get_qfarm_load.xml

Im PRTG selbst fügen wir bei unserem bestehenden Server einen neuen Sensor vom Typ:

  • Programm/Skript (erweitert)

hinzu und wählen dass von uns hinterlegte Skript aus:

prtg_qfarm_load_batch_add_sensor

Auch hier sehen wir nach zweimaliger Abfrage des Sensors:

prtg_qfarm_load_batch_final_sensor

 

Quellen:

Citrix GoToMeeting-Probleme in einer gemischten Struktur mit Verwendung eines Proxy

Mittels Citrix GoToMeeting ist es möglich Meetings mit Bildübertragung durchzuführen. Leider ist durch ein automatisches Update, der Software unter MS Windows, die korrekte Nutzung über einen Proxy derzeit nicht möglich.

In Umgebungen, wo für einzelne PCs die direkte Nutzung ohne Proxy aktiviert wurde, ist es möglich ein erneutes Setzen der Proxy-Einstellungen via GPO zu verhindern. Jedoch kann es passieren dass die Proxy-Einstellungen über Benutzerprofile synchronisiert werden.

Zusätzlich übernimmt Mozilla Firefox sehr gerne die Proxy-Einstellungen vom Internet Explorer und auch Citrix GoToMeeting prüft zum Start auf vorhandenen Proxy-Einstellungen im Internet Explorer und Mozilla Firefox.

Im Ergebnis ist es sehr schwierig GoToMeeting mitzuteilen dass kein Proxy notwendig ist. Zur Lösung im Problemfall müssen per Hand die Prozesse von GoToMeeting (beginnend g2m*) beendet werden. Anschließend müssen die Proxy-Einstellungen in den Web Browsern deaktiviert werden. Zum Ende müssen noch die Registrierungswerte unterhalb HKEY_CURRENT_USER\SOFTWARE\Citrix gelöscht werden. Anschließend kann GoToMeeting gestartet werden.

Als Alternative habe ich hierzu folgendes Skript geschrieben, welches erfolgreich unter MS Windows 7 und MS Windows 10 getestet wurde. Dies kann entweder per Hand gestartet oder zur Benutzeranmeldung an bestimmten Systemen ausgeführt werden.

Hinweis: Zur Ausführung werden Mozilla Firefox und Internet Explorer automatisch beendet!

 

@echo off
SETLOCAL ENABLEEXTENSIONS
set killtasks=g2mcomm.exe g2mlauncher.exe g2mstart.exe iexplore.exe firefox.exe


:KILLTASKS

(for %%a in (%killtasks%) do (
 echo try: taskkill /IM %%a /F
 taskkill /IM %%a /F
 )
)

(for %%a in (%killtasks%) do (
 echo try: taskkill /IM %%a /F
 taskkill /IM %%a /F
 )
)


:INTERNETEXPLORER

REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d "0" /f
REG DELETE "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyOverride" /f
REG DELETE "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "AutoConfigURL" /f
REG DELETE "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyServer" /f


:FIREFOX

cd /D "%APPDATA%\Mozilla\Firefox\Profiles"
cd *.default*

set cd=%CD%
set file=%CD%\prefs.js

For /f "tokens=3 delims=." %%a in ('date /t') do (set sDateTime=%%a)
For /f "tokens=1-2 delims=." %%a in ('date /t') do (set sDateTime=%sDateTime:~0,4%_%%b_%%a)
For /f "tokens=1-2 delims=:" %%a in ('time /t') do (set sDateTime=%sDateTime%_%%a_%%b)

set backup=%CD%\prefs.js_%sDateTime%

if EXIST %file% ( copy %file% %backup% /Y )
if EXIST %backup% ( type %backup% | findstr /v "network.proxy" > %file% )

echo type %file% | findstr "network.proxy"
type %file% | findstr "network.proxy"
if %ERRORLEVEL% neq 0 ( echo user_pref^(^"network.proxy.type^", 0^); >> %file% )


:GOTOMEETING

Reg Delete "HKEY_CURRENT_USER\SOFTWARE\Citrix" /f


:END

 

Hinweis:

Die Prozesse werden bewusst doppelt beendet, da sie sich gegenseitig überwachen und teilweise erneut gestartet werden. Für mögliche Probleme beim Arbeiten mit der prefs.js vom Firefox, wird hier auf Basis von Datum und Uhrzeit eine Kopie verwendet, die nicht gelöscht wird. Sofern eine Löschung erfolgen soll, kann dies am Ende des Skript mittels:

del %backup%

erfolgen.

Wer lediglich eine Lösung zur Deaktivierung der Proxy-Einstellungen im Internet Explorer und Mozilla Firefox sucht, muss einfach nur die ersten zwei Zeilen plus die Zeilen nach :FIREFOX, bzw. :INTERNETEXPLORER verwenden.

 

 

 

Suchen in PDF-Dateien, wenn Text falsch kodiert oder als Bild gespeichert ist

Es kann gelegentlich vorkommen, dass in PDF-Dateien der Text zwar korrekt lesbar ist, aber der Inhalt nicht über die Suchfunktion durchsucht werden kann. Dies kann vorkommen, wenn der Text als Bild gespeichert ist oder der Text falsch kodiert wurde.

Hier bietet die kostenlose Version von PDF X-Change Viewer eine Lösung. Zum Test habe ich im Programm notepad einfach ein Text Das ist ein Test geschrieben. Dies als Bild in eine Word-Datei kopiert und anschließend als PDF gespeichert.

In dieser Form ist die Suche nach Text nicht möglich.

Zur Lösung die PDF mittels PDF X-Change Viewer öffnen, dann im Menü Dokument Text erkennen … auswählen.

PDF-XChangeViewer_OCR_TestPDF

Im anschließend erscheinenden Dialog unter Ausgabe, PDF-Ausgabe Originalinhalt in ein Bild konvertieren & Textebene hinzufügen auswählen. Zusätzlich unter Erkennung, Hauptsprache die Sprache auswählen.

PDF-XChangeViewer_Option_Texterkennung

Anschließend kann der erkannte Text durchsucht werden.

PDF-XChangeViewer_Test

Kleiner Hinweis: Mittels PDF X-Change Viewer können PDFs auch als Bild (TIFF) gespeichert werden. Dieses Format können auch andere OCR-Texterkennungsprogramme einlesen und verarbeiten.

Kodi 17 – aktuellen „Window Name“ ausgeben

Wer in Kodi 17 Anpassungen, zum Beispiel im Keymapping von Maus, Fernbedienungen und Tastur durchführen möchte, benötigt sehr oft den aktuellen Window Name, der sich bereits ändert, wenn zum Beispiel zur Videodatei-Wiedergabe, die Lautstärke geändert wird oder das Menü aktiv wird. Mit Kodi 16 wurde eine einfache Möglichkeit geschaffen, um den aktuellen Window Name auszugeben.

Ich habe auf Basis von:

die bekannten Window Name in einer keymap-Datei hinterlegt und bei einem langen Tastendruck auf die i-Taste der Tastatur eine Benachrichtigung mit Ausgabe des betroffenen Window Name aktiviert.

Beispiel für die Home-Ansicht:

<home>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "home", 3)</i>
  </keyboard>
</home>

 

Die Datei (weiter unten) muss ins User-Verzeichnis von Kodi gespeichert werden. Unter Windows 10 ist dies zum Beispiel %appdata%\kodi\userdata\keymaps.

Unter Linux, OpenELEC, LibreELEC, Fire TV-Stick, Android ist dies definitiv abweichend. Siehe: http://kodi.wiki/view/userdata – zusätzlich muss noch der Unterornder keymaps beachtet werden!

Als Ergebnis (Kodi erneut starten und i auf der Tastaur ca. eine Sekunde drücken) sehen wir, zum Beispiel beim Suchen von Freigaben (busydialog):

kodi17_keymapinfo_busydialog

und in der Start-Ansicht (home)

kodi17_keymapinfo_home.png

Wer bei seinen Tests als Ausgabe global erhält, sollte prüfen, welches Fenster im kodi.log (Logging muss aktiv sein) aufgeführt wird. In Skins und Addons können andere nicht dokumentiert sein. Beispiel:

03:55:49.789 T:13400   DEBUG: ------ Window Init (Custom_1109_TopBarOverlay.xml) -----

 

Datei: longpress_i_show_window_name_Kodi17.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- show http://kodi.wiki/view/keymap - chapter 7 windows -->
<keymap>
<home>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "home", 3)</i>
  </keyboard>
</home>
<programs>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "programs", 3)</i>
  </keyboard>
</programs>
<pictures>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pictures", 3)</i>
  </keyboard>
</pictures>
<filemanager>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "filemanager", 3)</i>
  </keyboard>
</filemanager>
<settings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "settings", 3)</i>
  </keyboard>
</settings>
<systeminfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "systeminfo", 3)</i>
  </keyboard>
</systeminfo>
<testpattern>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "testpattern", 3)</i>
  </keyboard>
</testpattern>
<screencalibration>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "screencalibration", 3)</i>
  </keyboard>
</screencalibration>
<systemsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "systemsettings", 3)</i>
  </keyboard>
</systemsettings>
<servicesettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "servicesettings", 3)</i>
  </keyboard>
</servicesettings>
<pvrsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrsettings", 3)</i>
  </keyboard>
</pvrsettings>
<videos>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "videos", 3)</i>
  </keyboard>
</videos>
<videoplaylist>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "videoplaylist", 3)</i>
  </keyboard>
</videoplaylist>
<loginscreen>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "loginscreen", 3)</i>
  </keyboard>
</loginscreen>
<playersettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "playersettings", 3)</i>
  </keyboard>
</playersettings>
<mediasettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "mediasettings", 3)</i>
  </keyboard>
</mediasettings>
<interfacesettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "interfacesettings", 3)</i>
  </keyboard>
</interfacesettings>
<profiles>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "profiles", 3)</i>
  </keyboard>
</profiles>
<skinsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "skinsettings", 3)</i>
  </keyboard>
</skinsettings>
<addonbrowser>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "addonbrowser", 3)</i>
  </keyboard>
</addonbrowser>
<eventlog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "eventlog", 3)</i>
  </keyboard>
</eventlog>
<yesnodialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "yesnodialog", 3)</i>
  </keyboard>
</yesnodialog>
<progressdialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "progressdialog", 3)</i>
  </keyboard>
</progressdialog>
<virtualkeyboard>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "virtualkeyboard", 3)</i>
  </keyboard>
</virtualkeyboard>
<volumebar>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "volumebar", 3)</i>
  </keyboard>
</volumebar>
<contextmenu>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "contextmenu", 3)</i>
  </keyboard>
</contextmenu>
<notification>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "notification", 3)</i>
  </keyboard>
</notification>
<numericinput>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "numericinput", 3)</i>
  </keyboard>
</numericinput>
<gamepadinput>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "gamepadinput", 3)</i>
  </keyboard>
</gamepadinput>
<shutdownmenu>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "shutdownmenu", 3)</i>
  </keyboard>
</shutdownmenu>
<playercontrols>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "playercontrols", 3)</i>
  </keyboard>
</playercontrols>
<seekbar>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "seekbar", 3)</i>
  </keyboard>
</seekbar>
<playerprocessinfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "playerprocessinfo", 3)</i>
  </keyboard>
</playerprocessinfo>
<musicosd>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "musicosd", 3)</i>
  </keyboard>
</musicosd>
<visualisationpresetlist>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "visualisationpresetlist", 3)</i>
  </keyboard>
</visualisationpresetlist>
<osdvideosettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "osdvideosettings", 3)</i>
  </keyboard>
</osdvideosettings>
<osdaudiosettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "osdaudiosettings", 3)</i>
  </keyboard>
</osdaudiosettings>
<videobookmarks>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "videobookmarks", 3)</i>
  </keyboard>
</videobookmarks>
<filebrowser>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "filebrowser", 3)</i>
  </keyboard>
</filebrowser>
<networksetup>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "networksetup", 3)</i>
  </keyboard>
</networksetup>
<mediasource>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "mediasource", 3)</i>
  </keyboard>
</mediasource>
<profilesettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "profilesettings", 3)</i>
  </keyboard>
</profilesettings>
<locksettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "locksettings", 3)</i>
  </keyboard>
</locksettings>
<contentsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "contentsettings", 3)</i>
  </keyboard>
</contentsettings>
<favourites>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "favourites", 3)</i>
  </keyboard>
</favourites>
<songinformation>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "songinformation", 3)</i>
  </keyboard>
</songinformation>
<smartplaylisteditor>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "smartplaylisteditor", 3)</i>
  </keyboard>
</smartplaylisteditor>
<smartplaylistrule>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "smartplaylistrule", 3)</i>
  </keyboard>
</smartplaylistrule>
<busydialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "busydialog", 3)</i>
  </keyboard>
</busydialog>
<pictureinfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pictureinfo", 3)</i>
  </keyboard>
</pictureinfo>
<addonsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "addonsettings", 3)</i>
  </keyboard>
</addonsettings>
<accesspoints>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "accesspoints", 3)</i>
  </keyboard>
</accesspoints>
<fullscreeninfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "fullscreeninfo", 3)</i>
  </keyboard>
</fullscreeninfo>
<sliderdialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "sliderdialog", 3)</i>
  </keyboard>
</sliderdialog>
<addoninformation>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "addoninformation", 3)</i>
  </keyboard>
</addoninformation>
<textviewer>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "textviewer", 3)</i>
  </keyboard>
</textviewer>
<peripheralsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "peripheralsettings", 3)</i>
  </keyboard>
</peripheralsettings>
<extendedprogressdialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "extendedprogressdialog", 3)</i>
  </keyboard>
</extendedprogressdialog>
<mediafilter>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "mediafilter", 3)</i>
  </keyboard>
</mediafilter>
<subtitlesearch>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "subtitlesearch", 3)</i>
  </keyboard>
</subtitlesearch>
<audiodspmanager>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "audiodspmanager", 3)</i>
  </keyboard>
</audiodspmanager>
<osdaudiodspsettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "osdaudiodspsettings", 3)</i>
  </keyboard>
</osdaudiodspsettings>
<osdcmssettings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "osdcmssettings", 3)</i>
  </keyboard>
</osdcmssettings>
<musicplaylist>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "musicplaylist", 3)</i>
  </keyboard>
</musicplaylist>
<music>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "music", 3)</i>
  </keyboard>
</music>
<musicplaylisteditor>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "musicplaylisteditor", 3)</i>
  </keyboard>
</musicplaylisteditor>
<pvrguideinfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrguideinfo", 3)</i>
  </keyboard>
</pvrguideinfo>
<pvrrecordinginfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrrecordinginfo", 3)</i>
  </keyboard>
</pvrrecordinginfo>
<pvrtimersetting>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrtimersetting", 3)</i>
  </keyboard>
</pvrtimersetting>
<pvrgroupmanager>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrgroupmanager", 3)</i>
  </keyboard>
</pvrgroupmanager>
<pvrchannelmanager>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrchannelmanager", 3)</i>
  </keyboard>
</pvrchannelmanager>
<pvrguidesearch>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrguidesearch", 3)</i>
  </keyboard>
</pvrguidesearch>
<pvrchannelscan>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrchannelscan", 3)</i>
  </keyboard>
</pvrchannelscan>
<pvrupdateprogress>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrupdateprogress", 3)</i>
  </keyboard>
</pvrupdateprogress>
<pvrosdchannels>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrosdchannels", 3)</i>
  </keyboard>
</pvrosdchannels>
<pvrosdguide>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrosdguide", 3)</i>
  </keyboard>
</pvrosdguide>
<pvrradiordsinfo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "pvrradiordsinfo", 3)</i>
  </keyboard>
</pvrradiordsinfo>
<tvchannels>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "tvchannels", 3)</i>
  </keyboard>
</tvchannels>
<tvrecordings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "tvrecordings", 3)</i>
  </keyboard>
</tvrecordings>
<tvguide>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "tvguide", 3)</i>
  </keyboard>
</tvguide>
<tvtimers>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "tvtimers", 3)</i>
  </keyboard>
</tvtimers>
<tvsearch>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "tvsearch", 3)</i>
  </keyboard>
</tvsearch>
<radiochannels>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "radiochannels", 3)</i>
  </keyboard>
</radiochannels>
<radiorecordings>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "radiorecordings", 3)</i>
  </keyboard>
</radiorecordings>
<radioguide>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "radioguide", 3)</i>
  </keyboard>
</radioguide>
<radiotimers>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "radiotimers", 3)</i>
  </keyboard>
</radiotimers>
<radiosearch>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "radiosearch", 3)</i>
  </keyboard>
</radiosearch>
<tvtimerrules>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "tvtimerrules", 3)</i>
  </keyboard>
</tvtimerrules>
<radiotimerrules>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "radiotimerrules", 3)</i>
  </keyboard>
</radiotimerrules>
<FullscreenLiveTV>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "FullscreenLiveTV", 3)</i>
  </keyboard>
</FullscreenLiveTV>
<fullscreenradio>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "fullscreenradio", 3)</i>
  </keyboard>
</fullscreenradio>
<gamecontrollers>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "gamecontrollers", 3)</i>
  </keyboard>
</gamecontrollers>
<selectdialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "selectdialog", 3)</i>
  </keyboard>
</selectdialog>
<musicinformation>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "musicinformation", 3)</i>
  </keyboard>
</musicinformation>
<okdialog>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "okdialog", 3)</i>
  </keyboard>
</okdialog>
<movieinformation>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "movieinformation", 3)</i>
  </keyboard>
</movieinformation>
<fullscreenvideo>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "fullscreenvideo", 3)</i>
  </keyboard>
</fullscreenvideo>
<visualisation>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "visualisation", 3)</i>
  </keyboard>
</visualisation>
<slideshow>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "slideshow", 3)</i>
  </keyboard>
</slideshow>
<weather>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "weather", 3)</i>
  </keyboard>
</weather>
<screensaver>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "screensaver", 3)</i>
  </keyboard>
</screensaver>
<videoosd>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "videoosd", 3)</i>
  </keyboard>
</videoosd>
<videomenu>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "videomenu", 3)</i>
  </keyboard>
</videomenu>
<startwindow>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "startwindow", 3)</i>
  </keyboard>
</startwindow>
<startup>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "startup", 3)</i>
  </keyboard>
</startup>
<addon>
  <keyboard>
    <i mod="longpress">Notification("keymap info", "addon", 3)</i>
  </keyboard>
</addon>

</keymap>

 

Mit dieser Information ist es jetzt zum Beispiel möglich, eine keymap zu erstellen oder anzupassen:

kodi_keymap_file_windowid_programs.jpg

Zur Anpassung einer entsprechend keymap-Datei empfiehlt es sich meine Beiträge

zu lesen.

 

Debian – Pakete können nicht mehr aktualisiert und installiert werden

Wer unter Debian bei Ausführung von:

apt-get update

folgende Meldungen oder ähnlich erhält:

Fehl http://ftp.de.debian.org squeeze/main Sources
  404  Not Found

W: Fehlschlag beim Holen von http://security.debian.org/dists/squeeze-lts/updates/main/binary-amd64/Packages.gz
  404  Not Found

W: Fehlschlag beim Holen von http://ftp.de.debian.org/debian/dists/squeeze/main/source/Sources.gz  404  Not Found

E: Einige Indexdateien konnten nicht heruntergeladen werden, sie wurden ignoriert oder alte an ihrer Stelle benutzt.

der sollte prüfen, ob ggf. zu seiner Debian-Version die Paketquellen nicht bereits ins Archiv verschoben wurden. Siehe hierzu:

https://www.debian.org/distrib/archive

Beispiel – Debian 6-Server:

Zunächst prüfen wir die aktuelle Version mittels:

cat /proc/version

Ausgabe:

Linux version 2.6.32-5-amd64 (Debian 2.6.32-48squeeze1) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Mon Feb 25 00:26:11 UTC 2013

Anschließend passen wir unsere sources.list mittels:

 nano /etc/apt/sources.list

an (Beispiel für erste Zeile – mit # wird die alte Zeile auskommentiert und somit deaktiviert):

#deb http://ftp.de.debian.org/debian/ squeeze main
deb http://archive.debian.org/debian/ squeeze contrib main non-free

und aktualisieren die Paketquellen erneut mittels:

apt-get update

 

 

Kodi – aktuelle Window ID ausgeben

Bei Anpassungen im Kodi und erstellem von eigenen Skripten ist es ggf. erforderlich zu wissen, welche Window ID aktuell im Kodi Verwendung findet.

Dies wird möglich, indem wir eine immer frei verfügbare Taste zum Aufruf eines python-Skripts aktivieren. Das python-Skript ermittelt anschließend die Window ID und gibt das Ergebnis über die Notification aus.

Mit der hierbei ermittelten Window ID ist es dann möglich gewünschte Anpassungen von keymap-Dateien durchzuführen.

In meinem Fall habe ich einen langen Tastendruck auf die w-Taste so aktiviert, dass das Skript anschließend ausgeführt wird.

Zur Aktivierung erstellen wir die folgenden zwei Dateien.

Datei: get_window_id.py

import xbmc, time, xbmcgui, os, sys

try:
        cWID = xbmcgui.getCurrentWindowId()
except BaseException, exception:
        cWID = 0
except Exception, exception:
        cWID = 0
except NameError, exception:
        cWID = 0
except RuntimeError, exception:
        cWID = 0
finally:
        cWID = cWID + 0

xbmc.executebuiltin( 'Notification(Info,Window ID ist: ' + str(cWID) + ')' )

Wichtiger Hinweis: Der Python-Interpreter setzt ein Tabulatorzeichen mit acht Leerzeichen gleich. Der Bereich vor cWID entsprach in meinem Original-Code der jeweils einmaligen Verwendung der Tabulator-Taste. Ggf. zur Sicherheit vor cWID jeweils die Leerzeichen löschen und durch erneute Eingabe mittels Tabulator-Taste den Code formatieren.

Datei: longpress_w_get_window_id.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- https://lichtschattenblog.wordpress.com -->

<keymap>
  <global>
    <keyboard>
        <w mod="longpress">RunScript(special://profile/get_window_id.py)</w>
    </keyboard>
  </global>
</keymap>

Anschließend kopieren wir die Dateien unter Windows in folgende Verzeichnisse:

Datei get_window_id.py nach: %appdata%\Kodi\userdata

Datei longpress_w_get_window_id.xml nach: %appdata%\Kodi\userdata\keymaps

Anschließend starten wir Kodi erneut und erhalten nach ca. 2-sekündigem Druck auf die Taste w der Tastatur die Window ID.

Beispiel:

kodi17_windowid.png

 

Fernbedienung Rii mini i7 – Verwendung der Power-Taste unter Windows 10 (64bit) und Kodi

Auf Anfrage von Sebastian zu meinem Beitrag Einrichtung Fernbedienung Rii mini i7 unter Kodi habe ich mir Zeit genommen um eine entsprechende Lösung zu finden, damit die Power-Taste unter Windows 10 entsprechend genutzt werden kann. Das Problem ist an dieser Stelle, dass Microsoft die Funktion der Taste systemseitig vollständig integriert hat. Es ist daher nicht möglich die Verwendung der Taste direkt zu prüfen. Mit einem Trick ist es jedoch möglich.

 

Wichtiger Hinweis: Ich übernehme keine Haftung für eventuelle Schäden bei Verwendung dieser Lösung. Jedem der diese Lösung verwendet weise ich hiermit darauf hin, dass zur Nutzung dieser Lösung Grafikkarte, Bildschirm und ggf. weitere Komponenten kurzzeitig in den Energiesparmodus versetzt werden.

 

Hinweis: Für alle die die Fernbedienung alternativ unter Linux mit Kodi verwenden wollen, haben hierzu bessere Möglichkeiten. Dort kann mittels dem Tool irw die Verwendung der Taste als KEY_POWER geprüft und anschließend das Mapping der Taste für Kodi durchgeführt werden (teilweise verschieden zu Windows).

 

Funktionstest vor Anpassung unseres Systems:

Zur Verdeutlichung der Funktion der Taste besteht die Möglichkeit unter Windows 10 die Option für Beim Drücken der Energiespartaste auf Bildschrim ausschalten zu setzen.

rii_mini_i7_win10_energy_options_power_button_test

Sobald diese Einstellung aktiv ist, können wir mittels der Rii Mini i7 Funk-Fernbedienung den Bildschirm durch Verwendung der Power-Taste an der Fernbedienung ausschalten. Sofern dies erfolgreich erfolgte, können wir nun mittels dem sehr mächtigen Tool Autohotkey das System entsprechend anpassen.

Als erstes laden wir uns die aktuelle Version von der Webseite:

http://ahkscript.org/

herunter. Anschließend führen wir die Installation durch. In meinem Fall (Dateiname: AutoHotkey_1.1.24.02_setup.exe) habe ich zur Auswahl Version Unicode 32-bit verwendet. Bei Options habe ich install script compiler und separate taskbar buttons aktiviert.

Anschließend erstellen wir eine Datei rii_mini_i7_kodi_power_button.ahk mit folgendem Inhalt:

;Written by Tebori at lichtschattenblog.wordpress.com
;2016-11-02 - tested on windows 10 64bit, kodi 16.1 and Rii mini i7 remote control
;required settings on energy options:
; sleep mode by pressing sleep button
; disable "require a password"

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

OnMessage(0x218, "WM_POWERBROADCAST") 
  
WM_POWERBROADCAST(wParam, lParam) 
    {

    WindowCheck: 

        disable_send_s := false

        ; check kodi is running
        If !WinExist("Kodi")
            {
            ; no - start kodi
            Run, c:\Program Files (x86)\Kodi\Kodi.exe
            disable_send_s := true
            sleep, 500
            Send {RAlt} & `\
            Send {RAlt} & `\
            }

        ; check kodi fullscreen
        If !WinActive("Kodi")
            {
            ; no - activate window
            WinActivate, Kodi
            disable_send_s := true
            Send {RAlt} & `\
            Send {RAlt} & `\
            }

        WinMaximize, Kodi
        WinShow, Kodi

        sleep, 500

        WinGet, Style, Style, ahk_class Kodi
        if (Style & 0xC00000)  ;0xC00000 is WS_CAPTION, check window has a title bar
            {
            ; maximize Kodi to fullscreen mode
            ;Send {VKDC}
            Send {RAlt} & `\
            disable_send_s := true
            }

        sleep, 2000

        if (disable_send_s = false)
            {
            ; call shutdown menu
            send s
            }

        Return  0x424D5144

    }

Speichern anschließend und testen die Funktion mittels Doppelklick auf die Datei. Als erstes sollte in der Taskleise ein grünes H erscheinen. Wenn dies korrekt erfolgte testen wir einfach die Power-Taste an unserer Fernbedienung.

Zusammenfassend sollten folgende Funktionen zu sehen sein:

  • Kodi aus, Power-Taste wurde gedrückt – Kodi wird gestartet und maximiert
  • Kodi bereits aktiv, jedoch im Hintergrund – Kodi wird als aktive Anwendung in den Vordergrund geschoben und maximiert
  • Kodi bereits aktiv, aber nicht Vollbild – Kodi wechselt in den Vollbildmodus
  • Kodi bereits aktiv, im Vordergrund und im Vollbildmodus – das Shutdown-Menü wird angezeigt

Wer jetzt bei einigen dieser Funktionen Probleme hat, muss ggf. die von mir bereits hinterlegten Pausen in Millisekunden etwas erweitern. Nach mehreren Tests konnte ich eine an meinem System ein gutes Ergebnis erzielen.

Wenn alles zufriedenstellend funktioniert, ist es nur noch notwendig, die erstellte Datei in den Autostart von Windows zu integrieren.

Bei Verwednung von Kodi unter Windows 32bit muss der Pfad zum Aufruf von Kodi entsprechend angepasst werden!

Hinweis: Sofern bei Verwendung der Power-Taste die Benutzeranmeldung erscheint, muss zusätzlich in den Energieoptionen „Kennwort ist nicht erforderlich“ aktiviert werden.

Quellen, Anregungen und ggf. alternative Lösungsansätze:

Notepad++ – Löschen von doppelten Zeilen in Textdatei

Wer hin und wieder Dateien mit sehr vielen Einträgen hat und doppelte Einträge bei Bedarf löschen muss, kann dies mittels Notepad++ durchführen.

Hierzu über Erweiterungen -> Plugin Manager -> Show Plugin Manager den Plugin Manager öffnen. Im Aktenreiter Available TextFX Character, bzw. TextFX auswählen, installieren und Notepad++ neu starten.

notepadplusplus01

Nach dem Neustart gibt es im Notepad++ einen neuen Menüpunkt TextFX. In diesem Menüpunkt müssen folgende Elemente aktiviert werden:

  • TextFX -> TextFX Tools -> +Sort ascending
  • TextFX -> TextFX Tools -> +Sort outputs only UNIQUE (at column) lines

Anschließend mittels TextFX -> TextFX Tools -> Sort lines case sensitive (at column) alle doppelte Einträge löschen.

notepadplusplus02

Sollten zusätzlich Leerzeilen vorliegen, können diese über Bearbeiten -> Zeilenoperationen -> Leerzeilen (auch mit Whitespace) löschen, entfernt werden.

notepadplusplus03

Bloggen auf WordPress.com.

Nach oben ↑