【问题标题】:Create windows media player playlist with PHP使用 PHP 创建 windows 媒体播放器播放列表
【发布时间】:2012-08-28 08:59:23
【问题描述】:

我正在尝试制作一个将生成 .WPL 文件的脚本。该脚本扫描文件夹中的所有 .mp3 文件,并将它们包含在 .wpl 文件中。但是它似乎不起作用,因为 Windows 媒体播放器给我一个文件已损坏的错误。

代码有什么问题? :)

    $ourFileName = "Playlist.wpl";
    $ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
    echo "Created the playlist <br />";
    $firsthalf = "
    <?wpl version='1.0'?>
        <smil>
            <head>
                <meta name='Generator' content='Microsoft Windows Media Player -- 12.0.9200.16384'/>
                <meta name='IsNetworkFeed' content='0'/>
                <title>Playlist</title>
            </head>
        <body>
            <seq>";
    $secondhalf = "
        </seq>
        </body>
    </smil>
    ";

    fwrite($ourFileHandle, $firsthalf);

    foreach (glob("*.mp3") as $filename) {
        fwrite($ourFileHandle, "<media src='".$filename."'/>");     
    }       

    fwrite($ourFileHandle, $secondhalf);
    fclose($ourFileHandle);

编辑:生成的 .wpl 文件如下所示:

    <?wpl version='1.0'?>
        <smil>
            <head>
                <meta name='Generator' content='Microsoft Windows Media Player -- 12.0.9200.16384'/>
                <meta name='IsNetworkFeed' content='0'/>
                <title>Playlist</title>
            </head>
        <body>
            <seq><media src='FIRST SONG.mp3'/><media src='SECOND SONG.mp3'/>
        </seq>
        </body>
    </smil>

EDIT2:歌曲与播放列表文件位于同一文件夹中。 EDIT3:我正在使用 Windows 8 RTM 中包含的最新 Windows Media Player。

【问题讨论】:

  • 你能发布你的播放器列表的示例输出吗?
  • 编辑了帖子并发布了输出:)

标签: php playlist windows-media-player wpl


【解决方案1】:

media src 必须是该歌曲的完整路径,或者至少相对于 .wpl 文件。

<seq><media src='c:\music\FIRST SONG.mp3'/><media src='c:\music\SECOND SONG.mp3'/></seq>

所以你需要:

foreach (glob("*.mp3") as $filename) {
    fwrite($ourFileHandle, "<media src='".realpath($filename)."'/>");     
}

【讨论】:

  • 根据我自己的简单实验,鉴于我将播放列表放在音乐中,我不需要来自文件的相对路径,而是来自我的用户配置文件。
  • 两者都可以。完整路径是最好的。
  • 歌曲与播放列表文件位于同一文件夹中。另外 - 它仍然不起作用。感谢您的解决方案!
  • 那是你的脚本有问题,你的媒体播放器有问题。
  • 我正在使用 Windows 8 RTM 中包含的最新 Windows Media Player。
【解决方案2】:

为什么不用PHP动态创建wpl文件呢,我赶紧把这个功能放在一起,也许有点意思,输出成文件,浏览器或者强制下载/发送文件给用户。

<?php
create_playlist('./', "Playlist.wpl",'save');

/**
 * Using SimpleXMLElement create wmp playlist
 *
 * @param string $path_to_files - Pathe to mp3 files
 * @param string $save_path - path to save your xml
 * @param string $handle - download || save 
 */
function create_playlist($path_to_files, $save_path=null, $handle='download'){

    $xml = new SimpleXMLElement('<?wpl version="1.0"?><smil/>');
    $node = $xml->addChild('head');

    $meta = $node->addChild('meta', '');
    $meta->addAttribute('name', 'Generator');
    $meta->addAttribute('content', 'Microsoft Windows Media Player -- 12.0.9200.16384');

    $meta = $node->addChild('meta', '');
    $meta->addAttribute('name', 'IsNetworkFeed');
    $meta->addAttribute('content', '0');

    $node->addChild('title', 'Playlist');

    $body = $xml->addChild('body');
    $seq = $body->addChild('seq');

    foreach (glob($path_to_files."*.mp3") as $filename) {
        $media = $seq->addChild('media', "");
        $media->addAttribute('src', realpath($filename));
    }

    ob_start();
    echo $xml->asXML();
    $return = ob_get_contents();
    ob_end_clean();
    $return = trim(str_replace(array('<?xml version="1.0"?>','></media>','></meta>'),array('','/>','/>'),$return));

    if($handle == 'download'){
        //Force a download
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.ms-wpl');
        header('Content-Disposition: attachment; filename=our_playlist.wpl');
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . sprintf("%u", strlen($return)));
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Expires: 0');
        header('Pragma: public');
        exit($output);
    }elseif($handle == 'save'){
        file_put_contents($save_path, $return);
        return true;
    }else{
        exit($return);
    }
}

/**
 * Result
 * 
<?wpl version="1.0"?>
<smil>
   <head>
    <meta name="Generator" content="Microsoft Windows Media Player -- 12.0.9200.16384"/>
    <meta name="IsNetworkFeed" content="0"/>
    <title>Playlist</title>
   </head>

   <body>
    <seq>
        <media src="C:\xampp\htdocs\test.mp3"/>
        ...
        ...
    </seq>
   </body>
</smil>
*/

【讨论】:

  • 非常感谢!看来问题是我没有将文件解析为XML文件,而是普通的......
【解决方案3】:

我的直觉反应是你需要一个项目计数。我制作了一个快速播放列表,最明显的缺失是您的项目数。以及不同线路上的项目,尽管我希望这是一件较小的事情。

<?wpl version="1.0"?>
<smil>
    <head>
        <meta name="Generator" content="Microsoft Windows Media Player -- 12.0.7601.17514"/>
        <meta name="ItemCount" content="2"/>
        <title>test</title>
    </head>
    <body>
        <seq>
            <media src="Music\Faves\Dario G - Sunchyme [radio version].mp3" tid="{4B0B7EAC-98F9-4566-9A8C-80E92334D03A}"/>
            <media src="Music\Faves\Dario G - Sunchyme [original].mp3"/>
        </seq>
    </body>
</smil>

【讨论】:

  • ItemCount 和换行符不是必需的。
  • 看来问题是我没有把文件解析为XML文件,而是普通的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多