Datenbank Tabelle für song ?

Hallo raci,

wie schaut denn dein jetziges Skript aus? Woher kommen denn die Titel her, von einer Website?

Nun möchte ich aber 100 Titel haben ,da habe ich gehört das ich das mittels einer datenbank machen kann.
Gut, erstmal brauchst du eine Datenbank + Tabelle.
Eine einfache Tabelle kann man z.B. so erstellen:
SQL:
CREATE TABLE songs
(
  id UNSIGNED INTEGER AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  interpret VARCHAR(50),
  lastPlayed DATETIME
);
 
Hallo ComFreek

Vielen Dank für deine schnelle Antwort und Hilfe

Das Script was ich benutze schaut so aus...halt standard
 
Zuletzt bearbeitet:
Für eine gute Antwort würde man die Klasse aus radio.class.php sehen müssen. Vermutlich gibts da drinnen irgendwo einen Query der mit "SELECT" beginnt und mit "LIMIT 10" endet. Den müsste man auf "LIMIT 100" ändern. Mal so in Blaue geraten...
 
Hmm, gar keine DB involviert. Dann ists der Output vom XML. Du hast ja das Passwort, dann kannst du auch folgende Zeile mal im Browser eingeben:

/admin.cgi?pass=" . $this->pass . "&mode=viewxml

Statt " . $this->pass . " muss da das Passwort hin, das du ja kennst. Vor dem /admin.cgi muss noch die Server-URL hin, auf der der Shoutcast läuft. Das was da raus kommt, dürfte dem Code nach XML sein.

PHP:
			for($i = 0; $i < 30; $i++) {
				if(feof($sp))
				break;
				$sp_data .= fread($sp, 31337);
				usleep(500000);
			}

fread() liest in diesem Fall immer 31337 Bytes oder weniger (wenn weniger da ist, kann auch nur weniger gelesen werden). Da es immerhin fast 30*32KByte (~960KB) sind dürfte eigentlich alles eingelesen werden, was da so zurück kommt. Wenn das nicht alles ist, hast du hier eine Stelle an der du nachschauen kannst.

Meine Vermutung lautet aber: Das admin.cgi liefert einfach nicht mehr als 10 Songs in der History zurück, demzufolge müsstest im Administrations-Interface des Shoutcast nachschauen, ob man die Länge der Song-History irgendwie beeinflussen kann (kenn mich da nicht aus).
 
Zuletzt bearbeitet:
Das kannst du höchstens über einen Cron-Job erledigen, der bspw. jede Minute läuft.

Der müsste genau das gleiche tun wie die Klasse nur zusätzlich prüfen, ob der Song bereits in der DB ist, wenn nicht hinzufügen. Da wäre nur die Frage: Kannst du überhaupt Cron-Jobs ausführen?
 
Ich kann es mal versuchen.

1. Du musst wie ComFreek schon vorgeschlagen hat, eine Tabelle in deiner Datenbank anlegen um die Songs zu speichern.
2. Du erweiterst die Klasse um die Funktionalität, die Songs zu speichern.

Das könnte so aussehen:

PHP:
	// Datenbank-Server setzen
	function setDbHost($host)
	{
		$this->dbhost = $host;
	}
	
	// Datenbank-Benutzername setzen
	function setDbUser($user)
	{
		$this->dbuser = $user;
	}
	
	// Datenbank-Passwort setzen
	function setDbPass($pass)
	{
		$this->dbpass = $pass;
	}
	
	// Datenbank-Name setzen
	function setDbName($name)
	{
		$this->dbname = $name;
	}
	
	// Songs aus der History holen in ggf. in die Datenbank eintragen
	function insert_into_db()
	{
		// Datenbank-Verbindung aufbauen
		$db_connection = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
		if(!$db_connection)
		{
			echo "Konnte nicht zur Datenbank verbinden: " . mysql_error($db_connection);
			return;
		}
		if(!mysql_select_db($this->dbname, $db_connection))
		{
			echo "Konnte Datenbank nicht auswählen: " . mysql_error($db_connection);
			mysql_close($db_connection);
			return;
		}
		
		foreach($this->song_history as $song)
		{
			// Daten aus dem XML sanitizen
			$songTitle = mysql_real_escape_string($song['title'], $db_connection);
			$songInterpret = mysql_real_escape_string($song['artist'], $db_connection);
			$songLastPlayed = mysql_real_escape_string($song['time'], $db_connection);
			 
			// SQL-Query ausführen, um zu prüfen, ob der Song bereits in der DB ist
			$result = mysql_query("SELECT COUNT(*) as cnt FROM songs WHERE name = '$songTitle' AND interpret = '$songInterpret' AND lastPlayed = '$songLastPlayed'",
				$db_connection);
			if(!result)
			{
				echo "Konnte nicht prüfen, ob Song bereits in Datenbank: " . mysql_error($db_connection);
				mysql_close();
				return;
			}
			// Ergebnis abholen und prüfen
			$amount = mysql_fetch_row($result);
			if($amount['cnt'] == 0)
			{
				// Der Song ist noch nicht in der Datenbank, also einfügen
				if( !mysql_query("INSERT INTO songs (name,interpret,lastPlayed) VALUES ('$songTitle', '$songInterpret', '$songLastPlayed')",
					$db_connection)
				 || !mysql_insert_id($db_connection) )
				{
					echo "Konnte Song nicht eintragen: " . mysql_error($db_connection);
					mysql_close($db_connection);
					return;
				}
			}
		}

		// Abschließend noch Datenbank-Verbindung trennen
		mysql_close($db_connection);
	}

3. Du musst ein PHP-Script für den Cron-Job schreiben, was in etwa das gleiche macht, wie das Script für die Anzeige. Ich nenne es mal songCronJob.php:

PHP:
// Das ist die songCronJob.php
include("radio.class.php");             // Klasse einbinden
$radio = new Radio;                     // Klasse initialisieren
 
$radio->set_host("XXXXXX ");            // ServerURL
$radio->set_port("XXXXXXX ");               // Serverport
$radio->set_pass("XXXXX");          // Passwort für den Adminbereich des Servers
$radio->set_serv("shoutcast");          // Legt die Serversoftware fest: "icecast" oder "shoutcast"
 
$radio->time_format("d.m.Y - H:i:s");   // Datumsformat festlegen. Beispiele unter http://de2.php.net/manual/de/function.date.php
 
$radio->init();                         // Statistik initialisieren
 
if($radio->status == 1){                // 1 -> Sendung läuft, 0-> keine Sendung
 
 
/********** Song History **********/
if(is_array($radio->song_history)){ // Nur ausführen, wenn Songs in der History sind

// DIESE WERTE MUSST DU NATÜRLICH ANPASSEN
  $radio->setDbHost("localhost");
  $radio->setDbUser("dbuser");
  $radio->setDbPass("dbpass");
  $radio->setDbName("dbname");
  $radio->insert_into_db();
}

4. Du brauchst ein Anzeige-Script, was die Datenbank wieder ausließt und darstellt. Das überlasse ich mal dir, es ist alles da, was du brauchst, um es selbst zusammen zu schreiben, wenn du verstanden hast, wie das funktioniert.

EDIT:

Das ist natürlich nicht getestet, aber bei mysql_fetch_field() habe ich irrtümlich 1 statt 0 eingetragen, ist jetzt korrigiert.

EDIT 2:

mysql_fetch_field() ist an der Stelle komplett falsch, ich habe es durch mysql_fetch_row() ersetzt und die if-Kondition entsprechend korrigiert.
 
Zuletzt bearbeitet:
Zurück