Flickr API возвращает несовместимое количество фотографий при использовании нескольких тегов - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь использовать свою учетную запись Flickr в качестве хоста для галереи изображений. Я пометил 251 фотографию общим тегом «golftournament», на каждой из которых указан год и все игроки на фотографии.

Так, например, три случайные фотографии могут иметь следующие теги:

golftournament dan steve 2005 (Дэн и Стив на этом фото 2006 года)

golftournament 2006 (на этой фотографии нет игроков с 2006 года)

golftournament 2008 paul dan (Пол и Дэн на этом фото 2008 года)

Когда я выполняю вызов API, он возвращает непоследовательное общее количество фотографий, если я устанавливаю часть тегов API-вызова на tags=golftournament,dan,2005, а тег_мод - на tagmode=all.

Иногда я получаю 13 фотографий в результате, иногда я получаю 12 фотографий, а иногда я получаю правильное количество фотографий (14)

Я использую библиотеку PHP, но это не имеет значения, потому что я вижу те же результаты в Flickr API Explorer: http://www.flickr.com/services/api/explore/?method=flickr.photos.search)

Есть ли какая-то причина, по которой API Flickr так непоследователен в этом отношении?

Приветствия

Dan

Ответы [ 2 ]

0 голосов
/ 20 января 2011

Видимо, функция поиска по flickr содержит ошибки , и flickr работает над исправлением.

0 голосов
/ 21 октября 2010

Просто чтобы обновить это, в конце концов я просто получил все фотографии из фотосета, а затем построил два массива лет и игроков из тегов.Наконец, я использовал запрос, чтобы вернуть правильные фотографии.Я использую отличную библиотеку phpFlickr и вот весь мой скрипт 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);

Надеюсь, кто-то найдет это полезным!

Дан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...