107 lines
2.8 KiB
Bash
Executable file
107 lines
2.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
# Dependencies
|
|
deps=('curl' 'dos2unix' 'grep' 'node' 'rows' 'sqlite3')
|
|
|
|
# Config files
|
|
config_files=('categories.json' 'countries.json' 'languages.json')
|
|
|
|
# URLs
|
|
tmp_m3u_url='https://iptv-org.github.io/iptv/index.m3u'
|
|
tmp_csv_url='https://raw.githubusercontent.com/iptv-org/database/master/data/channels.csv'
|
|
|
|
# Temporary files
|
|
tmp_m3u_file='/tmp/iptv.m3u'
|
|
tmp_csv_file='/tmp/iptv.csv'
|
|
tmp_processed_csv_file='/tmp/iptv-processed.csv'
|
|
tmp_sqlite_file='/tmp/iptv.sqlite'
|
|
|
|
# Final m3u
|
|
final_m3u='channels.m3u'
|
|
|
|
function cleanup {
|
|
[[ -f "$tmp_m3u_file" ]] && rm "$tmp_m3u_file"
|
|
[[ -f "$tmp_csv_file" ]] && rm "$tmp_csv_file"
|
|
[[ -f "$tmp_processed_csv_file" ]] && rm "$tmp_processed_csv_file"
|
|
[[ -f "$tmp_sqlite_file" ]] && rm "$tmp_sqlite_file"
|
|
}
|
|
|
|
function cleanup_and_exit {
|
|
cleanup
|
|
exit "$1"
|
|
}
|
|
|
|
function update {
|
|
# Ensure old temporary files don't exist
|
|
cleanup
|
|
|
|
if ! curl -s "$tmp_m3u_url" > "$tmp_m3u_file"; then
|
|
printf '%s\n' "Unable to download $tmp_m3u_url"
|
|
cleanup_and_exit 1
|
|
fi
|
|
|
|
if curl -s "$tmp_csv_url" > "$tmp_csv_file"; then
|
|
# Convert to unix format
|
|
dos2unix "$tmp_csv_file"
|
|
|
|
# Add links to each channel
|
|
while read -r; do
|
|
if [[ "$REPLY" =~ ^([^,]*), ]]; then
|
|
id="${BASH_REMATCH[1]}"
|
|
|
|
if [[ "$id" = 'id' ]]; then
|
|
printf '%s\n' "${REPLY},link"
|
|
else
|
|
match="$(grep -A1 'tvg-id="'"$id"'"' "$tmp_m3u_file" | grep -e '^http' | head -n 1)"
|
|
|
|
if (( $? == 0 )) && [[ -n "$match" ]]; then
|
|
link="$(grep -e '^http' <<< "$match")"
|
|
printf '%s\n' "$REPLY,$link"
|
|
fi
|
|
fi
|
|
fi
|
|
done < "$tmp_csv_file" > "$tmp_processed_csv_file"
|
|
|
|
# Convert to sqlite
|
|
rows csv2sqlite "$tmp_processed_csv_file" "$tmp_sqlite_file"
|
|
|
|
# Create the m3u
|
|
./scripts/iptv-generate-m3u > "$final_m3u"
|
|
|
|
# Delete temporary files
|
|
cleanup_and_exit 0
|
|
else
|
|
printf '%s\n' "Unable to download $tmp_csv_url"
|
|
cleanup_and_exit 1
|
|
fi
|
|
}
|
|
|
|
# Check for missing dependencies
|
|
declare -a missing_deps=()
|
|
|
|
for dep in "${deps[@]}"; do
|
|
type -P "$dep" >/dev/null \
|
|
|| missing_deps=( "${missing_deps[@]}" "$dep" )
|
|
done
|
|
|
|
[[ -n "${missing_deps[*]}" ]] && {
|
|
printf '%s\n' "missing dependencies ($(
|
|
for (( x=0; x < ${#missing_deps[@]}; x++ )); do
|
|
printf '%s' "${missing_deps[$x]}"
|
|
(( ( x + 1 ) < ${#missing_deps[@]} )) && printf '%s' ', '
|
|
done
|
|
))"
|
|
|
|
exit 1
|
|
}
|
|
|
|
# Ensure the required config files exist
|
|
for config in "${config_files[@]}"; do
|
|
if [[ ! -f "config/$config" ]]; then
|
|
printf '%s\n' "The file config/$config is missing"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# Update M3U
|
|
update
|