Что нового

извлечь нужную строку и последующую строку

alex2887

Чайник
Сообщения
50
Репутация
0
Всем привет, имеется плейлист для IpTV. Так как листы часто обновляются, то приходится его перекачивать и вручную удалять ненужные мне каналы, а там строк больше двух тысяч, что не очень удобно...
Хочу, чтобы скрипт по заданному мной критерию (Названию канала) искал нужный канал в плейлисте и когда найдет, то копировал заголовок и последующую за ним строку (ссылка на само вещание) и записывал в новый текстовый документ с расширением *.m3u. Заранее благодарен.
Вот как выглядит сам лист:
#EXTM3U
#EXTINF:-1,Сказки Зайки (Детские)
http://127.0.0.1:6878/ace/getstream?id=068ed0c085e948f712d88ae9ce3b3b5354c4f611&.mp4
#EXTINF:-1,Советские мультфильмы (Детские)
http://127.0.0.1:6878/ace/getstream?id=08ba52866dfa1607a3d9f53b78f01cd04abf58f6&.mp4
#EXTINF:-1,Тлум HD (Детские)
http://127.0.0.1:6878/ace/getstream?id=501947daa65b2ba709d41b071fe7dbe306416891&.mp4
#EXTINF:-1,100AutoMoto TV (Мужские)
http://127.0.0.1:6878/ace/getstream?id=951215e2f072fffe7939e813e7091d79ea72b8ca&.mp4
#EXTINF:-1,CBS Reality (Мужские)
http://127.0.0.1:6878/ace/getstream?id=b6e0db1e2c7c25960393da221d6704108379c1ce&.mp4
#EXTINF:-1,Canal Motor HD (Мужские)
http://127.0.0.1:6878/ace/getstream?id=1bc3cf4befb0443e1303ad0be0d51faa522a000f&.mp4
#EXTINF:-1,Fitness M (Мужские)
http://127.0.0.1:6878/ace/getstream?id=37bec8a0c8fdd4b1d24f73393ef1fba91bbb399f&.mp4
#EXTINF:-1,Hunt Channel (Мужские)
http://127.0.0.1:6878/ace/getstream?id=9203e13571ae51e41659ce00c6147f9bf43072c2&.mp4
#EXTINF:-1,Outdoor Channel (Мужские)
http://127.0.0.1:6878/ace/getstream?id=8ff5473b10f2955d1b4ef57e0a0b478d504c2f5a&.mp4
 

Tempo

Скриптер
Сообщения
460
Репутация
119
Код:
#include <FileConstants.au3>
#include <StringConstants.au3>
FileChangeDir(@ScriptDir)

_OnlyForExample()

Local $sIn = FileRead("In.m3u")
Local $aNames = FileReadToArray("Names.txt"), $aRegExp, $sOut
If Not @error Then
	For $i = 0 To @extended - 1
		$aRegExp = StringRegExp($sIn, "(#EXTINF:.*" & $aNames[$i] & ".*\R.*)", $STR_REGEXPARRAYMATCH)
		If Not @error Then $sOut &= $aRegExp[0] & @CRLF
	Next
EndIf
Local $hOut = FileOpen("Out.m3u", $FO_OVERWRITE)
FileWrite($hOut, "#EXTM3U" & @CRLF & $sOut)
FileClose($hOut)

Func _OnlyForExample()
	Local $hIn = FileOpen("In.m3u", $FO_OVERWRITE)
	FileWrite($hIn, "#EXTM3U" & @CRLF & _
			"#EXTINF:-1,Сказки Зайки (Детские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=068ed0c085e948f712d88ae9ce3b3b5354c4f611&.mp4" & @CRLF & _
			"#EXTINF:-1,Советские мультфильмы (Детские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=08ba52866dfa1607a3d9f53b78f01cd04abf58f6&.mp4" & @CRLF & _
			"#EXTINF:-1,Тлум HD (Детские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=501947daa65b2ba709d41b071fe7dbe306416891&.mp4" & @CRLF & _
			"#EXTINF:-1,100AutoMoto TV (Мужские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=951215e2f072fffe7939e813e7091d79ea72b8ca&.mp4" & @CRLF & _
			"#EXTINF:-1,CBS Reality (Мужские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=b6e0db1e2c7c25960393da221d6704108379c1ce&.mp4" & @CRLF & _
			"#EXTINF:-1,Canal Motor HD (Мужские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=1bc3cf4befb0443e1303ad0be0d51faa522a000f&.mp4" & @CRLF & _
			"#EXTINF:-1,Fitness M (Мужские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=37bec8a0c8fdd4b1d24f73393ef1fba91bbb399f&.mp4" & @CRLF & _
			"#EXTINF:-1,Hunt Channel (Мужские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=9203e13571ae51e41659ce00c6147f9bf43072c2&.mp4" & @CRLF & _
			"#EXTINF:-1,Outdoor Channel (Мужские)" & @CRLF & _
			"http://127.0.0.1:6878/ace/getstream?id=8ff5473b10f2955d1b4ef57e0a0b478d504c2f5a&.mp4")
	FileClose($hIn)
	Local $hNames = FileOpen("Names.txt", $FO_OVERWRITE)
	FileWrite($hNames, "Hunt Channel" & @CRLF & _
			"CBS Reality" & @CRLF & _
			"Outdoor Channel")
	FileClose($hNames)
EndFunc   ;==>_OnlyForExample
 
Автор
A

alex2887

Чайник
Сообщения
50
Репутация
0
А можно сделать так, чтобы он из файла m3u вытащил определенный канал с заголовком и ссылку на него и отправил в новый текстовый документ? Например мне нужен только Канал "Сказки зайки". Если вам не сложно, закомментируйте ваш скрипт, а то я не могу никак с ним разобраться
 

Tempo

Скриптер
Сообщения
460
Репутация
119
Код:
#include <FileConstants.au3>
#include <StringConstants.au3>
FileChangeDir(@ScriptDir)

Local $sFileIn = "In.m3u" ;Укажите путь к файлу со списком всех каналов
Local $sFileNames = "Names.txt" ;Укажите путь к файлу в котором построчно указаны имена нужных каналов
Local $sFileOut = "Out.m3u" ;Укажите путь к файлу в который будут записаны нужные каналы + ссылка на вещание

Local $sIn = FileRead($sFileIn), $aNames = FileReadToArray($sFileNames), $aRegExp, $sOut
If Not @error Then
    For $i = 0 To @extended - 1
        $aRegExp = StringRegExp($sIn, "(#EXTINF:.*" & $aNames[$i] & ".*\R.*)", $STR_REGEXPARRAYMATCH)
        If Not @error Then $sOut &= $aRegExp[0] & @CRLF
    Next
EndIf
Local $hOut = FileOpen($sFileOut, $FO_OVERWRITE)
FileWrite($hOut, "#EXTM3U" & @CRLF & $sOut)
FileClose($hOut)
 
Автор
A

alex2887

Чайник
Сообщения
50
Репутация
0
Tempo, можно Вас попросить изменить регулярное выражение? Почему-то у меня не работает последний скрипт, записывает только самую верхнюю строчку в файл Out.m3u #EXTM3U и больше ничего.... Заранее извиняюсь, файл плейлиста и того, что для меня нужно прикрепляю... Ошибка моя была в том, что я сам Вас ввел в заблуждение, не предоставив файлы, в том виде, в каком они должны быть, чтобы у них была работоспособность.
 

Вложения

Tempo

Скриптер
Сообщения
460
Репутация
119
Скрипт был рассчитан на то что вы будете указывать только название канала в файле Names.txt, а не всю строку "#EXTINF..."

Исправил
Код:
#include <FileConstants.au3>
#include <StringConstants.au3>
FileChangeDir(@ScriptDir)

Local $sFileIn = "In.m3u.txt" ;Укажите путь к файлу со списком всех каналов
Local $sFileNames = "Names.txt" ;Укажите путь к файлу в котором построчно указаны имена нужных каналов
Local $sFileOut = "Out.m3u" ;Укажите путь к файлу в который будут записаны нужные каналы + ссылка на вещание

Local $sIn = FileRead($sFileIn), $aNames = FileReadToArray($sFileNames), $aRegExp, $sOut
If Not @error Then
    For $i = 0 To @extended - 1
        $aRegExp = StringRegExp($sIn, "(.*\Q" & $aNames[$i] & "\E.*\R.*)", $STR_REGEXPARRAYMATCH)
        If Not @error Then $sOut &= $aRegExp[0] & @CRLF
    Next
EndIf
Local $hOut = FileOpen($sFileOut, $FO_OVERWRITE)
FileWrite($hOut, "#EXTM3U" & @CRLF & $sOut)
FileClose($hOut)
 
Верх