Получаю ошибку: File "C:\Python37-32\download\download_m3u.py", line 87, in <module> main(sys.argv[0:])

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Windows 7 Starter
Python37-32
Скрипт запускаю в папке: C:\Python37-32\download
===========================================
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
import sys
import urllib
import urllib.request
import urllib.error
import os
from urllib.parse import urlparse

def get_url_nofollow(url, pathTo):
try:
urllib.request.urlretrieve (url, pathTo)
return 1
except urllib.error.HTTPError as e:
return 0
except:
return 0

def main(args):
urls = []
# urls = {}

arguments = len(args) - 1

filepath1 = 'printer1.mu3'
filepath2 = 'err.mu3'
if arguments > 1:
filepath1 = args[1]
if arguments >= 2:
chan = args[2]
if arguments >= 3:
filepath2 = args[3]

plist = "plist.m3u"
plistF = open(plist, "w", encoding = "utf-8")

with open(filepath1, encoding = "utf-8") as fp:
line = fp.readline()
cnt = 1
while line:
line = line.strip()
line = line.strip('\n')
line = line.strip('\r')
a = urlparse(line)
pathTo = filepath2 + '\%s' % os.path.basename(a.path)
out = get_url_nofollow(line, pathTo)
if (out != 1):
print("not found - " + line)
else:
urls.append(pathTo)

line = fp.readline()

fp.close()

with open(chan, encoding = "utf-8") as fc:
chName = fc.readline()
while chName:
chName = chName.strip()
chName = chName.strip('\n')
chName = chName.strip('\r')
print(chName)

for url in urls:
# print(url)
with open(url, encoding = "utf-8") as fo:
line = fo.readline()
# print(line)
cnt = 1
while line:

if (line.find(chName) != -1):
plistF.write(line)
line = fo.readline()
plistF.write(line)

line = fo.readline()

fo.close()

chName = fc.readline()

fc.close()
plistF.close()

if __name__ == "__main__":
main(sys.argv[0:])
===================================
Выдало ошибки:
============== RESTART: C:\Python37-32\download\download_m3u.py ==============
Traceback (most recent call last):
File "C:\Python37-32\download\download_m3u.py", line 87, in <module>
main(sys.argv[0:])
File "C:\Python37-32\download\download_m3u.py", line 56, in main
with open(chan, encoding = "utf-8") as fc:
UnboundLocalError: local variable 'chan' referenced before assignment
>>>
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
stud_55
-----------------------------------
1. Даю описание скрипта:
Ранее вы прислали инструкцию:
1. этап работы скрипта:
-----------------------
Скрипт должен отработать следующее:
Загрузить все самообновлямые плейлисты m3u из списка в файле --- link1.txt
Сколько ссылок - столько скачает плейлистов m3u
Загрузить все в папку скрипта: C:\Users\Александр\Desktop\Скачать m3u
Ссылок может быть много. Не более 50.
Задача скрипта:
Построчно скачать все файлы из link1.txt ---- своё_название.m3u --- в каталог скрипта.
C:\Users\Александр\Desktop\Скачать m3u
-------------------------------------------------
Название скрипта: download_m3u.py
-------------------------------------------------
Все скаченные файлы со своим названием, с расширением .m3u должны быть загружены в эту же директорию.
C:\Users\Александр\Desktop\Скачать m3u
==================================================
2. этап работы скрипта:
-----------------------
Скрипт должен отработать следующее:
Из файла -- channels.txt брать построчно название канала.
Запускать поиск этого канала во всех скаченных плейлистах m3u
Если канал найден то он должен быть сохранён во вновь созданном файле: plist.m3u
Пример: Нашли канал из файла --- channels.txt --- Телепутешествия HD
Скрипт должен сохранить в -- plist.m3u --- 2 строки так:

-------------------------------------------------
 

Вложения

  • channels.txt
    907 байт · Просмотры: 1
  • link1.txt
    300 байт · Просмотры: 1

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Переписал ваш скрипт:
Python:
import requests
import os
from os import listdir
from os.path import isfile, join


# создаем папку playlists если ее нет
if not os.path.isdir('playlists'):
    os.mkdir('playlists')


# загружаем плейлисты из файла link1.txt в папку playlists
with open('link1.txt', 'r', encoding='utf-8') as f:
    for s in f:
        r = requests.get(s.strip())
        name = s.split('/')[-1].strip()
        if not name.endswith('.m3u'):
            name = name + '.m3u'
        with open('playlists/' + name, 'w', encoding='utf-8') as f2:
            f2.write(r.text)

# получаем список файлов плейлистов из папки playlists
playlists = [f for f in listdir('playlists') if isfile(join('playlists', f))]

channels = []
# получаем список каналов из файла
with open('channels.txt', 'r', encoding='utf-8') as f:
    channels = [s.strip() for s in f]

# ищем каналы
with open('plist.m3u', 'w', encoding='utf-8') as f:
    for s in channels:
        print('Канал:', s)
        print('-' * 71)
        for s2 in playlists:
            print(' ' * 10, 'Поиск в плейлисте:', s2)
            print(' ' * 10, '-' * 60)
            with open('playlists/' + s2, 'r', encoding='utf-8') as f2:
                lst = list(f2)
                for i, item in enumerate(lst):
                    if '#EXTINF' in item and s in item:
                        print(' ' * 20, 'Найдено:', item)
                        print(' ' * 20, lst[i + 2])
                        try:
                            f.write(item)
                            f.write(lst[i + 2])
                        except Exception as e:
                            print(e)
Его нужно запускать в папке с файлами link1.txt и channels.txt. В процессе работы скрипт создаст папку playlists и скачает в нее файлы плейлистов по ссылкам из файла link1.txt. Потом найдет в этих плейлистах все каналы из файла channels.txt и запишет их в файл plist.m3u (файл будет создан в папке со скриптом).
 
  • Мне нравится
Реакции: satfan

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
stud_55
--------------------------
Огромное спасибо.
Скрипт работает отлично.
Всё супер.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
@stud_55
-----------------------------
Есть вопросы по скрипту:
1. Если в папку playlists я сам добавлю, несколько мною заранее скаченных, плейлистов m3u
будет ли наш скрипт искать в них нужные каналы из списка channels.txt ?
(Я пробовал -- не ищет)
2. Можно ли в скрипт добавить такую возможность ?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Уважаемый
@stud_55
-----------------------------
Есть вопросы по скрипту:
1. Если в папку playlists я сам добавлю, несколько мною заранее скаченных, плейлистов m3u
будет ли наш скрипт искать в них нужные каналы из списка channels.txt ?
(Я пробовал -- не ищет)
2. Можно ли в скрипт добавить такую возможность ?
Скрипт ищет по всем файлам в папке playlists. Если в файле с плейлистом будет строка содержащая #EXTINF и название канала, то скрипт ее найдет.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
@stud_55
-----------------------------
Спасибо за быстрый ответ.
Скрипт находит каналы по списку.из channels.txt
Но почему-то сохраняет их в файл plist.m3u --- без ссылки.
Вот пример:
#EXTINF:-1 ,Дикая рыбалка HD
#EXTINF:-1 ,Oхотник и Рыболов HD
#EXTINF:-1 ,Охотник и Рыболов
#EXTINF:-1 ,Дикая Рыбалка HD
#EXTINF:-1 ,М2
#EXTINF:-1 ,Оружие
-----------------------------------------------------
Не смог загрузит сюда rar и m3u
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Уважаемый
@stud_55
-----------------------------
Спасибо за быстрый ответ.
Скрипт находит каналы по списку.из channels.txt
Но почему-то сохраняет их в файл plist.m3u --- без ссылки.
Вот пример:
#EXTINF:-1 ,Дикая рыбалка HD
#EXTINF:-1 ,Oхотник и Рыболов HD
#EXTINF:-1 ,Охотник и Рыболов
#EXTINF:-1 ,Дикая Рыбалка HD
#EXTINF:-1 ,М2
#EXTINF:-1 ,Оружие
Ссылку он ищет через строку от строки с названием, если строки в файле идут подряд (без пропуска), то скрипт не сможет найти ссылку. Покажите пример плейлиста (скорее всего там немного другой порядок строк).
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
#EXTINF:-1 ,Дикая рыбалка HD
Может это из за того что файл: m3u8
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
#EXTINF:-1 ,Дикая рыбалка HD
Может это из за того что файл: m3u8
В плейлистах, которые скачивались по ссылкам из link1.txt ссылка была через строку от названия канала:
Код:
#EXTINF:-1,Discovery

http://178.217.72.66/225.201.2.88/tracks-v1a1/mono.m3u8
а у вас ссылка в следующей строке:
Код:
#EXTINF:-1 ,Дикая рыбалка HD
http://hlsstr01.svc.iptv.rt.ru/hls/CH_DIKAYARYBALKAHD/variant.m3u8
вот и не находит. Чтобы находил нужно либо добавить в плейлист пустую строку между названиями каналов и ссылками. Либо изменить скрипт, но для этого нужен пример плейлиста, в котором не находит ссылки.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Как Вам скинуть пример плейлиста ?
Не смог загрузит сюда rar и m3u а также 7z
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Как Вам скинуть пример плейлиста ?
Не смог загрузит сюда rar и m3u
В txt или zip.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Ок. Сменил расширение.
Может это из за того что файл: m3u8
 

Вложения

  • Авторская-сборка.txt
    118,7 КБ · Просмотры: 1
  • list.txt
    57,1 КБ · Просмотры: 1
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ок. Сменил расширение.
Может это из за того что файл: m3u8
Вот немного изменил скрипт:
Python:
import requests
import os
from os import listdir
from os.path import isfile, join


# создаем папку playlists если ее нет
if not os.path.isdir('playlists'):
    os.mkdir('playlists')


# загружаем плейлисты из файла link1.txt в папку playlists
with open('link1.txt', 'r', encoding='utf-8') as f:
    for s in f:
        r = requests.get(s.strip())
        name = s.split('/')[-1].strip()
        if not name.endswith('.m3u'):
            name = name + '.m3u'
        with open('playlists/' + name, 'w', encoding='utf-8') as f2:
            f2.write(r.text)

# получаем список файлов плейлистов из папки playlists
playlists = [f for f in listdir('playlists') if isfile(join('playlists', f))]

channels = []
# получаем список каналов из файла
with open('channels.txt', 'r', encoding='utf-8') as f:
    channels = [s.strip() for s in f]

link = ''
# ищем каналы
with open('plist.m3u', 'w', encoding='utf-8') as f:
    for s in channels:
        print('Канал:', s)
        print('-' * 71)
        for s2 in playlists:
            print(' ' * 10, 'Поиск в плейлисте:', s2)
            print(' ' * 10, '-' * 60)
            with open('playlists/' + s2, 'r', encoding='utf-8') as f2:
                lst = list(f2)
                for i, item in enumerate(lst):
                    if '#EXTINF' in item and s in item:
                        print(' ' * 20, 'Найдено:', item)
                        link = lst[i + 1] if lst[i + 1] != '\n' else lst[i + 2]
                        print(' ' * 20, link)
                        try:
                            f.write(item)
                            f.write(link)
                        except Exception as e:
                            print(e)
 
  • Мне нравится
Реакции: satfan

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
@stud_55
-----------------------------
Спасибо. Сейчас всё сработало правильно.
Очистил plist.m3u от нерабочих каналов прогой IPTV Checker.
Загрузил на спутниковый ресивер.
Всё Ок.
Огромное спасибо за помощь.
 

Форум IT Специалистов