Добавление номеров каналов в плейлист M3U

Вопрос или проблема

Мне нужно добавить номера каналов в файл плейлиста M3U. Эти номера каналов передаются в скрипт с помощью интерактивного запроса. Все это работает на 90%.

Идея заключается в том, что скрипт будет проходить по строкам файла M3U и добавлять их в определенное место. К сожалению, он обрабатывает все строки, но добавляет каждый номер канала к каждой строке вместо одного номера канала на строку. Я немного запутался, дойдя до этого этапа, есть идеи?

#!/bin/bash
LISTA="test.m3u"
LINEA_INFO=0
IFS=$'\n'
(
  while read LINEA; do
    INFO=$(echo "$LINEA" | grep '^#EXTINF:')
    if [ "$LINEA_INFO" -eq 0 ] && [ -n "$INFO" ]; then
      LINEA_INFO=1
      CHANNELNAME=$(echo "$LINEA" | sed 's|.*,||')
      echo выберите номер канала для $CHANNELNAME
      read varnumber < /dev/tty;
      echo вы выбрали $varnumber для $CHANNELNAME
    fi
    if [ "$LINEA_INFO" -eq 1 ] && [ -z "$INFO" ]; then
      LINEA_INFO=0
      echo "$LINEA" | sed -i -e's/\#EXTINF:-1\>/& tvg-chno="'$varnumber'"https://unix.stackexchange.com/" $LISTA
   fi
 done < "$LISTA"
) 
echo "Готово!"

[пример входного файла]

пример ожидаемого вывода

Если я правильно вас понял, скрипт шелл должен проходить через каждую строку входного файла m3u и заполнять номера каналов, которые запрашиваются интерактивно для каждой строки. Итак, я предлагаю:

#!/bin/bash
InputList="$1"
OutputList="$2"

> "$OutputList"
while IFS= read -r Line; do
  if [[ "$Line" =~ ^#EXTINF: ]]; then
    echo "выберите номер канала для $Line"
    read varnumber < /dev/tty
    echo "вы выбрали $varnumber для $Line"
    Line="${Line%% *} tvg-chno=\"${varnumber}\" ${Line#* }"
  fi
  echo "$Line" >> "$OutputList"
done < "$InputList"

Использование:

$ ./m3u_channels.sh test-1.m3u test-1-ch.m3u

Он создает файл test-1-ch.m3u с вставленными номерами каналов.


Как это работает?

Программа довольно проста. Она читает файл, заданный $InputList, построчно с помощью цикла while. read останавливается на каждой строке (по умолчанию, как используется здесь). Если строка начинается с #EXTINF:, пользователю предлагается ввести данные, которые сохраняются в переменной $varnumber (скопировано из вашей программы). Затем переменная $Line формируется как:

  1. ${Line%% *}: Начало строки $Line до первого пробела.
  2. Пробел, буквально.
  3. tvg-chno=\"${varnumber}\" строка с номером канала.
  4. Пробел, буквально.
  5. ${Line#* }: Строка $Line с первого пробела.

Затем содержимое переменной $Line добавляется в выходной файл, будь оно модифицировано или нет.

Интересно, работает ли этот скрипт?? Я молод и не много понимаю. Но у меня есть список IPTV, и у меня есть скрипт, но ничего не происходит. Вы можете мне помочь??

#!/bin/bash

Получите имена входного и выходного файлов из аргументов скрипта

input_file=”Freetv.m3u”
output_file=”Freetv.m3u”

Создайте пустой выходной файл

touch $output_file

Переменная для хранения номера канала

channel_number=1

Итерация по каждой строке в входном файле

while read line; do

Если строка начинается с “#EXTINF”, это означает, что это строка, описывающая канал

if [[ $line == “#EXTINF”* ]]; then
# Добавьте номер канала к параметру tvg-chno
line=$(echo $line | sed “s/tvg-name/tvg-chno=”$channel_number” tvg-name/”)
# Увеличьте номер канала на 1
channel_number=$((channel_number+1))
fi

Добавьте строку в выходной файл

echo $line >> $output_file
done < $input_file

Ответ или решение

Добавление номеров каналов в M3U плейлист – задача, с которой может столкнуться любой пользователь IPTV, стремящийся улучшить и персонализировать свой опыт. Рассмотрим детально, как можно корректно добавить номера каналов в файл M3U с использованием Bash-скрипта.

Контекст проблемы

Вы исходите из требования, что необходимо пройти по M3U файлу, строчка за строчкой, и добавить номер канала для каждой соответствующей строки #EXTINF. Ожидается, что номера каналов вводятся интерактивно через терминал. Однако в данном случае вы сталкиваетесь с проблемой, когда каждый номер добавляется ко всем строкам, а не только к соответствующей.

Проблемы существующего сценария

  1. Ввод номер согласно файлу: Из текущего описания ясно, что используется переменная $varnumber, которая добавляется неправильным образом. Вы используете sed для вставки нового значения, но текущая строка уже модифицирована перед записью.

  2. Управление потоком данных: Используемая логика не учитывает корректное переключение между строками #EXTINF и ссылками на каналы.

Исправленный скрипт

#!/bin/bash

# Имена входного и выходного файла
input_file="Freetv.m3u"
output_file="Freetv-channels.m3u"

# Создать или очистить выходной файл
> "$output_file"

# Переменная для хранения номера канала
channel_number=1

# Чтение файла построчно
while IFS= read -r line; do
    if [[ "$line" =~ ^#EXTINF: ]]; then
        echo "Введите номер канала для ${line#*,}:"
        read varnumber < /dev/tty
        echo "Вы выбрали $varnumber для канала ${line#*,}"
        line="${line%%,*}, tvg-chno=\"$varnumber\",${line#*,}"
    fi
    echo "$line" >> "$output_file"
done < "$input_file"

echo "Обработка завершена!"

Объяснение работы сценария

  1. Переменные: Скрипт получает входной и выходной файл. Выходной файл создаётся заново и очищается, что предотвращает накопление информации при повторных запусках.

  2. Перебор построчно: Каждая строка тестируется с помощью регулярного выражения для нахождения строк – метаданных #EXTINF.

  3. Интерактивный ввод: Для каждой строки #EXTINF пользователь вводит номер канала, который добавляется к метаданным канала.

  4. Обновление строки: Строка модифицируется с добавлением номера канала в позиции, где он должен быть.

  5. Запись: Изменённые и неизменённые строки записываются в новый файл.

Заключение

Итак, указанный скрипт решает поставленную задачу. Он включает все необходимые шаги для корректного переработки файла M3U плейлиста, чтобы результат соответствовал вашим ожиданиям. Данный подход оптимизирует рабочий процесс и может быть адаптирован под разнообразные сценарии работы с IPTV.

Оцените материал
Добавить комментарий

Капча загружается...