2010-08-22 4 views
1

J'essaie d'utiliser mon compte Flickr en tant qu'hôte pour une galerie d'images. J'ai tagué 251 photos avec un tag commun 'golftournament' et chacun avec l'année et tous les joueurs sur la photo.L'API Flickr renvoie un nombre incohérent de photos lors de l'utilisation de plusieurs tags

Ainsi, par exemple, trois photos aléatoires peuvent avoir les balises suivantes:

golftournament dan steve 2005 (dan et steve dans cette photo de 2006)

golftournament 2006 (aucun joueur dans cette photo de 2006)

golftournament 2008 paul dan (paul et dan sur cette photo de 2008)

Lorsque je fais un appel API, il renvoie un nombre total de photos incohérent si je mets la partie 'tags' de l'appel API t o tags=golftournament,dan,2005 et le tag_mode à tagmode=all.

Parfois, je reçois 13 photos dans le résultat, parfois je reçois 12 photos et parfois je reçois effectivement le nombre de photos (14)

J'utilise une bibliothèque PHP, mais ce n'est pas pertinent parce que je vois la mêmes résultats dans l'explorateur d'API de Flickr:

Y at-il une raison pour laquelle l'API Flickr est si incohérente à cet égard?

Cheers,

Dan

Répondre

0

Juste pour mettre à jour à ce sujet, à la fin, je suis tout simplement toutes photos d'un photoset puis construit deux tableaux d'années et les joueurs des tags. Finalement, j'ai utilisé la demande pour retourner les bonnes photographies. J'utilise l'excellent phpFlickr library et voici mon script entier API:

quelqu'un
<?php 
// Initialise Flickr API library and authentication 
require_once("phpFlickr.php"); 
$f = new phpFlickr('<api key>', '<secret>'); 
$f->setToken('<token>'); 

// Get all photos from the photoset 
$page = 0; 
$perpage = 500; 
$all = array('photos' => array(), 'total' => 0); 
while ($perpage * $page < $all['total'] || $all['total'] == 0) { 
    $p = $f->photosets_getPhotos('<photoset number>', 'tags', NULL, $perpage, $page + 1); 
    $all['total'] = (integer) $p['photoset']['total']; 
    $all['photos'] += $p['photoset']['photo']; 
    $page++; 
} 

// Get all the available years/players from the tags 
$years = array(); 
$players = array(); 
foreach ($all['photos'] as $key => $photo) { 
    $photo_tags = explode(' ', $photo['tags']); 
    $all['photos'][$key]['tags'] = $photo_tags; 
    foreach ($photo_tags as $tag) { 
     if (preg_match('/^[0-9]{4}$/', $tag)) { 
      if (!in_array($tag, $years)) { 
       $years[] = $tag; 
      } 
     } else { 
      if (!in_array($tag, $players)) { 
       $players[] = $tag; 
      } 
     } 
    } 
} 
rsort($years); 
sort($players); 

// Set year/player tags if set 
$tags = array(); 
if (isset($_GET['year']) && in_array($_GET['year'], $years)) { 
    $tags['year'] = $_GET['year']; 
} 
if (isset($_GET['player']) && in_array($_GET['player'], $players)) { 
    $tags['player'] = $_GET['player']; 
} 

// Build output array and filter by year/person 
$output = array(
    'years'  => $years, 
    'players' => $players, 
    'photos' => array() 
); 
foreach ($all['photos'] as $key => $photo) { 
    if (!isset($tags['year']) || in_array($tags['year'], $photo['tags'])) { 
     if (!isset($tags['player']) || in_array($tags['player'], $photo['tags'])) { 
      $output['photos'][] = array(
       'thumbnail' => $f->buildPhotoURL($photo, 'Square'), 
       'image'  => $f->buildPhotoURL($photo, 'Large'), 
       'tags'  => implode(' ', $photo['tags']) 
      ); 
     } 
    } 
} 
$output['totals']['total'] = count($output['photos']); 

// Calculate paging 
$output['perpages'] = array(32, 64, 128, 256); 
if (isset($_GET['perpage']) && in_array($_GET['perpage'], $output['perpages'])) { 
    $output['perpage'] = $_GET['perpage']; 
} else { 
    $output['perpage'] = $output['perpages'][0]; 
} 
if ($output['totals']['total'] <= $output['perpage']) { 
    $output['pages'] = 1; 
} else { 
    $output['pages'] = ceil($output['totals']['total']/$output['perpage']); 
} 
if (isset($_GET['page']) && intval($_GET['page']) > 0 && intval($_GET['page']) <= $output['pages']) { 
    $page = $_GET['page']; 
} else { 
    $page = 1; 
} 
$output['totals']['recordstart'] = (($page == 1) ? 0 : (($page - 1) * $output['perpage'])); 
$output['totals']['recordend'] = ($output['totals']['recordstart'] + $output['perpage']) - 1; 
if ($output['totals']['recordend'] > ($output['totals']['total'] - 1)) { 
    $output['totals']['recordend'] = $output['totals']['total'] - 1; 
} 
$photos = array(); 
foreach ($output['photos'] as $index => $photo) { 
    if ($index >= $output['totals']['recordstart'] && $index <= $output['totals']['recordend']) { 
     $photos[] = $photo; 
    } 
} 
unset($output['photos']); 
$output['photos'] = $photos; 

ob_start("ob_gzhandler"); 
echo json_encode($output); 

Hope trouve cela utile!

Dan

+0

Et comme j'ai résolu mon propre problème, je vais accepter ma propre réponse! –