image_48

Давно у меня уже была мысль о том, что фотогалерею надо бы было организовать при помощи веб-сервиса. Причин этому много. Во-первых это идеалогически правильно. Web 2.0, mash-ups и т.д. Во-вторых – помогает экономить место на хостинге. В-третьих – не стоит забоиться об организации БД, хранилища файлов, безопасности, аплоаде, а так же большой групповой загрузке фотографий на сервер.

В этом деле главное – выбрать сервис. Я вообще большой любитель Google, по этому, в первую очередь я подумал о Picasa. Пикаса, конечно, хороша, но ограничения на место мне явно не хватает. Хотелось чего-нибудь динамического и бесплатного.  Flickr в бесплатном варианте не очень удобен – только 3 альбома, 100мб в месяц. Еще посоветовали некий Яндекс.Фотки, но уж простите, но Яндекс для меня как раз идеалогически неверен.

В общем я на время эту идею оставил, как вдруг в Интернетных Штучках наткнулся на не очень информативный, но в последствии оказавшийся очень полезным пост про ipernity.

logo50Ipernity это такая социальная сеть для распостранения файлов. Принцип прост – создаёте альбомы, загружаете туда файлы какие хотите, а потом ваши друзья (или все кто хотите) может их загружать или просматривать.  Все это дело, как я уже сказал, полито толстым слоем социальности и веб 2.0-сти. К счастью это включает еще и вполне широкий API для работы с альбомами и его содержимым. В бесплатной форме он даёт 200мб ежемесячно на ваши нужды. Не очень много, но лучше чем 100.

Хватит слов, пора приступить к делу! :)

Во-первых вам надо получить ключ. Это такой набор символов, который авторизирует ваш скрипт (приложение) к подключению к API.  Для начала его стоит получить. Вот тут.

Теперь скачаем их PHP API Kit. Там же, кстати, можно почитать описания методов и два примера. Кстати, для его работы нужен PHP5 и CURL.

Кидаем файл в /app/vendors и подключаем как было описано пару постов назад.

Теперь лёгким движением руки получаем список альбомов:

1
2
3
4
5
6
7
8
9
10
11
12
function index() {
	App::import('Vendor','Iper_API',array('file'=>'ipernity/api.php'));
 
	$api = new Iper_API(array('api_key'=>'<em>Tут ваш API_KEY</em>',
                 'secret'=>'<em>Тут ваш SECRET</em>',
                 'format'=>'json'));
 
	$r = $api->request('album.getList',array('user_id'=>"<em>Тут ваш User_id</em>",'thumbsize'=>'560'));
 
	$this->set('albums',$r['albums']['album']);
	$this->set('title','Album list');
}

Итак, что же мы делаем? Сначала – создаём объект который будет общаться с сервером и передаём в него наши ключи и указываем что тип данных будет json. Это приведёт к тому, что мы получим в ответ – обычный php-объект. Теперь делаем запрос. Метод Request выполняет один из методов API и передаёт в него параметры. Тут вотможно просмотреть весь список доступных методов. В данном примере, мы получаем список альбомов пользователя по его ID. Размер уменьшенных копий – 560пх. Это максимальный размер. Вообще, ширина картинок тут очень дискретна: 75x, 100, 240, 500 или 560. 75х – по-умолчанию.
В ответ мы получаем объект. Добавте вид по-вкусу и получите список альбомов.

1
2
3
4
5
6
7
8
<?foreach($albums as $item):?>
		<div class='photo-frame'>
		<a href="/pho/album/<?php echo $item['album_id']?>" title="<?php echo $item['title']?>" ><img src="<?php echo $item['cover']['url']?>"/></a>
		<h2><?php echo $item['title']?></h2>
		<p><?php echo date("d F, y",$item['dates']['created_at'])?></p>
 
	</div>
<?endforeach;?>

Получается такое.

Таким же образом получаем список изображений в альбоме:

function album($id = null) {
	if ($id == null) {
		$this->flash("Wrong album","/pho/");
	}
 
	$this->layout = "photo";
	App::import('Vendor','Iper_API',array('file'=>'ipernity/api.php'));
 
	$api = new Iper_API(array('api_key'=>'Ваш API-ключ',
				  'secret'=>'Ваш Secret-ключ',
				  'format'=>'json'));
 
	$r = $api->request('album.docs.getList',array('album_id'=>$id,'thumbsize'=>'75','per_page'=>'500'));
	$this->set('albums',$r['album']['docs']['doc']);
	$r = $api->request('album.get',array('album_id'=>$id));
	$this->set('album_title',$r['album']['title']);
	$this->set('title',$r['album']['title']);
}

Получается, к примеру, такое.

Идея такая же, за исключением того, что мы используем метод album.docs.getList, указываем количество фоток на страницу (максимально – 500), а так же отдельным вызовом получаем название альбома (да, ребята могли бы его добавить в ответ на запрос о содержании альбома… но чего нет, того нет).

И тут возникает самая большая проблема: мы получаем уменьшенные копии изображения в заданном размере. Скажем 75пх. Чтобы получить увеличенную фотку, надо делать еще один запрос. По-этому, либо нужно делать аякс-запрос при выборе картинки (запрашивать ссылку на более большой вариант), либо создать еще один метод, который будет показывать картинки.

Я выбрал второй вариант:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function image($id = null) {
	if ($id == null) {
		$this->flash("Wrong photo","/pho/");
	}
	App::import('Vendor','Iper_API',array('file'=>'ipernity/api.php'));
 
	$api = new Iper_API(array('api_key'=>'...ваш ключ',
				  'secret'=>'...ваш ключ',
				  'format'=>'json'));
 
	$r =  $api->request('doc.get',array('doc_id'=>$id));
	$url = $r['doc']['thumbs']['thumb'][4]['url'];
 
	//header("Location:".$url);	
	header('Content-Type: image/jpeg'); 
	header("Cache-Control: must-revalidate");			
	header("Expires: " . gmdate("D, d M Y H:i:s", time() + 259200) . " GMT");
 
	$f = fopen($url,'r');
		echo(stream_get_contents($f));		
		fclose($f);
	die();		
}

Используем метод doc.get который возвращает нам всю информацию о файле.
У меня было два варианта – редирект, или замещение. Пришлось выбрать второй вариант, чтобы менять хедеры и заставлять браузер кешировать картинки. В примере вы можете увидеть закомментированный вариант с редиректом.

Пока что существует одна проблема – для получения картинки оригинального размера необходима сложная авторизация. Сейчас я выясняю как с этим бороться, как только разузнаю – сразу вам всё расскажу.

This entry was posted on Saturday, January 3rd, 2009 and is filed under PHP-разработка, cakephp. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

2 Responses to “Создаём галерею при помощи ipernity и CakePHP”

  1. А есть возможность добавлять комментарии, оценки к фотографиям?

  2. Нет, это лишь способ работы с Ipernity API

Leave a Reply

free counters

Designed by Gabfire
Rambler's Top100