Skip to main content

proxytv.ru IPTV 频道解析器和机器人(如 ProxyBot)

项目描述

PTV机器人

https://proxytv.ru/的机器人(ProxyBot)

点安装PTVRobot

python -m PTVRobot --help

usage: PTVRobot [-h] [-f] [-t] [-q QUERY] [-cd COOLDOWN] [-x PROXY] [-chf CHANNEL_FILTERS] [-pl [PL ...]] [-o OUTPUT]

options:
  -h, --help            show this help message and exit
  -f, --forever         Run the script again every cooldown seconds.
  -t, --threading       Send and parse the request for each playlist in a separate thread. (Default: True)
  -q QUERY, --query QUERY
                        Send only one request with the specified text. For example: "ch: HD" or "pl: aist"
  -cd COOLDOWN, --cooldown COOLDOWN
                        Cooldown in seconds. (Default: 1)
  -x PROXY, --proxy PROXY
                        Proxy <protocol>://<ip>
  -chf CHANNEL_FILTERS, --channel-filters CHANNEL_FILTERS
                        Filters for received channels
  -pl [PL ...]          Playlist name(s)
  -o OUTPUT, --output OUTPUT
                        Output .m3u(8) file. (Default: <stdout>)

Если запустить без доп。аргументов, будут получены все каналы, всех плейлистов (plist) И записаны в файл 输出, по умолчание выведет результат в форате m3.u

Аругмент -pl: список плейлистов по которым будет происходить поиск, по умолчанию все доступные。

Код

from multiprocessing.pool import ThreadPool

from PTVRobot.ExtinfParse import *
from PTVRobot.Search import *
from PTVRobot.Types import *
from PTVRobot.static import *

__all__ = (
    'ProxyTVRobot', 'ProxyTVRobotThreading',
    'Extinf', 'Srch', 'SearchEngine', 'OneChannel',
    'save_extinf', 'parse_extinf_format',
    'Proxy'
)

SearchEngine = Srch()


class ProxyTVRobot:
    """A class describing a parser robot. Designed for inheritance."""

    __slots__ = ('end_extinf', 'plist', 'PLIST_LEN', 'search_engine', 'pl_number', 'output')
    sort_key = None  # sort channels

    def __init__(self, forever: bool = True, cooldown: typing.SupportsFloat = 0.,
                 search: Srch = None, output=None, except_types=(Exception,)):
        """Runs the order of actions, if forever is true then it does it forever."""
        ...

    def post_init(self):
        """Execute after initialization."""
        pass

    def loop(self):
        self.on_start()
        self.during()
        self.on_end()

    def on_start(self):
        """Initial actions."""
        self.plist = self.search_engine.plist()
        self.PLIST_LEN = len(self.plist)
        self.end_extinf = Extinf()
        self.pl_number = 1

    def search_pl(self, pl_name: str):
        pl = self.search_engine.pl(pl_name)
        print(f'Pl: {pl_name} ({self.pl_number}/{self.PLIST_LEN}) Channels: {len(pl)}')
        self.end_extinf += pl
        self.pl_number += 1

    def during(self):
        """Actions in the middle of the process."""
        for pl_name in self.plist:
            self.search_pl(pl_name)

    def on_end(self):
        """Sort by self.sort_key function and save"""
        self.end_extinf.data.sort(key=self.sort_key)
        ch_count = len(self.end_extinf)
        print(f"Saving {ch_count} channel{'' if ch_count == 1 else 's'}")
        self.upload(save_extinf(self.end_extinf, self.output))

    def upload(self, fn: str):
        """Used to upload files to a remote host, used in on_end."""
        pass


class ProxyTVRobotThreading(ProxyTVRobot):
    """An example of implementing your own robot, with multithreading"""
    __slots__ = ('end_extinf', 'pl_number')

    def during(self):
        """Creates threads to search for each playlist."""
        with ThreadPool() as pool:
            pool.map(self.search_pl, self.plist)

Классы для наследования, при написании более сложных роботов。

Фильтры

Аргумент --channel-filters принимает файл с фильтрами в формате регулярного выражения, применяемого к выходному m3u формату

Существуют некоторое упрощения для более быстрого составления файла фильтров。Напомню, выходной m3u формат выглядит примерно так:

#EXTINF:-1 tvch-id="40025" group-title="ДЕТСКИЕ",DISNEY CHANNEL-40025
http://93.158.224.2:4022/udp/239.3.100.85:4321

Каждая строка в файле фильтров представляет собой фильтр в особом формате。

Чтобы канал прошёл фильтрацию, необходимо чтобы как минимум один фильтр к нему подошёл。

  1. \в начале строки всегда обрезается

  2. Чтобы фильтровать IP адреса (вторую строку), фильтр должен начинаться со знака:

  3. Чтобы проверить на присутствие подстроки в строке, фильтр должен начинаться с#

  4. Или любое регулярное выражение (при использовании #) регулярное выражение не применяется (строка экранируется), если строка начинается с :, регулярное выражение по прежнему проверяется, но уже на IP

  5. Все филтры не чувствительны к регистру ( re.IGNORECASE)


Было:

\:-1

节目:

:-1

:.+:4022.+

Найти все IP с портом 1234

http://93.158.224.2:/udp/239.3.100.85:4321 4022_


:#:4321
:.*:4321.*

http://93.158.224.2:4022/udp/239.3.100.85:4321


#group-title="ДЕТСКИЕ"
.*group-title="ДЕТСКИЕ".*

Найти все каналы в группе детских

#EXTINF:-1 tvch-id="40025" group-title="ДЕТСКИЕ",迪士尼频道-40025


#HD
.*HD.*

Тоже что и -q "ch:HD" аргумет

#EXTINF:-1 tvch-id="46046" group-title="ИНФ/РАЗВЛЕКАТЕЛЬНЫЕ",РОССИЯ 1HD<./kbd>-46046


Пример составления нужного плейлиста:

过滤器.txt

#NICKELODEON HD
#CARTOON NETWORK
#Рен ТВ
#ТНТ HD
#Пятница
#Россия 24

python -m PTVRobot -chf filters.txt -f -cd 120 -o tv.m3u8

Каждые 2 минуты будет обновляться файл tv.m3u8 с перечисленными выше каналами。


Вопросы задавайте на GitHub,на почту или загляните в исходный код,там всё прозрачно。

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

PTVRobot-1.2.2.tar.gz (13.0 kB 查看哈希

已上传 source

内置分布

PTVRobot-1.2.2-py3-none-any.whl (13.0 kB 查看哈希

已上传 py3