检测Shoutcast服务器中歌曲何时发生变化

时间:2016-04-29 04:05:22

标签: php regex shoutcast

我有一个脚本正在使用以下命令读取我的电台的日志文件的最后一行。

watch -n 1 php script.php

上面的命令以1秒为间隔执行我的脚本。此脚本正在读取的日志具有如下所示的输出。

2016-04-28 23:30:34 INFO    [ADMINCGI sid=1] Title updated [Bankroll Fresh Feat. Street Money Boochie - Get It]
2016-04-28 23:30:34 INFO    [ADMINCGI sid=1] DJ name updated [1]
2016-04-28 23:30:36 INFO    [YP] Updating listing details for stream #1 succeeded.

每次更改歌曲时,会在日志中添加另外3行,如上面的示例输出中所示。我需要一种做三件事的方法。

1)仅检测与第1行的模式匹配的日志中条目的最新出现 2)当发生代码时执行代码,并且在再次发生之前不执行任何其他操作。 3)正则表达式在由“ - ”分隔的行上的“第二组”方括号之间提取数据,例如[蕾哈娜壮举。 Keyshia Cole - Title(Remix)]

在我的收音机脚本的日志输出发生变化之前,我的脚本会通过拖尾“标题更新”行的日志来检测歌曲发生更改的时间,然后从同一行的方括号内提取艺术家和标题名称

一旦发生这种情况,数据将被发送到MySQL数据库并发送到Twitter。

我尝试在if语句中使用“strpos”来首先检测包含“Title updated”的行,然后执行一个函数来从行中获取歌曲信息,但是只有当我使用静态场景时将除#1行之外的示例放入变量中,然后将其从我的脚本中运行。它确实检测了线路和服务器的目的,但是我需要我的脚本保持动态意义,只有在事件发生时才做某事并且在此期间总是闲置。

现在我必须去盗版并执行以下操作。

创建一个函数来从日志中获取最后3行,然后将每行放入一个数组中。关闭上面的示例输出。     array [0] =目标线     array [1] =下一行     array [3] =下一行

日志将以这种方式保留,因为在下一首歌曲改变之前没有其他输出被发布,然后它重复,唯一改变的是艺术家和标题信息。目前,因为我正在运行我的脚本强制查看array [0],这总是我需要的行,当脚本在更改歌曲时发布到Twitter时,它会立即发送重复项。幸运的是我在Twitter部分实现了错误代码,这样我就可以使用sleep()强制我的脚本在平均歌曲长度周围闲置180秒(3分钟)。现在这是不错的,它确实发布但我的推文不再是实时的,因为每首歌都有不同的长度。

以下是我脚本中的一个片段...

$lines = read_file(TEXT_FILE, LINES_COUNT);
    foreach ($lines as $line) {
    $pattern="/\[([^\]]*)\]/";
            if (preg_match_all($pattern, $lines[0], $matches)){
                foreach ($matches[1] as $a ){

     $fulltitle = explode("-", $matches[1][1]);

     $artist = $fulltitle[0];
     $title = $fulltitle[1];

下面的这个脚本是我想要回到的方向,并且在使用静态版本时可以正常工作,如下例所示。一旦我将脚本设置为查看日志的最后一行,它就永远不会检测到更改,因为它始终检测到目标行之后的下一行。 (相信正则表达式可能有责任但不确定)

$line ="2016-04-27 22:56:48     INFO    [ADMINCGI sid=1] Title updated [Tessa Feat. Gucci Mane - Get You Right]";
echo $line;

$pattern="/\[([^\]]*)\]/";

$needle = " Title updated ";
if (strpos($line,$needle) !== false) {
    preg_match_all($pattern, $line, $matches);
        foreach ($matches[1] as $a ){

$fulltitle = explode("-", $matches[1][1]);

$artist = $fulltitle[0];
$title = $fulltitle[1];

0 个答案:

没有答案