Pulse Extension

Bei Extensions handelt es sich um sogenannte Erweiterungen Für Pulse, die Funktionen Hinzufügen oder Überschreiben.

Die Extensions befindet sich wie alle Addons im Addons Ordner, desweiteren hat auch eine Extension eine ganz normale addon.xml.
Desweiteren kann sie auch im „resources“ Ordner eine settings.xml besitzen, wo sich z.b Einstellungen für die Extension befinden.

Eine Beispiel Extension gibt es HIER zum Herunterladen
In Dieser Beispiel Extension wird Ein ApiCall der in den Extension Settings festgelegt ist ausgeführt, sobald Pulse die Extension „Initialisiert“

Extension | Addon.xml


Hier ist die Addon.xml aus dem oben genannten Beispiel
Die Beschreibung, der Name usw kann nach belieben angepasst werden.
Wichtig ist aber das die Addon ID immer kleingeschrieben ist und mit extension.pulse. anfängt (Im Bespiel: extension.pulse.myextension)
Beim ändern der AddonID aufpassen, dass sie den Ordner der Extension auch in die AddonID umbenennen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="extension.pulse.myextension"
       name="My cool Extension"
       version="1.0"
       provider-name="MyName">
  <requires>
    <import addon="xbmc.python" version="2.14.0"/>
    <import addon="script.module.pulseapi" version="3.0"/>
  </requires>
  <extension point="xbmc.python.pluginsource" library="default.py">
    <provides>executable</provides>
  </extension>
  <extension point="xbmc.addon.metadata">
    <summary>MyExtension is Cool</summary>
    <platform>all</platform>
  </extension>
</addon>

Extension | Scripting (extension.py)


Pulse lädt die Extension aus der extension.py, diese Datei kann aktuell NICHT umbenannt werden !
In diesem Python Script befindet sich im Grunde eine Extension Class (Class Name darf auch nicht geändert werden)
Hier ist die extension.py aus dem oben genannten Beispiel

#!/usr/bin/python
# -*- coding: utf-8 -*-
#

import xbmcaddon

addon = xbmcaddon.Addon('extension.pulse.myextension') #ExtensionID
initApiCall = addon.getSetting('apiCall') #Read out settings from Settings.xml with the respective id (id = "apiCall")

pulseapi = None
Tool = None

def Call(call, *args): #Wrapper Function
    global pulseapi
    argParsed = call
    for arg in args:
        argParsed = argParsed + "/" + str(arg)
    pulseapi(argParsed)

class Extension:

    def __init__(self, api, tools):
        global pulseapi #Making global variable "pulseapi" accessible
        global Tool #Making global variable "Tool" accessible

        pulseapi = api #Set PulseApi to the global variable (for caching)
        Tool = tools #Set Tools to the global variable (for caching)

        Call(initApiCall) #Run ApiCall which has been set in Settings.xml (and use Wrapper function)
        #Alternative can also be used:
        #pulseapi(initApiCall)

    def onPlay(self, url): #Will be called if Pulse try to start playing an Media which contains the extension Badge ([myextension])
        return url


    # FOR MORE INFORMATION VISIT: https://www.pulse-player.tv/extension

in die Extension Class kann ganz normal Python Programmiert werden,
Bitte beachte aber das einige Funktions Namen reserviert sind ! die __init__ wird zum Beispielt
aufgerufen Wenn Pulse die Extension lädt. In Diesem Beispiel führt er den APICall der in den Extension Settings definiert aus.

Desweiteren wird in der __init__ die PulseApi und eine Tool/Util class automatisch übergeben,
welche wir auf die Globale Variable pulseapi sowie Tool zwischenspeichern damit wir später darauf zurückgreifen können
(import pulseapi funktioniert hier wegen des Schutzgrades NICHT, deswegen wird sie in der __init__ übergeben)

Eine Liste aller Funktionen die in der Tool/Util class enthalten sind gibt es weiter unten

Wir haben noch eine Wrapper Function eingebaut welche es dir erlaubt die Api über verschiedene Args zu nutzen z.b

Call("OpenExtensionSettings", "extension.pulse.myextension")

Extension | Optimierung

Beim ausführen der Extension wird im Extension ordner eine zusätzliche Datei erstellt: extension.pyo
Dies ist eine optimierte Datei für den Python-Interpreter, falls deine Extension fertig ist und du sie mit anderen
teilen möchtest, empfehlen wir dir die normal extension.py zu entfernen, damit Pulse nur auf die Optimierte
extension.pyo zugreift.
Bitte beachte das du vor dem löschen deiner .py den QuellCode absicherst.

Extension | Scripting (default.py)


Dieser Script wird ausgeführt wenn der EndUser InApp unter Addons Diese Extension öffnet

#!/usr/bin/python
# -*- coding: utf-8 -*-
#

import pulseapi

pulseapi.Call("OpenExtensionSettings/extension.pulse.myextension")

ganz simple wird hier die pulseapi importiert und über den ApiCall OpenExtensionSettings Die Einstellung unserer Beispiel Extension geöffnet, auch hier wird wieder die AddonID angegeben (extension.pulse.myextension)

Der name dieser Datei kann beliebig nicht wie die extension.py umbenannt werden.
Das einzige was beachtet werden muss, ist das man in der addon.xml dies auch ändert.
Zum ändern einfach den String bei library=“default.py“ ändern

<extension point="xbmc.python.pluginsource" library="default.py">
    <provides>executable</provides>
  </extension>

Die gesammte <extension point=“xbmc.python.pluginsource“ lib… kann auch aus der addon.xml entfernt werden, jedoch ist das Addon dann nicht mehr unter den Installierten Addons (InApp) sichtbar, desweiteren lassen sich auch keine Einstellungen mehr ändern bzw die Einstellungen können nicht geöffnet werden

Extension | Fehler


Deine Extension Funktioniert nicht richtig oder wird nicht ausgeführt ?
Der Exakte Fehler befindet sich in einer extension.log
Diese Log Datei befindet sich im User Ordner/Pulse

Android: /sdcard/Android/data/<PULSE>
IOS: /private/var/mobile/Library/Preferences/<PULSE>
Windows: C:\Users\[username]\AppData\Roaming\<PULSE>
Linux: /home/[username]/<PULSE>
Mac OS X: /Users/[username]/Library/Application Support/<PULSE>

<PULSE> ist in dem Fall der Packet Name oder der Programm Name

Extension | Funktionen/ Events


Hier sind Alle Funktionen/ Events die Reserviert sind und in der Extension Class definiert werden können.
Mit diesen Funktionen/ Events können sie verschiedene Sachen aus Pulse abfangen und verarbeiten


Bitte beachte das manche Funktionen/ Events in deiner Extension nur unter bestimmten Bedingungen aufgerufen werden.
Überall wo ein String verarbeitet wird, welches der EndUser hinzufügt muss vor dem String ein „Badge“ von deiner Extension sein:
Bei dem „Badge“ handle es sich um deine ExtensionID (ohne extension.pulse.) welche in Eckige Klammern gesetzt wird ([ am Anfang, ] am Ende)
So sieht das „Badge“ für das oben genannte Beispiel aus:

[myextension]

Pulse TV Extension

Tool/Util Functions

Diese Funktionen können von der Tool variable aufgerufen werden

Desweiteren sind auch alle Public Funktionen von von unserem python-tv-parser nutzbar

Hier ist ein kleines Beispiel, welches eine neue Gruppe und einen neuen Ordner hinzufügt:

    def __init__(self, api, tools):
        global pulseapi #Making global variable "pulseapi" accessible
        global Tool #Making global variable "Tool" accessible

        pulseapi = api #Set PulseApi to the global variable (for caching)
        Tool = tools #Set Tools to the global variable (for caching)

        Tool.SetActiveFolder("My New Folder")
        MyGroup = Tool.CreateGroupData()
        Tool.AddItemToGroupData(MyGroup, "Title 1", Tool.CreateItem("http://www.myUrl.net/myCool.mp4"))
        Tool.AddItemToGroupData(MyGroup, "Title 2", Tool.CreateItem("http://www.myUrl.net/myCool.mp4"))
        Tool.AddGroup("MyGroup", MyGroup)

Natürlich kann auch mithilfe des „python-tv-parser“ externe Dateien, oder Inhalte geparsed und in Pulse eingefügt werden.
Hier ist ein kleines Beispiel welches eine M3U Datei aus dem Internet Herunterlädt, als „.m3u“ parsed und in PulseTv über die
AddFolder Funktion hinzufügt: (import urllib darf natürlich nicht fehlen)

    def __init__(self, api, tools):
        global pulseapi
        global Tool

        pulseapi = api
        Tool = tools
        f = urllib.urlopen("https://www.My-M3U-Link.net/my.m3u")
        dlcontent = f.read()
        Dicted = Tool.ConvertContent(dlcontent, ".m3u")
        Tool.AddFolder("ExtensionTest", Dicted)

Falls irgendwelche Fragen offen bleiben oder sie Probleme haben können sie uns gerne HIER kontaktieren.

Weitere Informationen


Falls du nicht daran Interessiert bist Pulse Funktionen zu verarbeiten, kannst du auch ein ganz normales Addon Programmieren.
Weitere Informationen gibt es auf der Offiziellen Kodi Wiki

Falls du nach Fertigen Addons suchst, findest du diese überall im Internet oder auf der Offiziellen Kodi Website im Addon Verzeichniss