PHP Script zum Erstellen von PLS-Files

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich bin nicht sicher ob das auch wirklich hier reinpasst, es ist noch keine fertige 3rd Party Anwendung, aber das Teil läuft am besten mit Vollzugriff auf die Verzeichnisse und damit mit root-Rechten :D

Für den Icecast Server auf meiner DS107+ wollte ich Playlists erstellen, damit ich auch mp3 Files von der DS aus am Client abspielen kann. Am einfachsten sind PLS Playlisten und darum habe ich mir mal folgendes Script gezimmert, das die komplette mp3 Sammlung in Playlisten stellt. Dem Script wird das Root Verzeichnis der mp3 Files angegeben (z.B. /volume1/mp3), dann liest das Script alle Verzechnisse der ersten Ebene unter mp3 ein. Für jedes dieser Verzeichnisse der ersten Ebene wird dann rekursiv eine Playlist erstellt.

Also wer's brauchen kann..
PHP:
<?php
//Pfad zu mp3-Root KEINEN ABSCHLIESSENDEN SLASH!!
$path_mp3='/volume1/mp3';
//Pfad zu den Playlisten KEINEN ABSCHLIESSENDEN SLASH!!
$path_pl='/volume1/playlists';
//Für Playlisten auf Servern können keine lokalen Pfade verwendet werden
//es sollten immer komplette Pfade inkl Schema, Port und END-SLASH (/) verwendet werden
//Für lokale Playlisten einfach einen Leerstring '' setzen.
$server='http://deineDomain.tld:8000/';

$folder=array();
//alle Verzeichnissnamen der ersten Ebene unterhalb von mp3-Root auslesen
$dh=opendir($path_mp3);
while(false!==($file=readdir($dh))){
 if($file!='..' && $file!='.'){
  $folder[]=$file;
 }
}
//jedes gefundene Verzeichnis der ersten Ebene rekursiv nach mp3 Dateien
//durchsuchen, Dateipfade bearbeiten und in PLS schreiben
for($i=0;$i<count($folder);$i++){
 $fp=fopen($path_pl.'/'.$folder[$i].'.pls','w');
 $c=1;
 $str='';
 $cmd='find "'.$path_mp3.'/'.$folder[$i].'" -name *.mp3';
 $out=array();
 exec($cmd,$out);
 foreach($out as $wert){
  if($server==''){
   $str .= "File{$c}={$wert}\n";
  }else{
   $str .= "File{$c}=".str_replace(substr($path_mp3,0,strrpos($path_mp3,'/')+1),$server,$wert)."\n";
  }
  $c++;
 }
 $c--;
 fwrite($fp,'[playlist]'."\n".'numberofentries='.$c."\n".trim($str));
 fclose($fp);
}
?>
Wenn es wiedermal heftig regnet oder gar schneit mache ich daraus mal noch eine fertige 3rd Party Applkation ;)
Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Einfach mal notiert für dich: schau dir auch mal die PHP-Funktion scandir() an.

itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Einfach mal notiert für dich: schau dir auch mal die PHP-Funktion scandir() an.

itari
Danke, das hätte natürlich besser gepasst :)
Aber ich benutze gerne die Shell und arbeite mit der Rückgabe in PHP weiter Mit scandir() müsste ich das Ergebnis noch nach mp3 filtern, das geht mit dem find fixer ;)

Gruss

tobi
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hier der aktuellste Code, der Playlisten nicht pro Interpret sondern pro Album erstellt.
PHP:
<?php
$path_mp3='/volume1/public/mp3';
$path_pl='/volume1/public/playlists';
$server='http://deineDomain.tld:PORT/';

function readDirLevel($dir){
 $folder=array();
 $dh=opendir($dir);
 while(false!==($file=readdir($dh))){
  if($file!='..' && $file!='.' && is_dir($dir.'/'.$file)){
   $folder[$dir.'/'.$file]=$file;
  }
 }
 return $folder;
}

function createPLS($folder){
 foreach($folder as $key=>$wert){
  $t = preg_split('/\//',$key,null,PREG_SPLIT_NO_EMPTY);
  $fp=fopen($GLOBALS['path_pl'].'/'.$t[count($t)-2].'-'.$wert.'.pls','w');
  $c=1;
  $str='';
  $cmd='find "'.$key.'" -name *.mp3';
  $out=array();
  exec($cmd,$out);
  foreach($out as $wert){
   if($GLOBALS['server']==''){
    $str .= "File{$c}={$wert}\n";
   }else{
    $str .= "File{$c}=".str_replace(substr($GLOBALS['path_mp3'],0,strrpos($GLOBALS['path_mp3'],'/')+1),$GLOBALS['server'],$wert)."\n";
   }
   $c++;
  }
  $c--;
  fwrite($fp,'[playlist]'."\n".'numberofentries='.$c."\n".trim($str));
  fclose($fp);
 }
}
function showPLSFileContent(){
 echo '<pre>';
 foreach(glob($GLOBALS['path_pl'].'/*.pls') as $wert){
  echo '<strong>'.$wert."</strong>\n".file_get_contents($wert)."\n\n";
 }
 echo '</pre>';
}

$folderToSearch=array();
$folder=readDirLevel($path_mp3);
foreach($folder as $key=>$wert){
 $temp = readDirLevel($key);
 if(!empty($temp)){
  $folderToSearch=array_merge($folderToSearch,$temp);
 }else{
  $folderToSearch=array_merge($folderToSearch,array($key=>$wert));
 }
}
createPLS($folderToSearch);
showPLSFileContent();
?>
 

Maltin

Benutzer
Mitglied seit
16. Jan 2008
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
braeuchte ne kurze anleitung, wie ich das implementieren muss.
oda natuerlich ein spk-paket ;)


gruss, maltin
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
braeuchte ne kurze anleitung, wie ich das implementieren muss.
oda natuerlich ein spk-paket ;)


gruss, maltin
Das ganze ist ein PHP Script und sollte unter dem Root Apache laufen, damit auf das ganze Filesystem zugeriffen werden kann. Installieren lässt es sich wie jede andere 3rd Party Application (du findest hier im Forum genug Tipps wie man diese installieren muss)
Danach rufst du im Browser einfach diese Seite auf und das Script erstellt die Playlists nach den Vorgaben in den Konfigurationsvariabeln
PHP:
//Pfad wo die mp3 Files liegen
$path_mp3='/volume1/public/mp3';
//Pfad wo die Playlists gespeichert werden sollen
$path_pl='/volume1/public/playlists';
//Wenn diese Variable einen Wert hat, dann wird dieser Wert
//allen Pfadangaben vorangestellt. Damit kann man Playlisten
//erstellen welche für Clients aus dem Internet abspielbar sind
//wenn nur eine lokale Playlist (für die DS) erstellt werden soll, 
//dann einfach einen leeren String --> '' angeben
$server='http://deineDomain.tld:PORT/';
 

Maltin

Benutzer
Mitglied seit
16. Jan 2008
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
tut mir leid aba ich checks net.
ich hatte heute mal wieder etwas zeit mich um das thema zu kuemmern. ich muss mir eingestehen, dass ich das so schnell wohl net erlernen werde. bei mir scheiterts schon daran zu finden, wo denn die ganzen dateien liegen. wie komme ich dahin? keine ahnung.
nach dem suchen im wiki etc. ueber 3rd party apps verschwommen mir langsam die buchstaben vor augen.

@ die, die es checken// is ne .spk drin? ich weiss das is die faule variante oda kannst mir echt nochmal jmd stecken, wie das geht? itari und jahlives fallen mir da spontan ein. ;)

gruss und gn8, maltin
 

Maltin

Benutzer
Mitglied seit
16. Jan 2008
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
keiner, der mir helfen will?
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
hi Maltin,

leider bin ich der völlig Falsche, wenn es um Downloads usw. geht. Da ich sowas nicht mache, hab ich auch keinen Draht in diese Welt.

Itari
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Sorry - Playlists ... ist für mich dasselbe :D

Keine Ahnung von sowas

Itari
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat