<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Forum społeczności kodiwpigulce.pl - wszystko o Kodi! Polskie wtyczki, dodatki, poradniki. - Wszystkie działy]]></title>
		<link>https://forum.kodiwpigulce.pl/</link>
		<description><![CDATA[Forum społeczności kodiwpigulce.pl - wszystko o Kodi! Polskie wtyczki, dodatki, poradniki. - https://forum.kodiwpigulce.pl]]></description>
		<pubDate>Sat, 14 Nov 2026 21:33:13 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Nowy tx box]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6786</link>
			<pubDate>Sat, 14 Nov 2026 13:51:22 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=1698">pawel_p5</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6786</guid>
			<description><![CDATA[Moj mecool m8s pro plus juz nie daje rady. Mam na nim coreeleca i to mu zywot przedluza. Kupowal moze ktos jakis sprzet ostatnio i jest zadowolony ? Najlepiej z dolnej polki . Byleby dzialal youtube , vlc, kodi]]></description>
			<content:encoded><![CDATA[Moj mecool m8s pro plus juz nie daje rady. Mam na nim coreeleca i to mu zywot przedluza. Kupowal moze ktos jakis sprzet ostatnio i jest zadowolony ? Najlepiej z dolnej polki . Byleby dzialal youtube , vlc, kodi]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Optymalna konfiguracja Input Stream Adaptive]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6782</link>
			<pubDate>Wed, 11 Nov 2026 08:59:57 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=39193">mirekc</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6782</guid>
			<description><![CDATA[Chciałbym uzyskać taki efekt:<br />
- po uruchomieniu odtwarzania rozdzielczość wideo ustawia się jak najszybciej na maksymalną 720p (lub startuje od razu 720p)<br />
- w przypadku problemów z przepustowością sieci rozdzielczość zostaje automatycznie obniżona (aby uniknąć zacięć), ale nie bardziej niż do 540p.<br />
<br />
Kombinuję i kombinuję, ale albo odtwarzanie startuje z rozdzielczością 480p (za mało) i nie może dojść do 720p (może po wielu godzinach), albo przy ograniczonej przepustowości sieci nie ma skalowania rozdzielczości w dół, pomimo ewidentnych zacięć obrazu. Mogę oczywiście ustawić na stałe 720p i w normalnych warunkach wszystko działa jak trzeba, ale wtedy przy problemach z Internetem muszę wchodzić w ustawienia i obniżać rozdzielczość ręcznie, a to jest niewygodne.<br />
<br />
Ktoś mi pomoże to ogarnąć?]]></description>
			<content:encoded><![CDATA[Chciałbym uzyskać taki efekt:<br />
- po uruchomieniu odtwarzania rozdzielczość wideo ustawia się jak najszybciej na maksymalną 720p (lub startuje od razu 720p)<br />
- w przypadku problemów z przepustowością sieci rozdzielczość zostaje automatycznie obniżona (aby uniknąć zacięć), ale nie bardziej niż do 540p.<br />
<br />
Kombinuję i kombinuję, ale albo odtwarzanie startuje z rozdzielczością 480p (za mało) i nie może dojść do 720p (może po wielu godzinach), albo przy ograniczonej przepustowości sieci nie ma skalowania rozdzielczości w dół, pomimo ewidentnych zacięć obrazu. Mogę oczywiście ustawić na stałe 720p i w normalnych warunkach wszystko działa jak trzeba, ale wtedy przy problemach z Internetem muszę wchodzić w ustawienia i obniżać rozdzielczość ręcznie, a to jest niewygodne.<br />
<br />
Ktoś mi pomoże to ogarnąć?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Problem] Błąd logowania tb7 / Kodi 21.2 (2026.10.03)]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6778</link>
			<pubDate>Sun, 08 Nov 2026 17:56:58 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=3203">Flower</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6778</guid>
			<description><![CDATA[Po zaktualizowaniu do wersji 2026.10.03.1 gdzie naprawiono scrapery tb7 , przy poszukiwaniu źródeł , pojawia się błąd logowania. Zmieniłem hasło na stronie i w Kodi ,bez rezultatu . Ktoś ma pomysł  co się stało?<img src="https://i.imgur.com/ZzyXgKW.jpeg" loading="lazy"  alt="[Obrazek: ZzyXgKW.jpeg]" class="mycode_img" /> ?]]></description>
			<content:encoded><![CDATA[Po zaktualizowaniu do wersji 2026.10.03.1 gdzie naprawiono scrapery tb7 , przy poszukiwaniu źródeł , pojawia się błąd logowania. Zmieniłem hasło na stronie i w Kodi ,bez rezultatu . Ktoś ma pomysł  co się stało?<img src="https://i.imgur.com/ZzyXgKW.jpeg" loading="lazy"  alt="[Obrazek: ZzyXgKW.jpeg]" class="mycode_img" /> ?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Wersja PLTV]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6775</link>
			<pubDate>Thu, 05 Nov 2026 10:59:49 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=53748">FCBeny</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6775</guid>
			<description><![CDATA[Zauważyłem, że w wersji pltv do wszystkich tytułów dopisywana jest na końcu kropka. Czy to błąd czy planowane działanie?<br />
Przykład:<br />
<pre class="block-code line-numbers"><code class="language-none">&lt;programme start=&quot;20261104044500 +0100&quot; stop=&quot;20261104045500 +0100&quot; channel=&quot;TVP 1&quot;&gt;
    &lt;title lang=&quot;pl&quot;&gt;Zakończenie programu. &lt;/title&gt;
    &lt;desc&gt;&lt;/desc&gt;
    &lt;icon src=&quot;https://ptv-prod.wphcdn.cloud/media/akpa4419675.jpg&quot; /&gt;
  &lt;/programme&gt;</code></pre>]]></description>
			<content:encoded><![CDATA[Zauważyłem, że w wersji pltv do wszystkich tytułów dopisywana jest na końcu kropka. Czy to błąd czy planowane działanie?<br />
Przykład:<br />
<pre class="block-code line-numbers"><code class="language-none">&lt;programme start=&quot;20261104044500 +0100&quot; stop=&quot;20261104045500 +0100&quot; channel=&quot;TVP 1&quot;&gt;
    &lt;title lang=&quot;pl&quot;&gt;Zakończenie programu. &lt;/title&gt;
    &lt;desc&gt;&lt;/desc&gt;
    &lt;icon src=&quot;https://ptv-prod.wphcdn.cloud/media/akpa4419675.jpg&quot; /&gt;
  &lt;/programme&gt;</code></pre>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[parser EPG Telewizja Biznesowa]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6768</link>
			<pubDate>Wed, 21 Oct 2026 23:21:07 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=2193">memek86</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6768</guid>
			<description><![CDATA[Witam,<br />
<br />
zrobiłem przy pomocy AI parser do Telewizja Biznesowa, edytowałem i dodałem jeszcze opis i grafikę.<br />
<pre class="block-code line-numbers"><code class="language-none">#!/usr/bin/env python3
# -*- coding: utf-8 -*-

&quot;&quot;&quot;
Telewizja Biznesowa (tbpl) -&gt; XMLTV EPG

Pobiera harmonogram z API MediaTool i zapisuje program w formacie XMLTV.
Domyślnie zapisuje dzisiejszy dzień oraz dwa kolejne dni.

Wymagania:
    python3 -m pip install requests

Uruchomienie:
    python3 telewizjabiznesowa_epg.py

Opcje:
    python3 telewizjabiznesowa_epg.py --days 2
    python3 telewizjabiznesowa_epg.py -o /ścieżka/telewizjabiznesowa.xml
    python3 telewizjabiznesowa_epg.py --channel-id telewizjabiznesowa.pl

Uwaga:
- Parametr --days oznacza liczbę dni naprzód oprócz dzisiejszego dnia.
  --days 2 obejmuje dziś, jutro i pojutrze.
- Ustaw CHANNEL_TOKEN 
&quot;&quot;&quot;

import argparse
import html
import logging
import os
import sys
import time
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta, time as dt_time, timezone
from pathlib import Path
from zoneinfo import ZoneInfo

import requests


API_URL = &quot;https://app.mediatool.tv/api/epg-api/information/channel/tbpl/weeks/1&quot;
TIMEZONE =  ZoneInfo(&quot;Europe/Warsaw&quot;) #timezone.utc
DEFAULT_OUTPUT = &quot;telewizjabiznesowa.xml&quot;
#USER_AGENT = &quot;Mozilla/5.0 (compatible; XMLTV-EPG/1.0)&quot;
USER_AGENT = &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36&quot;
CHANNEL_TOKEN='86e89a49-9e7c-48da-8c29-7db6807e8f8b'

def parse_datetime(value):
    &quot;&quot;&quot;Zachowuje godzinę z API i interpretuje ją jako czas polski.&quot;&quot;&quot;
    if not value:
        return None

    try:
        parsed = datetime.fromisoformat(str(value).replace(&quot;Z&quot;, &quot;+00:00&quot;))

        # Usuwamy źródłową strefę bez przeliczania godziny.
        # Następnie przypisujemy strefę docelową.
        parsed = parsed.replace(tzinfo=None)
        return parsed.replace(tzinfo=TIMEZONE)

    except (ValueError, TypeError):
        logging.warning(&quot;Nie można odczytać daty: %r&quot;, value)
        return None

def localized_text(value, language=&quot;AB&quot;):
    &quot;&quot;&quot;Wydobywa tekst z pola, które może być zwykłym stringiem lub mapą języków.&quot;&quot;&quot;
    if isinstance(value, dict):
        text = value.get(language)
        if text is None:
            # Awaryjnie wybierz pierwszą niepustą wartość tekstową.
            text = next((v for v in value.values() if isinstance(v, str) and v.strip()), &quot;&quot;)
        return str(text).strip() if text is not None else &quot;&quot;
    if isinstance(value, str):
        return value.strip()
    return &quot;&quot;


def add_text(parent, tag, value, **attrs):
    node = ET.SubElement(parent, tag, attrs)
    node.text = value
    return node


def xmltv_timestamp(value):
    &quot;&quot;&quot;XMLTV zapisuje czas lokalny wraz z przesunięciem względem UTC.&quot;&quot;&quot;
#    value = value.astimezone(timezone.utc)
    return value.strftime(&quot;%Y%m%d%H%M%S %z&quot;)

#def xmltv_timestamp(value):
#    &quot;&quot;&quot;Zapisuje czas w UTC w formacie XMLTV.&quot;&quot;&quot;
#    value = value.astimezone(timezone.utc)
#    return value.strftime(&quot;%Y%m%d%H%M%S +0000&quot;)


def fetch_schedule(token, timeout):
    url = API_URL
    started = time.monotonic()
    try:
        response = requests.get(
            url,
            params={&quot;token&quot;: token},
            headers={&quot;User-Agent&quot;: USER_AGENT, &quot;Accept&quot;: &quot;application/json&quot;},
            timeout=(15, timeout),
        )
        elapsed = time.monotonic() - started
        response.raise_for_status()
        try:
            data = response.json()
        except requests.exceptions.JSONDecodeError as exc:
            raise RuntimeError(&quot;API nie zwróciło poprawnego JSON-a.&quot;) from exc
        logging.info(
            &quot;Pobrano odpowiedź HTTP %s w %.2f s (%s bajtów).&quot;,
            response.status_code, elapsed, len(response.content)
        )
    except requests.RequestException as exc:
        raise RuntimeError(f&quot;Błąd pobierania danych z API: {exc}&quot;) from exc

    if not isinstance(data, dict):
        raise RuntimeError(&quot;Nieoczekiwany format odpowiedzi API: oczekiwano obiektu JSON.&quot;)
    schedule = data.get(&quot;schedule&quot;)
    if not isinstance(schedule, list):
        keys = &quot;, &quot;.join(data.keys())
        raise RuntimeError(f&quot;Brak listy 'schedule' w odpowiedzi API. Dostępne pola: {keys}&quot;)
    return schedule


def programme_bounds(now, days_ahead):
    start = now.replace(hour=0, minute=0, second=0, microsecond=0)
    # Koniec jest wyłączny: przy --days 2 obejmujemy dziś, jutro i pojutrze.
    end_date = start.date() + timedelta(days=days_ahead + 1)
    end = datetime.combine(end_date, dt_time.min, tzinfo=TIMEZONE)
    return start, end


def build_xml(schedule, output, days_ahead, channel_id, channel_name):
    now = datetime.now(TIMEZONE)
    start_bound, end_bound = programme_bounds(now, days_ahead)

    root = ET.Element(&quot;tv&quot;, {&quot;source-info-name&quot;: &quot;MediaTool&quot;, &quot;generator-info-name&quot;: &quot;telewizjabiznesowa_epg.py&quot;})
    channel = ET.SubElement(root, &quot;channel&quot;, {&quot;id&quot;: channel_id})
    add_text(channel, &quot;display-name&quot;, channel_name, lang=&quot;pl&quot;)

    programmes = []
    skipped = 0
    for item in schedule:
        if not isinstance(item, dict):
            skipped += 1
            continue

        start = parse_datetime(item.get(&quot;startTime&quot;))
        end = parse_datetime(item.get(&quot;endTime&quot;))
        if not start or not end or end &lt;= start:
            skipped += 1
            continue

        # Zachowujemy audycje przecinające wybrany zakres.
        if end &lt;= start_bound or start &gt;= end_bound:
            continue

        title = localized_text(item.get(&quot;title&quot;))
        episode_title = localized_text(item.get(&quot;episodeTitle&quot;))
        if not title:
            title = episode_title or &quot;Program&quot;

        programme = ET.Element(
            &quot;programme&quot;,
            {
                &quot;start&quot;: xmltv_timestamp(start),
                &quot;stop&quot;: xmltv_timestamp(end),
                &quot;channel&quot;: channel_id,
            },
        )
        add_text(programme, &quot;title&quot;, title, lang=&quot;pl&quot;)
        if episode_title and episode_title.casefold() != title.casefold():
            add_text(programme, &quot;sub-title&quot;, episode_title, lang=&quot;pl&quot;)

        # Dodatkowe pola dodajemy tylko wtedy, gdy faktycznie są obecne w JSON-ie.
   # Pełny opis audycji: synopsis.PL.longSynopsis
        synopsis = item.get(&quot;synopsis&quot;)
        description = &quot;&quot;

        if isinstance(synopsis, dict):
            synopsis_pl = synopsis.get(&quot;PL&quot;)
            if isinstance(synopsis_pl, dict):
                long_synopsis = synopsis_pl.get(&quot;longSynopsis&quot;)
                if isinstance(long_synopsis, str):
                    description = long_synopsis.strip()

        # Awaryjnie wykorzystaj dotychczasowe pole description.
        if not description:
            description = localized_text(item.get(&quot;description&quot;))

        if description:
            add_text(programme, &quot;desc&quot;, description, lang=&quot;pl&quot;)

        # Obraz audycji: images.stillScene
        images = item.get(&quot;images&quot;)
        if isinstance(images, dict):
            image_url = images.get(&quot;stillScene&quot;)
            if isinstance(image_url, str) and image_url.strip():
                ET.SubElement(
                    programme,
                    &quot;icon&quot;,
                    {&quot;src&quot;: image_url.strip()}
                )

        # Data produkcji: productionDate, np. 2024-12-05.
        production_date = item.get(&quot;productionDate&quot;)
        if isinstance(production_date, str) and production_date.strip():
            try:
                date_value = datetime.strptime(
                    production_date.strip()[:10], &quot;%Y-%m-%d&quot;
                ).strftime(&quot;%Y%m%d&quot;)
                add_text(programme, &quot;date&quot;, date_value)
            except ValueError:
                logging.warning(
                    &quot;Nieprawidłowa data produkcji: %r&quot;, production_date
                )

        # Kategoria, jeśli występuje w odpowiedzi API.
        category = localized_text(item.get(&quot;category&quot;))
        if category:
            add_text(programme, &quot;category&quot;, category, lang=&quot;pl&quot;)

        programmes.append((start, programme))

    programmes.sort(key=lambda pair: pair[0])
    for _, programme in programmes:
        root.append(programme)

    tree = ET.ElementTree(root)
    try:
        ET.indent(tree, space=&quot;  &quot;)
    except AttributeError:
        pass

    output_path = Path(output).expanduser()
    output_path.parent.mkdir(parents=True, exist_ok=True)
    tree.write(output_path, encoding=&quot;utf-8&quot;, xml_declaration=True)

    return output_path, len(programmes), skipped, start_bound, end_bound


def main():
    parser = argparse.ArgumentParser(description=&quot;Pobiera EPG Telewizji Biznesowej z MediaTool i zapisuje XMLTV.&quot;)
    parser.add_argument(&quot;-o&quot;, &quot;--output&quot;, default=DEFAULT_OUTPUT, help=f&quot;Plik wyjściowy (domyślnie: {DEFAULT_OUTPUT})&quot;)
    parser.add_argument(&quot;--days&quot;, type=int, default=2, help=&quot;Ile dni naprzód poza dzisiejszym dniem; domyślnie 2&quot;)
    parser.add_argument(&quot;--channel-id&quot;, default=&quot;Telewizja Biznesowa&quot;, help=&quot;Identyfikator kanału XMLTV&quot;)
    parser.add_argument(&quot;--channel-name&quot;, default=&quot;Telewizja Biznesowa&quot;, help=&quot;Nazwa kanału XMLTV&quot;)
    parser.add_argument(&quot;--timeout&quot;, type=int, default=120, help=&quot;Limit czasu odpowiedzi API w sekundach&quot;)
    parser.add_argument(&quot;-v&quot;, &quot;--verbose&quot;, action=&quot;store_true&quot;, help=&quot;Więcej informacji diagnostycznych&quot;)
    args = parser.parse_args()

    logging.basicConfig(
        level=logging.DEBUG if args.verbose else logging.INFO,
        format=&quot;%(asctime)s %(levelname)s: %(message)s&quot;,
    )

    if args.days &lt; 0 or args.days &gt; 6:
        parser.error(&quot;--days musi być w zakresie 0–6.&quot;)

    token = CHANNEL_TOKEN
    if not token:
        logging.error(&quot;Brak tokenu. Ustaw zmienną środowiskową CHANNEL_TOKEN.&quot;)
        logging.error(&quot;Przykład: export CHANNEL_TOKEN='TWÓJ_TOKEN'&quot;)
        return 2

    try:
        schedule = fetch_schedule(token, args.timeout)
        output, count, skipped, start, end = build_xml(
            schedule, args.output, args.days, args.channel_id, args.channel_name
        )
    except (RuntimeError, OSError) as exc:
        logging.error(&quot;%s&quot;, exc)
        return 1

    logging.info(&quot;Zakres EPG: %s – %s (koniec wyłączny).&quot;, start.isoformat(), end.isoformat())
    logging.info(&quot;Zapisano %d audycji do: %s&quot;, count, output.resolve())
    if skipped:
        logging.warning(&quot;Pominięto %d nieprawidłowych rekordów.&quot;, skipped)
    if count == 0:
        logging.warning(&quot;Nie znaleziono audycji w wybranym zakresie. Sprawdź zakres API i format dat.&quot;)
    return 0


if __name__ == &quot;__main__&quot;:
    sys.exit(main())
</code></pre>]]></description>
			<content:encoded><![CDATA[Witam,<br />
<br />
zrobiłem przy pomocy AI parser do Telewizja Biznesowa, edytowałem i dodałem jeszcze opis i grafikę.<br />
<pre class="block-code line-numbers"><code class="language-none">#!/usr/bin/env python3
# -*- coding: utf-8 -*-

&quot;&quot;&quot;
Telewizja Biznesowa (tbpl) -&gt; XMLTV EPG

Pobiera harmonogram z API MediaTool i zapisuje program w formacie XMLTV.
Domyślnie zapisuje dzisiejszy dzień oraz dwa kolejne dni.

Wymagania:
    python3 -m pip install requests

Uruchomienie:
    python3 telewizjabiznesowa_epg.py

Opcje:
    python3 telewizjabiznesowa_epg.py --days 2
    python3 telewizjabiznesowa_epg.py -o /ścieżka/telewizjabiznesowa.xml
    python3 telewizjabiznesowa_epg.py --channel-id telewizjabiznesowa.pl

Uwaga:
- Parametr --days oznacza liczbę dni naprzód oprócz dzisiejszego dnia.
  --days 2 obejmuje dziś, jutro i pojutrze.
- Ustaw CHANNEL_TOKEN 
&quot;&quot;&quot;

import argparse
import html
import logging
import os
import sys
import time
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta, time as dt_time, timezone
from pathlib import Path
from zoneinfo import ZoneInfo

import requests


API_URL = &quot;https://app.mediatool.tv/api/epg-api/information/channel/tbpl/weeks/1&quot;
TIMEZONE =  ZoneInfo(&quot;Europe/Warsaw&quot;) #timezone.utc
DEFAULT_OUTPUT = &quot;telewizjabiznesowa.xml&quot;
#USER_AGENT = &quot;Mozilla/5.0 (compatible; XMLTV-EPG/1.0)&quot;
USER_AGENT = &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36&quot;
CHANNEL_TOKEN='86e89a49-9e7c-48da-8c29-7db6807e8f8b'

def parse_datetime(value):
    &quot;&quot;&quot;Zachowuje godzinę z API i interpretuje ją jako czas polski.&quot;&quot;&quot;
    if not value:
        return None

    try:
        parsed = datetime.fromisoformat(str(value).replace(&quot;Z&quot;, &quot;+00:00&quot;))

        # Usuwamy źródłową strefę bez przeliczania godziny.
        # Następnie przypisujemy strefę docelową.
        parsed = parsed.replace(tzinfo=None)
        return parsed.replace(tzinfo=TIMEZONE)

    except (ValueError, TypeError):
        logging.warning(&quot;Nie można odczytać daty: %r&quot;, value)
        return None

def localized_text(value, language=&quot;AB&quot;):
    &quot;&quot;&quot;Wydobywa tekst z pola, które może być zwykłym stringiem lub mapą języków.&quot;&quot;&quot;
    if isinstance(value, dict):
        text = value.get(language)
        if text is None:
            # Awaryjnie wybierz pierwszą niepustą wartość tekstową.
            text = next((v for v in value.values() if isinstance(v, str) and v.strip()), &quot;&quot;)
        return str(text).strip() if text is not None else &quot;&quot;
    if isinstance(value, str):
        return value.strip()
    return &quot;&quot;


def add_text(parent, tag, value, **attrs):
    node = ET.SubElement(parent, tag, attrs)
    node.text = value
    return node


def xmltv_timestamp(value):
    &quot;&quot;&quot;XMLTV zapisuje czas lokalny wraz z przesunięciem względem UTC.&quot;&quot;&quot;
#    value = value.astimezone(timezone.utc)
    return value.strftime(&quot;%Y%m%d%H%M%S %z&quot;)

#def xmltv_timestamp(value):
#    &quot;&quot;&quot;Zapisuje czas w UTC w formacie XMLTV.&quot;&quot;&quot;
#    value = value.astimezone(timezone.utc)
#    return value.strftime(&quot;%Y%m%d%H%M%S +0000&quot;)


def fetch_schedule(token, timeout):
    url = API_URL
    started = time.monotonic()
    try:
        response = requests.get(
            url,
            params={&quot;token&quot;: token},
            headers={&quot;User-Agent&quot;: USER_AGENT, &quot;Accept&quot;: &quot;application/json&quot;},
            timeout=(15, timeout),
        )
        elapsed = time.monotonic() - started
        response.raise_for_status()
        try:
            data = response.json()
        except requests.exceptions.JSONDecodeError as exc:
            raise RuntimeError(&quot;API nie zwróciło poprawnego JSON-a.&quot;) from exc
        logging.info(
            &quot;Pobrano odpowiedź HTTP %s w %.2f s (%s bajtów).&quot;,
            response.status_code, elapsed, len(response.content)
        )
    except requests.RequestException as exc:
        raise RuntimeError(f&quot;Błąd pobierania danych z API: {exc}&quot;) from exc

    if not isinstance(data, dict):
        raise RuntimeError(&quot;Nieoczekiwany format odpowiedzi API: oczekiwano obiektu JSON.&quot;)
    schedule = data.get(&quot;schedule&quot;)
    if not isinstance(schedule, list):
        keys = &quot;, &quot;.join(data.keys())
        raise RuntimeError(f&quot;Brak listy 'schedule' w odpowiedzi API. Dostępne pola: {keys}&quot;)
    return schedule


def programme_bounds(now, days_ahead):
    start = now.replace(hour=0, minute=0, second=0, microsecond=0)
    # Koniec jest wyłączny: przy --days 2 obejmujemy dziś, jutro i pojutrze.
    end_date = start.date() + timedelta(days=days_ahead + 1)
    end = datetime.combine(end_date, dt_time.min, tzinfo=TIMEZONE)
    return start, end


def build_xml(schedule, output, days_ahead, channel_id, channel_name):
    now = datetime.now(TIMEZONE)
    start_bound, end_bound = programme_bounds(now, days_ahead)

    root = ET.Element(&quot;tv&quot;, {&quot;source-info-name&quot;: &quot;MediaTool&quot;, &quot;generator-info-name&quot;: &quot;telewizjabiznesowa_epg.py&quot;})
    channel = ET.SubElement(root, &quot;channel&quot;, {&quot;id&quot;: channel_id})
    add_text(channel, &quot;display-name&quot;, channel_name, lang=&quot;pl&quot;)

    programmes = []
    skipped = 0
    for item in schedule:
        if not isinstance(item, dict):
            skipped += 1
            continue

        start = parse_datetime(item.get(&quot;startTime&quot;))
        end = parse_datetime(item.get(&quot;endTime&quot;))
        if not start or not end or end &lt;= start:
            skipped += 1
            continue

        # Zachowujemy audycje przecinające wybrany zakres.
        if end &lt;= start_bound or start &gt;= end_bound:
            continue

        title = localized_text(item.get(&quot;title&quot;))
        episode_title = localized_text(item.get(&quot;episodeTitle&quot;))
        if not title:
            title = episode_title or &quot;Program&quot;

        programme = ET.Element(
            &quot;programme&quot;,
            {
                &quot;start&quot;: xmltv_timestamp(start),
                &quot;stop&quot;: xmltv_timestamp(end),
                &quot;channel&quot;: channel_id,
            },
        )
        add_text(programme, &quot;title&quot;, title, lang=&quot;pl&quot;)
        if episode_title and episode_title.casefold() != title.casefold():
            add_text(programme, &quot;sub-title&quot;, episode_title, lang=&quot;pl&quot;)

        # Dodatkowe pola dodajemy tylko wtedy, gdy faktycznie są obecne w JSON-ie.
   # Pełny opis audycji: synopsis.PL.longSynopsis
        synopsis = item.get(&quot;synopsis&quot;)
        description = &quot;&quot;

        if isinstance(synopsis, dict):
            synopsis_pl = synopsis.get(&quot;PL&quot;)
            if isinstance(synopsis_pl, dict):
                long_synopsis = synopsis_pl.get(&quot;longSynopsis&quot;)
                if isinstance(long_synopsis, str):
                    description = long_synopsis.strip()

        # Awaryjnie wykorzystaj dotychczasowe pole description.
        if not description:
            description = localized_text(item.get(&quot;description&quot;))

        if description:
            add_text(programme, &quot;desc&quot;, description, lang=&quot;pl&quot;)

        # Obraz audycji: images.stillScene
        images = item.get(&quot;images&quot;)
        if isinstance(images, dict):
            image_url = images.get(&quot;stillScene&quot;)
            if isinstance(image_url, str) and image_url.strip():
                ET.SubElement(
                    programme,
                    &quot;icon&quot;,
                    {&quot;src&quot;: image_url.strip()}
                )

        # Data produkcji: productionDate, np. 2024-12-05.
        production_date = item.get(&quot;productionDate&quot;)
        if isinstance(production_date, str) and production_date.strip():
            try:
                date_value = datetime.strptime(
                    production_date.strip()[:10], &quot;%Y-%m-%d&quot;
                ).strftime(&quot;%Y%m%d&quot;)
                add_text(programme, &quot;date&quot;, date_value)
            except ValueError:
                logging.warning(
                    &quot;Nieprawidłowa data produkcji: %r&quot;, production_date
                )

        # Kategoria, jeśli występuje w odpowiedzi API.
        category = localized_text(item.get(&quot;category&quot;))
        if category:
            add_text(programme, &quot;category&quot;, category, lang=&quot;pl&quot;)

        programmes.append((start, programme))

    programmes.sort(key=lambda pair: pair[0])
    for _, programme in programmes:
        root.append(programme)

    tree = ET.ElementTree(root)
    try:
        ET.indent(tree, space=&quot;  &quot;)
    except AttributeError:
        pass

    output_path = Path(output).expanduser()
    output_path.parent.mkdir(parents=True, exist_ok=True)
    tree.write(output_path, encoding=&quot;utf-8&quot;, xml_declaration=True)

    return output_path, len(programmes), skipped, start_bound, end_bound


def main():
    parser = argparse.ArgumentParser(description=&quot;Pobiera EPG Telewizji Biznesowej z MediaTool i zapisuje XMLTV.&quot;)
    parser.add_argument(&quot;-o&quot;, &quot;--output&quot;, default=DEFAULT_OUTPUT, help=f&quot;Plik wyjściowy (domyślnie: {DEFAULT_OUTPUT})&quot;)
    parser.add_argument(&quot;--days&quot;, type=int, default=2, help=&quot;Ile dni naprzód poza dzisiejszym dniem; domyślnie 2&quot;)
    parser.add_argument(&quot;--channel-id&quot;, default=&quot;Telewizja Biznesowa&quot;, help=&quot;Identyfikator kanału XMLTV&quot;)
    parser.add_argument(&quot;--channel-name&quot;, default=&quot;Telewizja Biznesowa&quot;, help=&quot;Nazwa kanału XMLTV&quot;)
    parser.add_argument(&quot;--timeout&quot;, type=int, default=120, help=&quot;Limit czasu odpowiedzi API w sekundach&quot;)
    parser.add_argument(&quot;-v&quot;, &quot;--verbose&quot;, action=&quot;store_true&quot;, help=&quot;Więcej informacji diagnostycznych&quot;)
    args = parser.parse_args()

    logging.basicConfig(
        level=logging.DEBUG if args.verbose else logging.INFO,
        format=&quot;%(asctime)s %(levelname)s: %(message)s&quot;,
    )

    if args.days &lt; 0 or args.days &gt; 6:
        parser.error(&quot;--days musi być w zakresie 0–6.&quot;)

    token = CHANNEL_TOKEN
    if not token:
        logging.error(&quot;Brak tokenu. Ustaw zmienną środowiskową CHANNEL_TOKEN.&quot;)
        logging.error(&quot;Przykład: export CHANNEL_TOKEN='TWÓJ_TOKEN'&quot;)
        return 2

    try:
        schedule = fetch_schedule(token, args.timeout)
        output, count, skipped, start, end = build_xml(
            schedule, args.output, args.days, args.channel_id, args.channel_name
        )
    except (RuntimeError, OSError) as exc:
        logging.error(&quot;%s&quot;, exc)
        return 1

    logging.info(&quot;Zakres EPG: %s – %s (koniec wyłączny).&quot;, start.isoformat(), end.isoformat())
    logging.info(&quot;Zapisano %d audycji do: %s&quot;, count, output.resolve())
    if skipped:
        logging.warning(&quot;Pominięto %d nieprawidłowych rekordów.&quot;, skipped)
    if count == 0:
        logging.warning(&quot;Nie znaleziono audycji w wybranym zakresie. Sprawdź zakres API i format dat.&quot;)
    return 0


if __name__ == &quot;__main__&quot;:
    sys.exit(main())
</code></pre>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Jaki TV Stick wybrać?]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6767</link>
			<pubDate>Wed, 21 Oct 2026 20:43:47 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=3134">steve4</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6767</guid>
			<description><![CDATA[Nie mam doświadczenia w tego typu sprzętach a chciałem zakupić dla córki, do starszego TV, pod wej. HDMI - TV Stick'a. Chodzi o to, że starszy TV (smart) Samsung córki przestał obsługiwać apkę "Polsat Box Go", która była córce potrzebna. Ponadto chciałem też docelowo zainstalować: Disney +; HBO MAX a także w przyszłości - KODI.<br />
Trochę czytałem na temat TV Box-ów, które są chyba bardziej popularne do tych tematów, ale córka chciała żeby to "coś" było małe i najlepiej niewidoczne i stąd pomysł na TV Stick-a. Córka podsunęła mi coś takiego:<br />
<br />
1. Odtwarzacz multimedialny 4K XIAOMI MI Stick TV Czarny:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
lub<br />
<br />
2. Odtwarzacz multimedialny 4K XIAOMI Mi TV Stick 2nd Gen Czarny:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
Ten drugi ma na pokładzie system Google TV a chyba lepiej żeby był z Androidem no i 8 GB pamięci wbudowanej to chyba trochę mało...?<br />
Proszę o pomoc - co myślicie o tych sprzętach? A może macie inne, lepsze propozycje?<br />
Dziękuję i pozdrawiam.]]></description>
			<content:encoded><![CDATA[Nie mam doświadczenia w tego typu sprzętach a chciałem zakupić dla córki, do starszego TV, pod wej. HDMI - TV Stick'a. Chodzi o to, że starszy TV (smart) Samsung córki przestał obsługiwać apkę "Polsat Box Go", która była córce potrzebna. Ponadto chciałem też docelowo zainstalować: Disney +; HBO MAX a także w przyszłości - KODI.<br />
Trochę czytałem na temat TV Box-ów, które są chyba bardziej popularne do tych tematów, ale córka chciała żeby to "coś" było małe i najlepiej niewidoczne i stąd pomysł na TV Stick-a. Córka podsunęła mi coś takiego:<br />
<br />
1. Odtwarzacz multimedialny 4K XIAOMI MI Stick TV Czarny:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
lub<br />
<br />
2. Odtwarzacz multimedialny 4K XIAOMI Mi TV Stick 2nd Gen Czarny:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
Ten drugi ma na pokładzie system Google TV a chyba lepiej żeby był z Androidem no i 8 GB pamięci wbudowanej to chyba trochę mało...?<br />
Proszę o pomoc - co myślicie o tych sprzętach? A może macie inne, lepsze propozycje?<br />
Dziękuję i pozdrawiam.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Aeon Tajo - spolszczenie interfejsu i ustawień]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6753</link>
			<pubDate>Sun, 11 Oct 2026 10:08:01 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=10454">arkady1964</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6753</guid>
			<description><![CDATA[Znana skórka z oficjalnego repozytorium Kodi. <br />
<br />
Niedawno, nareszcie otrzymała interfejs, w tym opis ustawień spolonizowany. Niestety, ale w bardzo wielu skórkach polonizacja interfejsu i opisu ustawień jest tylko częściowa, tak do niedawna było w Aeon Tajo. Dla osób ze słabszą znajomością języka angielskiego ułatwia to znacznie obsługę tej ciekawej skórki.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Aeon Tajo</span><br />
<br />
Autor: manfeed<br />
Github: <br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
Oficjalny wątek: <br />
wersja 20  <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
wersja 21  <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
Repozytorium Kodi  v20, v21, v22<br />
Instalacja skóry:<br />
System &gt; Interfejs &gt; Wygląd i działanie/Skóra &gt; Pobierz więcej...  &gt; Aeon Tajo<br />
<br />
Skórka jest dość lekka i szybka. Ma Bardzo czytelny interfejs, wygodny do obsługi pilotem od Android TV oraz pilotem od Air Mouse (jest duży i szeroki pasek postępu filmu, co ułatwia bardzo przewijanie pilotem Air Mouse). <br />
Skórka ma schludny wygląd, bez nadmiaru elementów, które mogą utrudniać obsługę. Do tego czarne tło skórki ułatwia obsługę w nocy, czcionka jest duża dająca dobry odczyt tekstu. Aeon Tajo dobrze działa na Android TV i jest cały czas rozwijana przez aktualizacje. <br />
<br />
Uwaga.  Zaznaczam, że jest jedna nietypowa sprawa w skórce Aeon Tajo tj. umiejscowienie zakładki  Dodatki .  Nie znajduje się ona w Ustawieniach lecz w Programach:<br />
Programy &gt; Dodatki<br />
<br />
Z ustawień dla ułatwienia przeglądu info o filmie, można załączyć automatyczne przewijanie opisu i recenzji filmu:<br />
SYSTEM &gt; Opcje skórki &gt; Widoki &gt; Przewijaj opis i recenzję (załączone - zielona kropka w okręgu)  Kolor zielony w tym ustawieniu oznacza bardzo mały wpływ na wydajność, pomarańczowy zaś umiarkowany.<br />
<br />
Jest jeszcze sporo innych ustawień w  skórce Aeon Tajo, ale te zależą od indywidualnych preferencji użytkownika skórki Aeon Tajo.<br />
<br />
Pozdrawiam]]></description>
			<content:encoded><![CDATA[Znana skórka z oficjalnego repozytorium Kodi. <br />
<br />
Niedawno, nareszcie otrzymała interfejs, w tym opis ustawień spolonizowany. Niestety, ale w bardzo wielu skórkach polonizacja interfejsu i opisu ustawień jest tylko częściowa, tak do niedawna było w Aeon Tajo. Dla osób ze słabszą znajomością języka angielskiego ułatwia to znacznie obsługę tej ciekawej skórki.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Aeon Tajo</span><br />
<br />
Autor: manfeed<br />
Github: <br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
Oficjalny wątek: <br />
wersja 20  <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
wersja 21  <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
Repozytorium Kodi  v20, v21, v22<br />
Instalacja skóry:<br />
System &gt; Interfejs &gt; Wygląd i działanie/Skóra &gt; Pobierz więcej...  &gt; Aeon Tajo<br />
<br />
Skórka jest dość lekka i szybka. Ma Bardzo czytelny interfejs, wygodny do obsługi pilotem od Android TV oraz pilotem od Air Mouse (jest duży i szeroki pasek postępu filmu, co ułatwia bardzo przewijanie pilotem Air Mouse). <br />
Skórka ma schludny wygląd, bez nadmiaru elementów, które mogą utrudniać obsługę. Do tego czarne tło skórki ułatwia obsługę w nocy, czcionka jest duża dająca dobry odczyt tekstu. Aeon Tajo dobrze działa na Android TV i jest cały czas rozwijana przez aktualizacje. <br />
<br />
Uwaga.  Zaznaczam, że jest jedna nietypowa sprawa w skórce Aeon Tajo tj. umiejscowienie zakładki  Dodatki .  Nie znajduje się ona w Ustawieniach lecz w Programach:<br />
Programy &gt; Dodatki<br />
<br />
Z ustawień dla ułatwienia przeglądu info o filmie, można załączyć automatyczne przewijanie opisu i recenzji filmu:<br />
SYSTEM &gt; Opcje skórki &gt; Widoki &gt; Przewijaj opis i recenzję (załączone - zielona kropka w okręgu)  Kolor zielony w tym ustawieniu oznacza bardzo mały wpływ na wydajność, pomarańczowy zaś umiarkowany.<br />
<br />
Jest jeszcze sporo innych ustawień w  skórce Aeon Tajo, ale te zależą od indywidualnych preferencji użytkownika skórki Aeon Tajo.<br />
<br />
Pozdrawiam]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Komputronik zapowiedział nowego PC Level]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6751</link>
			<pubDate>Wed, 07 Oct 2026 20:58:45 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=51380">stannasia</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6751</guid>
			<description><![CDATA[Ktoś może być zainteresowany — <span style="font-weight: bold;" class="mycode_b">Komputronik</span> zapowiedział nowego PC Level. <br />
<br />
Informacja pojawiła się na ich kanale nadawczym.<br />
<br />
Jeśli ktoś rozgląda się za gotowym komputerem, można zapisać się do newslettera, żeby nie przegapić premiery:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://i.imgur.com/Jw02gjrl.jpeg" loading="lazy"  alt="[Obrazek: Jw02gjrl.jpeg]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Ktoś może być zainteresowany — <span style="font-weight: bold;" class="mycode_b">Komputronik</span> zapowiedział nowego PC Level. <br />
<br />
Informacja pojawiła się na ich kanale nadawczym.<br />
<br />
Jeśli ktoś rozgląda się za gotowym komputerem, można zapisać się do newslettera, żeby nie przegapić premiery:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://i.imgur.com/Jw02gjrl.jpeg" loading="lazy"  alt="[Obrazek: Jw02gjrl.jpeg]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Vantage TV, Show TV, Red Carpet]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6750</link>
			<pubDate>Mon, 05 Oct 2026 21:50:17 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=2193">memek86</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6750</guid>
			<description><![CDATA[Witam,<br />
<br />
proszę o integrację Vantage TV <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a>  <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> lub <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
Ponadto EPG dla "Show TV" jest takie samo jak dla "Red Carpet". Show TV wydaje się być prawidłowe, a błędne Red Carpet International.<br />
Nie znalazłem źródła EPG dla Red Carpet.<br />
<br />
Pozdrawiam]]></description>
			<content:encoded><![CDATA[Witam,<br />
<br />
proszę o integrację Vantage TV <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a>  <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> lub <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a> <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
Ponadto EPG dla "Show TV" jest takie samo jak dla "Red Carpet". Show TV wydaje się być prawidłowe, a błędne Red Carpet International.<br />
Nie znalazłem źródła EPG dla Red Carpet.<br />
<br />
Pozdrawiam]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Poobi, może ciekawa apka?]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6747</link>
			<pubDate>Sun, 04 Oct 2026 13:44:40 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=10454">arkady1964</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6747</guid>
			<description><![CDATA[Wszystkie przeglądarki dedykowane na Android TV, nawet te najlepsze pod względem blokowania reklam i tak ustępują pod względem blokowania reklam oraz wyskakujących okienek kilku przeglądarkom zrobionych na tzw. "zwykłego" Androida.<br />
Przeglądarek dedykowanych na Android TV jest niedużo, zaś tych. które jako tako blokują reklam reklamy jest niewiele.<br />
<br />
Przez weekend ponownie przetestowałem dosłownie wszystkie przeglądarki internetowe dedykowane na Android TV (obecnie jest ich trochę dostępnych).<br />
<br />
Wydaje mi się, że pomimo ograniczeń najlepiej sprawują się ZEUS TV Browser i BrowseHere. Jest jeszcze kilka w miarę dobrych, jak na Android TV.<br />
Jednak jak wspomniałem wcześniej niektóre przeglądarki ze "zwykłego" Androida mają lepsze blokowanie reklam. Co prawda można je z pliku APK zainstalować na Android TV, ale do sterowania wymagają pilota Air Mouse lub myszki komputerowej na USB.<br />
<br />
W Internecie na Githubie znalazłem aplikację Poobi, która według zapewnień autora ma przeglądarkę świetnie blokującą reklamy na sprzęcie z Android TV/Google TV. Poobi dla swojego silnika używa bardzo skutecznego blokera z Brave tj. Adblock Rust, w nim korzysta z list Easylist, Easyprivacy i uBO do blokowania reklam.<br />
Niestety, nie udało mi się jej zainstalować na moim box-e z Android TV, ponieważ wyskoczył błąd w trakcie instalacji (może to wina mojego sprzętu). <br />
<br />
Gwoli informacji podaję źródło z Githuba, gdzie jest ona opublikowana:<br />
Główna strona wydania Poobi:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
Strona z wersjami Poobi na różne architektury procesora:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
Według zapewnień jej autora, <span style="font-weight: bold;" class="mycode_b">Poobi</span>: <br />
"Poobi to szybka, nowoczesna i wysoce zoptymalizowana przeglądarka internetowa i streamer multimediów, zaprojektowana specjalnie dla telewizorów z systemem Android TV, Google TV i dekoderów z systemem Android."<br />
<br />
Pozdrawiam]]></description>
			<content:encoded><![CDATA[Wszystkie przeglądarki dedykowane na Android TV, nawet te najlepsze pod względem blokowania reklam i tak ustępują pod względem blokowania reklam oraz wyskakujących okienek kilku przeglądarkom zrobionych na tzw. "zwykłego" Androida.<br />
Przeglądarek dedykowanych na Android TV jest niedużo, zaś tych. które jako tako blokują reklam reklamy jest niewiele.<br />
<br />
Przez weekend ponownie przetestowałem dosłownie wszystkie przeglądarki internetowe dedykowane na Android TV (obecnie jest ich trochę dostępnych).<br />
<br />
Wydaje mi się, że pomimo ograniczeń najlepiej sprawują się ZEUS TV Browser i BrowseHere. Jest jeszcze kilka w miarę dobrych, jak na Android TV.<br />
Jednak jak wspomniałem wcześniej niektóre przeglądarki ze "zwykłego" Androida mają lepsze blokowanie reklam. Co prawda można je z pliku APK zainstalować na Android TV, ale do sterowania wymagają pilota Air Mouse lub myszki komputerowej na USB.<br />
<br />
W Internecie na Githubie znalazłem aplikację Poobi, która według zapewnień autora ma przeglądarkę świetnie blokującą reklamy na sprzęcie z Android TV/Google TV. Poobi dla swojego silnika używa bardzo skutecznego blokera z Brave tj. Adblock Rust, w nim korzysta z list Easylist, Easyprivacy i uBO do blokowania reklam.<br />
Niestety, nie udało mi się jej zainstalować na moim box-e z Android TV, ponieważ wyskoczył błąd w trakcie instalacji (może to wina mojego sprzętu). <br />
<br />
Gwoli informacji podaję źródło z Githuba, gdzie jest ona opublikowana:<br />
Główna strona wydania Poobi:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
Strona z wersjami Poobi na różne architektury procesora:<br />
<a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
Według zapewnień jej autora, <span style="font-weight: bold;" class="mycode_b">Poobi</span>: <br />
"Poobi to szybka, nowoczesna i wysoce zoptymalizowana przeglądarka internetowa i streamer multimediów, zaprojektowana specjalnie dla telewizorów z systemem Android TV, Google TV i dekoderów z systemem Android."<br />
<br />
Pozdrawiam]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[HP OmniBook 5 AI 16]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6744</link>
			<pubDate>Sat, 03 Oct 2026 03:27:20 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=51380">stannasia</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6744</guid>
			<description><![CDATA[Od dzisiaj od 8:00 rano do końca niedzieli w apce Komputronika ma być dobra cena na HP OmniBooka 5 AI 16. <br />
<br />
Jak za ekran 16" OLED, 16GB RAM i procesor Ultra 7 255U, okazja całkiem solidna. <br />
? <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgdesktop_topekmobile1856x412jpg130kb_25489d24f857c30f9685d4424e55d7e4.jpg" loading="lazy"  width="957" height="213" alt="[Obrazek: gen_wew_sgdesktop_topekmobile1856x412jpg...55d7e4.jpg]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Od dzisiaj od 8:00 rano do końca niedzieli w apce Komputronika ma być dobra cena na HP OmniBooka 5 AI 16. <br />
<br />
Jak za ekran 16" OLED, 16GB RAM i procesor Ultra 7 255U, okazja całkiem solidna. <br />
? <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgdesktop_topekmobile1856x412jpg130kb_25489d24f857c30f9685d4424e55d7e4.jpg" loading="lazy"  width="957" height="213" alt="[Obrazek: gen_wew_sgdesktop_topekmobile1856x412jpg...55d7e4.jpg]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[„Nie trzeba miliona żeby mieć smartfona!”]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6741</link>
			<pubDate>Wed, 30 Sep 2026 03:35:16 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=51380">stannasia</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6741</guid>
			<description><![CDATA[Jak ktoś z Was planuje wymianę telefonu na nowy semestr, to polecam zerknąć na akcję Komputronika „Nie trzeba miliona żeby mieć smartfona!”. <br />
<br />
Bardzo ułatwili szukanie, robiąc progi cenowe do 1000 zł, 1500 zł i 2000 zł (z opcjami od 399 zł). <br />
<br />
Bestsellerowo wygląda Xiaomi Redmi Note 17 za 1099 zł lub w opcji 5G za 1249 zł. <br />
A jeśli chcecie przetestować droższe modele, fajną opcją jest wynajem – np. iPhone 17 Pro za 199 zł/msc, Galaxy S26 za 125 zł/msc albo Z Flip 8 za 162 zł/msc: <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgmobile_topekmobile624x392jpg50kb_053ed0926adcc872efc7e119ff3bfe3a.aggr-m.jpg" loading="lazy"  alt="[Obrazek: gen_wew_sgmobile_topekmobile624x392jpg50...aggr-m.jpg]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Jak ktoś z Was planuje wymianę telefonu na nowy semestr, to polecam zerknąć na akcję Komputronika „Nie trzeba miliona żeby mieć smartfona!”. <br />
<br />
Bardzo ułatwili szukanie, robiąc progi cenowe do 1000 zł, 1500 zł i 2000 zł (z opcjami od 399 zł). <br />
<br />
Bestsellerowo wygląda Xiaomi Redmi Note 17 za 1099 zł lub w opcji 5G za 1249 zł. <br />
A jeśli chcecie przetestować droższe modele, fajną opcją jest wynajem – np. iPhone 17 Pro za 199 zł/msc, Galaxy S26 za 125 zł/msc albo Z Flip 8 za 162 zł/msc: <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgmobile_topekmobile624x392jpg50kb_053ed0926adcc872efc7e119ff3bfe3a.aggr-m.jpg" loading="lazy"  alt="[Obrazek: gen_wew_sgmobile_topekmobile624x392jpg50...aggr-m.jpg]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Dni Komponentów]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6740</link>
			<pubDate>Mon, 28 Sep 2026 23:12:56 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=51380">stannasia</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6740</guid>
			<description><![CDATA[Do końca miesiąca w Komputroniku trwają Dni Komponentów. <br />
<br />
W ramach akcji można znaleźć na promocji wybrane podzespoły komputerowe, więc jeśli ktoś planuje złożyć nowy komputer albo wymienić którąś z części, może sprawdzić aktualną ofertę.<br />
<br />
Link: <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgmobile_topekmobile624x392jpg50kb_09448e7a864b5efddaa5e27fd6b6dfe7.aggr-m.jpg" loading="lazy"  alt="[Obrazek: gen_wew_sgmobile_topekmobile624x392jpg50...aggr-m.jpg]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Do końca miesiąca w Komputroniku trwają Dni Komponentów. <br />
<br />
W ramach akcji można znaleźć na promocji wybrane podzespoły komputerowe, więc jeśli ktoś planuje złożyć nowy komputer albo wymienić którąś z części, może sprawdzić aktualną ofertę.<br />
<br />
Link: <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgmobile_topekmobile624x392jpg50kb_09448e7a864b5efddaa5e27fd6b6dfe7.aggr-m.jpg" loading="lazy"  alt="[Obrazek: gen_wew_sgmobile_topekmobile624x392jpg50...aggr-m.jpg]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Lenovo Yoga Slim 7 14]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6739</link>
			<pubDate>Sat, 26 Sep 2026 01:17:29 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=51380">stannasia</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6739</guid>
			<description><![CDATA[W ten weekend w aplikacji Komputronik będzie promocja na Lenovo Yoga Slim 7 14.<br />
Promocja rozpocznie się w sobotę o 8:00 i potrwa do końca niedzieli.<br />
<br />
Specyfikacja: Intel Core Ultra 5 226V, 16 GB RAM, SSD 512 GB, ekran 14" WUXGA OLED, Intel Arc Graphics, Windows 11 Home.<br />
<br />
Link: <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgdesktop_topekmobile1856x412jpg130kb_bc47fab51d21fb16136fd5ed7d5d0aed.jpg" loading="lazy"  alt="[Obrazek: gen_wew_sgdesktop_topekmobile1856x412jpg...5d0aed.jpg]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[W ten weekend w aplikacji Komputronik będzie promocja na Lenovo Yoga Slim 7 14.<br />
Promocja rozpocznie się w sobotę o 8:00 i potrwa do końca niedzieli.<br />
<br />
Specyfikacja: Intel Core Ultra 5 226V, 16 GB RAM, SSD 512 GB, ekran 14" WUXGA OLED, Intel Arc Graphics, Windows 11 Home.<br />
<br />
Link: <a href="https://forum.kodiwpigulce.pl/member.php?action=register"><b>By zobaczyć linki musisz się zalogować lub zarejestrować.</b></a><br />
<br />
<img src="https://static.komputronik.pl/banners/gen_wew_sgdesktop_topekmobile1856x412jpg130kb_bc47fab51d21fb16136fd5ed7d5d0aed.jpg" loading="lazy"  alt="[Obrazek: gen_wew_sgdesktop_topekmobile1856x412jpg...5d0aed.jpg]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Jest ból]]></title>
			<link>https://forum.kodiwpigulce.pl/showthread.php?tid=6734</link>
			<pubDate>Sun, 20 Sep 2026 10:23:21 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.kodiwpigulce.pl/member.php?action=profile&uid=608">sky02</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.kodiwpigulce.pl/showthread.php?tid=6734</guid>
			<description><![CDATA[Tu walczymy o lepsze EPG  <img src="https://forum.kodiwpigulce.pl/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />]]></description>
			<content:encoded><![CDATA[Tu walczymy o lepsze EPG  <img src="https://forum.kodiwpigulce.pl/images/smilies/wink.png" alt="Wink" title="Wink" class="smilie smilie_2" />]]></content:encoded>
		</item>
	</channel>
</rss>