Aktualizácia kanálov na Enigma2 boxoch

Ak človek spravuje väčšie množstvo linuxových Enigma2 (E2) boxov (napr. pre rodinu, alebo známych) a potrebuje spraviť nejaký úkon pre všetkých, tak hľadá riešenie aby to nemusel robiť individuálne. Občas sa stane, že ma známy poprosí aby som mu aktualizoval zoznam kanálov v DVB boxe. O pár dní ma o to poprosí ďalší známy a potom ďalší atď.

Obsah

Úvod

Ako už napovedá úvodná stať blogu, dnes sa budeme zaoberať pluginom (aplikáciou), ktorý zjednoduší majiteľom DVB boxov aktualizovať zoznám kanálov. Manuálny proces ladenia a úpravy zoznamu kanálov predstavuje pre menej skúsených užívateľov značný problém, preto sa snažím známym aktualizovať zoznam kanálov na diaľku.

Ladíme a upravujeme manuálne

V dnešnej dobe sa dá veľa veci riešiť po sieti. To znamená, že nemusím fyzicky navštíviť známeho s USB kľúčom, kde mám nahraté kanály, ale viem to spraviť z pohodlia domova. Riešenie je to veľmi dobré a postup je tiež celkom jednoduchý. Všetky úkony sú vykonávané na E2 boxe a PC.

  • Do boxu nahrám cez FTP aktuálny satellites.xml
  • V boxe reštartujem E2
  • Preskenujem aktuálny satellites.xml
  • V PC otvorím DreamBoxEdit (DBE) a pripojím sa k boxu
  • Z boxu stiahnem kanály do PC (DBE)
  • V DBE vytvorím bouquet a poukladám kanály ako potrebujem
  • Kanály cez DBE odošlem späť do boxu s reloadom

V E2 boxe mám teraz zoznam kanálov ako som si ho nastavil. Ďalšia možnosť je fastscan. Je to vlastne zoznam kanálov, ktoré spravuje poskytovateľ služby. Avšak poskytovateľ si kanály ukladá tak ako chce on a uloží tam aj veľa kanálov, ktoré sú nepotrebné a mnoho krát nedostupné. Preto si vždy vytváram channelist sám. Ako som už spomenul, tak v DBE si poukladám kanály podľa potreby a odosielam ich späť do boxu. DBE je sofistikovaný program, ktorý okrem iného umožňuje vytvárať kontá pre neobmedzený počet boxov. Čiže ak chcem známemu aktualizovať channelist, tak stačí niekoľko kliknutí myškou (box sa môže pokojne nachádzať aj na druhej strane krajiny).

Mňa však napadlo iné riešenie. Každý si bude aktualizovať channelist úplne sám, len za pomoci diaľkového ovládača (DO) k boxu. Mojou úlohou bude vytvoriť plugin pre E2. Ja nie som programátor, takže plugin nedokážem vytvoriť. Pluginy pre E2 sú vyvíjané v programovacom jazyku Python a to by som ja nezvládol, preto som požiadavky na plugin odovzdal AI ChatGPT (bol to trocha boj). Zdá sa, že plugin sa celkom podaril a ja sa chcem podeliť o to ako som to nakoniec vyriešil.

V bodoch vyššie som popísal čo všetko musím spraviť aby som aktualizoval channelist vo svojom boxe. To sa samozrejme musí spraviť ručne. Plugin by vedel kanály stiahnuť priamo z boxu, ale ja to musím riešiť iným spôsobom. Dôvod je taký, že ja potrebujem vytvoriť viac druhov channelistov. Niekto chce športové kanály na začiatku, niekto chce aj rádio stanice, niekto nechce rozprávky atď. Preto vytvorím viac channelistov a umiestním ich na webový server. Ako vytvoriť webový server tu nebudem rozoberať, pretože to nie je cieľom tohto blogu.

Čiže v DBE sme upravili prvý channelist a odoslali sme ho do E2 boxu. Channelist stiahneme z boxu na webový server príkazom

wget http://root:password@10.8.0.140/bouqueteditor/tmp/bouquets_backup.tar -O /var/www/html/channels_update/full_channels_01.tar

Ďalej si v DBE upravíme ďalší channelist, kde budú preferované filmové kanály, ďalej športové, rádio atď. Rovnakým spôsobom si ich webový server stiahne na požadované miesto.

wget http://root:password@10.8.0.140/bouqueteditor/tmp/bouquets_backup.tar -O /var/www/html/channels_update/full_channels_01.tar
wget http://root:password@10.8.0.140/bouqueteditor/tmp/bouquets_backup.tar -O /var/www/html/channels_update/full_channels_02.tar
wget http://root:password@10.8.0.140/bouqueteditor/tmp/bouquets_backup.tar -O /var/www/html/channels_update/full_channels_03.tar

Celá adresárová štruktúra je teraz v balíku *.tar na servery.

Vytvárame plugin

Teraz si pripravíme plugin. Ja som plugin nazval Channel Updater. Pomocou SSH sa pripojíme do boxu (ideálne je použiť SSH kľúče), kde budeme plugin vytvárať a testovať. Na vytvorenie pluginu som použil DVB-S2 box Formuler F4 Turbo s Enigma2 OpenPLi 9. V mojom prípade je IP adresa boxu 10.8.0.140

ssh root@10.8.0.140
mkdir -p /usr/lib/enigma2/python/Plugins/Extensions/ChannelUpdater

V adresári vytvoríme 2 súbory

vi /usr/lib/enigma2/python/Plugins/Extensions/ChannelUpdater/plugin.xml
<?xml version="1.0" encoding="UTF-8" ?>
<plugins>
  <plugin name="ChannelUpdater" version="1.0" author="YourName" description="Plugin for updating channel list" where="extensions">
    <file>plugin.py</file>
  </plugin>
</plugins>

Ďalej vytvorime samotný plugin

vi /usr/lib/enigma2/python/Plugins/Extensions/ChannelUpdater/plugin.py
from Plugins.Plugin import PluginDescriptor
from Screens.MessageBox import MessageBox
from Screens.ChoiceBox import ChoiceBox  # Import ChoiceBox for multiple choice selection
import os, tarfile, urllib.request, re, subprocess

class UpdatePluginChannels:
    def __init__(self, session):
        self.session = session
        self.server_ip = "10.8.0.254"  # IP adresa webového servera
        self.packages = []
        if self.isServerReachable():  # Overenie dostupnosti servera
            self.fetchPackages()  # Načítanie dostupných balíkov

    def fetchPackages(self):
        try:
            # Pokus o načítanie dát zo servera
            package_data = urllib.request.urlopen(f"http://{self.server_ip}/channels_update/").read().decode("utf-8")
            # Log pre ladenie surového výstupu servera
            print("Raw response from server:", package_data)
            # Vyhľadanie .tar súborov v odpovedi pomocou regex
            self.packages = re.findall(r'href=["\']?([^"\'>]+\.tar)', package_data)
            if self.packages:
                # Ak sú balíky dostupné, zobraz ich v ChoiceBox na výber
                choices = [(pkg, pkg) for pkg in self.packages]
                self.session.openWithCallback(self.selectPackage, ChoiceBox, title="Select a channel package to update:", list=choices)
            else:
                # Ak neboli nájdené žiadne .tar súbory
                self.showMessageBox("No channel packages available on the server.", MessageBox.TYPE_INFO)
        except Exception as e:
            # Ak nastala chyba počas načítania balíkov
            self.showMessageBox(f"Error fetching packages: {str(e)}", MessageBox.TYPE_ERROR)

    def isServerReachable(self):
        try:
            # Spustenie príkazu ping (timeout 1 sekunda, len 1 pokus)
            return subprocess.run(["ping", "-c", "1", "-W", "1", self.server_ip], stdout=subprocess.DEVNULL).returncode == 0
        except Exception as e:
            # Ak nastala chyba počas spúšťania ping
            print(f"Error during ping: {str(e)}")
            self.showMessageBox("Error: Server is unreachable.", MessageBox.TYPE_ERROR)
            return False

    def selectPackage(self, selected):
        if selected:
            # Ak používateľ potvrdí, vyberie aktuálny balík na inštaláciu
            self.downloadAndInstallPackage(selected[0])

    def downloadAndInstallPackage(self, package_name):
        try:
            # Stiahnutie vybraného balíka
            local_file = f"/tmp/{package_name}"
            urllib.request.urlretrieve(f"http://{self.server_ip}/channels_update/{package_name}", local_file)
            # Extrahovanie balíka
            with tarfile.open(local_file, "r") as tar:
                tar.extractall(path="/")
            # Odstránenie stiahnutého súboru
            os.remove(local_file)
            # Informovanie používateľa o úspešnej aktualizácii
            self.session.openWithCallback(self.confirmRestart, MessageBox, "Update was successful. Do you want to restart Enigma2 now?", MessageBox.TYPE_YESNO)
        except Exception as e:
            # Ak nastala chyba počas sťahovania alebo extrakcie
            self.showMessageBox(f"Error: {str(e)}", MessageBox.TYPE_ERROR)

    def confirmRestart(self, result):
        if result:
            # Ak používateľ potvrdí, reštart Enigma2
            os.system("killall -9 enigma2")

    def showMessageBox(self, message, type):
        # Zobrazenie správy v MessageBoxe
        self.session.open(MessageBox, message, type, timeout=5)

# Táto funkcia je potrebná pre registráciu pluginu v Enigma2
def main(session, **kwargs):
    UpdatePluginChannels(session)

# Táto funkcia definuje, kde sa plugin zobrazí v menu
def Plugins(**kwargs):
    return [PluginDescriptor(
        name="Channel Updater",
        description="Update your channel list from server",
        where=PluginDescriptor.WHERE_EXTENSIONSMENU,  # Zmena na Extensions menu (pod modrým tlačidlom)
        fnc=main)]
chmod 755 /usr/lib/enigma2/python/Plugins/Extensions/ChannelUpdater/plugin.py

Plugin je v E2 namapovaný na modré tlačidlo DO. To znamená, že po stlačení modrého tlačidla sa zobrazí ponuka, kde bude aj plugin Channel Updater.

Principiálne fungovanie pluginu

Úlohou pluginu je aktualizácia kanálov. Užívateľ otvorí plugin a na pozadí sa vykoná akcia, ktorá pomocou protokolu ICMP zistí, či je server dostupný. Ak je server dostupný a na servery sú nejaké zoznamy kanálov tak sa užívateľovi zobrazia. Ak server neodpovie na ping, alebo na servery nie sú žiadne zoznamy kanálov, tak užívateľ bude o tom informovaný krátkou správou.

Ak sú teda na servery dostupné zoznamy kanálov (zoznamy sú očíslované), tak užívateľ si vyberie, ktorý chce do boxu nainštalovať. Do niekoľkých sekúnd sa zoznam kanálov do boxu nainštaluje. Proces inštalácia funguje následovne: Zoznam kanálov, ktorý si užívateľ vyberie sa zo servera stiahne do boxu a uloží sa v /tmp. Archív *.tar sa extrahuje a existujúce súbory prepíše novými. Následne dostane užívateľ správu o tom, že zmeny sa prejavia až po reštarte E2. Ak sa rozhodne E2 reštartovať, tak po reštarte sa môže tešiť z nového zoznamu kanálov.

Plugin balíme do IPK

Táto časť je voliteľná, ale dobrým zvykom je zabalenie pluginu do .ipk (ipk je v E2 veľmi podobné ako inštalačný exe súbor v MS Windows). Takto zbalený plugin sa dá jednoduchšie nainštalovať do ďalších Enigma2 boxov. Nasleduje veľmi rýchly a stručný návod na vytvorenie .ipk balíka. Tento postup vykonávame na linuxovom PC (v mojom prípade Linux Mint 21).

mkdir -p ChannelUpdater/usr/lib/enigma2/python/Plugins/Extensions/ChannelUpdater
cp plugin.py plugin.xml ChannelUpdater/usr/lib/enigma2/python/Plugins/Extensions/ChannelUpdater/
touch ChannelUpdater/control

Do tohto súboru vložíme nasledujúce informácie:

Package: enigma2-plugin-extensions-channelupdater
Version: 1.0
Architecture: all
Maintainer: jany
Description: Plugin pre aktualizaciu zoznamu kanalov
cd ChannelUpdater
tar -czvf data.tar.gz ./usr
tar -czvf control.tar.gz ./control
echo "2.0" > debian-binary
ar r enigma2-plugin-extensions-channelupdater_1.0_all.ipk control.tar.gz data.tar.gz debian-binary

Tento postup vytvorí .ipk balík s názvom enigma2-plugin-extensions-channelupdater_1.0_all.ipk.

Inštalácia a použitie pluginu

Skopírujeme vytvorený .ipk balík na cieľový box do /tmp a nainštalujeme ho pomocou príkazu:

opkg install /tmp/k/enigma2-plugin-extensions-channelupdater_1.0_all.ipk

Po inštalácii reštartujeme Enigma2

init 4 && init 3

Plugin v boxe nájdeme pod modrým tlačidlom na DO. Čiže na DO stlačíme modré tlačidlo a mohli by sme vidieť niečo podobné (na obrázku je umiestnený pod číslom 3).

Channel Updater potvrdíme a dostaneme sa rovno do ponuky, kde sú zoznamy kanálov. Tieto zoznamy sú len ukážkové. Reálne budú mať zoznamy zmysluplné názvy aby si užívateľ vedel správne vybrať.

Zo zoznamu vyberieme napr. možnosť 2 a potvrdíme. Zoznam sa aktualizuje o čom budeme informovaný a na koniec môžeme potvrdiť reštart E2.

Po reštarte by sme mali mať už aktualizovaný zoznam kanálov.

Záver

Myslím si, že tento postup je celkom jednoduchý. Užívateľ nepotrebuje nič ladiť, presúvať a pod. Na aktualizáciu mu stačí stlačiť niekoľko gombíkov na DO a ak je všetko v poriadku, tak o niekoľko sekúnd, ma aktuálny zoznam kanálov. Plugin som testoval na IMG OpenPLi 9, ktorý už beží pod Python 3. To znamená, že na OpenPLi 8 a nižšie tento plugin zrejme nebude fungovať.

Tento python kód si môže stiahnuť každý a môže ho aplikovať aj u seba. Zmenu musí spraviť len v riadku 9, kde sa nastavuje IP adresa servera, odkiaľ sa majú sťahovať zoznamy kanálov. Taktiež musí byť zachovaná cesta na webovom servery (viď riadok 17, resp. 52 /channels_update/ ). Samozrejmosťou je mať funkčný aj webový server, ktorý musí byť dostupný v rámci siete, kde sa nachádzajú DVB boxy, alebo musí byť verejne dostupný na internete.

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *