有300人阅读过
使用php获取当前目录内指定格式文件,生成DIYP格式订阅源【群晖】
发布于2023/12/31 更新于2025/08/12
[ 教程仅保证更新时有效,请自行测试。]
发布于2023/12/31 更新于2025/08/12
[ 教程仅保证更新时有效,请自行测试。]
[ 教程仅保证更新时有效,请自行测试。]
下载列表模板文件:
index.rar,解压上传至将要列表的文件目录。修改文件权限
使用webstation创建一个web服务,目录设置为文件所在目录,设置好端口
使用 ip:端口/?name=分类,查看结果,如需外网访问,则路由做好端口映射即可。
*name=文件夹名称,输出指定文件夹列表
*name=1输出所有文件,以#genre#进行分组
输出效果如下:
此教程作用:
获取多个外部的直播源列表,并获取本地文件,生成直播源,合并成一个列表,提供给只有一个直播源输入的iptv壳子使用。
php文件内容:
<?php
// 设置响应头,指定内容类型为纯文本
header('Content-Type: text/plain');
// 域名信息
// 自动获取当前请求的协议
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' || isset($_SERVER['HTTP_FRONT_END_HTTPS']) && $_SERVER['HTTP_FRONT_END_HTTPS'] === 'on' ? 'https' : 'http';
// 获取当前域名
$domain = $_SERVER['HTTP_HOST'] ?? '127.0.0.1';
$host= $protocol ."://" . $domain . "/";
// 访问方式 http://IP或域名:端口/?name=1或目录名,否则无法获取本地文件目录
// 目标文件后缀名列表(自行添加想显示的格式文件,请规范填写)
$target_extensions = ["mp4", "mkv","mp3", "rmvb"];
// 外部m3u源频道列表,按格式可写多个
$custom_url = array(
//"盒子" => 'https://gitcode.net/ygbh66/test/-/raw/master/hzzb.txt',
//"中央频道" => 'https://raw.githubusercontent.com/Moexin/IPTV/Files/CCTV.m3u',
//"卫视频道" => 'https://raw.githubusercontent.com/Moexin/IPTV/Files/CNTV.m3u',
);
// 外部频道开关。
// 0关闭 1开启
$costom_on = 1 ;
// 以下区域不可修改!!!
// 获取脚本所在目录路径
$script_dir = dirname(__FILE__);
$dir_name = $_GET['name'];
//遍历目标目录下媒体文件,并生成拼接列表
function read_to_txt($dir){
global $script_dir;
global $target_extensions;
global $host;
echo $dir . ',#genre#' ."\n";
$resultArray= traverseDirectory($dir);
}
function traverseDirectory($dir) {
global $host;
global $target_extensions;
// 扫描目录中的文件和子目录
$files = scandir($dir);
$result = []; // 存储文件路径的数组;
// 遍历文件和子目录
foreach ($files as $file) {
// 忽略当前目录(.)和上级目录(..)
if ($file == '.' || $file == '..' || $file == '@eaDir') {
continue;
}
// 构建文件或子目录的完整路径
$path = $dir . '/' . $file;
// 如果是目录,则递归调用 traverseDirectory()
if (is_dir($path)) {
traverseDirectory($path);
} else {
// 获取文件扩展名
$extension = pathinfo($file, PATHINFO_EXTENSION);
// 检查是否为指定扩展名的文件
if (in_array($extension, $target_extensions)) {
// url编码
$new_file_link = pathinfo($file, PATHINFO_FILENAME) . ',' . $host . rawurlencode($path) . PHP_EOL ;
// echo '<p>' . $file . ',' . $host . urlencode($path) . PHP_EOL . '</p>';
echo $new_file_link;
//写入$result列表中
$result[] = $new_file_link; // 存储文件路径的数组
}
}
}
// print_r($result);
return $result;
}
//传参判断
function main(){
global $dir_name;
global $script_dir;
global $custom_url; // 自定义频道链接
global $costom_on; // 自定义频道判断开关
if($costom_on=="1"){
foreach ($custom_url as $name => $url) {
// 获取文件扩展名
$fileInfo = pathinfo($url);
$extension = strtolower($fileInfo['extension']); // 转换为小写以进行比较
// 判断文件类型
if ($extension == 'txt') {
$fileContent = file_get_contents($url);
// 判断外部源中是否包含genre,即diyp格式
if (strpos($fileContent, "#genre#") !== false) {
// 如果包含,只输出内容
echo read_url($url) . "\n";
} else {
// 如果不包含,则加个分类标签
echo $name . ',#genre#' ."\n";
echo read_url($url) . "\n";
}
} elseif ($extension == 'm3u') {
echo $name . ',#genre#' ."\n";
m3utotxt($url);
} else {
echo "未知文件类型\n";
}
}
}
$dirlist = json_decode(getdir(), true);
if (in_array($dir_name, $dirlist)) {
// echo $dir_name;
read_to_txt($dir_name);
}elseif($dir_name=="1"){
foreach ($dirlist as $dir){
read_to_txt($dir);
}
}else{
//返回404错误页
http_response_code(404);
echo "注意:无参数或参数错误,未获得本地目录有效信息!";
}
}
// 获取当前目录下的所有文件和文件夹列表
function getdir(){
// 获取当前目录下的所有文件和文件夹列表
$filesAndFolders = scandir(__DIR__);
// 遍历列表并筛选出文件夹名称
$folders = array();
foreach ($filesAndFolders as $item) {
// 排除隐藏文件和文件夹以及名为".file"的文件夹
if ($item != '.' && $item != '..' && strpos($item, '.') !== 0 && strpos($item, '@eaDir') === false) {
if (is_dir($item)) {
$folders[] = $item;
}
}
}
return json_encode($folders, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
// 自定义读取外部链接
function read_url($url,$user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
// 将M3U文件转换为TXT文件
function m3utotxt($m3uFile){
// 读取M3U文件内容
$m3uContent = file_get_contents($m3uFile);
// 将内容按行拆分
$m3uLines = explode("\n", $m3uContent);
// 初始化频道数组
$channels = [];
// 遍历每一行
for ($i = 0; $i < count($m3uLines); $i++) {
// 检查是否是EXTINF标签行
if (strpos($m3uLines[$i], '#EXTINF:') === 0) {
// 解析EXTINF标签,提取频道名和链接
$infoParts = explode(',', $m3uLines[$i], 2);
$channelInfo = $infoParts[1]; // 获取频道信息部分
// 检查是否有频道链接
if (isset($m3uLines[$i + 1])) {
$channelLink = trim($m3uLines[$i + 1]); // 获取频道链接
$channels[] = ['name' => $channelInfo, 'link' => $channelLink];
echo $channelInfo ."," . $channelLink . "\n";
}
}
}
return $channels;
}
main();
?> 文章对你有帮助吗?
- 一般[0]

- 很赞[0]

- 没用[0]

- 垃圾[0]

- 无语[0]







