Organize a lista de reprodução de torrent-TV (Super Wash)

UPD O serviço Torrent-TV, que era a principal fonte de conteúdo, morreu, então o artigo não tem significado prático.

Os fluxos no serviço ilegal de Torrent-TV (Super Wash) são fluxos predominantemente originais de operadores ou de um satélite sem fixação. Estes são principalmente fluxos de vídeo entrelaçados. A TV Torrent oferece a mais alta qualidade possível, mas baixa estabilidade. Hoje existem alguns canais, amanhã não. Hoje, alguns canais funcionam bem, amanhã é ruim. Este serviço não é adequado para uso contínuo e sem problemas - pelo qual eles pagaram, ou seja, não pagou, então eles receberam. Mas é ótimo quando você precisa assistir a algo com alta qualidade (se o canal funcionar de forma estável nesse momento). Outro problema é a formação de uma lista pessoal conveniente. Isso será discutido em uma nota.



A lista de reprodução básica da TV torrent (Super Wash) contém mais de 1200 canais. Todos os tipos de países regionais, diferentes, duplicatas de SD e HD, diferentes canais de lixo etc. 200 a 300 canais pertencem aos telespectadores russos. Ao mesmo tempo, o agrupamento de canais aceito não é conveniente para todos. Parece que você pode pegar uma lista de reprodução da Torrent TV, organizá-la conforme exigido pela alma do perfeccionista. O problema é que os links do AceStream para os canais mudam periodicamente e a lista de reprodução preparada se torna inútil. I.e. Você precisa da geração automática de uma nova lista de reprodução atualizada em um formato conveniente para você. É isso que faremos.

Você precisará de:

  • Experiência na criação de programas para assistir a Torrent TV ("Super Wash") e saber o que é.
  • Roteador com suporte a Entware (se necessário, e algumas habilidades podem ser facilmente adaptadas às instruções do OpenWrt ou Entware nas próprias caixas).

A nota não aborda questões:

  • Escolhendo e configurando um gerenciador de IPTV.
  • Configurações do sistema como um todo para assistir a Torrent TV.
  • Recursos de caixas Android específicas para trabalhar com vídeo entrelaçado em geral e Torrent TV em particular.

Usaremos o programa no roteador, que quando solicitado pelo link, baixará a lista de reprodução atual de Torrent-TV, criará uma nova lista de reprodução e fornecerá:

  • Sua própria lista de canais com base na lista preparada de canais favoritos.
  • Você pode excluir automaticamente os canais SD se houver correspondência HD para eles.
  • Classifique os grupos e seus nomes de acordo com o seu desejo.
  • Nome do canal exibido como você deseja.
  • Classifique os canais em um grupo por HD / SD (primário) e nome.
  • Links internos para fontes de EPG.
  • A origem dos logotipos (assim como os próprios logotipos) e conformidade com o EPG para os canais de sua escolha.

Como tudo funcionará após o ajuste?


Adicione um link à lista de reprodução http://192.168.0.1:81/playlist.cgi (substitua 192.168.0.1 pelo endereço interno do seu roteador) no seu gerenciador de IPTV. Feito.



O princípio de operação é muito simples. O script playlist.cgi no roteador inicia o programa ttv.py, que, com base na lista de reprodução atual de TV torrent (carregada no momento do acesso) e na lista de canais favoritos, gera uma nova lista de reprodução e a distribui.

Instalando o software necessário no roteador


Conecte-se via SSH ao roteador. No Windows, você pode usar o cliente PuTTY para conectar a conexão.

Instale o software necessário:

opkg update opkg install wget ca-certificates mc python3 lighttpd-mod-cgi 

O wget é um programa para baixar arquivos. Será necessário apenas para a configuração inicial.

ca-certificates - certificados para o wget.

mc - gerenciador de arquivos Midnight Commander. É necessário apenas por causa do conveniente editor do mcedit. Se você está acostumado a usar outro editor de texto, o mc não pode ser instalado.

python3 é um intérprete Python.

lighttpd-mod-cgi - servidor de web lighttpd.

Baixar arquivos principais


 mkdir -p /opt/etc/ttv wget --no-check-certificate -O /opt/etc/ttv/ttv.py https://raw.githubusercontent.com/Kyrie1965/ttv/master/ttv.py wget --no-check-certificate -O /opt/share/www/playlist.cgi https://raw.githubusercontent.com/Kyrie1965/ttv/master/playlist.cgi chmod +x /opt/share/www/playlist.cgi 

Falarei sobre a consulta deles mais tarde, mas por enquanto apenas mostrarei o conteúdo. Não encontrei falhas no código Python, até o momento nunca escrevi nada em Python.

Conteúdo /opt/etc/ttv/ttv.py
 PLAYLIST_LOAD_URL = "http://91.92.66.82/trash/ttv-list/as.all.tag.player.m3u" TEMPLATE_SAVE_PATH = "/opt/etc/ttv/template.txt" FAVORITES_LOAD_PATH = "/opt/etc/ttv/favorites.txt" PLAYLIST_SAVE_PATH = "/opt/etc/ttv/playlist.m3u" LOGOS_URL = "" #LOGOS_URL = "https://raw.githubusercontent.com/Kyrie1965/ttv/master/logos/{}" #LOGOS_URL = "{}" STREAM_URL = "http://127.0.0.1:6878/ace/getstream?id={}&.mp4" #STREAM_URL = "acestream://{}" EPG_LINKS = "https://teleguide.info/download/new3/xmltv.xml.gz" #EPG_LINKS = "https://teleguide.info/download/new3/xmltv.xml.gz,http://programtv.ru/xmltv.xml.gz,http://api.torrent-tv.ru/ttv.xmltv.xml.gz" import re import urllib.request import os from operator import itemgetter as i from functools import cmp_to_key from urllib.parse import urlencode import gzip def cmp(a, b): return (a > b) - (a < b) def multikeysort(items, columns): comparers = [ ((i(col[1:].strip()), -1) if col.startswith('-') else (i(col.strip()), 1)) for col in columns ] def comparer(left, right): comparer_iter = ( cmp(fn(left), fn(right)) * mult for fn, mult in comparers ) return next((result for result in comparer_iter if result), 0) return sorted(items, key=cmp_to_key(comparer)) def loadChannels(content): lines = content.splitlines() returnChannels = {} pattern = re.compile("group-title=\"(.*?)\"") pattern2 = re.compile("tvg-logo=\"(.*?)\"") channelName = "" channelGroup = "" channelLogoLink = "" channelStreamID = "" waitURI = False for line in lines: if line.startswith("acestream"): if waitURI: channelStreamID = line[12:] HD = False if ("HD" in channelName) or ("UHD" in channelName) or ("4K" in channelName): HD = True tmpDict = {"name": channelName, "group": channelGroup, "stream": channelStreamID, "hd": HD, "logolink": channelLogoLink} returnChannels[channelName.upper()] = tmpDict waitURI = False elif line.startswith("#EXTINF"): index = line.rfind("\",") if (index == -1): continue channelName = line[index+2:] match = pattern.search(line) if match: channelGroup = match.group(1) else: channelGroup = "" match = pattern2.search(line) if match: channelLogoLink = match.group(1) else: channelLogoLink = "" waitURI = True return returnChannels def saveTemplate(content, channels, path): lines = content.splitlines() pattern = re.compile("group-title=\"(.*?)\"") waitURI = False channelName = "" channelReplace = "" channelNewName = "" channelEPG = "" channelGroup = "" channelStreamID = "" groupDict = {} currentGroup = 1 template="" for line in lines: if line.startswith("acestream"): if waitURI: channelStreamID = line[12:] template += channelName template += "/" template += channelReplace template += "/" template += channelNewName template += "/" template += channelEPG template += "/" template += channelName + ".png" template += "/" template += channelGroup template += "\n" waitURI = False elif line.startswith("#EXTINF"): x = line.split("\",") if (len(x) != 2): continue channelName = x[1] channelNewName = x[1] channelEPG = x[1] if (channels.get(channelName.upper() + " HD") != None): channelReplace = channelName + " HD" else: channelReplace = "-" match = pattern.search(x[0]) if match: channelGroup = match.group(1) if (groupDict.get(channelGroup)): channelGroup = groupDict.get(channelGroup) else: newGroupName = "{:02d}_{}".format(currentGroup, channelGroup) currentGroup += 1 groupDict[channelGroup] = newGroupName channelGroup = newGroupName else: channelGroup = "00_Unsigned" waitURI = True file = open(path,'w', encoding='utf-8') file.write(template) file.close() return def loadFavorites(content): returnChannels = {} lines = content.splitlines() for line in lines: parts = line.split('/') if len(parts) == 6: tmpDict = {"name": parts[0], "replace": parts[1], "newName": parts[2], "EPG": parts[3], "logo": parts[4], "group": parts[5]} returnChannels[parts[0].upper()] = tmpDict elif len(parts) == 5: #    tmpDict = {"name": parts[0], "replace": parts[1], "newName": parts[2], "EPG": parts[3], "group": parts[4], "logo": parts[0] + ".png"} returnChannels[parts[0].upper()] = tmpDict return returnChannels def savePlaylist(channels, favorites, path): returnChannels = [] currentChannels = set() for key, chDict in favorites.items(): if chDict["replace"] != "-": if favorites.get(chDict["replace"].upper()) != None and channels.get(chDict["replace"].upper()) != None: currentChannels.add(chDict["replace"]) elif channels.get(chDict["name"].upper()) != None: currentChannels.add(chDict["name"]) elif channels.get(chDict["name"].upper()) != None: currentChannels.add(chDict["name"]) for ch in currentChannels: chFromFavorites = favorites.get(ch.upper()) chFromChannels = channels.get(ch.upper()) tmpDict = {"name": chFromFavorites.get("newName"), "oldName": chFromFavorites.get("name"), "EPG": chFromFavorites.get("EPG"), "group": chFromFavorites.get("group"), "logof": chFromFavorites.get("logo"), "logoc": chFromChannels.get("logolink"), "stream": chFromChannels.get("stream"), "hd": chFromChannels.get("hd")} returnChannels.append(tmpDict) result = multikeysort(returnChannels, ['group', '-hd', 'name']) template="" template += "#EXTM3U url-tvg=" template += "\"" template += EPG_LINKS template += "\"" template += "\n" for n in result: group = n.get("group") if group.find("_", 2, 3) != -1: group = group[3:] if len(LOGOS_URL) > 0: template += "#EXTINF:-1 tvg-name=\"{}\" tvg-logo=\"{}\" group-title=\"{}\",{}".format(n.get("EPG"), LOGOS_URL.format(urllib.parse.quote(n.get("logof"))), group, n.get("name")) else: template += "#EXTINF:-1 tvg-name=\"{}\" tvg-logo=\"{}\" group-title=\"{}\",{}".format(n.get("EPG"), n.get("logoc"), group, n.get("name")) template += "\n" template += STREAM_URL.format(n.get("stream")) template += "\n" file = open(path,'w', encoding='utf-8') file.write(template) file.close() return result #response = urllib.request.urlopen(PLAYLIST_LOAD_URL) #content = response.read().decode("utf-8") #channels = loadChannels(content) content = "" request = urllib.request.Request(PLAYLIST_LOAD_URL) request.add_header('Accept-encoding', 'gzip') response = urllib.request.urlopen(request) if response.info().get('Content-Encoding') == 'gzip': gzipFile = gzip.GzipFile(fileobj=response) content = gzipFile.read().decode("utf-8") else: content = response.read().decode("utf-8") channels = loadChannels(content) if channels == None or (len(channels.keys()) == 0): exit() saveTemplate(content, channels, TEMPLATE_SAVE_PATH) exists = os.path.isfile(FAVORITES_LOAD_PATH) if exists: file = open(FAVORITES_LOAD_PATH,'r', encoding='utf-8') content = file.read() favorites = loadFavorites(content) savePlaylist(channels, favorites, PLAYLIST_SAVE_PATH) 


Conteúdo /opt/share/www/playlist.cgi
 #!/bin/sh PATH=/opt/sbin:/opt/bin:/opt/usr/sbin:/opt/usr/bin:/usr/sbin:/usr/bin:/sbin:/bin python3 /opt/etc/ttv/ttv.py echo "Content-Type: text/plain; charset=UTF-8" echo "" echo "$(cat /opt/etc/ttv/playlist.m3u)" 


Configuração e inicialização do servidor da Web


Abra o arquivo /opt/etc/lighttpd/lighttpd.conf :

 mcedit /opt/etc/lighttpd/lighttpd.conf 

Para colar do buffer, use Shift + Insert, salve - F2, saia - F10.

Altere a linha # server.port = 80 para:

 server.port = 81 

Abra o arquivo /opt/etc/lighttpd/conf.d/30-cgi.conf :

 mcedit /opt/etc/lighttpd/conf.d/30-cgi.conf 

Altere ".cgi" => "/ opt / bin / perl" para:

 ".cgi" => "/bin/sh" 

Inicie o servidor da web:

 /opt/etc/init.d/S80lighttpd start 

Crie uma lista de canais favoritos


Execute o programa ttv.py :

 python3 /opt/etc/ttv/ttv.py 

Um arquivo de modelo template.txt será criado na pasta / opt / etc / ttv . Este é um arquivo de texto simples. Será sempre relevante, ou seja, Quando o programa é iniciado, ele é substituído pelos dados atuais.

Cada linha deste arquivo corresponde a um canal de Torrent-TV e tem a forma:
CHANNEL_NAME / CHANGE_CHANNEL / YOUR_CHANNEL_NAME / YOUR_CHANNEL_NAME__EPG / YOUR_LOGO / SEU GRUPO

Por exemplo:

Amedia Premium / Amedia Premium HD / Amedia Premium / Amedia Premium / Amedia Premium.png / 11_Movies
Amedia Premium HD / - / Amedia Premium HD / Amedia Premium HD / Amedia Premium HD.png / 11_Movies

Salve este arquivo no seu computador para facilitar a edição (por exemplo, usando o WinSCP ). Renomeie-o para favorites.txt.

Edite o arquivo, deixando apenas os canais necessários.

CHANNEL_NAME - O nome do canal na lista de reprodução original.

CHANGE_CHANNEL - o nome do canal na lista de reprodução original para substituição. Coloque um "-" se uma substituição não for necessária. Por padrão, as substituições são substituídas automaticamente no modelo se o canal tiver uma opção HD. Por exemplo, na lista de reprodução original, existem o Amedia Premium e o Amedia Premium HD. Somente o Amedia Premium HD estará na lista final.

YOUR_CHANNEL_NAME é o nome de exibição no gerenciador de IPTV. Pode ser qualquer coisa e afeta apenas o nome exibido no gerenciador de IPTV. Por exemplo, o canal original é chamado "Paramount Comedy HD (Rússia)" e você o renomeia como "Paramount Comedy HD".

YOUR_CHANNEL_B__EPG_NAME - isso é necessário para total conformidade na fonte EPG selecionada. Por exemplo, o canal original é chamado "Match TV HD". E no EPG esse canal é chamado de "Match!". Mude este parâmetro para "Match!" e obtenha total conformidade com sua fonte de EPG. Portanto, para todos os canais, você pode aproximar a conformidade do EPG de 100%.

YOUR_LOGO - o nome do arquivo de logotipo. Por padrão, ttv.py obtém links de logotipo da lista de reprodução original, ou seja, YOUR_LOGO será ignorado. Para usá-lo, você precisa alterar o parâmetro LOGOS_URL em ttv.py (você lerá mais sobre isso mais tarde).

YOUR_GROUP - o nome do grupo de canais. Você pode usar um índice, um número de dois dígitos, antes do nome do grupo. Este índice determina a ordem dos grupos na lista de reprodução final (de menor para maior). Após a classificação, o índice será removido automaticamente do nome do grupo.

Aqui está um exemplo de um arquivo favorites.txt editado
 Amedia Premium/Amedia Premium HD/Amedia Premium/Amedia Premium/Amedia Premium.png/11_   Amedia Premium HD/-/Amedia Premium HD/Amedia Premium HD/Amedia Premium HD.png/11_   / HD///.png/12_  HD/-/ HD/ HD/ HD.png/12_ Viasat History/Viasat History HD/Viasat History/Viasat History/Viasat History.png/01_ Viasat History HD/-/Viasat History HD/Viasat History/Viasat History.png/01_ Discovery Channel/Discovery Channel HD/Discovery Channel/Discovery Channel/Discovery Channel.png/01_ Discovery Channel HD/-/Discovery Channel HD/Discovery Channel HD/Discovery Channel HD.png/01_ Discovery Science/Discovery Science HD/Discovery Science/Discovery Science/Discovery Science.png/01_ Discovery Science HD/-/Discovery Science HD/Discovery Science HD/Discovery Science HD.png/01_ Amedia Hit/Amedia Hit HD/Amedia Hit/Amedia Hit/Amedia Hit.png/11_   Amedia Hit HD/-/Amedia Hit HD/Amedia Hit HD/Amedia Hit HD.png/11_    /  HD/!/!/ .png/03_   HD/-/! HD/!/  HD.png/03_ Eurosport 1/Eurosport 1 HD/Eurosport 1/Eurosport 1/Eurosport 1.png/03_ Eurosport 1 HD/-/Eurosport 1 HD/Eurosport 1 HD/Eurosport 1 HD.png/03_ Paramount Comedy HD ()/-/Paramount Comedy HD/Paramount Comedy HD ()/Paramount Comedy HD ().png/11_   !  1/!  1 HD/!  1/!  1/!  1.png/03_ !  1 HD/-/!  1 HD/!  1 HD/!  1 HD.png/03_  1/ HD/ 1/ 1/ 1.png/13_-  HD/-/ HD/ HD/ HD.png/13_- 


Copie o arquivo favorites.txt preparado para a pasta / opt / etc / ttv no roteador.

Está tudo pronto. Você pode pegar a lista de reprodução em http://192.168.0.1:81/playlist.cgi (substitua 192.168.0.1 pelo endereço interno do seu roteador). Basta especificar o link no gerenciador de IPTV e você sempre terá sua lista de reprodução atual. O script playlist.cgi inicia o programa ttv.py, que, com base na lista de reprodução de torrent-TV atual (carregada no momento da chamada) e favorites.txt, gera uma nova lista de reprodução e fornece essa nova lista de reprodução.

Na saída, se todos os canais estiverem presentes na lista de reprodução atual (caso contrário, os canais ausentes serão ignorados), você obterá uma lista de reprodução tão elegante:

Lista de reprodução
#EXTM3U url-tvg="https://teleguide.info/download/new3/xmltv.xml.gz"
#EXTINF:-1 tvg-name="Discovery Channel HD" tvg-logo="http://1ttv.org/uploads/SmWnYlOvkJn8GzttT2UY0vmo8PYfMg.png" group-title="",Discovery Channel HD
http://127.0.0.1:6878/ace/getstream?id=b6e518df35bdffc7ea8fdd05025cec851941a102&.mp4
#EXTINF:-1 tvg-name="Discovery Science HD" tvg-logo="http://1ttv.org/uploads/Yjj1p6idV0HGD56Wz7JX5IeKfD44vz.png" group-title="",Discovery Science HD
http://127.0.0.1:6878/ace/getstream?id=03fb28986da9168dd56ec6891253bcc496c13eb5&.mp4
#EXTINF:-1 tvg-name="Viasat History" tvg-logo="http://1ttv.org/uploads/MWGbB8wJp5Gm4vbPHl0ktohDDjMKdr.png" group-title="",Viasat History
http://127.0.0.1:6878/ace/getstream?id=c6d943e1aac03c179b3af9e99d97ac6779c947c7&.mp4
#EXTINF:-1 tvg-name="Eurosport 1 HD" tvg-logo="http://1ttv.org/uploads/DpFTzUEA3y67Z6ObTPF4xH0XLNRAZm.png" group-title="",Eurosport 1 HD
http://127.0.0.1:6878/ace/getstream?id=70bd87520c622ba7dd6e41aface77d5b2f437f87&.mp4
#EXTINF:-1 tvg-name="!" tvg-logo="http://1ttv.org/uploads/MXyy9Uud7oDuH8JqVisjsD0csgAHnQ.png" group-title="",! HD
http://127.0.0.1:6878/ace/getstream?id=9af7ac309216464e67092deb23d312a20c483674&.mp4
#EXTINF:-1 tvg-name="! 1 HD" tvg-logo="http://1ttv.org/uploads/9PM8M6cN21wQ3M5isVZgjNepzUI4Ry.png" group-title="",! 1 HD
http://127.0.0.1:6878/ace/getstream?id=b8a1e8458419b63ad1c3fa7bd79431d9625c322d&.mp4
#EXTINF:-1 tvg-name="Amedia Hit HD" tvg-logo="http://1ttv.org/uploads/HdnTfcZCgP7Odm1cOKNq9j4yJDRiFP.png" group-title=" ",Amedia Hit HD
http://127.0.0.1:6878/ace/getstream?id=ed6d00e9b6c50c95902b33c841302dd709b214da&.mp4
#EXTINF:-1 tvg-name="Amedia Premium HD" tvg-logo="http://1ttv.org/uploads/ornzQpk6WCW6xk0lyBhlwqH8u2QyU7.png" group-title=" ",Amedia Premium HD
http://127.0.0.1:6878/ace/getstream?id=c38a7580985fa85fa6e0a82c6fd7403e8e5c2b50&.mp4
#EXTINF:-1 tvg-name="Paramount Comedy HD ()" tvg-logo="http://1ttv.org/uploads/VowjbL265DoceAryIEtqNuPv3NDhFK.png" group-title=" ",Paramount Comedy HD
http://127.0.0.1:6878/ace/getstream?id=a9023adab9228b8aa7f1b508b553140b69cecd80&.mp4
#EXTINF:-1 tvg-name=" HD" tvg-logo="http://1ttv.org/uploads/m6ODa3HXr9QNAbSThJNvWeOIEYGp7q.png" group-title="", HD
http://127.0.0.1:6878/ace/getstream?id=4318416741f8d35f2de38e7100b89831e0ef0617&.mp4
#EXTINF:-1 tvg-name=" HD" tvg-logo="http://1ttv.org/uploads/ghvqmVpPWqn9x6POAm9UJBvXFzTrqN.png" group-title="-", HD
http://127.0.0.1:6878/ace/getstream?id=39b9b54a5031846e4936735ec62d157d5eca56e0&.mp4


 : Discovery Channel HD Discovery Science HD Viasat History : Eurosport 1 HD ! HD !  1 HD   : Amedia Hit HD Amedia Premium HD Paramount Comedy HD :  HD -:  HD 

Se necessário, você pode alterar alguns parâmetros no programa ttv.py:

 mcedit /opt/etc/ttv/ttv.py 

Opções disponíveis para alteração
PLAYLIST_LOAD_URL = "http://91.92.66.82/trash/ttv-list/as.all.tag.player.m3u"
TEMPLATE_SAVE_PATH = "/opt/etc/ttv/template.txt"
FAVORITES_LOAD_PATH = "/opt/etc/ttv/favorites.txt"
PLAYLIST_SAVE_PATH = "/opt/etc/ttv/playlist.m3u"
LOGOS_URL = ""
#LOGOS_URL = "https://raw.githubusercontent.com/Kyrie1965/ttv/master/logos/{}"
#LOGOS_URL = "{}"
STREAM_URL = "http://127.0.0.1:6878/ace/getstream?id={}&.mp4"
#STREAM_URL = "acestream://{}"
EPG_LINKS = "https://teleguide.info/download/new3/xmltv.xml.gz"
#EPG_LINKS = "https://teleguide.info/download/new3/xmltv.xml.gz,http://programtv.ru/xmltv.xml.gz,http://api.torrent-tv.ru/ttv.xmltv.xml.gz"


PLAYLIST_LOAD_URL - link para baixar a lista de reprodução atual de torrent-TV.
TEMPLATE_SAVE_PATH - caminho para salvar o modelo.
FAVORITES_LOAD_PATH - caminho para carregar a lista de canais favoritos.
PLAYLIST_SAVE_PATH - caminho para salvar uma nova lista de reprodução.
LOGOS_URL - link com os logotipos dos canais. Você pode usar a string vazia ("") para obter links da lista de reprodução original, enquanto os logotipos de favorites.txt serão ignorados.
STREAM_URL - visualize o link do stream na lista de reprodução final. Pode ser um link direto para o Ace Stream ou um link para o Ace Stream Proxy. Depende do gerenciador de IPTV que você está usando.
EPG_LINKS - Uma lista de links EPG. Todos os gerentes de IPTV são diferentes. Há quem não saiba como acessar o EPG na lista de reprodução. Existem aqueles que suportam apenas uma fonte EPG de uma lista de reprodução. Há quem não saiba combinar o EPG de diferentes fontes.

Você estará interessado apenas em STREAM_URL, LOGOS_URL, EPG_LINKS, porque a aparência da lista final depende deles. Para eles, exemplos alternativos são dados no arquivo.

Conclusão


Como resultado, você obtém a lista de reprodução de Torrent TV real (Super Wash) com sua própria lista de canais, com seus próprios nomes de canal, com seus próprios grupos e sua classificação arbitrária, seus próprios logotipos, com seu próprio mapeamento EPG, com a capacidade de excluir HD / SD duplicado, com classificação canais dentro dos grupos por HD / SD e nome. Você só precisa configurar tudo uma vez e uma vez criar um arquivo dos seus canais favoritos. E todos os dispositivos da sua rede doméstica receberão a lista de reprodução desejada por meio do link, fazendo “tudo é bonito” imediatamente, sem configurações adicionais.



UPD 19/02/2019:

  • Adicionado suporte ao gzip ao carregar a lista de reprodução original ("superwash" agora fornece ttv.all.tag.player.m3u apenas no gzip). Sua lista de reprodução criada será fornecida, como antes, em texto / sem formatação.
  • Foi adicionada a capacidade de obter links para logotipos da lista de reprodução original.

Source: https://habr.com/ru/post/pt438842/


All Articles