Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [funkcja] Pobieranie informacji o filmie..., Rozwinięcie funkcji getPlots()
crash
post 29.01.2006, 12:11:46
Post #1





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

Ostrzeżenie: (0%)
-----


Funkcja przyjmuje tytuł filmu i rok produkcji (ewentualnie ścieżkę do pliku cache) pobiera dane o filmie i zwraca je w formie tablicy.

  1. <?php
  2. /**
  3.  * Funkcja pobierająca dane z podanego adresu,
  4.  * można zastąpić zwykłą file(), ale użycie CURL'a
  5.  * jest o wiele bardziej efektywne...
  6.  *
  7.  * @author crash : crash (at) os (dot) pl
  8.  */
  9. function getData( $url, $type = 'array' )
  10. {
  11.    $data = '';
  12.    
  13.    if( !extension_loaded( 'curl' ) )
  14.    {
  15.       @dl( 'curl' );
  16.    }
  17.  
  18.    if( extension_loaded( 'curl' ) )
  19.    {
  20.       $curl = curl_init();
  21.  
  22.       curl_setopt( $curl, CURLOPT_URL, $url );
  23.       curl_setopt( $curl, CURLOPT_HEADER, false );
  24.       curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
  25.       curl_setopt( $curl, CURLOPT_FORBID_REUSE, true );
  26.       curl_setopt( $curl, CURLOPT_FRESH_CONNECT, true );
  27.       curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
  28.       curl_setopt( $curl, CURLOPT_TIMEOUT, 25 );
  29.  
  30.       $data = curl_exec( $curl );
  31.       
  32.       curl_close( $curl );
  33.    }
  34.    else
  35.    {
  36.       $data = file( $url );
  37.    }
  38.    
  39.    if( ( $type == 'array' ) and !is_array( $data ) )
  40.    {
  41.       $data = explode( "\n", $data );
  42.    }
  43.    
  44.    return $data;
  45. }
  46.  
  47. /**
  48.  * Argumenty:
  49.  * string $parTitle - tytuł filmu,
  50.  *    int $year     - rok produkcji,
  51.  * string $cache    - opcjonalna ścieżka do pliku cache
  52.  *
  53.  * Zwraca:
  54.  * array $info
  55.  *
  56.  * @author crash : crash (at) os (dot) pl
  57.  */
  58. function getMovieInfo( $parTitle, $year, $cache = false )
  59. {
  60.    $info = array();
  61.    
  62.    if( $cache != false )
  63.    {
  64.       if( $data = @file_get_contents( $cache ) )
  65.       {
  66.          $data = unserialize( $data );
  67.  
  68.          if( array_key_exists( $parTitle, $data ) )
  69.          {
  70.             return $data[ $parTitle ];
  71.          }
  72.          else
  73.          {
  74.             foreach( $data as $name => $save )
  75.             {
  76.                if( strcasecmp( $name, $parTitle ) == 0 )
  77.                {
  78.                   return $save;
  79.                }
  80.             }
  81.          }
  82.       }
  83.    }
  84.    
  85.    $title  = preg_replace( '/^(the|el|le|a) (.+)/i', '\\2, \\1', $parTitle );
  86.    $url1   = 'http://www.filmweb.pl/Find?query=' . urlencode( $title ) . '&category=1&submit=szukaj';
  87.    $data   = getData( $url1 );
  88.    $inPage = false;
  89.  
  90.    if( count( $data ) > 0 )
  91.    {
  92.       foreach( $data as $n => $line )
  93.       {
  94.          if( ( stripos( $line, '<title>' ) !== false ) and ( strpos( $line, 'Filmweb.pl' ) === false ) )
  95.          {
  96.             $inPage = true;
  97.             break;
  98.          }
  99.          if( ( stripos( $line, $title ) !== false ) and ( strpos( $line, (string)$year ) !== false ) )
  100.          {
  101.             if( preg_match( '/href="([^"]+)"/', $line, $out ) )
  102.             {
  103.                $url2 = $out[ 1 ];
  104.                break;
  105.             }
  106.          }
  107.       }
  108.  
  109.       if( isset( $url2 ) or $inPage == true )
  110.       {
  111.          $data = implode( '', ( $inPage != true ) ? getData( $url2 ) : $data );
  112.          
  113.          if( preg_match( '#<div class="tyt">([^<]+)<span class="styt">\(?([^<\(\)]+)#', $data, $out ) )
  114.          {
  115.             $info[ 'title' ][ 'polish' ]   = trim( $out[ 1 ] );
  116.             $info[ 'title' ][ 'original' ] = ( $out[ 2 ] != $year ) ? trim( preg_replace( '/^AKA /', '', html_entity_decode( $out[ 2 ] ) ) ) : $info[ 'title' ][ 'polish' ];
  117.  
  118.             $info[ 'year' ] = $year;
  119.          }
  120.          
  121.          if( preg_match_all( '#(country|genre).id=[0-9]+">([^<]+)#', $data, $out ) )
  122.          {
  123.             foreach( $out[ 1 ] as $key => $type )
  124.             {
  125.                $info[ $type ][] = $out[ 2 ][ $key ];
  126.             }
  127.          }
  128.          
  129.          if( preg_match_all( '#<b>([^<]+)</b> \((Polska|Świat)\)#', $data, $out ) )
  130.          {
  131.             $types = array(
  132.                             'Polska' => 'poland',
  133.                             'Świat'  => 'world'
  134.                           );
  135.                           
  136.             foreach( $out[ 1 ] as $key => $type )
  137.             {
  138.                $info[ 'premiere' ][ $types[ $out[ 2 ][ $key ] ] ] = isset( $out[ 1 ][ $key ] ) ? strtotime( $out[ 1 ][ $key ] ) : 0;
  139.             }
  140.          }
  141.          
  142.          if( preg_match( '#czas trwania: ([0-9]+)#', $data, $out ) )
  143.          {
  144.             $info[ 'time' ] = $out[ 1 ];
  145.          }
  146.          
  147.          if( preg_match_all( '#(reżyseria|scenariusz|zdjęcia|muzyka)\t+?<a class="n" title="(.+?)- filmografia#', $data, $out ) )
  148.          {
  149.             $names = array(
  150.                             'reżyseria'  => 'director',
  151.                             'scenariusz' => 'screenplay',
  152.                             'zdjęcia'    => 'photos',
  153.                             'muzyka'     => 'music'
  154.                           );
  155.                           
  156.             foreach( $out[ 1 ] as $key => $type )
  157.             {
  158.                $info[ 'people' ][ $names[ $type ] ] = $out[ 2 ][ $key ];
  159.             }
  160.          }
  161.          
  162.          if( preg_match_all( '#<td width="194" align="right"><a class="n" title="(.+?)- filmografia.+?<td width="194" align="left">([^<]+)</td>#s', $data, $out ) )
  163.          {
  164.             foreach( $out[ 1 ] as $key => $who )
  165.             {
  166.                $info[ 'cast' ][ html_entity_decode( $who ) ] = html_entity_decode( $out[ 2 ][ $key ] );
  167.             }
  168.          }
  169.       }
  170.    }
  171.  
  172.    if( count( $info ) > 0 )
  173.    {
  174.       if( $cache != false )
  175.       {
  176.          if( $data = @file_get_contents( $cache ) )
  177.          {
  178.             $data = unserialize( $data );
  179.          
  180.             if( !array_key_exists( $parTitle, $data ) or ( count( $data[ $parTitle ] ) < count( $info ) ) )
  181.             {
  182.                $data[ $parTitle ] = $info;
  183.             }
  184. if( preg_match( '#src="(http://gfx.filmweb.pl/f/[^/]+/po.[^.]+.jpg|http://gfx.filmweb.pl/f/[^/]+/[^.]+.jpg)"#', $data, $out ) )
  185. {
  186.  $info[ 'poster' ] = $out[ 1 ];
  187. }
  188.          }
  189.          else
  190.          {
  191.             $data = array();
  192.             $data[ $parTitle ] = $info;
  193.          }
  194.  
  195.          file_put_contents( $cache, serialize( $data ) );
  196.       }
  197.    }
  198.  
  199.    return $info;
  200. }
  201. ?>


Przykład użycia:
  1. <?php
  2. print_r( getMovieInfo( 'Crash', 2004 ) );
  3. ?>


Wynik:
Kod
Array
(
   [title] => Array
       (
           [polish] => Miasto gniewu
           [original] => Crash
       )

   [year] => 2004
   [country] => Array
       (
           [0] => Niemcy
           [1] => USA
       )

   [genre] => Array
       (
           [0] => Dramat
           [1] => Obyczajowy
       )

   [premiere] => Array
       (
           [poland] => 1121983200
           [world] => 1094767200
       )

   [time] => 113
   [people] => Array
       (
           [director] => Paul Haggis
           [screenplay] => Paul Haggis
           [photos] => James Muro
           [music] => Mark Isham
       )

   [cast] => Array
       (
           [Sandra Bullock] => Jean
           [Don Cheadle] => Graham
           [Matt Dillon (I)] => Oficer Ryan
           [Jennifer Esposito] => Ria
           [William Fichtner] => Flanagan
           [Brendan Fraser] => Rick
           [Terrence Howard] => Cameron
           [Ludacris] => Anthony
           [Thandie Newton] => Christine
           [Ryan Phillippe] => Oficer Hanson
           [Larenz Tate] => Peter
           [Tony Danza] => Fred
           [Keith David (I)] => Porucznik Dixon
           [Shaun Toub] => Farhad
           [Loretta Devine] => Shaniqua
       )

    [poster] => http://gfx.filmweb.pl/f/107996/po.6990411.jpg
)


Updated!


--------------------
Go to the top of the page
+Quote Post
quadro
post 19.08.2006, 20:19:13
Post #2





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 18.08.2006

Ostrzeżenie: (0%)
-----


mam, może banalne pytanie bo nieznam się za bardzo na php. Jak przerobić ten skrypcik tak żeby dało się wysiągnąć z niego dane np:

$title_pl
$title_org
$obsada
...itd

Chodzi mi o to żebym do konkretnych zmiennych były nadane konkretne dane
Go to the top of the page
+Quote Post
tiraeth
post 19.08.2006, 20:32:33
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


  1. <?php
  2. // tutaj te funkcje
  3.  
  4. $res = getMovieInfo( 'Crash', 2004 );
  5. $title_pl = $res['title']['polish'];
  6. // ........
  7. ?>


Nie umiesz przypisywać do zmiennych? A może nie znasz tablic?questionmark.gifquestionmark.gif
Go to the top of the page
+Quote Post
quadro
post 19.08.2006, 22:14:31
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 18.08.2006

Ostrzeżenie: (0%)
-----


Wielkie dzięki za tak szybką odpowiedź, o to właśnie mi chodziło. Nieznam się za bardzo na php i niemiałem pojęcia że w taki prosty sposób można to załatwić. Jeszcze raz wielkie dzięki





no i napodkałem jeszcze jeden pewnie też banalny problem.

mam takie coś


  1. Array
  2. (
  3. [Sandra Bullock] => Jean
  4. [Don Cheadle] => Graham
  5. [Matt Dillon (I)] => Oficer Ryan
  6. [Jennifer Esposito] => Ria
  7. [William Fichtner] => Flanagan
  8. [Brendan Fraser] => Rick
  9. [Terrence Howard] => Cameron
  10. [Ludacris] => Anthony
  11. [Thandie Newton] => Christine
  12. [Ryan Phillippe] => Oficer Hanson
  13. [Larenz Tate] => Peter
  14. [Tony Danza] => Fred
  15. [Keith David (I)] => Porucznik Dixon
  16. [Shaun Toub] => Farhad
  17. )


i jak do tych danych przypisać zmienne?

Ten post edytował quadro 19.08.2006, 22:16:49
Go to the top of the page
+Quote Post
rama
post 19.08.2006, 22:36:16
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 25.02.2006
Skąd: Trójmiasto

Ostrzeżenie: (0%)
-----


To zależy co chcesz zrobić z tymi wartościami ( tablicą ), bo jeśli wyrzucić do przeglądarki ( np. echo/print ), to możesz użyć funkcji foreach winksmiley.jpg

  1. <?php
  2. $res = getMovieInfo( 'Crash', 2004 );
  3.  
  4. foreach( $res['cast'] as $klucz => $wartosc ) 
  5. {
  6.  // Jak ma wyświetlić, czyli...
  7.  print $klucz . 'jako' . $wartosc;
  8. }
  9. ?>
i w rezultacie zwraca Ci coś takiego
  1. Sandra Bullock jako Jean
  2. Don Cheadle jako Graham
  3. Matt Dillon (I) jako Oficer Ryan


PS Tablice przypisujesz tak samo jak zmienną, czyli
  1. <?php
  2. $cast = $res['cast'];
  3. ?>
A później odwołujesz się do zawartości tej tablicy tak jak wyżej opisałem winksmiley.jpg

Ten post edytował rama 19.08.2006, 22:40:21
Go to the top of the page
+Quote Post
quadro
post 20.08.2006, 10:25:36
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 18.08.2006

Ostrzeżenie: (0%)
-----


Wielkie dzięki, zrobiłem coś takiego:

  1. <?php
  2. foreach( $res['cast'] as $klucz => $wartosc )
  3. {
  4.  $obsada.= $klucz . ': ' . $wartosc . '<br>';
  5. }
  6. ?>


no i ostatni problem,

  1. <?php
  2. $res = getMovieInfo( 'Matrix', 1999 );
  3. ?>


Jak podsatwić zamiast Matrix i 1999 2 zmienne, próbowałem różnie to wstawiać ale coś mi nie wychodziło
Go to the top of the page
+Quote Post
rama
post 20.08.2006, 15:17:32
Post #7





Grupa: Zarejestrowani
Postów: 50
Pomógł: 1
Dołączył: 25.02.2006
Skąd: Trójmiasto

Ostrzeżenie: (0%)
-----


Metoda I:
  1. <?php
  2. $film = 'Matrix';
  3. $rok = 1999;
  4.  
  5. $res = getMovieInfo( $film, $rok );
  6. ?>

Metoda II - Wykorzystanie GET, czyli uzyskanie zmiennych z adresu...
  1. <?php
  2. if( isset( $_GET['film'] ) && isset( $_GET['rok'] ) ) {
  3.  $res = getMovieInfo( $_GET['film'], $_GET['rok'] );
  4. } else {
  5.  // Bląd jeśli $_GET['film'] i $_GET['rok'] nie istnieje ;)
  6.  print 'Błąd: Nie został wybrany żaden film';  
  7. }
  8. ?>
Parametry podajesz poprzez adres, czyli (np.) index.php?film=Matrix&rok=1999

Warte uwagi jest to, że poza tymi dwiema metodami istnieje jeszcze cała masa innych sposobów, aby przekazać zmienną do skryptu, a powyższe przykłady są tylko szybkim przykładem zobrazowania rozwiązania Twojego problemu winksmiley.jpg
Go to the top of the page
+Quote Post
acztery
post 6.09.2006, 18:05:11
Post #8





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

Ostrzeżenie: (0%)
-----


skrypt ma 1 wade

jezeli cos sie zmini na stronie filmweb to moze cos sie zle cos wyswetlac ...
Go to the top of the page
+Quote Post
michael_13
post 13.05.2007, 14:40:16
Post #9





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 13.05.2007

Ostrzeżenie: (0%)
-----


i właśnie już nie dział, mógłby ktoś uaktualnić tą funkcję?


--------------------
<?php
die ('Wiedza sama w sobie nie ma żadnej wartości. Cenną czyni ją jej STOSOWANIE. Innymi słowy, świat nie odpłaca Ci za to, co wiesz. Świat odpłaca Ci za to, co robisz.');
?>
Go to the top of the page
+Quote Post
Gacek89
post 9.05.2008, 10:34:33
Post #10





Grupa: Zarejestrowani
Postów: 77
Pomógł: 8
Dołączył: 2.11.2007
Skąd: Katowice

Ostrzeżenie: (0%)
-----


wywala mi bład w 66 linijce przy unserialize
Kod
Notice:  unserialize() [function.unserialize]: Error at offset 0 of 4768 bytes

wie ktos jak to naprawic ?
Go to the top of the page
+Quote Post
spit
post 9.05.2008, 23:56:36
Post #11





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 1.08.2005

Ostrzeżenie: (0%)
-----


Ostatnio filmweb zmienił formę url'i, i przez to większość filmów nie działa poprawnie w skrypcie. Czy autor byłby tak uprzejmy i rzucił na to okiem?
Go to the top of the page
+Quote Post
Krizis
post 13.11.2009, 16:56:29
Post #12





Grupa: Zarejestrowani
Postów: 49
Pomógł: 1
Dołączył: 27.07.2008

Ostrzeżenie: (0%)
-----


Witam!
Mógł byś rzucić okiem na skrypt bo FilmWeb zmieniło skrypt i teraz to nie działa :/
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 18:25