/library/imdb/imdb.class.php
PHP | 1914 lines | 1307 code | 134 blank | 473 comment | 366 complexity | a93d36f2a5e9b7c81c1aa28dbca14722 MD5 | raw file
Possible License(s): MIT
Large files files are truncated, but you can click here to view the full file
- <?php
- #############################################################################
- # IMDBPHP (c) Giorgos Giagas & Itzchak Rehberg #
- # written by Giorgos Giagas #
- # extended & maintained by Itzchak Rehberg <izzysoft AT qumran DOT org> #
- # http://www.izzysoft.de/ #
- # ------------------------------------------------------------------------- #
- # This program is free software; you can redistribute and/or modify it #
- # under the terms of the GNU General Public License (see doc/LICENSE) #
- #############################################################################
- /* $Id: imdb.class.php 473 2011-10-11 13:14:56Z izzy $ */
- require_once (dirname(__FILE__) . "/movie_base.class.php");
- #=============================================================================
- #=================================================[ The IMDB class itself ]===
- #=============================================================================
- /** Accessing IMDB information
- * @package openTracker
- * @class imdb
- * @extends movie_base
- * @author Georgos Giagas
- * @author Izzy (izzysoft AT qumran DOT org)
- * @copyright (c) 2002-2004 by Giorgos Giagas and (c) 2004-2009 by Itzchak Rehberg and IzzySoft
- * @version $Revision: 473 $ $Date: 2011-10-11 15:14:56 +0200 (Di, 11. Okt 2011) $
- */
- class imdb extends movie_base {
- #======================================================[ Common functions ]===
- #-----------------------------------------------------------[ Constructor ]---
- /** Initialize the class
- * @constructor imdb
- * @param string id IMDBID to use for data retrieval
- */
- function __construct($id) {
- parent::__construct($id);
- $this->revision = preg_replace('|^.*?(\d+).*$|', '$1', '$Revision: 473 $');
- $this->setid($id);
- }
- #-------------------------------------------------------------[ Open Page ]---
- /** Define page urls
- * @method protected set_pagename
- * @param string wt internal name of the page
- * @return string urlname page URL
- */
- protected function set_pagename($wt) {
- switch ($wt) {
- case "Title" : $urlname = "/";
- break;
- case "TitleFoot" : $urlname = "/_ajax/iframe?component=footer";
- break;
- case "Credits" : $urlname = "/fullcredits";
- break;
- case "CrazyCredits": $urlname = "/crazycredits";
- break;
- case "Plot" : $urlname = "/plotsummary";
- break;
- case "Synopsis" : $urlname = "/synopsis";
- break;
- case "Taglines" : $urlname = "/taglines";
- break;
- case "Episodes" : $urlname = "/episodes";
- break;
- case "Quotes" : $urlname = "/quotes";
- break;
- case "Trailers" : $urlname = "/trailers";
- break;
- case "VideoSites" : $urlname = "/videosites";
- break;
- case "Goofs" : $urlname = "/goofs";
- break;
- case "Trivia" : $urlname = "/trivia";
- break;
- case "Soundtrack" : $urlname = "/soundtrack";
- break;
- case "MovieConnections" : $urlname = "/movieconnections";
- break;
- case "ExtReviews" : $urlname = "/externalreviews";
- break;
- case "ReleaseInfo" : $urlname = "/releaseinfo";
- break;
- case "CompanyCredits" : $urlname = "/companycredits";
- break;
- case "ParentalGuide" : $urlname = "/parentalguide";
- break;
- case "OfficialSites" : $urlname = "/officialsites";
- break;
- case "Keywords" : $urlname = "/keywords";
- break;
- case "Awards" : $urlname = "/awards";
- break;
- case "Locations" : $urlname = "/locations";
- break;
- default :
- $this->page[$wt] = "unknown page identifier";
- $this->debug_scalar("Unknown page identifier: $wt");
- return false;
- }
- return $urlname;
- }
- #-----------------------------------------------[ URL to movies main page ]---
- /** Set up the URL to the movie title page
- * @method main_url
- * @return string url full URL to the current movies main page
- */
- public function main_url() {
- return "http://" . $this->imdbsite . "/title/tt" . $this->imdbid() . "/";
- }
- #======================================================[ Title page infos ]===
- #-------------------------------------------[ Movie title (name) and year ]---
- /** Setup title and year properties
- * @method private title_year
- */
- private function title_year() {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match('!<title>(IMDb\s*-\s*)?(.*) \((.*)(\d{4}|\?{4}).*\)(.*)(\s*-\s*IMDb)?</title>!', $this->page["Title"], $match)) {
- $this->main_title = $match[2];
- if ($match[3] == "????")
- $this->main_year = "";
- else
- $this->main_year = $match[4];
- }
- }
- /** Get movie title
- * @method title
- * @return string title movie title (name)
- * @see IMDB page / (TitlePage)
- */
- public function title() {
- if ($this->main_title == "")
- $this->title_year();
- return $this->main_title;
- }
- /** Get year
- * @method year
- * @return string year
- * @see IMDB page / (TitlePage)
- */
- public function year() {
- if ($this->main_year == -1)
- $this->title_year();
- return $this->main_year;
- }
- /** Get range of years for e.g. series spanning multiple years
- * @method yearspan
- * @return array yearspan [start,end] (if there was no range, start==end)
- * @see IMDB page / (TitlePage)
- */
- function yearspan() {
- if (empty($this->main_yearspan)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match('!<title>.*?\(.*?(\d{4})(\–|-)(\d{4}|\?{4}).*?</title>!i', $this->page['Title'], $match)) {
- $this->main_yearspan = array('start' => $match[1], 'end' => $match[3]);
- } else {
- $this->main_yearspan = array('start' => $this->year(), 'end' => $this->year());
- }
- }
- return $this->main_yearspan;
- }
- /** Get movie types (if any specified)
- * @method movieTypes
- * @return array [0..n] of strings (or empty array if no movie types specified)
- * @see IMDB page / (TitlePage)
- */
- public function movieTypes() {
- if (empty($this->main_movietypes)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match("/\<title\>(.*)\<\/title\>/", $this->page["Title"], $match)) {
- if (preg_match_all('|\(([^\)]*)\)|', $match[1], $matches)) {
- for ($i = 0; $i < count($matches[0]); ++$i)
- if (!preg_match('|^\d{4}$|', $matches[1][$i]))
- $this->main_movietypes[] = $matches[1][$i];
- }
- }
- }
- return $this->main_movietypes;
- }
- #---------------------------------------------------------------[ Runtime ]---
- /** Get general runtime
- * @method private runtime_all
- * @return string runtime complete runtime string, e.g. "150 min / USA:153 min (director's cut)"
- */
- private function runtime_all() {
- if ($this->main_runtime == "") {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match('!Runtime:</h4>\s*(.*)\s*</div!ms', $this->page["Title"], $match))
- $this->main_runtime = $match[1];
- }
- return $this->main_runtime;
- }
- /** Get overall runtime (first one mentioned on title page)
- * @method runtime
- * @return mixed string runtime in minutes (if set), NULL otherwise
- * @see IMDB page / (TitlePage)
- */
- public function runtime() {
- if (empty($this->movieruntimes))
- $runarr = $this->runtimes();
- else
- $runarr = $this->movieruntimes;
- if (isset($runarr[0]["time"]))
- return $runarr[0]["time"];
- return NULL;
- }
- /** Retrieve language specific runtimes
- * @method runtimes
- * @return array runtimes (array[0..n] of array[time,country,comment])
- * @see IMDB page / (TitlePage)
- */
- public function runtimes() {
- if (empty($this->movieruntimes)) {
- if (empty($this->main_runtime))
- $rt = $this->runtime_all();
- if (preg_match_all("/[\/ ]*((\D*?):|)([\d]+?) min( \((.*?)\)|)/", $this->main_runtime, $matches)) {
- for ($i = 0; $i < count($matches[0]); ++$i)
- $this->movieruntimes[] = array("time" => $matches[3][$i], "country" => $matches[2][$i], "comment" => $matches[5][$i]);
- } elseif (preg_match('!<div class="infobar">.*?(\d+)\s*min!ims', $this->page['Title'], $match)) {
- $this->movieruntimes[] = array('time' => $match[1], 'country' => '', 'comment' => '');
- }
- }
- return $this->movieruntimes;
- }
- #----------------------------------------------------------[ Aspect Ratio ]---
- /** Aspect Ratio of movie screen
- * @method aspect_ratio
- * @return string ratio
- * @see IMDB page / (TitlePage)
- */
- public function aspect_ratio() {
- if (empty($this->aspectratio)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- preg_match('!<h4 class="inline">Aspect Ratio:</h4>\s*(.*?)\s</div>!ims', $this->page["Title"], $match);
- $this->aspectratio = $match[1];
- }
- return $this->aspectratio;
- }
- #----------------------------------------------------------[ Movie Rating ]---
- /** Setup votes
- * @method private rate_vote
- */
- private function rate_vote() {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match('!<span itemprop="ratingValue">(\d{1,2}\.\d)!i', $this->page["Title"], $match)) {
- $this->main_rating = $match[1];
- } else {
- $this->main_rating = 0;
- }
- if (preg_match('!href="ratings"\s+title="([\d\,]+)!i', $this->page["Title"], $match)) {
- $this->main_votes = $match[1];
- } else {
- $this->main_votes = 0;
- }
- }
- /** Get movie rating
- * @method rating
- * @return string rating current rating as given by IMDB site
- * @see IMDB page / (TitlePage)
- */
- public function rating() {
- if ($this->main_rating == -1)
- $this->rate_vote();
- return $this->main_rating;
- }
- /** Return votes for this movie
- * @method votes
- * @return string votes count of votes for this movie
- * @see IMDB page / (TitlePage)
- */
- public function votes() {
- if ($this->main_votes == -1)
- $this->rate_vote();
- return $this->main_votes;
- }
- #------------------------------------------------------[ Movie Comment(s) ]---
- /** Get movie main comment (from title page)
- * @method comment
- * @return string comment full text of movie comment from the movies main page
- * @see IMDB page / (TitlePage)
- */
- public function comment() {
- // this stuff whent into a frame in 2011! _ajax/iframe?component=footer
- if ($this->main_comment == "") {
- if ($this->page["TitleFoot"] == "")
- $this->openpage("TitleFoot");
- if (@preg_match('!<div class\="user-comments">\s*(.*?)\s*<div class\="yn"!ms', $this->page["TitleFoot"], $match))
- $this->main_comment = preg_replace("/a href\=\"\//i", "a href=\"http://" . $this->imdbsite . "/", $match[1]);
- $this->main_comment = str_replace("http://i.media-imdb.com/images/showtimes", $this->imdb_img_url . "/showtimes", $this->main_comment);
- }
- return $this->main_comment;
- }
- /** Get movie main comment (from title page - split-up variant)
- * @method comment_split
- * @return array comment array[string title, string date, array author, string comment]; author: array[string url, string name]
- * @see IMDB page / (TitlePage)
- */
- public function comment_split() {
- if (empty($this->split_comment)) {
- if ($this->main_comment == "")
- $comm = $this->comment();
- if (@preg_match('!<strong>(.*?)</strong>.*<div class="comment-meta">\s*(.*?)\s*\|\s*by\s*(.*?)\s*–.*?<p>(.*?)</div!ims', $this->main_comment, $match)) {
- @preg_match('!href="(.*?)">(.*)</a!i', $match[3], $author);
- $this->split_comment = array("title" => $match[1], "date" => $match[2], "author" => array("url" => $author[1], "name" => $author[2]), "comment" => trim($match[4]));
- } elseif (@preg_match('!<div class="comment-meta">\s*(.{10,20})\s*\|\s*by\s*(.*?)\s*–.*?<div>\s*(.*?)\s*</div>!ims', $this->main_comment, $match)) {
- @preg_match('!href="(.*?)">(.*)</a!i', $match[2], $author);
- $this->split_comment = array('title' => '', 'date' => $match[1], 'author' => array("url" => $author[1], "name" => $author[2]), "comment" => trim($match[3]));
- }
- }
- return $this->split_comment;
- }
- #--------------------------------------------------------------[ Keywords ]---
- /** Get the keywords for the movie
- * @method keywords
- * @return array keywords
- * @see IMDB page / (TitlePage)
- */
- public function keywords() {
- if (empty($this->main_keywords)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match_all('!<a href\="/keyword/[\w\-]+">(.*?)</a>!', $this->page["Title"], $matches))
- $this->main_keywords = $matches[1];
- }
- return $this->main_keywords;
- }
- #--------------------------------------------------------[ Language Stuff ]---
- /** Get movies original language
- * @method language
- * @return string language
- * @brief There is not really a main language on the IMDB sites (yet), so this
- * simply returns the first one
- * @see IMDB page / (TitlePage)
- */
- public function language() {
- if ($this->main_language == "") {
- if (empty($this->langs))
- $this->langs = $this->languages();
- if (isset($this->langs[0]))
- $this->main_language = $this->langs[0];
- }
- return $this->main_language;
- }
- /** Get all languages this movie is available in
- * @method languages
- * @return array languages (array[0..n] of strings)
- * @see IMDB page / (TitlePage)
- */
- public function languages() {
- if (empty($this->langs)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match_all('!<a href="/language/(.*?)">\s*(.*?)\s*</a>(\s+\((.*?)\)|)!m', $this->page["Title"], $matches))
- $this->langs = $matches[2];
- $mc = count($matches[2]);
- for ($i = 0; $i < $mc; $i++) {
- $this->langs_full[] = array('name' => $matches[2][$i], 'code' => $matches[1][$i], 'comment' => $matches[4][$i]);
- }
- }
- return $this->langs;
- }
- /** Get all languages this movie is available in, including details
- * @method languages_detailed
- * @return array languages (array[0..n] of array[string name, string code, string comment], code being the ISO-Code)
- * @see IMDB page / (TitlePage)
- */
- public function languages_detailed() {
- if (empty($this->langs_full))
- $foo = $this->languages();
- return $this->langs_full;
- }
- #--------------------------------------------------------------[ Genre(s) ]---
- /** Get the movies main genre
- * Since IMDB.COM does not really now a "Main Genre", this simply means the
- * first mentioned genre will be returned.
- * @method genre
- * @return string genre first of the genres listed on the movies main page
- * @brief There is not really a main genre on the IMDB sites (yet), so this
- * simply returns the first one
- * @see IMDB page / (TitlePage)
- */
- public function genre() {
- if (empty($this->main_genre)) {
- if (empty($this->moviegenres))
- $genres = $this->genres();
- if (!empty($genres))
- $this->main_genre = $this->moviegenres[0];
- }
- return $this->main_genre;
- }
- /** Get all genres the movie is registered for
- * @method genres
- * @return array genres (array[0..n] of strings)
- * @see IMDB page / (TitlePage)
- */
- public function genres() {
- if (empty($this->moviegenres)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match_all("@<a href\=\"/genre/[\w\-]+\"\>(.*?)\</a>@", $this->page["Title"], $matches)) {
- $this->moviegenres = $matches[1];
- } elseif (preg_match('!<div class="infobar">(.*?)</div>!ims', $this->page['Title'], $match)) {
- if (preg_match_all('!href="/genre/.*?"\s*>(.*?)<!ims', $match[1], $matches)) {
- $this->moviegenres = $matches[1];
- }
- }
- }
- return $this->moviegenres;
- }
- #----------------------------------------------------------[ Color format ]---
- /** Get colors
- * @method colors
- * @return array colors (array[0..1] of strings)
- * @see IMDB page / (TitlePage)
- */
- public function colors() {
- if (empty($this->moviecolors)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match_all("|/search/title\?colors=.*?>\s*(.*?)<|", $this->page["Title"], $matches))
- $this->moviecolors = $matches[1];
- }
- return $this->moviecolors;
- }
- #---------------------------------------------------------------[ Creator ]---
- /** Get the creator of a movie (most likely for seasons only)
- * @method creator
- * @return array creator (array[0..n] of array[name,imdb])
- * @see IMDB page / (TitlePage)
- */
- public function creator() {
- if (empty($this->main_creator)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match("/Creator:\<\/h5\>\s*\n(.*?)(<\/div|<a class=\"tn15more)/ms", $this->page["Title"], $match)) {
- if (preg_match_all('|/name/nm(\d{7}).*?>(.*?)<|ims', $match[1], $matches)) {
- for ($i = 0; $i < count($matches[0]); ++$i)
- $this->main_creator[] = array('name' => $matches[2][$i], 'imdb' => $matches[1][$i]);
- }
- }
- }
- return $this->main_creator;
- }
- #---------------------------------------------------------------[ Tagline ]---
- /** Get the main tagline for the movie
- * @method tagline
- * @return string tagline
- * @see IMDB page / (TitlePage)
- */
- public function tagline() {
- if ($this->main_tagline == "") {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match('!Taglines:</h4>\s*(.*?)\s*<!ims', $this->page["Title"], $match)) {
- $this->main_tagline = trim($match[1]);
- }
- }
- return $this->main_tagline;
- }
- #---------------------------------------------------------------[ Seasons ]---
- /** Get the number of seasons or 0 if not a series
- * @method seasons
- * @return int seasons number of seasons
- * @see IMDB page / (TitlePage)
- */
- public function seasons() {
- if ($this->seasoncount == -1) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match_all('|<a href="episodes#season-\d+">(\d+)</a>|Ui', $this->page["Title"], $matches)) {
- $this->seasoncount = $matches[1][0];
- } else {
- $this->seasoncount = 0;
- }
- if (preg_match_all('|<a href="episodes#season-unknown">unknown</a>|Ui', $this->page["Title"], $matches)) {
- $this->seasoncount += count($matches[0]);
- }
- }
- return $this->seasoncount;
- }
- #-----------------------------------------------[ Is it part of a serial? ]---
- /** Try to figure out if this is a movie or part of a serie
- * @method is_serial
- * @return boolean
- * @see IMDB page / (TitlePage)
- */
- public function is_serial() {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- return preg_match('|<h5>TV Series:</h5>|i', $this->page["Title"], $matches);
- }
- #--------------------------------------------------------[ Plot (Outline) ]---
- /** Get the main Plot outline for the movie
- * @method plotoutline
- * @param optional boolean fallback Fallback to storyline if we could not catch plotoutline? Default: FALSE
- * @return string plotoutline
- * @see IMDB page / (TitlePage)
- */
- public function plotoutline($fallback = FALSE) {
- if ($this->main_plotoutline == "") {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match('!<span class="rating-rating">.*?(<p>.*?)\s*<div!ims', $this->page['Title'], $match)) {
- $this->main_plotoutline = trim($match[1]);
- } elseif (preg_match('!<p itemprop="description">\s*(.*?)\s*</p>!ims', $this->page['Title'], $match)) {
- $this->main_plotoutline = trim($match[1]);
- } elseif ($fallback) {
- $this->main_plotoutline = $this->storyline();
- }
- if (preg_match('!<p>\s*(<p>.*</p>)\s*$!ims', $this->main_plotoutline, $tmp))
- $this->main_plotoutline = $tmp[1];
- }
- return $this->main_plotoutline;
- }
- /** Get the Storyline for the movie
- * @method storyline
- * @return string storyline
- * @see IMDB page / (TitlePage)
- */
- public function storyline() {
- if ($this->main_storyline == "") {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match('!Storyline</h2>\s*\n*<?p?>?(.*?)<?/?p?<h4!ims', $this->page["Title"], $match)) {
- if (preg_match('!(.*?)<em class="nobr">Written by!ims', $match[1], $det))
- $this->main_storyline = $det[1];
- elseif (preg_match('!(.*)\s</p>!ims', $match[1], $det))
- $this->main_storyline = $det[1];
- elseif (preg_match('!(.*)\s<span class="see-more inline">!ims', $match[1], $det))
- $this->main_storyline = $det[1];
- elseif (preg_match('!(.*)\s\|!ims', $match[1], $det))
- $this->main_storyline = $det[1];
- else
- $this->main_storyine = trim($match[1]);
- }
- }
- return $this->main_storyline;
- }
- #--------------------------------------------------------[ Photo specific ]---
- /** Setup cover photo (thumbnail and big variant)
- * @method private thumbphoto
- * @return boolean success (TRUE if found, FALSE otherwise)
- * @see IMDB page / (TitlePage)
- */
- private function thumbphoto() {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- preg_match("!id\=\"img_primary\">[^<]*<a[^<]+<img src\=\"(.+?)\"!i", $this->page["Title"], $match);
- if (empty($match[1]))
- return FALSE;
- $this->main_thumb = $match[1];
- preg_match('|(.*\._V1).*|iUs', $match[1], $mo);
- $this->main_photo = $mo[1];
- return true;
- }
- /** Get cover photo
- * @method photo
- * @param optional boolean thumb get the thumbnail (100x140, default) or the
- * bigger variant (400x600 - FALSE)
- * @return mixed photo (string url if found, FALSE otherwise)
- * @see IMDB page / (TitlePage)
- */
- public function photo($thumb = true) {
- if (empty($this->main_photo))
- $this->thumbphoto();
- if (!$thumb && empty($this->main_photo))
- return false;
- if ($thumb && empty($this->main_thumb))
- return false;
- if ($thumb)
- return $this->main_thumb;
- return $this->main_photo;
- }
- /** Save the photo to disk
- * @method savephoto
- * @param string path where to store the file
- * @param optional boolean thumb get the thumbnail (100x140, default) or the
- * bigger variant (400x600 - FALSE)
- * @return boolean success
- * @see IMDB page / (TitlePage)
- */
- public function savephoto($path, $thumb = true, $rerun = 0) {
- switch ($rerun) {
- case 2: $req = new MDB_Request('');
- break;
- case 1: $req = new MDB_Request('', '', !$this->trigger_referer);
- break;
- default: $req = new MDB_Request('', '', $this->trigger_referer);
- break;
- }
- $photo_url = $this->photo($thumb);
- if (!$photo_url)
- return FALSE;
- $req->setURL($photo_url);
- $req->sendRequest();
- if (strpos($req->getResponseHeader("Content-Type"), 'image/jpeg') === 0
- || strpos($req->getResponseHeader("Content-Type"), 'image/gif') === 0
- || strpos($req->getResponseHeader("Content-Type"), 'image/bmp') === 0) {
- $fp = $req->getResponseBody();
- } else {
- switch ($rerun) {
- case 2 :
- $ctype = $req->getResponseHeader("Content-Type");
- $this->debug_scalar("<BR>*photoerror* at " . __FILE__ . " line " . __LINE__ . ": " . $photo_url . ": Content Type is '$ctype'<BR>");
- if (substr($ctype, 0, 4) == 'text')
- $this->debug_scalar("Details: <PRE>" . $req->getResponseBody() . "</PRE>\n");
- return FALSE;
- break;
- case 1 :
- $this->debug_scalar("<BR>Initiate third run for savephoto($path) on IMDBID " . $this->imdbID . "<BR>");
- unset($req);
- return $this->savephoto($path, $thumb, 2);
- break;
- default:
- $this->debug_scalar("<BR>Initiate second run for savephoto($path) on IMDBID " . $this->imdbID . "<BR>");
- unset($req);
- return $this->savephoto($path, $thumb, 1);
- break;
- }
- }
- $fp2 = fopen($path, "w");
- if ((!$fp) || (!$fp2)) {
- $this->debug_scalar("image error at " . __FILE__ . " line " . __LINE__ . "...<BR>");
- return false;
- }
- fputs($fp2, $fp);
- return TRUE;
- }
- /** Get the URL for the movies cover photo
- * @method photo_localurl
- * @param optional boolean thumb get the thumbnail (100x140, default) or the
- * bigger variant (400x600 - FALSE)
- * @return mixed url (string URL or FALSE if none)
- * @see IMDB page / (TitlePage)
- */
- public function photo_localurl($thumb = true) {
- if ($thumb)
- $ext = ""; else
- $ext = "_big";
- if (!is_dir($this->photodir)) {
- $this->debug_scalar("<BR>***ERROR*** The configured image directory does not exist!<BR>");
- return false;
- }
- $path = PATH_ROOT . "/images/imdb/" . $this->imdbid() . "${ext}.jpg";
- if (file_exists($path))
- return $this->photoroot . $this->imdbid() . "${ext}.jpg";
- if (!is_writable($this->photodir)) {
- $this->debug_scalar("<BR>***ERROR*** The configured image directory lacks write permission!<BR>");
- return false;
- }
- if ($this->savephoto($path, $thumb))
- return $this->photoroot . $this->imdbid() . "${ext}.jpg";
- else
- echo "Could not save file";
- return false;
- }
- /** Get URLs for the pictures on the main page
- * @method mainPictures
- * @return array [0..n] of [imgsrc, imglink, bigsrc], where<UL>
- * <LI>imgsrc is the URL of the thumbnail IMG as displayed on main page</LI>
- * <LI>imglink is the link to the <b><i>page</i></b> with the "big image"</LI>
- * <LI>bigsrc is the URL of the "big size" image itself</LI>
- * @author moonface
- * @author izzy
- */
- public function mainPictures() {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (empty($this->main_pictures)) {
- preg_match('!<div class="mediastrip">\s*(.*?)\s*</div>!ims', $this->page["Title"], $match);
- if (@preg_match_all('!<a .*?href="(.*?)".*?<img.*?src="(.*?)"!ims', $match[1], $matches)) {
- for ($i = 0; $i < count($matches[0]); ++$i) {
- $this->main_pictures[$i]["imgsrc"] = $matches[2][$i];
- if (substr($matches[1][$i], 0, 4) != "http")
- $matches[1][$i] = "http://" . $this->imdbsite . $matches[1][$i];
- $this->main_pictures[$i]["imglink"] = $matches[1][$i];
- preg_match('|(.*\._V1).*|iUs', $matches[2][$i], $big);
- $ext = substr($matches[2][$i], -3);
- $this->main_pictures[$i]["bigsrc"] = $big[1] . ".${ext}";
- }
- }
- }
- return $this->main_pictures;
- }
- #-------------------------------------------------[ Country of Production ]---
- /** Get country of production
- * @method country
- * @return array country (array[0..n] of string)
- * @see IMDB page / (TitlePage)
- */
- public function country() {
- if (empty($this->countries)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- $this->countries = array();
- # if (preg_match_all("/\/country\/\w+\"\>(.*?)<\/a/m",$this->page["Title"],$matches))
- if (preg_match_all('!/country/\w+"\s*>(.*?)<\/a!m', $this->page["Title"], $matches))
- for ($i = 0; $i < count($matches[0]); ++$i)
- $this->countries[$i] = $matches[1][$i];
- }
- return $this->countries;
- }
- #------------------------------------------------------------[ Movie AKAs ]---
- /** Get movies alternative names
- * @method alsoknow
- * @return array aka array[0..n] of array[title,year,country,comment]; searching
- * on akas.imdb.com will add "lang" (2-char language code) to the array
- * for localized names, "country" may hold multiple countries separated
- * by commas
- * @see IMDB page ReleaseInfo
- * @version Due to changes on the IMDB sites, neither the languages nor the year
- * seems to be available anymore - so those array properties will always
- * be empty, and kept for compatibility only (for a while, at least).
- * Moreover, content has been moved from the title page to ReleaseInfo page.
- */
- public function alsoknow() {
- if (empty($this->akas)) {
- if ($this->page["ReleaseInfo"] == "")
- $this->openpage("ReleaseInfo");
- $ak_s = strpos($this->page["ReleaseInfo"], "<a name=\"akas\">");
- //if ($ak_s == 0) $ak_s = strpos ($this->page["ReleaseInfo"], "Alternativ:");
- if ($ak_s == 0)
- return array();
- $alsoknow_end = strpos($this->page["ReleaseInfo"], "</table>", $ak_s);
- $alsoknow_all = substr($this->page["ReleaseInfo"], $ak_s, $alsoknow_end - $ak_s);
- preg_match_all("@<td>(.*?)</td>@i", $alsoknow_all, $matches);
- for ($i = 0; $i < count($matches[1]); $i+=2) {
- $title = trim($matches[1][$i]);
- $countries = explode('/', $matches[1][$i + 1]);
- foreach ($countries as $country) {
- $firstbracket = strpos($country, '(');
- if ($firstbracket === false) {
- $_country = trim($country);
- $comment = '';
- } else {
- $_country = trim(substr($country, 0, $firstbracket));
- preg_match_all("@\((.+?)\)@", $country, $matches3);
- $comment = implode(', ', $matches3[1]);
- }
- $this->akas[] = array(
- "title" => $title,
- "year" => '',
- "country" => $_country,
- "comment" => $comment,
- "lang" => ''
- );
- }
- }
- }
- return $this->akas;
- }
- #---------------------------------------------------------[ Sound formats ]---
- /** Get sound formats
- * @method sound
- * @return array sound (array[0..n] of strings)
- * @see IMDB page / (TitlePage)
- */
- public function sound() {
- if (empty($this->sound)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match_all("|/search/title\?sound_mixes=.*?>\s*(.*?)<|", $this->page["Title"], $matches))
- $this->sound = $matches[1];
- }
- return $this->sound;
- }
- #-------------------------------------------------------[ MPAA / PG / FSK ]---
- /** Get the MPAA data (also known as PG or FSK)
- * @method mpaa
- * @return array mpaa (array[country]=rating)
- * @see IMDB page / (TitlePage)
- */
- public function mpaa() {
- if (empty($this->mpaas)) {
- if ($this->page["ParentalGuide"] == "")
- $this->openpage("ParentalGuide");
- if (preg_match_all("|/search/title\?certificates=.*?>\s*(.*?):(.*?)<|", $this->page["ParentalGuide"], $matches)) {
- $cc = count($matches[0]);
- for ($i = 0; $i < $cc; ++$i)
- $this->mpaas[$matches[1][$i]] = $matches[2][$i];
- }
- }
- return $this->mpaas;
- }
- /** Get the MPAA data (also known as PG or FSK) - including historical data
- * @method mpaa_hist
- * @return array mpaa (array[country][0..n]=rating)
- * @see IMDB page / (TitlePage)
- */
- public function mpaa_hist() {
- if (empty($this->mpaas_hist)) {
- if ($this->page["ParentalGuide"] == "")
- $this->openpage("ParentalGuide");
- if (preg_match_all("|/search/title\?certificates=.*?>\s*(.*?):(.*?)<|", $this->page["ParentalGuide"], $matches)) {
- $cc = count($matches[0]);
- for ($i = 0; $i < $cc; ++$i)
- $this->mpaas_hist[$matches[1][$i]][] = $matches[2][$i];
- }
- }
- return $this->mpaas_hist;
- }
- #----------------------------------------------------[ MPAA justification ]---
- /** Find out the reason for the MPAA rating
- * @method mpaa_reason
- * @return string reason why the movie was rated such
- * @see IMDB page / (TitlePage)
- */
- public function mpaa_reason() {
- if (empty($this->mpaa_justification)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (preg_match('!href="/mpaa">.*?</h4>\s*<span itemprop="contentRating">(.*?)</span!ims', $this->page["Title"], $match))
- $this->mpaa_justification = trim($match[1]);
- }
- return $this->mpaa_justification;
- }
- #------------------------------------------------------[ Production Notes ]---
- /** For not-yet completed movies, we can get the production state
- * @method prodNotes
- * @return array production notes [status,statnote,lastupdate[day,month,mon,year],more,note]
- * @see IMDB page / (TitlePage)
- */
- public function prodNotes() {
- if (empty($this->main_prodnotes)) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (!preg_match('!(<h2>Production Notes.*?)\s*</div!ims', $this->page["Title"], $match))
- return $this->main_prodnotes; // no info available
- if (preg_match('!<b>Status:\s*</b>\s*(.*?)\s*<br!ims', $match[1], $tmp))
- if (preg_match('!(.*?)\s*<span class="ghost">\|</span>\s*(.*)!ims', $tmp[1], $tmp2)) {
- $status = trim($tmp2[1]);
- $statnote = trim($tmp2[2]);
- } else {
- $status = trim($tmp);
- $statnote = '';
- }
- if (preg_match('!<b>Updated:\s*</b>\s*(\d+)\s*(\D+)\s+(\d{4})!ims', $match[1], $tmp))
- $update = array("day" => $tmp[1], "month" => $tmp[2], "mon" => $this->monthNo($tmp[2]), "year" => $tmp[3]);
- if (preg_match('!<b>More Info:\s*</b>\s*(.*)!ims', $match[1], $tmp))
- $more = preg_replace('!\s*onclick=".*?"!ims', '', trim($tmp[1]));
- $more = preg_replace('!href="/!ims', 'href="http://' . $this->imdbsite . '/', $more);
- if (preg_match('!<b>Note:\s*</b>\s*(.*?)</!ims', $match[1], $tmp))
- $note = trim($tmp[1]);
- $this->main_prodnotes = array("status" => $status, "statnote" => $statnote, "lastUpdate" => $update, "more" => $more, "note" => $note);
- }
- return $this->main_prodnotes;
- }
- #----------------------------------------------[ Position in the "Top250" ]---
- /** Find the position of a movie in the top 250 ranked movies
- * @method top250
- * @return int position a number between 1..250 if the movie is listed, 0 otherwise
- * @author abe
- * @see http://projects.izzysoft.de/trac/imdbphp/ticket/117
- */
- public function top250() {
- if ($this->main_top250 == -1) {
- if ($this->page["Title"] == "")
- $this->openpage("Title");
- if (@preg_match('!<a href="[^"]*/chart/top\?tt(.*?)"><strong>Top 250 #(.*?)</a>!i', $this->page["Title"], $match)) {
- $this->main_top250 = $match[2];
- } else {
- $this->main_top250 = 0;
- }
- }
- return $this->main_top250;
- }
- #=====================================================[ /plotsummary page ]===
- #--------------------------------------------------[ Full Plot (combined) ]---
- /** Get the movies plot(s)
- * @method plot
- * @return array plot (array[0..n] of strings)
- * @see IMDB page /plotsummary
- */
- public function plot() {
- if (empty($this->plot_plot)) {
- if ($this->page["Plot"] == "")
- $this->openpage("Plot");
- if ($this->page["Plot"] == "cannot open page")
- return array(); // no such page
- if (preg_match_all("/p class=\"plotpar\">(.*?)<\/p>/", str_replace("\n", " ", $this->page["Plot"]), $matches))
- for ($i = 0; $i < count($matches[0]); ++$i)
- $this->plot_plot[$i] = preg_replace('/<a href=\"\/SearchPlotWriters/i', '<a href="http://' . $this->imdbsite . '/SearchPlotWriters/', $matches[1][$i]);
- }
- return $this->plot_plot;
- }
- #-----------------------------------------------------[ Full Plot (split) ]---
- /** Get the movie plot(s) - split-up variant
- * @method plot_split
- * @return array array[0..n] of array[string plot,array author] - where author consists of string name and string url
- * @see IMDB page /plotsummary
- */
- public function plot_split() {
- if (empty($this->split_plot)) {
- if (empty($this->plot_plot))
- $plots = $this->plot();
- for ($i = 0; $i < count($this->plot_plot); ++$i) {
- if (preg_match("/(.*?)<i>.*<a href=\"(.*?)\">(.*?)<\/a>/", $this->plot_plot[$i], $match))
- $this->split_plot[] = array("plot" => $match[1], "author" => array("name" => $match[3], "url" => $match[2]));
- }
- }
- return $this->split_plot;
- }
- #========================================================[ /synopsis page ]===
- #---------------------------------------------------------[ Full Synopsis ]---
- /** Get the movies synopsis
- * @method synopsis
- * @return string synopsis
- * @see IMDB page /synopsis
- */
- public function synopsis() {
- if (empty($this->synopsis_wiki)) {
- if ($this->page["Synopsis"] == "")
- $this->openpage("Synopsis");
- if ($this->page["Synopsis"] == "cannot open page")
- return $this->synopsis_wiki; // no such page
- if (preg_match('|<div id="swiki\.2\.1">(.*?)</div>|ims', $this->page["Synopsis"], $match))
- $this->synopsis_wiki = trim($match[1]);
- }
- return $this->synopsis_wiki;
- }
- #========================================================[ /taglines page ]===
- #--------------------------------------------------------[ Taglines Array ]---
- /** Get all available taglines for the movie
- * @method taglines
- * @return array taglines (array[0..n] of strings)
- * @see IMDB page /taglines
- */
- public function taglines() {
- if (empty($this->taglines)) {
- if ($this->page["Taglines"] == "")
- $this->openpage("Taglines");
- if ($this->page["Taglines"] == "cannot open page")
- return array(); // no such page
- if (preg_match_all("/<p>(.*?)<\/p><hr/", $this->page["Taglines"], $matches))
- $this->taglines = $matches[1];
- }
- return $this->taglines;
- }
- #=====================================================[ /fullcredits page ]===
- #-----------------------------------------------------[ Helper: TableRows ]---
- /** Get rows for a given table on the page
- * @method private get_table_rows
- * @param string html
- * @param string table_start
- * @return mixed rows (FALSE if table not found, array[0..n] of strings otherwise)
- * @see used by the methods director, cast, writing, producer, composer
- */
- private function get_table_rows($html, $table_start) {
- $row_s = strpos($html, ">" . $table_start . "<");
- $row_e = $row_s;
- if ($row_s == 0)
- return FALSE;
- $endtable = strpos($html, "</table>", $row_s);
- if (preg_match_all("/<tr>(.*?)<\/tr>/", substr($html, $row_s, $endtable - $row_s), $matches)) {
- $mc = count($matches[1]);
- for ($i = 0; $i < $mc; ++$i)
- if (strncmp(trim($matches[1][$i]), "<td valign=", 10) == 0)
- $rows[] = $matches[1][$i];
- }
- return $rows;
- }
- #------------------------------------------------[ Helper: Cast TableRows ]---
- /** Get rows for the cast table on the page
- * @method private get_table_rows_cast
- * @param string html
- * @param string table_start
- * @return mixed rows (FALSE if table not found, array[0..n] of strings otherwise)
- * @see used by the method cast
- */
- private function get_table_rows_cast($html, $table_start, $class = "nm") {
- $row_s = strpos($html, '<table class="cast">');
- $row_e = $row_s;
- if ($row_s == 0)
- return FALSE;
- $endtable = strpos($html, "</table>", $row_s);
- if (preg_match_all("/<tr.*?(<td class=\"$class\".*?)<\/tr>/", substr($html, $row_s, $endtable - $row_s), $matches))
- return $matches[1];
- return array();
- }
- #------------------------------------------------[ Helper: Awards TableRows ]---
- /** Get rows for the awards table on the page
- * @method private get_table_rows_awards
- * @param string html
- * @param string table_start
- * @return mixed rows (FALSE if table not found, array[0..n] of strings otherwise)
- * @see used by the method awards
- * @author Qvist
- */
- private function get_table_rows_awards($html) {
- $row_s = strpos($html, '<table style="margin-top:');
- $row_e = $row_s;
- if ($row_s == 0)
- return FALSE;
- $endtable = strpos($html, "</table>", $row_s);
- $table_string = substr($html, $row_s, $endtable - $row_s);
- if (preg_match_all("/<tr>(.*?)<\/tr>/ims", $table_string, $matches)) {
- return $matches[1];
- }
- return $rows;
- }
- #------------------------------------------------------[ Helper: RowCells ]---
- /** Get content of table row cells
- * @method private get_row_cels
- * @param string row (as returned by imdb::get_table_rows)
- * @return array cells (array[0..n] of strings)
- * @see used by the methods director, cast, writing, producer, composer
- */
- private function get_row_cels($row) {
- if (preg_match_all("/<td.*?>(.*?)<\/td>/ims", $row, $matches))
- return $matches[1];
- return array();
- }
- #-------------------------------------------[ Helper: Get IMDBID from URL ]---
- /** Get the IMDB ID from a names URL
- * @method private get_imdbname
- * @param string href url to the staff members IMDB page
- * @return string IMDBID of the staff member
- * @see used by the methods director, cast, writing, producer, composer
- */
- private function get_imdbname($href) {
- if (strlen($href) == 0)
- return $href;
- $name_s = 17;
- $name_e = strpos($href, '"', $name_s);
- if ($name_e != 0)
- return substr($href, $name_s, $name_e - 1 - $name_s);
- else
- return $href;
- }
- #-------------------------------------------------------------[ Directors ]---
- /** Get the director(s) of the movie
- * @method director
- * @return array director (array[0..n] of arrays[imdb,name,role])
- * @see IMDB page /fullcredits
- */
- public function director() {
- if (empty($this->credits_director)) {
- if ($this->page["Credits"] == "")
- $this->openpage("Credits");
- if ($this->page["Credits"] == "cannot open page")
- return array(); // no such page
- }
- $director_rows = $this->get_table_rows($this->page["Credits"], "Directed by");
- if ($director_rows == null)
- $director_rows = $this->get_table_rows($this->page["Credits"], "Series Directed by");
- for ($i = 0; $i < count($director_rows); $i++) {
- $cels = $this->get_row_cels($director_rows[$i]);
- if (!isset($cels[0]))
- return array();
- $dir = array();
- $dir["imdb"] = $this->get_imdbname($cels[0]);
- $dir["name"] = strip_tags($cels[0]);
- $role = trim(strip_tags($cels[2]));
- if ($role == "")
- $dir["role"] = NULL;
- else
- $dir["role"] = $role;
- $this->credits_director[$i] = $dir;
- }
- return $this->credits_director;
- }
- #----------------------------------------------------------------[ Actors ]---
- /** Get the actors
- * @method cast
- * @return array cast (array[0..n] of arrays[imdb,name,role,thumb,photo])
- * @see IMDB page /fullcredits
- */
- public function cast() {
- if (empty($this->credits_cast)) {
- if ($this->page["Credits"] == "")
- $this->openpage("Credits");
- if ($this->page["Credits"] == "cannot open page")
- return array(); // no such page
- }
- $cast_rows = $this->get_table_rows_cast($this->page["Credits"], "Cast", "hs");
- for ($i = 0; $i < count($cast_rows); $i++) {
- $cels = $this->get_row_cels($cast_rows[$i]);
- if (!isset($cels[0]))
- return array();
- $dir = array();
- $dir["imdb"] = $this->get_imdbname($cels[1]);
- $dir["name"] = strip_tags($cels[1]);
- $role = strip_tags($cels[3]);
- if ($role == "")
- $dir["role"] = NULL;
- else
- $dir["role"] = $role;
- $dir["thumb"] = preg_replace('|.*<img src="(.*?)".*|is', '$1', $cels[0]);
- if (strpos($dir["thumb"], '._V1'))
- $dir["photo"] = preg_replace('|(.*._V1)\..+\.(.*)|is', '$1.$2', $dir["thumb"]);
- $this->credits_cast[$i] = $dir;
- }
- return $this->credits_cast;
- }
- #---------------------------------------------------------------[ Writers ]---
- /** Get the writer(s)
- * @method writing
- * @return array writers (array[0..n] of arrays[imdb,name,role])
- * @see IMDB page /fullcredits
- */
- public function writing() {
- if (empty($this->credits_writing)) {
- if ($this->page["Credits"] == "")
- $this->openpage("Credits");
- if ($this->page["Credits"] == "cannot open page")
- return array(); // no such page
- }
- $this->credits_writing = array();
- $writing_rows = $this->get_table_rows($this->page["Credits"], "Writing credits");
- for ($i = 0; $i < count($writing_rows); $i++) {
- $cels = $this->get_row_cels($writing_rows[$i]);
- if (count($cels) > 2) {
- $wrt = array();
- $wrt["imdb"] = $this->get_imdbname($cels[0]);
- $wrt["name"] = strip_tags($cels[0]);
- $role = strip_tags($cels[2]);
- if ($role == "")
- $wrt["role"] = NULL;
- else
- …
Large files files are truncated, but you can click here to view the full file