2012-08-28 66 views
0

我正在嘗試創建一個腳本來生成一個.WPL文件。該腳本將掃描該文件夾中的所有.mp3文件,並將它們包含在.wpl文件中。然而,它似乎不工作,因爲Windows媒體播放器給我一個錯誤,該文件已損壞。使用PHP創建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:這些歌是在同一個文件夾中的播放列表文件。編輯3:我使用的是Windows 8 RTM中包含的最新Windows Media Player。

+0

你可以發佈你的播放列表的例子輸出嗎? – BugFinder

+0

編輯帖子併發布輸出:) – pangi

回答

1

爲什麼不使用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> 
*/ 
+0

非常感謝! 看來,問題是我沒有將文件解析爲XML文件,而是普通的文件... – pangi

2

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)."'/>");  
} 
+0

從我自己的簡單實驗中,考慮到我把播放列表放在音樂中,我不需要文件中的相對路徑,而是需要我的用戶配置文件。 – BugFinder

+0

它可以是兩個。完整路徑是最好的。 –

+0

這些歌曲與播放列表文件位於同一文件夾中。另外 - 它仍然不起作用。感謝您的解決方案! – pangi

1

我的直覺反應是,你需要一個項目計數。我做了一個快速播放列表,最遺憾的是您的項目數量。以及不同行上的項目,儘管我希望這是一件小事。

<?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> 
+1

ItemCount和newline不是必需的。 –

+0

看來問題在於我沒有將文件解析爲XML文件,而是普通的文件... – pangi