将频道编号添加到 M3U 播放列表

将频道编号添加到 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 choose the channel number for $CHANNELNAME
      read varnumber < /dev/tty;
      echo you chose $varnumber for $CHANNELNAME
    fi
    if [ "$LINEA_INFO" -eq 1 ] && [ -z "$INFO" ]; then
      LINEA_INFO=0
      echo "$LINEA" | sed -i -e's/\#EXTINF:-1\>/& tvg-chno="'$varnumber'"/' $LISTA
   fi
 done < "$LISTA"
) 
echo "Done!"

[示例输入文件]

预期输出的示例

答案1

如果我理解正确的话,shell 脚本应该遍历输入 m3u 文件的每一行,并填写每行交互式请求的通道号。所以,我建议:

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

> "$OutputList"
while IFS= read -r Line; do
  if [[ "$Line" =~ ^#EXTINF: ]]; then
    echo "choose the channel number for $Line"
    read varnumber < /dev/tty
    echo "you chose $varnumber for $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通过循环逐行读取给出的文件whileread在每个换行符处停止(默认情况下,如此处所使用)。如果该行以 开头#EXTIF:,则会提示用户,他们的输入将存储在变量中$varnumber(从程序复制)。之后,变量$Line组合在一起为:

  1. ${Line%% *}:字符串的开头$Line到第一个空格。
  2. 从字面上看,是一个空间。
  3. tvg-chno=\"${varnumber}\"带有频道号的字符串。
  4. 从字面上看,是一个空间。
  5. ${Line#* }$Line:从第一个空格开始的字符串。

$Line然后,无论是否修改,变量的内容都会附加到输出文件中。

相关内容