flickr

Flickr i python – proste i użyteczne

Jeśli posiadamy konto na flickr.com – systemu zarządzania zdjęciami online, to nie tylko możemy zarządzać fotkami przez WWW. Flickr udostępnia API służące wykorzystaniu usług serwisu w tworzeniu własnych aplikacji. Dostępne jest API w wielu językach programowania takich jak PHP, Python, C, Java, Perl i wielu innych.

Oto kilka „sztuczek” na wykorzystanie flickr.com w swojej aplikacji przy pomocy języka Python. Ja korzystam z jednej z kilku implementacji w/w api w Pythonie – flickrapi. Będziemy też potrzebować klucz api_key, który możemy zdobyć bez większych formalności aby korzystać z możliwości usług flickr.com do celów niekomercyjnych. Do pewnych celów może się także przydać ID użytkownika flickr.

Po zainstalowaniu możemy rozpocząć pracę. Wynik powyższego kodu zwróci odpowiedź parsowaną przez XMLNode.

import flickrapi        # import zainstalowanego API
from re import match

api_key="nasze_flickr_api_key"  # api_key
flickr = flickrapi.FlickrAPI(api_key, format='xmlnode')

#columns_num = 2
#number_of_photos='8'
user_id='30569663@N05'

def getLastPhotos(id, no_photos=8):
    """
    get last photos form my flicrk public galleries

    id - string (id użytkownika flickr)
    no_photos - string (ilosc ostatnio załadowanych fotek)
    """
    last_photos = flickr.photos_search(user_id='30569663@N05',per_page=no_photos).photos[0].photo
    photo_urls = []
    counter = 0

    for photo in last_photos:
        counter += 1
        if counter % columns_num == 0:
            end_row = 1
        else:
            end_row = 0
        photo_urls.append(('http://farm' + photo['farm']+'.static.flickr.com/' + photo['server']+'/' + photo['id']+'_' + photo['secret']+'_s.jpg',
                           'http://farm' + photo['farm']+'.static.flickr.com/' + photo['server']+'/' + photo['id']+'_' + photo['secret']+'.jpg',end_row))
    return photo_urls

Wykonanie powyższej funkcjo zwróci poniższy wynik. Dodam, że flickr udostępnia także dokumentację dotyczącą źródłowych linków do obrazów.

[(u'http://farm4.static.flickr.com/3087/3109827158_a4044631d6_s.jpg',
  u'http://farm4.static.flickr.com/3087/3109827158_a4044631d6.jpg',
  0),
 (u'http://farm4.static.flickr.com/3138/3108995151_5fc5427650_s.jpg',
  u'http://farm4.static.flickr.com/3138/3108995151_5fc5427650.jpg',
  1),
 (u'http://farm4.static.flickr.com/3098/3109825840_edc94d758b_s.jpg',
  u'http://farm4.static.flickr.com/3098/3109825840_edc94d758b.jpg',
  0),
 (u'http://farm4.static.flickr.com/3287/3109825280_a5ebf14139_s.jpg',
  u'http://farm4.static.flickr.com/3287/3109825280_a5ebf14139.jpg',
  1),
 (u'http://farm4.static.flickr.com/3050/3109824650_a2a524f4af_s.jpg',
  u'http://farm4.static.flickr.com/3050/3109824650_a2a524f4af.jpg',
  0),
 (u'http://farm4.static.flickr.com/3067/3108992495_682ee07c6e_s.jpg',
  u'http://farm4.static.flickr.com/3067/3108992495_682ee07c6e.jpg',
  1),
 (u'http://farm4.static.flickr.com/3094/3108991759_bb18c2b791_s.jpg',
  u'http://farm4.static.flickr.com/3094/3108991759_bb18c2b791.jpg',
  0),
 (u'http://farm4.static.flickr.com/3157/3109822390_929b038782_s.jpg',
  u'http://farm4.static.flickr.com/3157/3109822390_929b038782.jpg',
  1)]

Kolejną przydatną funkcjonalnością może być wyciągnięcie informacji exif o zdjęciu: Zmieniamy parser odpowiedzi na ElementTree. W pythonie 2.4 moduł elementtree należy zainstalować we własnym zakresie.

# teraz format zwracanych danych będzie inny.
flickr = flickrapi.FlickrAPI(api_key, format='etree')

def get_exif(id)
    """
    get photo information for flickr photo with given id
    return dict with all exif and url info

    id - (str) flickr photo id
    """
    photo = flickr_etree.photos_getExif(photo_id = id)[0]

    exif_info = photo.attrib
    for i in photo.getchildren():
        if match(r'EXIF|TIFF',i.attrib['tagspace']):

            exiftag = i.getiterator()
            for j in exiftag:
                if j.tag == 'clean':
                    exif_info.update({i.attrib['label']:j.text})
                elif j.tag == 'raw':
                    hasKey = exif_info.has_key(i.attrib['label'])
                    if hasKey == False:
                        exif_info.update({i.attrib['label']:j.text})

    return exif_info

Oto przykładowy wynik:

{'Aperture': 'f/3.6',
 'Color Space': 'sRGB',
 'Compressed Bits per Pixel': '4 bits',
 'Compression': 'JPEG',
 'Date and Time': '2007:12:22 08:10:07',
 'Date and Time (Digitized)': '2007:12:22 08:10:07',
 'Date and Time (Original)': '2007:12:22 08:10:07',
 'Digital Zoom Ratio': '0/10',
 'Exposure': '0.01 sec (1/100)',
 'Exposure Bias': '0/100 EV',
 'Exposure Program': 'Normal',
 'Flash': 'Flash did not fire',
 'Focal Length': '6 mm',
 'Focal Length In 35mm Film': '36',
 'Gain Control': 'Low gain up',
 'ISO Speed': '200',
 'Light Source': 'Fine weather',
 'Make': 'Panasonic',
 'Maximum Lens Aperture': '30/10',
 'Metering Mode': 'Pattern',
 'Model': 'DMC-FZ8',
 'Orientation': 'Horizontal (normal)',
 'Pixel X-Dimension': '3072',
 'Pixel Y-Dimension': '2304',
 'Resolution Unit': 'Inches',
 'Sensing Method': 'One-chip colour area sensor',
 'Software': 'Ver.1.0',
 'White Balance': 'Manual',
 'X-Resolution': '72',
 'Y-Resolution': '72',
 'YCbCr Positioning': 'Co-Sited',
 'farm': '4',
 'id': '3068551408',
 'secret': 'a8f6fe491b',
 'server': '3030'}

I jeszcze dwie proste funkcje:

def get_info(id):
    """
    get photo information for flickr photo with given id
    return dict with all information needed to get photo url

    id - (str) flickr photo id
    """
    photo = flickr_etree.photos_getExif(photo_id = id)[0]
    photo_info = photo.attrib

    return photo_info
def get_sizes(id):
    """
    get url to all sizes of photo on flickr with given photo id
    return dict with all information needed to get photo url

    id - (str) flickr photo id
    """
    photo = flickr_etree.photos_getSizes(photo_id = id)[0]
    tmp_sizes = photo.getchildren()
    sizes = dict()
    for i in tmp_sizes:
        sizes.update({i.attrib['label'].lower():i.attrib})
    return sizes

Dzięki tym dwóm ostatnim funkcjom zdobędziemy informacje o zdjęciu. Pierwsza z nich zwróci informacje potrzebne do konstruowania źródłowego URL do zdjęcia, natomiast druga zwróci pythonowy słownik (dict) zawierający linki źródłowe do zdjęć oraz URL do strony flickr ze zdjęciem.

By grzeszy on Grudzień 15, 2008 | Programowanie, Python | A comment?
Tagi: , ,