VAVOO zeichnet sich durch Individualität aus

Dadurch, dass die Kunden beim ersten Gebrauch die Möglichkeit haben eine externe Quelle bei der Einrichtung einzugeben, kannst Du der Community ein exklusives User-Interface bereitstellen und somit Deine eigene VAVOO Fan-Base schaffen.

Wir nennen es VAVOO BUNDLE.

Nachfolgend findest Du die Anleitung zur Erstellung von einem VAVOO Bundle.

  1. Lade Dir VAVOO hier runter und installiere es.
  2. Starte mit den VAVOO Standardeinstellungen. Gib hierfür als Bundle-URL folgendes ein: vavoo.tv/repo
  3. Richte VAVOO vollständig nach Deinen Wünschen ein.
  4. Starte unser Bundle erstellen Tool. Für mehr Informationen hierzu siehe weiter unten.
    Die Dateien werden in Deinem Home-Verzeichnis unter VAVOO abgelegt.
  5. Stelle sicher das alle Informationen in der vavoo.json vavoo.json korrekt sind.
  6. Lade die vavoo.json auf einen Webserver und sorge dafür dass die Eingabe der URL so einfach wie möglich ist.
    VAVOO ergänzt die eingegebene URL automatisch mit /vavoo.json.
    So wird bei der Eingabe von http://deinserver.com/repo auch die URL http://deinserver.com/repo/vavoo.json abgefragt.
  7. Lade ein Video Tutorial der Installation auf YouTube und nutze den Hashtag #VAVOOBUNDLE in Deiner Videobeschreibung.
    Vergesse nicht Deine URL in der Videobeschreibung zu nennen.

VAVOO Bundle Domainumleitungen

Dies ist nützlich um zum Beispiel von einer sehr kurzen Domain auf eine längere, schwieriger zu schreibende Domain umzuleiten.

  1. Erstelle mit einem Texteditor eine Datei mit dem Namen vavoo.json mit dem folgenden Inhalt:
    {
        "redirect": "anotherdomain.com"
    }
    Oder:
    {
        "redirect": "http://anotherdomain.com/repo/"
    }

VAVOO Funktionen

  1. VAVOO bietet eine verbesserte Android API
    Wir haben die Kodi Kern Funktion StartAndroidActivity verbessert. Hier kannst Du jetzt nicht nur Android Apps starten, sondern auch direkt einzelne Activities.
    Der Syntax lautet wie folgt:
    StartAndroidActivity("package.name!.SomeActivity")
  2. Geschlossener Addon Code
    Addons können im vorkompilierten Python Code ausgeliefert werden (Dateiendung .pyo).
    Dies beschleundigt den start der Addons und erlaubt es auch geschlossene Addons auszuliefern.
  3. VAVOO Addon Modul
    Das Modul vavoo_api bietet einige nützliche Funktionen:
    import vavoo_api
    vavoo_api.restart() # Startet die VAVOO Software neu.
  4. Benutzer verifizieren
    Um diverse Dienste anbieten zu können für die eine Verifizierung des Benutzers notwendig ist, bietet VAVOO eine spimple API:
    import vavoo_api
    # Liefert die Authentifizierungssignatur zurück.
    vavoo_api.getAuthSignature()
    # Beispiel Addon Code:
    endpoint = "http://dein.service.com/api/endpoint"
    params = {"some": "value", "vavoo_auth": vavoo_api.getAuthSignature()}
    response = requests.post(endpoint, params=params)
    Serverseitig muss jetzt die Signatur via RSA-SHA256 überprüft werden. Hier ein kurzer Python Code:
    import json
    from Crypto.PublicKey import RSA
    from Crypto.Signature import PKCS1_v1_5
    from Crypto.Hash import SHA256
    
    public_key = """-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYQ/yPjdNq0WHTyvYSqGBspT/e
    /dL9On1jW4TQ6cC1aXTtmGXwZvCRWAElFRItYps6Kh+oRzZmt2llfUhnYkC27Gzo
    V4sDzsnE6juA8mtJIC2PO28wnHwQXKYjBl7l6u+6uGsFhlUu+hCT8uKPPZtq5n26
    SFOGVgxIL5m9P1tZawIDAQAB
    -----END PUBLIC KEY-----"""
    
    rsakey = RSA.importKey(public_key)
    signer = PKCS1_v1_5.new(rsakey)
    
    def verify_vavoo_auth(client_ip, data):
      data = data.decode("base64")
      data = json.loads(data)
      digest = SHA256.new()
      digest.update(data["data"])
      if not signer.verify(digest, data["signature"].decode("base64")):
        raise ValueError("Invalid signature")
    
      data = json.loads(data["data"])
      # Die haltbarkeit einer Signatur sollte nicht länger als maximal 15 Minuten sein.
      if time.time()*1000 - data["time"] > 10*60*1000:
        raise ValueError("Signature timed out")
    
      print data
      if client_ip not in data["ips"]:
        raise ValueError("Client IP not allowed")
    
      if data["error"]:
        raise ValueError(data["error"])
    
      return data["ruleset"]
    
    @route("api/endpoint")
    def api_endpoint():
      ruleset = verify_vavoo_auth(request.get_client_ip(), request.args["vavoo_auth"])
      if ruleset == "pro":
        # Your protected VAVOO Premium code here
      elif ruleset == "free":
        # Your protected VAVOO free code here
      elif ruleset == "guest":
        # Your protected VAVOO guest code here
      return "success"
  5. Festlegen was vor einer Wiedergabe passieren soll (ab VAVOO Version 1.28)
    Pro Medieneintrag kann festgelegt werden was beim Klick auf einen Eintrag passieren soll.
    import xbmcgui
    listItem = xbmcgui.ListItem()
    listItem.setProperty("selectaction", "play")
    Mögliche Werte für selectaction sind:
    • play
      Wiedergabe vom Anfang an.
    • resume
      Immer fortsetzen wenn möglich
    • play_or_resume
      Wiedergabe oder fortsetzen.
    • info
      Informationsdialog anzeigen.
    • choose
      Auswahl dem Benutzer überlassen.
    • more
      Mehr Auswahlmöglichkeiten als bei choose anzeigen.
  6. Zusätzliche Skinning Variablen
    Um auf die verschiendenen Zustände von VAVOO zu reagieren stehen folgende neuen Skin Variablen zur Verfügung:
    • Window(10000).Property(Vavoo_Device)
      Boolean. true wenn das die Hardware eine VAVOO Box ist.
    • Window(10000).Property(Vavoo_InternetDisconnected)
      Boolean. true wenn die Internetverbindung verloren gegangen ist.
    • Window(10000).Property(Vavoo_BundleInstalled)
      Boolean. true wenn ein VAVOO Bundle installiert ist.
    • Window(10000).Property(Vavoo_Locked)
      Boolean. true wenn gerade ein VAVOO Service Fenster im Vordergrund ist.
    • Window(10000).Property(Vavoo_Guest)
      Boolean. true wenn es sich um eine Gast Session handelt.
    • Window(10000).Property(Vavoo_LoggedIn)
      Boolean. true wenn es sich um einen Benutzer Account handelt.
    • Window(10000).Property(Vavoo_Token)
      String. Der aktuelle VAVOO Token.
    • Window(10000).Property(Vavoo_Running)
      Boolean. true wenn der VAVOO Bootstrap vollständig ist.
  7. VAVOO Service Funktionen
    • RunScript(service.vavoo,ftp)
      Startet den integrierten FTP Server.
    • RunScript(service.vavoo,install)
      Startet den Bundle Installer.
    • RunScript(service.vavoo,snapshot)
      Tool um eigene Bundles einfach zu erstellen.
    • RunScript(service.vavoo,logout)
      Meldet den Benutzer von einer Gast oder Benutzersession ab.

Skinning

  1. Empfohlener Inhalt von Startup.xml
    Hierfür musst Du die folgenden 2 Dateien in den media Ordner deines Skins kopieren:
    <?xml version="1.0" encoding="UTF-8"?>
    <window>
      <controls>
        <top>0</top>
        <left>0</left>
        <control type="image">
          <left>0</left>
          <top>0</top>
          <width>100%</width>
          <height>100%</height>
          <texture>black.png</texture>
        </control>
        <control type="image">
          <top>387</top>
          <left>471</left>
          <width>978</width>
          <height>326</height>
          <texture>vavoo-text.png</texture>
        </control>
        <control type="label">
          <left>0</left>
          <top>800</top>
          <width>100%</width>
          <height>100</height>
          <font>font20_title</font>
          <align>center</align>
          <label>$LOCALIZE[39586]</label>
        </control>
      </controls>
    </window>
  2. Empfohlende Menüeinträge für DialogButtonMenu.xml
    <item>
      <description>Login</description>
      <label>$LOCALIZE[39506]</label>
      <onclick>Dialog.Close(all,true)</onclick>
      <onclick>RunScript(service.vavoo,profile)</onclick>
      <visible>!String.isEmpty(Window(10000).Property(Vavoo_LoginEnabled)) + String.isEmpty(Window(10000).Property(Vavoo_Locked)) + !String.isEmpty(Window(10000).Property(Vavoo_Guest))</visible>
    </item>
    <item>
      <description>View profile</description>
      <label>$LOCALIZE[39607]</label>
      <onclick>Dialog.Close(all,true)</onclick>
      <onclick>RunScript(service.vavoo,profile)</onclick>
      <visible>!String.isEmpty(Window(10000).Property(Vavoo_LoginEnabled)) + String.isEmpty(Window(10000).Property(Vavoo_Locked)) + String.isEmpty(Window(10000).Property(Vavoo_Guest))</visible>
    </item>
    <item>
      <description>Settings</description>
      <label>$LOCALIZE[5]</label>
      <onclick>Dialog.Close(all,true)</onclick>
      <onclick>ActivateWindow(settings)</onclick>
      <visible>!String.isEmpty(Window(10000).Property(Vavoo_Ready))</visible>
    </item>
    <item>
      <description>VAVOO Box Internet Settings</description>
      <label>$LOCALIZE[39585]</label>
      <onclick>StartAndroidActivity("com.android.tv.settings!.connectivity.NetworkActivity")</onclick>
      <visible>String.isEmpty(Window(10000).Property(Vavoo_Ready)) + System.Platform.Android + !String.isEmpty(Window(10000).Property(Vavoo_Device))</visible>
    </item>
    <item>
      <description>Bundle Installer</description>
      <label>$LOCALIZE[39582]</label>
      <onclick>RunScript(service.vavoo,install)</onclick>
      <visible>String.isEmpty(Window(10000).Property(Vavoo_Locked)) + !String.isEmpty(Window(10000).Property(Vavoo_Ready))</visible>
    </item>
    <item>
      <description>Restart</description>
      <label>$LOCALIZE[13013]</label>
      <onclick>RunScript(service.vavoo,restart)</onclick>
    </item>
    <item>
      <description>Quit</description>
      <label>$LOCALIZE[13012]</label>
      <onclick>Quit()</onclick>
      <visible>String.isEmpty(Window(10000).Property(Vavoo_Device))</visible>
    </item>
  3. Empfohlende Menüeinträge für Settings.xml
    <item>
      <description>VAVOO Box Internet Settings</description>
      <label>$LOCALIZE[443]</label>
      <onclick>StartAndroidActivity("com.android.tv.settings!.connectivity.NetworkActivity")</onclick>
      <visible>System.Platform.Android + !String.isEmpty(Window(10000).Property(Vavoo_Device))</visible>
    </item>
    <item>
      <description>VAVOO Box Display Settings</description>
      <label>$LOCALIZE[14220]</label>
      <onclick>StartAndroidActivity("com.android.tv.settings!.device.display.DisplayActivity")</onclick>
      <visible>System.Platform.Android + !String.isEmpty(Window(10000).Property(Vavoo_Device))</visible>
    </item>
    <item>
      <description>VAVOO Box System-Update</description>
      <label>$LOCALIZE[24069]</label>
      <onclick>StartAndroidActivity("tv.vavoo.base!.UpdateActivity")</onclick>
      <visible>System.Platform.Android + !String.isEmpty(Window(10000).Property(Vavoo_Device))</visible>
    </item>
    <item>
      <description>Login</description>
      <label>$LOCALIZE[39506]</label>
      <icon>icons/settings/profiles.png</icon>
      <onclick>RunScript(service.vavoo,profile)</onclick>
      <visible>!String.isEmpty(Window(10000).Property(Vavoo_LoginEnabled)) + !String.isEmpty(Window(10000).Property(Vavoo_Guest))</visible>
    </item>
    <item>
      <description>Display profile</description>
      <label>$LOCALIZE[39607]</label>
      <icon>icons/settings/profiles.png</icon>
      <onclick>RunScript(service.vavoo,profile)</onclick>
      <visible>!String.isEmpty(Window(10000).Property(Vavoo_LoginEnabled)) + String.isEmpty(Window(10000).Property(Vavoo_Guest))</visible>
    </item>
    <item>
      <description>Bundle Installer</description>
      <label>$LOCALIZE[39582]</label>
      <onclick>RunScript(service.vavoo,install)</onclick>
    </item>
    <item>
      <description>Bundle Snapshot</description>
      <label>$LOCALIZE[39583]</label>
      <onclick>RunScript(service.vavoo,snapshot)</onclick>
      <visible>!System.Platform.Android</visible>
    </item>
    <item>
      <description>VAVOO FTP Server</description>
      <label>$LOCALIZE[39584]</label>
      <onclick>RunScript(service.vavoo,ftp)</onclick>
    </item>
  4. Versionsupdate der Skinning-Engine.
    Hierfür müssen unter umständen Teile vom Skin angepasst werden. Die aktuelle Version des Skins kann man via dem folgenden Code herausfinden:
    <control type="group">
      <visible>String.Contains(System.BuildVersion,-addonv2)</visible>
      <!-- Code for the new skinning engine -->
    </control>
    <control type="group">
      <visible>!String.Contains(System.BuildVersion,-addonv2)</visible>
      <!-- Code for the old and outdated skinning engine -->
    </control>