Einstieg in Addon-Entwicklung

  • Hallo liebe Entwickler,

    Ich trage mich mit einer Addon- Idee (naja eigentlich sind es 3 Addons) herum und wollte nun Anfangen mich in die Addon-Entwicklung einzuarbeiten. Ich hab das schon so weit verstanden, hab aber noch ein paar Fragen, die ich gerne im Vorfeld klären wollte, ob die Ideen überhaupt realisierbar sind und ob ich mir ggf. zu viel vornehme.

    1) Für meine Addon- Ideen bräuchte ich verschiedene Pythonlibraries, die so in Kodi nicht vorhanden sind. Da es relativ Universell einsetzbare Libraries sind, war mein Gedanke, diese in separate Libraries zu packen, welche dann als Abhängigkeiten für die eigentlichen Addons fungieren. Dies scheint mir der bessere Weg zu sein, da ich diesen Teil des Addons dann leichter pflegen kann bzw. es dann auch Aufwand/Code spart falls mehre meiner Addons auf die gleichen libraries zurück greifen.

    2) So ganz habe ich noch nicht verstanden, wie ich eine python library in ein Addon umwandeln kann. Gibt es vielleicht ein gutes Addon an dessen Quelltext man das dann verstehen kann? Also auch, wie diese Library dann in ein anderes Addon importiert werden kann.

    3) Ein Addon würde eine Binary benötigen. Diese müsste ja dann für jede Prozessorarchitektur vorliegen. Ich habe gesehen, daß man Binary Addons mithilfe des Kodi build roots compilieren kann. Aber so ganz bin ich noch nicht dahinter gestiegen, wie das dann genau geht, diese z.B. für arm, aarch64, x86_64 und windows zu kompilieren. Oder macht es sinn, diese Binäry "klassisch" zu kompilieren und dann ins Plugin einzufügen, wo dann je nach vorhandener Prozessorarchitektur die entsprechende Binary ausgewählt wird? Da müsste ich mich dann noch ein bischen ins Thema Crosscompiling einlesen, da ich noch nicht ganz sicher bin, wie ich meinen Build- Server dazu einrichten muss.

    4) Ist es prinzipiel Möglich, seine Eigenen "Medientypen" zu kreieren und diese im Addon zu laden und apzuspielen? Ich habe da was im Sinn, was über den regulären Player nicht möglich ist (zumindestens habe ich da nix in den entsprechenden Dokus gefunden). Diese "Medien" würden aus einer Zip-Datei bestehen in der mehrere Audiofiles gespeichert sind und eine Steuerungsdatei für diese. Ach ja, da stellt sich mir die Frage, ob es überhaupt möglich ist, dateien über Python am audio player "vorbei" abzuspielen?

    ich bedanke mich herzlich
    Adromir

  • Ich schmeiße mal das offizielle Wiki ins Rennen, das behandelt ebenfalls das Thema ziemlich ausführlich: http://kodi.wiki/view/Add-on_development

    Inklusive Tutorials, Tools und Links auf viele Addons inklusive Quellcode.

    Vor allem das Thema "Addon Rules" sollte beachtet werden, wenn es ein offiziell supportetes Addon sein soll.

  • Bei den Modulen kannst Du mal hier schauen, ob da nicht doch was dabei ist, was Du in deinen Addons verwenden kannst. Ansonsten sollte es schwierig sein, Deine Module ins offizielle Repo zu kriegen. Bleibt der Weg über

    • ein eigenes Repo und ins Addon einbinden per Dependency ;)
    • Implementierung der/des Module in der Addonstruktur z.B. unter <meinAddon>/resources/lib/<meinModule>

    Binary Bestandteile sind - soweit sie nicht aus dem eigenen Stall (kodi.tv) kommen - nicht erlaubt.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Zu 1-2,
    Ich würde beim Addon erst mal SImple beginngnen DIe Module in dein addon legen und laden.
    Ansonsten beim Twitter Plugin habe ich es so gemacht,wenn du wo nachschauen willst.

    3) kann warscheinich am besten @vdr.tuxnet was sagen

    4) Teoretisch ja. Kodi17 Nutzt Inputstream als Abspielmethode. Die wiederum erweiterbar ist um neue Methoden

    Du must aber dran denken wenn das jemand Nutzen will, relativ Complex ist, das zum Laufen zubringen, und hast viel Fehleranfälligkeit Wenn es nur darum geht ein Container format (zip zu nutzen) wäre es warscheinlich besser das Zipfile auszupacken und die Stuerinfos im Plugin auszuerten

    Da hoerts aber dan bei mir auf vom Know hoff

  • Erstmal herzlichen Dank für eure Antworten!

    Um mal etwas konkreter zu werden.

    Ich möchte ein Plugin entwickeln, was etwas ähnliches macht, wie diese Seite: https://www.ambient-mixer.com/

    Kurz erklärt: Auf dieser Seite werden Ambiente Sounds gesammelt/gemixt, die bestimmte Szenen/Atmospären nachbilden.. Also z.B. ein Sturm oder in einem Wald.
    Da der Player dort per Flash realisiert ist, gibt es warhscheinlich(?) keine Möglichkeit das in Kodi direkt einzubinden. Also war meine Idee, einen solchen "Mixer" selbst zu kreieren. Es wäre natürlich am einfachsten, einfach solche Sounds aufzunehmen und in eine Sounddatei abzumischen, aber da würde meiner Meinung nach einiges verloren gehen.

    Ich habe mich da schon etwas amgesehen, was es für Möglichkeiten gibt, über Python Sound auszugeben und bin da auf den Mixer von pygame gestoßen, der anscheinend all das bietet, was ich mir für den Mixer wünsche:
    1) Sounds müssen spezifisch an einen Audiokanal ausgegeben werden können
    2) Eine Soundüberlagerung muss möglich sein (also Kanal Links spielt standardmäßig Sound A ab, zeitweise Kommt sound B dazu, wobei Sound A nicht gestoppt wird)

    Deswegen war meine Idee, pygame in ein eigenes addon zu packen, dies benötigt aber SDL als binaries zum Funktionieren. Das sollte soweit aber möglich sein, da ich schon zwei Addons gesehen habe für den rpi, die das machen.

    Die Zips würden dann gebraucht um ein Paket zu liefern, mit den entsprechenden Sounds und einer Steuerungsdatei, die dem Mixer sagt, welcher Sound wann, wie abgespielt werden soll.

  • @Adromir
    1. Seite Laden und die Verschiedenen Genres von der Seite Laden,unda nzeigen
    2. Quell Code Des Seleckierten Gere Laden
    3.Suche nach der ID
    Im Code
    soundTemplate : '2808', --> 2808 ist dann die ID
    4. https://xml.ambient-mixer.com/audio-template…l5&id_template=[ID HIER EINFÜGEN]
    So kommst du an die Lsite der MP3 die bei den Mixer Benutzt werden
    6. Seite einblenden die man die Lautstärke regeln (Warscheinlcih muss mit Fenster gearbeitet werden damit die Schiebe Reglern gearbeitet werden kann)
    https://github.com/jiaaro/pydub gibts nen Plugin mit dem (Wenn ffmpg instaliert ist es möglich ist N mp3 zu einem zusammen zu fügen
    Beispiel
    https://stackoverflow.com/questions/4039…her-with-python

    Danach das Gemixte Mp3 speichern und dann Local abspielen

    So ungefähr müsste sich "Relativ leicht machen lassen" Von der teorie gehen. Machbar wäre auch das zusammenführen mit ffmpg, und man muss in den Settings ffmpg Pfad angeben

    Erweiterung mit greppen wie das speichern auf der Webseite der Werte geht, und das Ladne und Speichern mit von der Seite Nutzen.

    Jatzt müßtest du es nur noch Coden :)

    So wäre mein Vorschlag

  • Danke @lore. Das hilft mir schon mal ne menge weiter.
    ich muss mir das mal genau überlegen, welchen weg ich gehe. Das mit pydub scheint einfach zu sein, hat aber anscheinend den Nachteil, daß dabei die "dynamik" verloren geht. Das interessante an pygame.mixer ist für mich, daß man (nach meiner Einschätzung) eine größere Immersion erreichen kann gerade bei Abspielsystemen die mehr als 2 Kanäle bieten. Also zum Beispiel Sound A (Regen) als "Hintergrund" auf allen Kanälen dauerhaft loopen und dann ein Donnergeräusch per Zufall immer wieder abspielen und ggf nach dem Zufallsprinzip den Kanal wechseln lassen, so daß man den Eindruck eines sich Bewegenden Gewitters/Sturm bekommt.

    Aber vielleicht versuche ich deinen Weg erstmal um ein gefühl für die Addonentwicklung zu bekommen, da es mir leichter scheint.

  • Hallo liebe Addon-Entwickler,
    ich hab jetzt schon ein wenig rumgestöbert und mich eingelesen, und hab so ein paar Ideen entwickelt, so daß ich noch mal Nachfragen muss, bevor ich mich gegebenfalls total verrene, weil ich einen Weg einschlage, der überhaupt nicht gangbar ist.

    Basierend auf dem Addon (Kodisplay) gehe ich mal davon aus, daß es prinzipiel Möglich ist , SDL und pygame für mein Addon zu nutzen. Ich hab schon einen Ansatz angefangen, der auf diesem Addon basiert.

    Nun aber meine Frage(n).

    Ich würde SDL und Pygame gerne auch für andere Plugins verfügbar machen und mir sind diese Wege in den Sinn gekommen, von denen ich aber nicht sicher bin ob sie überhaupt möglich sind:

    1. als library/addon modul
    Geht das mit den Binaries? Können die dann von anderen Addons genutzt werden, gibt es ggf Pfadprobleme?
    Ansatz wäre der wie bei Kodisplay, daß die binaries in einem Ordner des Addons liegen.

    2. als binary addon

    3. Mittels eines Installerscriptes wie bei libwidevinecdm.so

    Sollten alle 3 mit nein beantwortet sein, dann werde ich das wohl nur in mein Addon und nicht als "library/modul" implementieren

  • Also es geht
    1. Must du die Library für jede Platform zu bauen. AM besten entsprechend Cross Compilern (da kann ich dir nicht helfen).
    Dann solltest du ein Python Stump zu der Labray mitbauen und dies ale eigens Script addon erzeugen (Pro Platform jeweils das Selbe Paket )

    Wie man ein Python Modul als eigenes Modul macht siehst du z.b.
    https://github.com/kodinerds/repo…ipt.module.past

    Da Binary Addons momentan im Offziellen Repo nicht erlaubt sind braust du pro Platform ein Eigenes Repository http://kodi.wiki/view/Add-on_repositories
    Dann machst du ein Haupt Repository in dem du deine Unter repository(Repo WIndows,Rsberry, Linux32, Linux64bt,...) einbindest.....
    Nun kann der User das Platform Abhängige Repo installieren.
    Wenn du jetzt im Hauptattfon ein Addon hast das das Library Nutzt t z.b. (https://github.com/kodinerds/repo…rfeed/addon.xml) da nutze ich das mit zusazModul kannst du mit import ... die Python Funktion ansprechen


    Da das dafür Prediestiniert ist das man nie Fertig wird, Würde ich es erst mal so
    1. zum laufen bekommen, und alles Hardkodiiert
    2. Die Library den Leute von Hand installieren lassen, Pfad in den Settings setzen
    Und dann würde ich nach nach versuchen auf die Oben genannte Lösung zu kommen

    Aber nicht alles auf einmal versuchen

  • Danke, das hilft mir schon mal weiter, daß es prinzipiel hilft.

    Muss ich die library wirklich selber kompilieren? Ich habe Debian Pakete für die von mir gewollten Plattformarchitekturen gefunden und hab die Library daraus extrahiert. Ist das so gangbar?

    Zudem, da ich ein wenig Faul bin, und nicht "3 verschiedene" verschiedene Addons hatte ich einen Ansatz ähnlich in KoDisplay überlegt. In dem liegt die library als Zip-Datei vor und wird vom addon in die entsprechenden Addons entpackt. Meine Idee war für jede Architektur eine zip hineinzulegen und dieses dann dementsprechend entpacken zu lassen

  • hallo zusammen,

    ich hoffe ich kann mein anliegen hier platzieren.
    für mein addon habe ich ein zusatz modul erzeugt mit der source von pyserial.
    lies sich auch installieren.
    jedoch bekomme ich von mein addon trotzdem den fehler, dass serial nicht importiert werden kann.
    muss da noch was zusätzlich eingestellt werden, vllt. in meiner addon.xml?

    edit:
    wie vermutet, ich muss in die addon.xml auch das modul importieren.

    Code
    <requires>
    <import addon="xbmc.python" version="2.1.0" />
    <import addon="script.module.pyserial" version="3.4" />
    </requires>
  • Ohne dein pyserial Addon zu kennen.. Abert kann es sein, daß die zu importierenden Dateien in einem Unterordner liegen, den du als libraryordner definiert hat? Bei BeautifulSoup 4 muss man z.B.

    Code
    import BeautifulSoup from bs4

    benutzen, da die benötigten Dateien im Unterordner bs4 liegen

  • das hast du nicht ganz richtig verstanden.

    da muss ich eine schritt zurück gehen. ich habe ein addon plugin.script.ibuscommunicator.
    in dem habe ich das modul pyserial aktuell im ordner lib drin.
    nun wollte ich dies aber gern extern haben.
    also nun der weg über das modul script.module.pyserial.
    da jetzt nun die abhängigkeiten fehlten, die mein addon benötigt, musste dies in der addon.xml zusätzlich importiert werden.
    im script verwende ich ganz normal "import serial"

    jetzt läuft alles wieder, wie es soll, nur dass ich das pyserial modul nun outgesourct habe.

    ps. import und from musst du tasuchen --> from bs4 import BeautifulSoup

  • So ich wurschtele mich gerade so durch, hab auch schon ein paar kleine Erfolge für mich erreicht. Ich merke aber, daß ich schon etwas überfordert bin an manchen Stellen und mich frage, ob ich da zu blöd bin (wahrscheinlich) oder ob die Doku auf der Webseite von Kodi auch nicht die beste ist.

    Das fängt schon mal dabei an, daß ich mittlerweile unsicher bin, ob für mein Addon der Typ Plugin oder Script die bessere wahl ist.. In der Doku finde ich nichts so richtig, wann ich was nehmen sollte..

    Dann der nächste Knackpunkt ist die GUI Entwicklung. Da sind die Informationen doch etwas Mager, so daß ich noch nicht mal weiß, ob ich das was ich möchte überhaupt umsetzen kann. Eigentlich bräuchte ich für das Addon mehrere Fenster mit unterschiedlichen Ansichten/Funktionen und mit einer Allgemeinen Navigation bei der der User zwischen den Fenstern navigieren kann. Soweit ich verstanden habe, geht das per xml datei Aaaber da gibt es iwie nichts, wo man das mal so beispielhaft sehen kann...

  • auch, wenn einiges nicht python konform ist, und einige verbessern wollen.
    beim aufruf des skin werden alle control verknüpft. solang das nicht erledigt ist, zeige ich eine loader animation. welche danach deaktivert wird. dann können alle anderen sachen mit der condition Strin.IsEqual() angezeigt werden, oder vorangegangene animationen, pi pa po.
    so kann das ganze aussehen: https://www.youtube.com/watch?v=5nZlD1gYje8
    hier mal eine kleine zusammenstellung:

  • Ich bin schon der Meinung das Code durchaus nach gewissen Masstäben geschrieben werden sollte,
    ABER, es muß sich auch die Frage gestellt werden, wofür den der Code gedacht ist.

    Wenn Du dass im Python-Forum postest mit dem Anspruch jemanden etwas über Pythonprgorammierung zu erklären,
    oder ein Open-Source Projekt daraus machst das ggf. andere mitpflegen sollen, dann ja, ich bin ohne Sünde ich schmeiße dann mal :D

    Aber wenn es um dein Projekt geht, dass Du schreibst und für Dich tut was es soll, dann gibt es kein pep8. PUNKT.
    Du mußt wissen was das tut und wie Du damit am besten auskommst.
    Was helfen List Comprehensions wenn ich mich immer wieder fragen muß was das nochmal war oder ...
    Dein Projekt - dein Codingstyle - dein Problem nachher ;)

    Abgesehen davon, pep8 ist keine festgeschriebene Bibel, es ist eine Empfehlung und wer das nicht versteht
    mag mir doch bitte mal erklären warum ein Zeilenumbruch, heutzutage, bei 80 Zeichen sein soll.

    In dem Sinn - keep on coding (ha, dass ist ja auch noch zweideutig) :D

    Cheers
    Claudia

  • Nunja, ich finde den Code von @harryberlin durchaus gut strukturiert und lesbar. Ich hätte es jetzt auch nicht anders gemacht. Natürlich sollte man sich soweit es geht, an die Programmierkonventionen halten, allerdings ist es ja - wie schon bemerkt - keine Bibel. Man kann jetzt auch den Max raushängen lassen und alles schön 'pythonic' schreiben, m.M. nach ist sowas aber gerade für andere schwerer lesbar.

    JM2C

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!