Вернувшись из похода с полной карточкой фотографий, обнаружила свой лимит в 1 Гб на пикасе-веб исчерпанным. К этому давно шло - я редко уменьшала картинки перед загрузкой. И даже всегда оставляла 100% качество.
Попытка оплатить дополнительные 20 Гб юркиной зарплатной карточкой провалилась - бездушный робот объявил её declined и предложил рассказать про какую-нибудь другую... Загрузить новые фотографии очень хотелось.
Мысль о ручном разгребании некогда загруженного наводила нечеловеческую тоску; пришлось её оставить. В результате написался скрипт. Выкладываю - вдруг кому ещё пригодится.
Что он делает.
Запросив пароль к гмейлу, читает поальбомно список имеющихся на пикасе фотографий. Выискивает те, размер которых превышает 200K. Скачивает, применяет к ним сжатие 75% и загружает сжатые обратно. При этом оставляет на локальной машине копию несжатого - пригодится. Скачанное оказывается в каталоге, из которого запустили скрипт.
#!/usr/bin/python
#(c)Katerina N. Shananina <serpent.k@gmail.com>, 2009. License: GPL v.3
import gdata.photos.service
import urllib
import os
client = gdata.photos.service.PhotosService()
client.email = raw_input("Enter your GMail: ")
client.password = raw_input("Enter your GMail password: ")
client.source = 'Serpents-service-script'
print "Logging in..."
client.ProgrammaticLogin()
print "Success"
print "Getting the list of albums"
albums = client.GetUserFeed()
for album in albums.entry:
print 'Processing ', album.title.text
photos = client.GetFeed(
'/data/feed/api/user/%s/albumid/%s?kind=photo' %
('default', album.gphoto_id.text)
)
for photo in photos.entry:
print 'Photo title: %s, size: %s' % (
photo.title.text,
str(int(photo.size.text) / 1024) + "K"
)
if int(photo.size.text) > 204800:
stream = urllib.urlopen(photo.GetMediaURL())
image = stream.read()
file = open(photo.title.text, "wb")
file.write(image)
file.close()
new_name = 'comp_' + photo.title.text
os.system('convert %s -quality 75 %s' %
(photo.title.text, new_name)
)
client.UpdatePhotoBlob(photo, new_name)
Чтобы это работало, нужны: unix-подобная система, интерпретатор python, imagemagick и библиотека gdata для работы с гугловскими сервисами. Ещё нужно место на диске - столько, сколько занимают те самые фотографии на пикасе.
Да, можно было лучше, и я отчасти знаю, что.
Можно не сваливать фотографии в одну кучу, а разложить по папкам соответственно альбомам.
Можно ориентироваться не на вес, а на на линейные размеры картинки. И не сжимать, а уменьшать эти самые линейные размеры, если они превышают некий разумный предел.
Можно, в конце концов, не отображать вводимый пароль на экране!
Если знаете, что ещё следовало сделать лучше - напишите, пожалуйста!
А ещё, как оказалось, после такой операции в веб-галерее оказываются утрачены данные EXIF. Я ими там не очень дорожу. Но кому-то может быть неприятно.
Но мою задачу скрипт решил. Вместо 1Гб теперь заняты 100Мб, и это не может не радовать. И ссылки на фотографии не пострадали, что уже хорошо!