Da ich mich in letzter Zeit mit der Erstellung einer einfachen aber dennoch ansehnlichen Filmübersicht beschäftigt habe, möchte ich euch meine Erkenntnisse mal mitteilen  :mrgreen:

Man möchte natürlich einfach an einer Stelle eine Übersicht über alle Filme haben, die man so besitzt. Aber alle Infos dazu stupide zu kopieren oder abzutippen und in eine Datenbank einzufügen, kann je nach Anzahl der eigenen Filme eine echte Sisyphusarbeit sein. Also braucht man die Möglichkeit die Daten einfach von wo anders herzubeziehen. Nach einer Recherche im Netz bin ich auf die API von themoviedb.org gestoßen.

Das war schon mal eine gute Sache, aber will man wirklich alle Funktionen hier von Grund auf neu erstellen? Natürlich nicht, und schon gar nicht, wenn man eine tolle PHP-Klasse dazu findet: https://github.com/glamorous/TMDb-PHP-API

Mit Hilfe dieser Klasse ist es sehr einfach die wichtigsten Infos eines Films auszulesen.

Und was braucht man dazu? Naja, einfach die IMDB-ID des Films, den man auswerten will. Da ich hierzu bereits schon mal eine Liste erstellt hatte, war das natürlich optimal!

Also kommen wir mal zu ein bisschen Code  😉

Zuerst wird die Klasse mal mit dem API-Schlüssel initialisiert (den kann man in den Benutzereinstellungen nach der Registrierung unter http://www.themoviedb.org/account/signup erstellen):

$tmdb_xml = new TMDb('a11223344556677889900', TMDb::XML);

Das TMDb::XML wird verwendet, damit eine Ausgabe der Daten im XML-Format stattfindet.

 

Nun wollen wir natürlich auch noch die deutschen Ergebnisse haben:

$tmdb_xml -> setLang('de');

 

Dann erstellen wir mal die XML-Daten und werten diese aus:

$xml_tmdb = simplexml_load_string($tmdb_xml -> getMovie($imdb_id, TMDb::IMDB));

 

Die $imdb_id muss natürlich davor initialisiert werden. Bei mir wird die IP bei dem Aufruf des Scripts übergeben:

$imdb_id = $_GET['id'];

 

So, nun kann man die Daten des XML einfach per echo ausgeben und in die Webseite einbauen:

 

Filmname:

echo $xml_tmdb -> movies -> movie -> name;

 

Wenn der englische Titel davon unterscheidet, gibts auch den noch als Ausgabe (dazu vergleiche ich die beiden Strings einfach):

if(strcasecmp($xml_tmdb -> movies -> movie -> name, $xml_tmdb -> movies -> movie -> original_name) != 0) {

echo $xml_tmdb -> movies -> movie -> original_name;

}

 

Dann gibts noch ein kleines Cover:

img src="<?php echo $xml_tmdb -> movies -> movie -> images -> image[0]['url'] ?>" alt="" height="300"

 

Wie wäre es nun noch mit dem Erscheinungsjahr (nur die ersten 4 Zeichen, da mir das Jahr genügt):

echo substr($xml_tmdb -> movies -> movie -> released, 0, 4);

 

Natürlich ist auch noch die Laufzeit interessant:

echo $xml_tmdb -> movies -> movie -> runtime . " Minuten";

 

Dann geben wir noch die Genres aus (da die Liste teilweise etwas länger ist, nur die ersten 3 Ergebnisse):

$i = 0;

foreach($xml_tmdb -> movies -> movie -> categories -> category as $cat) {

echo $cat['name']; 

if(++$i == 3) {

break;

}

 

Und zu guterletzt noch den Plot:

echo $xml_tmdb -> movies -> movie -> overview;

 

Wenn man das ganze dann noch in einer PHP-Datei zusammenfasst, ein paar HTML-Tags hinzufügt (ich musste die hier aus dem Code rausnehmen, da die sonst ausgewertet wurden) und mit etwas CSS anpasst, kann es dann so aussehen:

movies_splendid-design_de

Ich habe hier auch noch ein Sterne-Rating eingefügt, das hier aber nicht mit aufgeführt wird. Vielleicht gehe darauf ein anderes Mal ein.

 

Wie man sieht ist das ganze gar nicht so kompliziert. Ich hoffe ich konnte dem einen oder anderen mit meinen Ausführungen zu ein paar Ideen verhelfen.

Bei Fragen steht euch ja die Kommentarfunktion zur Verfügung.

 

 

UPDATE:

Es gibt eine neue Version der PHP-Klasse, die auf die neue TMDB-API aufsetzt. Es gibt hier einige Änderungen, so arbeitet der Entwickler nun mit verschachtelten Arrays und nicht mehr mit XML oder JSON!

Dadurch ergeben sich auch Änderungen in meinen Scripten:

 

Bei der Initalisierung der Klasse mit dem API-Key wird nun direkt die Sprache mit übergeben, den Typ kann man wg. des Wegfalls von XML/JSON weglassen:

$tmdb = new TMDb('a11223344556677889900', 'de');

 

Unter https://github.com/glamorous/TMDb-PHP-API findet man alle neuen Funktionen.

So kann man nun z. B. auch nach Youtube-Trailer-Links suchen:

$trailers = $tmdb->getMovieTrailers($imdb_id, 'de');

Es wird hier ein Array mit den IDs des Videos ausgeben, mit der man dann den passenden Youtube-Link generieren kann:

if ($trailers["youtube"]){
  if ($trailers["youtube"][0]) {
    $t_id = $trailers["youtube"][0]["source"];
    $yt_link = "http://www.youtube.com/watch?v=$t_id&hd=1";
  }
}

Ich fange hier auch gleich alles ab, falls nichts gefunden wird.

 

Man kann dann ein Array mit den Film-Infos generieren lassen:

$movie = $tmdb->getMovie($imdb_id, 'de');

Aus diesem kann man dann die verschiedenen Infos auslesen:

  • $movie[„title“] -> deutscher Titel
  •  $movie[„original_title“] -> Originaltitel
  • $movie[„release_date“] -> Erscheinungsdatum
  • $movie[„runtime“] -> Laufzeit in Minuten
  • $movie[„overview“] -> kurze Zusammenfassung
  • $movie[„production_countries“][0][„iso_3166_1“] -> erstes Produktionsland im ISO-Format (z.B. US, DE, usw.)
  • $movie[„revenue“] -> Einspielergebnis in Dollar

 

Wer noch Poster oder ähnliches laden will, kann hier nun die Funktion „getImageUrl“ nutzen. Ich empfehle hier den Bereich Images auf der github-Seite der API-Klasse zu lesen, da es verschiedene Arten von Bilder und hierzu wiederum verschiedene Bildgrößen gibt. Diese übergibt man dann der passenden Funktion:

$image_url = $tmdb->getImageUrl($movie["poster_path"],TMDb::IMAGE_POSTER,'w342');

Ich hole mir mit diesem Befehl das Film-Poster mit einer Breite von 342 Pixeln, dass ich dann in meine Detail-Seite einbaue.

 

Da hier ja nun mit Arrays gearbeitet wird, verändert sich auch die Ausgabe der Genres, die ich ja auf 3 begrenzt habe:

$i = 0;
foreach($movie["genres"] as $gen) {
  echo $gen['name'] . "<br />";
  if(++$i == 3) {
    break;
  }
}

Ich hoffe, das Update hilft euch, eure Scripte auf die neue API-Version anzupassen. Wie immer könnt ihr in den Kommentaren gerne Fragen stellen 😉