Seite 1 von 1

Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Freitag 19. November 2021, 19:01
von gabber
Hallo,

ich würde gerne aus dieser URL https://raw.githubusercontent.com/jnk22 ... odi_tv.m3u gewisse Sender exportieren und in einer eigenen .m3u Datei abspeichern.
Hier ein kleines Beispiel:

Möchte ich den Datensatz von ZDF haben benötige ich folgenden Eintrag:

#EXTINF:-1 tvg-name="ZDF HD" tvg-id="ZDF.de" group-title="Vollprogramm" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",ZDF HD
https://zdf-hls-15.akamaized.net/hls/li ... aster.m3u8


Daher meine Frage an euch. Wie würde man dabei am besten vorgehen?

Meine Idee:
Ein Array machen das alle Wunschsender enthält und dann durch iterieren, dann erhalte ich zumindest die erste Zeile. Wie aber komme ich dann zu der dazugehörigen URL?

Bin für Tipps dankbar :)

Grüße
Gabber

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Freitag 19. November 2021, 20:14
von __blackjack__
@gabber: Na das ist immer die Zeile danach. Man könnte die erste Zeile überspringen und dann mit `zip()` die Zeilen zu Tupeln zusammenfassen.

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Freitag 19. November 2021, 20:38
von dirk009
Hallo @gabber,

hier ein Skript, dass deine Wünsche erfüllen sollte:

Code: Alles auswählen

channels = ['yletv1', 'ZDF HD']
filename = 'kodi_tv.m3u'
target_file_name = 'extracted.m3u'

with open(filename, 'r') as file, open(target_file_name, 'w+') as target_file:
    target_file.write('#EXTM3U\n')
    for line in file:
        for channel in channels:
            if line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
                target_file.write(line)
                line = next(file)
                target_file.write(line)
Es liefert in der Datei 'extracted.m3u' die im Skript aufgelisteten Sender mit der URL, wenn die Datei 'kodi_tv.m3u' im aktuellen Verzeichnis existiert:

Code: Alles auswählen

#EXTM3U
#EXTINF:-1 tvg-name="ZDF HD" tvg-id="ZDF.de" group-title="Vollprogramm" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/zdfhd.png",ZDF HD
https://zdf-hls-15.akamaized.net/hls/live/2016498/de/veryhigh/master.m3u8
#EXTINF:-1 tvg-name="yletv1" tvg-id="YLE1.fi" group-title="International" tvg-logo="https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/logos/tv/yletv1.png",Yle TV1
http://yletvhdliveworld-lh.akamaihd.net/i/yletv1hdworld_1@187592/master.m3u8

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Freitag 19. November 2021, 21:29
von dirk009
Hallo @gabber

hier die URL-Version:

Code: Alles auswählen

from urllib. request import urlopen
url = 'https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/iptv/kodi/kodi_tv.m3u'

channels = ['yletv1', 'ZDF HD']

target_file_name = 'extracted.m3u'

with urlopen(url) as file, open(target_file_name, 'w+') as target_file:
    target_file.write('#EXTM3U\n')
    for line in file:
        decoded_line = line.decode("utf-8")
        for channel in channels:
            if decoded_line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
                target_file.write(decoded_line)
                line = next(file)
                decoded_line = line.decode("utf-8")
                target_file.write(decoded_line)

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Freitag 19. November 2021, 22:21
von __blackjack__
@dirk009: Der Dateimodus "w+" ist an sich schon sehr selten sinnvoll, aber noch weniger bei Textdateien. Was dagegen fehlt ist eine Kodierungsangabe, also hängt die Kodierung vom System und seinen Einstellungen ab.

Das Dekodieren der gelesenen Zeilen würde man besser über einen `io.TextIOWrapper` erledigen als manuell für jede Zeile an zwei verschiedenen Stellen im Code.

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Freitag 19. November 2021, 23:01
von gabber
@dirk009

Danke das war das was ich gesucht hatte.

Vielen Dank für die Hilfe!

Eine Frage habe ich dennoch. Ich möchte nicht das "WDR HD" z.B mehrmals vorkommt also habe ich noch folgendes ergänzt:

Code: Alles auswählen

from urllib. request import urlopen
list = []
target_file_name = 'extracted.m3u'
with urlopen(url) as file, open(target_file_name, 'w+') as target_file:
    target_file.write('#EXTM3U\n')
    for line in file:
        decoded_line = line.decode("utf-8")
        for channel in channels:
            if decoded_line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
                if channel not in list:
                    list.append(channel)
                    target_file.write(decoded_line)
                    line = next(file)
                    decoded_line = line.decode("utf-8")
                    target_file.write(decoded_line)
Gibt's da eine schönere / bessere Lösung "WDR HD" nur einmal einzufügen? Nur Interessehalber. Der Code funktioniert soweit.

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Samstag 20. November 2021, 00:55
von dirk009
@__blackjack__

Hier eine Version mit TextWrapper, geändertem Modus und UTF-8 Encoding beim File

Code: Alles auswählen

from urllib.request import urlopen
from io import TextIOWrapper

url = 'https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/iptv/kodi/kodi_tv.m3u'

channels = ['yletv1', 'ZDF HD']

target_file_name = 'extracted.m3u'

with urlopen(url) as file, open(target_file_name, 'w', encoding="utf-8") as target_file:
    target_file.write('#EXTM3U\n')
    text_wrapper = TextIOWrapper(file, encoding='utf-8')
    for line in text_wrapper:
        for channel in channels:
            if line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
                target_file.write(line)
                line = next(text_wrapper)
                target_file.write(line)
@gabber

Die doppelten Einträge sind:

#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Aachen HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Bonn HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Bergisches Land HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Dortmund HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Düsseldorf HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Duisburg HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Köln HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Münsterland HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Ostwestfalen HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Südwestfalen HD
#EXTINF:-1 tvg-name="WDR HD" tvg-id="WDR.de" group-title="Regional" tvg-logo="https://raw.githubusercontent.com/jnk22 ... d.png",WDR Ruhr HD

Man kann nach dem Bezeichner am Ende der Zeile filtern:

Code: Alles auswählen

from urllib.request import urlopen
from io import TextIOWrapper

url = 'https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/iptv/kodi/kodi_tv.m3u'

#channels = ['yletv1', 'ZDF HD', 'WDR HD']
channels = ['Yle TV1', 'ZDF HD', 'WDR HD'] # Bezeichner am Ende der Zeile

target_file_name = 'extracted.m3u'

with urlopen(url) as file, open(target_file_name, 'w', encoding="utf-8") as target_file:
    target_file.write('#EXTM3U\n')
    text_wrapper = TextIOWrapper(file, encoding='utf-8')
    for line in text_wrapper:
        for channel in channels:
            #if line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
            if line.rfind(',') != -1 and line[line.rfind(',')+1:].strip() == channel:
                target_file.write(line)
                line = next(text_wrapper)
                target_file.write(line)

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Samstag 20. November 2021, 01:20
von __blackjack__
Ungetestete IMHO etwas einfachere Bedingung:

Code: Alles auswählen

    if line.endswith(f",{channel}\n"):

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Samstag 20. November 2021, 08:50
von gabber
@dirk009

Bei der Version mit dem TextWrapper finde ich die letzte if-Abfrage zu kompliziert.

@__blackjack__
Deine if-Abfrage funktioniert auch, sofern der Channelname gleich mit dem Name am Ende ist, was leider bei einem der Sender nicht er Fall ist.

Daher bin ich bei meiner if-Abfrage mit der Liste geblieben. Trotzdem danke euch für die Unterstützung :)

Hier mein Code für alle:

Code: Alles auswählen

filename = 'TV.m3u'
url = 'https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/iptv/kodi/kodi_tv.m3u'
codec = 'utf-8'
my_channel_list = []
channels = ["Das Erste HD", "ZDF HD", "3sat", "ARTE HD", "ARD-alpha", "one HD", "ZDFneo HD", "phoenix HD",
            "tagesschau24", "WELT", "KiKA", "Nickelodeon", "WDR HD", "SWR Baden-Württemberg HD",
            "NDR Niedersachsen HD", "BR Fernsehen Süd HD", "MDR Sachsen HD", "hr-fernsehen", "rbb Berlin HD",
            "SR Fernsehen HD"]

with urlopen(url) as file, open(filename, 'w+') as target_file:
    target_file.write('#EXTM3U\n')
    for line in file:
        decoded_line = line.decode(codec)
        for channel in channels:
            if decoded_line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
                if channel not in my_channel_list:
                    my_channel_list.append(channel)
                    target_file.write(decoded_line)
                    line = next(file)
                    decoded_line = line.decode(codec)
                    target_file.write(decoded_line)
Thread kann als gelöst gekennzeichnet werden. Ich habs leider nicht gefunden :lol:

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Samstag 20. November 2021, 14:18
von __blackjack__
@gabber: Der `TextWrapper` und die ``if``-Abfrage sind ja orthogonal, den kann man also nutzen ohne das man am ``if`` was ändern muss.

Das `my_` unsinnig, `list` hat in dem Namen nichts zu suchen, insbesondere wenn man da besser ein `set()` draus machen würde.

Re: Bestimmte Zeilen aus einer Datei / URL exportieren und speichern

Verfasst: Samstag 20. November 2021, 17:35
von __blackjack__
Der Dateimodus ist ja auch noch unsinnig und da wird keine Kodierung angegeben.

Und statt die schon gesehenen Kanäle zu merken wäre es effizienter schon gesehene Kanäle aus der Menge der zu prüfenden Kanäle zu entfernen, denn es macht ja keinen Sinn die dann weiterhin für jede Zeile zu prüfen. Hat zudem den Vorteil, dass man am Ende einfach ausgeben kann, falls und welche Sender nicht gefunden wurden in den Daten.

Und wenn man einen Eintrag gefunden hat, kann man die innere Schleife mit ``break`` verlassen, denn auch dann macht es keinen Sinn noch weitere Kanäle gegen diese Eingabezeile zu prüfen.

Code: Alles auswählen

#!/usr/bin/env python3
from io import TextIOWrapper
from urllib.request import urlopen

CODEC = "utf-8"
FILENAME = "TV.m3u"
URL = "https://raw.githubusercontent.com/jnk22/kodinerds-iptv/master/iptv/kodi/kodi_tv.m3u"
CHANNELS = [
    "3sat",
    "ARD-alpha",
    "ARTE HD",
    "BR Fernsehen Süd HD",
    "Das Erste HD",
    "hr-fernsehen",
    "KiKA",
    "MDR Sachsen HD",
    "NDR Niedersachsen HD",
    "Nickelodeon",
    "one HD",
    "phoenix HD",
    "rbb Berlin HD",
    "SR Fernsehen HD",
    "SWR Baden-Württemberg HD",
    "tagesschau24",
    "WDR HD",
    "WELT",
    "ZDF HD",
    "ZDFneo HD",
]


def main():
    channels = set(CHANNELS)
    with TextIOWrapper(urlopen(URL), CODEC) as source_file:
        with open(FILENAME, "w", encoding=CODEC) as target_file:
            target_file.write("#EXTM3U\n")
            for line in source_file:
                for channel in channels:
                    if line.startswith(f'#EXTINF:-1 tvg-name="{channel}'):
                        target_file.write(line)
                        target_file.write(next(source_file))
                        channels.remove(channel)
                        break

    if channels:
        print("Achtung!  Folgende Kanäle konnten nicht gefunden werden:")
        print(", ".join(sorted(channels)))


if __name__ == "__main__":
    main()