Samstag, 28. April 2012

Picasa-Bilder in Blog einfügen - Onlinetool und php-Script zur google-API Teil 2

Fortsetzung von Teil 1

Fortgeschrittene Abfragen

Folgende Abfrage-URL fordert die Daten für das Album "MacProGrafikkarte" des users "regensburger.tagebuch" an, und zwar nicht alle, sondern ab dem 15. Bild und insgesamt nur 6 Bilder; die Bilder sollen dabei die Breite von 500px haben.

http://picasaweb.google.com/data/feed/api/user/regensburger.tagebuch/album/MacProGrafikkarte?start-index=15&max-results=6&thumbsize=500
Man braucht keinen gesonderten Zugang oder Code für diese Abfragen, die google-API ist also mittlerweile eine ganz einfache Sache geworden.


Welche Abfrage-Parameter sind möglich?

Die Referenz sagt hierzu:

The Picasa Web Albums Data API supports the following parameters:

access (Visbility), alt (Alternative representation type), bbox (bounding-box search of geo coorinates), fields (Response filter), imgmax (Image size Parameter, nur gültig mit Album oder Photo), kind (alle Alben eines Users oder alle Bilder eines Albums, das ist hier die Frage),  l (names search of geo data), max-results (selbsterklärentd), prettypring (returns an xml-response with identations and line breaks), q (Full-text query string - jawohl, hier kann man Suchbegriffe eingeben), start-index (Start bei so-und-so-vieltem Bild), tag (falls im Album Bilder getagged sind), thumbsize (thumbnail-Größe)

Zu den thumbnail-Größen gibt es dann noch folgende Regel:

The following values are valid for the thumbsize and imgmax query parameters and are embeddable on a webpage. These images are available as both cropped(c) and uncropped(u) sizes by appending c or u to the size. As an example, to retrieve a 72 pixel image that is cropped, you would specify 72c, while to retrieve the uncropped image, you would specify 72u for the thumbsize or imgmax query parameter values.

32, 48, 64, 72, 104, 144, 150, 160

The following values are valid for the thumbsize and imgmax query parameters and are embeddable on a webpage. These images are available as only uncropped(u) sizes by appending u to the size or just passing the size value without appending anything.

94, 110, 128, 200, 220, 288, 320, 400, 512, 576, 640, 720, 800, 912, 1024, 1152, 1280, 1440, 1600

There is an additional size d which results in the <media:content> elements referencing the original uploaded photo, including all original Exif data. It is valid only for use with the imgmax query parameter.

These query parameters are used when retrieving the feeds in order to get images of the appropriate sizes. They cannot be used when retrieving the actual images. Example URL using the imgmax parameter:
 
https://picasaweb.google.com/data/feed/api/user/userID/album/albumName
?imgmax=912

 
Wie ich schon im ersten Teil schrieb, kann man meiner Erfahrung nach beliebige Zwischenwerte eingeben und erhält korrekte Ergebnisse 

Das php-Script zum Auslesen des Bilderalbums

Das Skript liest über die Picasa-API die Daten eines Albums ein und listet die Bilder in gewünschter Größe auf, jedes Bild in einem <p>-Absatz</p> und ohne besondere Formatierung.
Hauptzweck ist, die Bilder mit der Maus markieren, kopieren und in einen Blogartikel übertragen zu können. Benutze die gutten-alten Tastenkombinationen STRG-C und STRG-V

Das Skript erkläre ich für public domain, damit Ihr Euch Rückfragen sparen könnt. Es hat meines Erachtens sowieso nicht die Schöpfungshöhe des Urheberrechts erreicht, sondern ist eine Sammlung gewöhnlicher Skriptbefehle.

Das Script habe ich vorläufig hier entwickelt und zusammen mit Notizen abgespeichert:

http://webworker-archiv.de/projekt-tool-picasa.html

Ich würde mich freuen, wenn jemand an dem Skript weiter arbeiten oder mit arbeiten mag. Ich habe derzeit keine Zeitressourcen, obwohl meines Erachtens großer Bedarf an einer Weiterentwicklung besteht. Wer Varianten oder Weiterentwicklungen erstellt hat, kann mich kontaktieren, dann stelle ich hier entsprechende Hinweise und Links ein. Auf Wunsch kann er auch direkt über dieses Blog mitwirken.

Auch besteht Bedarf daran, dass jemand die API-Referenz (https://developers.google.com/picasa-web/docs/2.0/reference?hl=de-DE#Parameters) eindeutscht.

Das Tool in Aktion

Das Tool in Aktion findet Ihr vorläufig auf folgender Seite und Ihr könnt es bedenkenlos benutzen, da es den Server nicht belastet (mein Server spuckt nur den Quellcode mit den img-Pfaden aus, die Bilder werden von Euerem Browser aus direkt von picasaweb geladen):

 

Einzelheiten zur PICASA-API


Wer sich mit der API beschäftigt, muss mit zwei Bereichen befassen:
  • welche Abfragevarianten gibt es, wie wird codiert?
  • welche Dateien stecken in dem XML-Daten und wie werden sie extrahiert? 
Eigentlich wollte ich das alles näher erklären, aber es fehlt einfach die Zeit. Deshalb belasse ich es bei ein paar Randnotizen über eigene Erkenntnisse und verweise ansonsten auf die Doku und auf das hoffentlich erleuchtende Script. Besser, es erscheint dieser Artikel in gekürzter Fassung, als überhaupt nicht. Er liegt sowieso schon sehr lange auf Eis.

Die Doku ist interessant wegen der Abfragevarianten bzw. Abfragemöglichkeiten:
Die Struktur der xml-Datei dagegen ist miserabel dokumnetiert -  hier sieht man sich am besten das Script an und experimentiert weiter. Den Script-Quelltext habe ich unten aufgelistet.

Die Albenliste

Neben den Bildern eines Albums kann man sich auch die Alben selbst auflisten lassen. Folgender Teil im untenstehenden Script erledigt das:
if(!empty($picasauser)) {

   // Initialisieren, einfache Variante
   $alben=""; $albenliste=""; $albumname=""; $gphoto=""; $album_id=""; $location="";
   $timestamp=""; $commentCount=""; $commentEnabled="";

    $feeduserurl = $feedurlbasis."$picasauser";
   // z.B. http://picasaweb.google.com/data/feed/api/user/regensburger.tagebuch/
 
    $alben = simplexml_load_file($feeduserurl);

    // holt Albumnamen und Zahl der Bilder in jedem Album

    foreach ($alben->entry as $entry) {

      $albumtitle = $entry->title; $albumtitle=utf8_decode($albumtitle);

      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      // das 2007 hat nichts zu sagen! Dort ist einfach ein Teil der Struktur definiert.

       $numphotos = $gphoto->numphotos;

       $album_id=$gphoto->id;

       $albumname=$gphoto->name; $albumname=utf8_decode($albumname);
      // = URL-Name, nicht Titel

       $location=$gphoto->location; // Ort

       $timestamp=$gphoto->timestamp; //

       $commentCount=$gphoto->commentCount; // Menge der Kommentare im Album

       $commentingEnabled=$gphoto->commentingEnabled;

       // es gibt noch: user und nickname

      // Hier wird Zeile für Zeile die spätere Ausgabe vorbereitet. Ich habe die einzelen Alben gleich verlinkt, damit man im nächsten Schritt die Bilder des Albums aufrufen kann.
      $albenliste. ="<p><a href='$selfpage&picasauser=$picasauser&album=$albumname'>$albumtitle (Albumname in URL: $albumname)</a><br>album_id=$album_id - enthaltene Bilder=$numphotos </p>";

    } // Ende der Schleife


    //Ausgabe der Albenliste:

    echo "<h2>Albenliste:</h2>";
    echo "<div style='font-size:9pt; width:90%; border:1px solid green; height:300px; overflow:auto' class='albenliste'>";
    echo $albenliste;
    echo "</div>";

Die Bedeutung der thumbnail-Werte


Innerhalb der XML-Datei gibt es eine Gruppe von Datensätzen über so genannte "thumbnails". Das ist etwas erklärungsbedürftig.



Die abgerufenen Daten eines Albums enthalten zu jedem Bild:

- die Originalbilddaten (Größe, Datum, Breite, Höhe, URL zur Vollversion)
- zusätzliche URI zu kleineren Bildvarianten, die hier thumbnails genannt werden.

Die thumbnails können dabei auch 1024 Pixel breit sein; der Name ist etwas missverständlich. Es sind offenbar alle kleineren Versionen des Originalbildes.

Die von google vorgeschlagenen thumbnails:

Gibt man beim Abruf eines Albums keine Größenwünsche vor, enthalten die XML-Daten drei Vorschläge zu thumbnails, also die URI von drei aufrufbaren  Größenvarianten. Die größte Variante scheint eine 720 Pixel breite Version zu sein. Die Breite der kleineren Versionen weiß ich im Moment nicht. Die URI unterscheiden sich nur an einer Stelle:

Beispiel aus Teil 1:

https://lh5.googleusercontent.com/-lC4lPk454Og/Tv3VWXyq-_I/AAAAAAAATcE/_MAazJsI-0w/s720/regensburg-galaxie3small.jpg

Anmerkung: Das Bild ist im Original 1024 Pixel groß.

Innerhalb der XML-Auswertung geschieht dies so:

In einem vorangegangenen Schritt wurde die Variable bzw. array namens $entry ermittelt. Dieser wird jetzt wieder zerlegt, wobei offenbar das Schema für die Datenstruktur über yahoo aufgerufen wird:


      $media = $entry->children('http://search.yahoo.com/mrss/');

und weiter

      $thumbnail = $media->group->thumbnail[0]; // zwischenwert


Das array $thumbnail  hat drei Elemente mit den Webadressen von drei unterschiedlich großen Bildvarianten


1. Variante: $thumbnail[0] = kleines Bild
2. Variante: $thumbnail[1] = mittleres Bild
3. Variante: $thumbnail[2] = größeres Bild (wahrscheinlich 720 Pixel)

An anderer Stelle ist aber die URL zum Vollbild gespeichert, ich muss die thumbnails nicht verwenden.

Außerdem kann ich die thumbnail-Adressen durch das php-Script automatisch abändern, indem ich den /s720/-Wert einfach ändere und den restlichen String belasse.

Die gezielt aufgerufene thumbnail-Größe

Durch Angaben im Abfragestring kann ich erzwingen, dass eine bestimmte thumbnail-Größe ausgegeben wird. Wenn man beim Aufruf eine spezielle Groesse vorgibt, dann muss man thumbnail[0] nehmen, sonst klappt meiner Erfahrung nach das Auslesen nicht! Offenbar werden dann keine drei Versionen angeboten, sondern nur eine. Darum ist der erste array-Wert auszulesen (beginnend bei 0).

Es werden aber trotzdem alle Angaben zum Originalbild und die URL zum Originalbild zurück gegeben. 


Der komplette Script-Quelltext des hier verwendeten Online-Tools

Die entscheidende Teil des Script steckt im Abschnitt " Bilder eines Albums listen" - dort wird das Ergebnis der Abfrage ausgewertet und aufbereitet
$selfpage=$_SERVER['PHP_SELF']; // oder Scriptname etc.

$albenliste="";

$feedurlbasis="http://picasaweb.google.com/data/feed/api/user/";

// nur temporär zur Kontrolle:
// echo "check album=$album - picasauser=$picasauser";

// nur für mich bzw. als demo:
if(empty($picasauser)) $picasauser="regensburger.tagebuch";
if(empty($album)) $album="Yorki";

// Voreinstellung Thumbnailgröße
if(empty($thumbsize)) $thumbsize=500;
// Voreinstellung Link-Target
if(empty($target)) $target="_blank";
// Voreinstellung Startnummer
if(empty($start)) $start=1;
// Voreinstellung: soll Bild auch mit Album verlinkt sein?
if(empty($verlinkt)) $verlinkt="nein";



### Formular zur Eingabe von User und evtl. auch Albumname###

echo "

<form method='post' action='$selfpage'>

<div style='width:80%; border:1px solid #9F0000; padding:15px; margin-bottom:10px; background-color:#E2DCCE'>

<p style='padding:5px; background-color:#333333;border:1px inset #9F0000; color:#B7F902'>Momentan gewählter User: $picasauser <br> Momentan gewähltes Album: $album

</p>

<p>

Username (ohne email-Zusatz):</br>

<input type='text' name='picasauser' value='$picasauser' size='50'><br>

Albumname <br> <input type='text' name='album' value='$album' size='50'><hr>

Startnummer Bild <input  type='text' name='start' value='$start' size='10' >

 -  Mengenbeschraenkung Bilder: <input  type='text' name='menge' value='$menge' size='10'> (leer lassen für alle Bilder anzeigen)<br><br>

Breite der anzuzeigenden Bilder in Pixel <input type='text' name='thumbsize' value='$thumbsize' size='10'>

<br>

Sollen Bilder verlinkt sein? <select size='1' name='verlinkt'>";

echo "<option value='nein'>keine Verlinkung</option>";

if($verlinkt=="originalbild") {

    echo "<option value='originalbild' selected='selected'>mit Original-Bilddatei</option>";

}else {

    echo "<option value='originalbild'>mit Original-Bilddatei</option>";

}

if($verlinkt=="albumseite") {

    echo "<option value='albumseite' selected='selected'>mit Bild in  Albumseite</option>";

}else{

    echo "<option value='albumseite'>mit Bild in  Albumseite</option>";

}

echo "

</select></p>

<input type='Submit' name='submit' value='senden' style='width:350px'>

</div>

</form>

";


########################### Alben des User listen ################
//  Hier eine Box mit einer Liste der Alben, kann auch wegfallen oder an einer anderen Stelle erfolgen 

if(!empty($picasauser)) {

   // Initialisieren, einfache Variante

   $alben=""; $albenliste=""; $albumname=""; $gphoto=""; $album_id=""; $location="";
   $timestamp=""; $commentCount=""; $commentEnabled="";


    $feeduserurl = $feedurlbasis."$picasauser";
   // z.B. http://picasaweb.google.com/data/feed/api/user/regensburger.tagebuch/
 

    $alben = simplexml_load_file($feeduserurl);

    // holt Albumnamen und Zahl der Bilder in jedem Album

    foreach ($alben->entry as $entry) {

      $albumtitle = $entry->title; $albumtitle=utf8_decode($albumtitle);

      $gphoto = $entry->children('http://schemas.google.com/photos/2007');
      // das 2007 hat nichts zu sagen! Dort ist einfach ein Teil der Struktur definiert.


       $numphotos = $gphoto->numphotos;

       $album_id=$gphoto->id;

       $albumname=$gphoto->name; $albumname=utf8_decode($albumname);
      // = URL-Name, nicht Titel

       $location=$gphoto->location; // Ort

       $timestamp=$gphoto->timestamp; //

       $commentCount=$gphoto->commentCount; // Menge der Kommentare im Album

       $commentingEnabled=$gphoto->commentingEnabled;

       // es gibt noch: user und nickname

      // Hier wird Zeile für Zeile die spätere Ausgabe vorbereitet. Ich habe die einzelen Alben gleich verlinkt, damit man im nächsten Schritt die Bilder des Albums aufrufen kann.

      $albenliste. ="<p><a href='$selfpage&picasauser=$picasauser&album=$albumname'>$albumtitle (Albumname in URL: $albumname)</a><br>album_id=$album_id - enthaltene Bilder=$numphotos </p>";

    } // Ende der Schleife


    //Ausgabe der Albenliste:

    echo "<h2>Albenliste:</h2>";
    echo "<div style='font-size:9pt; width:90%; border:1px solid green; height:300px; overflow:auto' class='albenliste'>";
    echo $albenliste;
    echo "</div>";




##########################  Bilder eines Albums listen ##############

if(!empty($album)){

    // evtl. Variablen initialisieren

    // dann feedurl erstellen

    $feedurl = $feedurlbasis."$picasauser/album/$album";

    $feedurl.="?start-index=$start";

    if(!empty($menge)) $feedurl.="&max-results=$menge";

    $feedurl.="&thumbsize=$thumbsize";

    // Feed einlesen

    $photos = simplexml_load_file($feedurl);

    // Albumname und Zahl der Bilder im Album

    $albumtitel=$photos->title;

    $counts = $photos->children('http://a9.com/-/spec/opensearchrss/1.0/');

    $gesamtanzahlbilder = $counts->totalResults;

    // gefunden auf swish4all.com,  testweise eingebunden (.chanel_user, channel_icon ..)

    $channeluser = $photo->author->name;

    $channelicon = $photo->icon;

    $channelid = $photo->id; echo $channelid."<br>";

    $ns = $photos->getDocNamespaces();

    $ns_gphoto = $photos->children($ns['gphoto']);

     $channelname = $ns_gphoto->name; echo $channelname."<br>";

     $channellocation = $ns_gphoto->location; echo $channellocation."<br>";

     $channelstartIndex = $ns_gphoto->startIndex; echo $channelstartindex."<br>";

     $channelnumphotos = $ns_gphoto->numphotos;


     // echo "$channeluser <br>$channelicon <br> $channelid <br> $channelname <br> $channellocation <br> $channelstartIndex <br> $channelnumphotos <br>";

}

####### die einzelnen Bilder auslesen #########

     $zeile="";

     foreach ($photos->entry as $entry) {

      $dateiname = $entry->title;

      $dateiname= utf8_decode($dateiname);

      $bildunterschrift = $entry->summary; // Bildunterschrift

      $bildunterschrift=utf8_decode($bildunterschrift);

      $gphoto = $entry->children('http://schemas.google.com/photos/2007');

       $size = $gphoto->size; // Dateigroesse

       $height = $gphoto->height;

       $width = $gphoto->width;

       ####echo "$dateiname - size=$size - height=$height - width=$width <br>";

      // get the photo and thumbnail information

      $media = $entry->children('http://search.yahoo.com/mrss/');

      // man erhält damit die thumbnail-Infos, also
      // Werte und URI von  3 Größen-Varianten des Bildes
         $thumbnail = $media->group->thumbnail[0]; // zwischenwert

      // [2] enthält die Werte zum größten thumbnail (die dritte Variante)
      // aendere das in  [0] or [1] um kleinere thumbnails zu erhalten

    //// Achtung - wenn man schon beim Aufruf eine spezielle Groesse vorgibt, dann muss man thumbnail[0] nehmen, sonst klappt das Auslesen nicht! Offenbar werden dann keine drei Versionen angeboten, sondern nur eine. Darum ist der erste array-Wert auszulesen (beginnend bei 0)

         $thumbnail_url=$thumbnail->attributes()->{'url'};

         $thumbnail_width = $thumbnail->attributes()->{'width'};

         $thumbnail_height = $thumbnail->attributes()->{'height'};


      // im einzelnen: Tags

       $tags = $media->group->keywords;

      // im einzelnen: full image information

       $group_content = $media->group->content; // zwischenwert

        $bild_url = $group_content->attributes()->{'url'}; // welches bild?

        $bild_width = $group_content->attributes()->{'width'};

        $bild_height = $group_content->attributes()->{'height'};

      //gefunden auf swish4all

        $ns = $photos->getDocNamespaces();

        $ns_gphoto = $entry->children($ns['gphoto']); // zwischenwert

          $timestamp = $ns_gphoto->timestamp/1000;

          $albumid = $ns_gphoto->id;

        ### echo "timestamp=$timestamp - albumid=$albumid <br>";

      $ns_media = $entry->children($ns['media']); //zwischenwert

       $thumb_attr = $ns_media->group->thumbnail->attributes(); // zwischenwert

          $thumbnail_url = $thumb_attr['url'];

          $thumbnail_w = $thumb_attr['width'];

          $thumbnail_h = $thumb_attr['height'];

       $bildtitle = $ns_media->group->title; // Dateiname!

       ###    echo "bildtitle=$bildtitle <br>";

          $con_attr = $ns_media->group->content->attributes(); //zwischenwert

            $content = $con_attr['url']; //originalbild?

        ### echo "content=$content <br>";

        $link_attr = $entry->{'link'}[1]->attributes(); // zwischenwert

           $link = $link_attr['href']; //ruft Bild im Rahmen auf Albums auf

        ## echo "link = $link <br>";

        $ns_exif = $entry->children($ns['exif']); // zwischenwert

            $iso = $ns_exif->tags->iso;

            $exposure = $ns_exif->tags->exposure;

            $fstop = $ns_exif->tags->fstop;

            $make = $ns_exif->tags->make;

            $model = $ns_exif->tags->model;

            $flash = $ns_exif->tags->flash;

            $focallength = $ns_exif->tags->focallength;

            $exiftime = $ns_exif->tags->time/1000; // muesste noch formatiert werden

           ### echo "iso=$iso - exposure = $exposure, fstop=$fstop, make=$make, model=$model - flash=$flash - exiftime=$exiftime <br> ";

           ### echo "<hr>";

           ### echo "<a href='$link' alt='$bildunterschrift'><img src='$thumbnail_url'></a><br>$bildunterschrift <br><br>";



$zeile= "<img src='$thumbnail_url' width='$thumbnail_w' >";


if($verlinkt=="originalbild") {

     $zeile="<p><a href='$content' target='$target'>$zeile</a></p>";

  }elseif($verlinkt=="albumseite"){

     $zeile="<p><a href='$link' target='$target'>$zeile</a></p>";

  }else {

    $zeile="<p>$zeile</p>";

}


$zeile.="<p class='bildunterschrift'>$bildunterschrift</p>";

$ausgabe.=$zeile;

} ## Ende der Schleife

################ Jetzt die Ausgabe ###########

echo $ausgabe;

/*
  zusaetzliche quellcode-Ausgabe für test-zwecke:
   $ausgabe=str_replace("</p>", "</p>\n\n", $ausgabe);
   $ausgabe=str_replace("<br />", "<br />\n\n", $ausgabe);
   $ausgabe=str_replace("<br>", "<br />\n\n", $ausgabe);
   echo nl2br(htmlspecialchars($ausgabe));
   echo "<hr>Kontrolle: Feed-URL: <a href='$feedurl' target='_blank'>$feedurl [Link in zweitem Fenster oeffnen]</a><hr>";

*/

#####################################################


}

Ich rufe alle Interessierten auf, in dieser Richtung weiter zu recherchieren, zu entwickeln und zu bloggen.


  © Blogger template 'Fly Away' by Ourblogtemplates.com 2008

Back to TOP