2010-08-22 38 views
1

我試圖將我的Flickr帳戶用作圖像庫的「主機」。我用共同標籤'golftournament'爲每張照片貼上了251張照片,並且每張照片都有年份和照片中的任何球員。使用多個標籤時,Flickr API返回的照片數量不一致

因此,例如,三個隨機照片可能有以下標籤:

golftournament dan steve 2005(丹和史蒂夫在這張照片從2006)

golftournament 2006(在這張照片來自2006年沒有球員)

golftournament 2008 paul dan

當我進行API調用時,如果將API調用的'tags'部分設置爲t,它將返回不一致的總照片數tags=golftournament,dan,2005和tag_mode到tagmode=all

有時候我拿到13張照片中的結果,有時我得到的12張照片,有時我實際得到的照片正確的號碼(14)

我使用PHP庫,但是這無關緊要,因爲我看到了在Flickr API Explorer中有相同的結果:http://www.flickr.com/services/api/explore/?method=flickr.photos.search

Flickr API在這方面有什麼不一致嗎?

乾杯,

回答

0

只是爲了更新這個,到底我簡直是從photoset所有照片,然後建年和球員兩個數組從標籤。最後,我使用了請求返回正確照片的內容。我使用優秀phpFlickr library,這裏是我的整個API腳本:

<?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); 

希望有人認爲這有用!

+0

而當我解決了自己的問題,我會接受我自己的答案! – 2010-10-25 20:01:41