關于iptv,之前在說軟路由的時候說過一次。可以借助軟路由的組播轉單播來實現iptv管看。具體參考刨除了機頂盒的限制,實現了家里多臺設備,隨時觀看iptv的訴求。但是有些頻道,本地運營商提供iptv沒有覆蓋完全。比如一些體育頻道,以及影視頻道等。
于是產生一個想法,電視家一類的軟件都能播放,那這些頻道的iptv源肯定是可以找到的,能否將這些頻道的源與本地共同組成家庭內部的iptv源。
然后開始找源,然后校驗,再整合的過程。這篇文章總結一下這個過程,以及分享過程中的一些經驗。
總體思路總體思路遵循 尋找源、校驗源,清晰源和整合的步驟。
有些文章只說了上面的思路,但是沒說具體怎么操作。下面具體說下,我每一步怎么操作的。
具體操作過程尋找源這個階段,主要是利用好搜索引擎,論壇,github,接口解密等等。這里分享下我怎么找的
有一個專門的iptv源搜索工具:電視直播源搜索引擎 。論壇我主要是在恩山,智能電視等尋找,很多大牛自己分享了自己整合的源。github的項目有幾類,有些自己通過自己的方法拿到了,托管到git上的, 也有一些專門提供這類源的。名稱項目地址說明
iptv-org
https://github.com/iptv-org/iptv
涵蓋全球的iptv源
iptv-source
https://github.com/HerbertHe/iptv-sources
整合了各種常見的可用的源,包括iptv-org 這個也有在國內部署的鏡像,也可用自己部署
其他的可以自行在git上進行搜索。
至于接口解密,這是主要是tvbox的接口節目,比如肥貓、飯太硬的接口。不過這些源普遍存在一些問題
重復太多。基本上大部分分享的源基本都是重復的。有用的不多。很多播放源同家里運營商iptv提供的是一樣的,想要看的體育頻道,影視頻道等沒有的還是沒有有些播放源則需要科學上網我想要的是,給定一個列表清單,自動給我匹配出相應的頻道列表。考慮到我的需求,我自己寫了個爬蟲,去這個網站http://tonkiang.us/ 拉取所有想要的頻道,倒也實現了,獻丑貼下代碼,不感興趣的跳過繼續往后看。
engine_url = "http://tonkiang.us/"# 爬取CCTV頻道資源def spider_source(): # 爬取直播源引擎 groups = ["CCTV6"] for group_addr in groups: # 獲取當前時間 current_time = datetime.now() page = 1 number = 0 page_count = 1 counts = 1 timeout_cnt = 0 # 初始化集合數據 data_list = [] # 生成數據格式 while page <= page_count and number < counts: #url = engine_url + "?page=" + str(page) + "&s=" + group_addr url = engine_url + "?name=" + group_addr ##修改地址 # 發起HTTP請求獲取網頁內容 try: response = requests.get(url, timeout=15) # 處理響應 response.raise_for_status() # 檢查請求是否成功 html_content = response.text #print(html_content) print(f"{current_time} 搜索頻道直播源:{url}") # 使用BeautifulSoup解析網頁內容 soup = BeautifulSoup(html_content, "html.parser") # 查找所有class為"result"的<div>標簽 result_divs = soup.find_all("div", attrs={"class": "resultplus"}) # 循環處理每個結果<div>標簽 for result_div in result_divs: m3u8_name = "" m3u8_link = "" # 獲取m3u8名稱 channel_div = result_div.find(name="div", attrs={"class": "channel"}) #print(result_div.text) if channel_div is not None: name_div = channel_div.find(name="div", attrs={"class": "tip", "style": "float: left;"}) if name_div is not None: m3u8_name = name_div.text.strip() #print(f"m3u name is {m3u8_name}") else: counts_text = channel_div.text.strip() # 提取數字部分 counts = int(''.join(filter(str.isdigit, counts_text))) print(f"{current_time} 總記錄數:{counts}") page_count = int(counts) // 30 if counts/30 > page_count: page_count += 1 print(f"{current_time} 總頁碼數:{page_count}") # 獲取m3u8鏈接 #m3u8_div = result_div.find(name="div", attrs={"class": "ujbmjx"}) m3u8_div = result_div.find_all(name="tba") if len(m3u8_div) == 2: m3u8_link = m3u8_div[-1].text.strip() print(f"頻道名稱: {m3u8_name}, 頻道地址是 {m3u8_link}") except (requests.Timeout, requests.RequestException) as e: timeout_cnt += 1 print(f"{current_time} 請求發生超時,異常次數:{timeout_cnt}") if timeout_cnt <= 10: # 繼續下一次循環迭代 continue else: print(f"{current_time} 超時次數過多:{timeout_cnt} 次,請檢查網絡是否正常") page += 1# 執行主程序函數spider_source()但是這個站點速度有點慢,代碼邏輯也沒仔細打磨,搞一段放棄了。想找大佬造好的輪子,我拿來直接用。git上一搜還真有,項目地址:https://github.com/yuanzl77/IPTV 這個大牛的思路是這樣的,自定定義搜索的范圍以及要搜索的目標以及v4還是v6,在source_urls里面可用隨意定義source。
ip_version_priority = "ipv6"source_urls = [ ...]然后在demo.txt下定義要搜索的目標,代碼入口如下
if __name__ == "__main__": template_file = "demo.txt" channels, template_channels = filter_source_urls(template_file) updateChannelUrlsM3U(channels, template_channels)整體結構和邏輯不算復雜,感興趣的自己去讀吧。
這樣我就可以把前面我找到的所有站點投一股腦丟個他,自己定義想要看的頻道,然后等他跑完就行。
校驗這里校驗是很關鍵的一步,就是判斷這些源能不能在你家的網絡下播放,如果能播放,時延是多少,分辨率是多少。
大概的思路,就是后臺用直接打開這個頻道,根據返回的結果判斷。其中用到了ffmpeg或者opencv相關的模塊來提取分辨率信息。具體參考這個項目:https://github.com/flyfishes/IPTV-M3U-Checker2
不過這個相對來說還是復雜,我又找了一個開箱即用的,還有打包好的容器鏡像, 項目地址:https://github.com/zhimin-dev/iptv-checker 提供了命令行和web頁面兩種方式,輸入一個列表,生成可用的iptv源,非常完美。
root@cdb832788958:/app# ./iptv-checker-rs check -h檢查相關命令Usage: iptv-checker-rs check [OPTIONS]Options: -i, --input-file <INPUT_FILE> 輸入文件,可以是本地文件或者是網絡文件,支持標準m3u格式以及非標準的格式:CCTV,https://xxxx.com/xxx.m3u8格式 -o, --output-file <OUTPUT_FILE> 輸出文件,如果不指定,則默認生成一個隨機文件名 [default: ] -t, --timeout <TIMEOUT> 超時時間,默認超時時間為28秒 [default: 28000] --debug debug使用,可以看到相關的中間日志 -c, --concurrency <CONCURRENCY> 并發數 [default: 1] --like <KEYWORD_LIKE> 想看關鍵詞 --dislike <KEYWORD_DISLIKE> 不想看關鍵詞 --sort 頻道排序 -h, --help Print help清洗前面的第一步,因為自定義了搜索的范圍,而這些范圍的重復率也高,所以找到的源重復率非常高。同時不知道哪個源可以用,所以即使重復了,第二步校驗的時候也保留了。但是最終不能將重復的源整合起來用,體驗太差。
前面兩步其實是最難的,這一步主要是簡單的數據處理。這里說的清洗,主要是針對前面找到可用的目標源,這里主要是去重。同時,也根據節目信息,添加log,epg等信息。
這個好像沒找到合適的項目參考,所以自己寫了個腳本,對字符串進行拼湊(這里便于理解,只貼了去重部分,供參考)
if __name__ == "__main__": file_name = sys.argv[1] # 可用的iptv文件名,包括重復信息等 userfull_line = "" tv_name = [] # key信息 with open(file_name,'r',encoding="utf-8") as f: all_info = f.readlines() all_len = len(all_info) index = 1 for line in all_info: # 獲取tvg_name tv = all_info[index].split(" ")[2].split("=")[1] try: tv = all_info[index].split(" ")[2].split("=")[1] except Exception as e: print(e) if tv in tv_name: pass else: tv_name.append(tv) userfull_line += all_info[index] userfull_line += all_info[index+1] index += 2 if index >= all_len: print("duplicate finish") break with open("duplicate.m3u", "w",encoding="utf-8") as ff: ff.write(userfull_line)整合這里是最簡單的一步,將找到的去重了的源直接整合起來放到nas或者httpserver上。然后播放器,或者tvbox等在內網直接指向這個他就行了。可以是txt格式,也可以是m3u格式。
這里我把前面幾個過程用一個shell全部整合起來了。實現了自動更新,校驗。
注意:腳本供參考,不能直接用,很多是我本地特有的路徑或者名稱。
#!/bin/bashcd /opt/itv/# 獲取本地iptv源# 輸出localiptv.m3u文件# getlocaliptv是我自己寫的獲取本地iptv的腳本./getlocaliptv# 獲取互聯網iptv,searchiptv是基于yuanzl7的程序我直接打包的,便于發布# 輸出live.m3ucd /opt/itv/searchTv./searchiptv sleep 60# 檢查互聯網iptv的可用/usr/bin/cp -rf live.m3u ../output/cd ..# 調用iptv-checker容器里面的命令# 輸出可用的m3u文件available.m3udocker exec myIp /app/iptv-checker-rs check -i static/output/live.m3u -o static/output/available.m3u -t 8000sleep 30# 去除重復的# duplicate是我程序自己打包的代碼./duplicate output/available.m3u #匯總互聯網源和本地iptv源cat duplicate.m3u >> localiptv.m3u# 放到nas上去供播放器調用/usr/bin/cp -rf localiptv.m3u /nasdir/media/總結上面總結了我整合iptv的一些思路,以及用到的一些資源。這里面主要用到一些大佬開源的項目,也有一些我自己折騰的腳本。基本實現了自動找源,自動校驗清晰,可用在家里面看一些iptv沒有覆蓋到的節目,如一些體育頻道等。
如果你要問這些怎么部署發布,當然是全部部署在家里的軟路由上。
轉載請注明來自夕逆IT,本文標題:《電視直播源論壇(IPTV整合本地源互聯網源實現IPTV自由)》

還沒有評論,來說兩句吧...