Рубрики
Без рубрики

Управляйте своей фотографией Google с Python! (стр.2)

(Обложка фото Noémi Macavei-Katócz на Unsplash) Учебное пособие в Gphotospy. Реконструировать В еле … Теги с Python, фото, начинающим, учебником.

Учебник Gphotospy (2 части серии)

(Обложка фото Noémi Macavei-Katócz на Unsplash)

А Gphotospy руководство.

Реконструировать

В первом уроке мы увидели, как настроить ключи и авторизацию API. После этого мы могли бы увидеть какой-то настоящий код:

  • Список альбомов: Мы увидели, как перечислить альбомы внутри нашей учетной записи, используя Альбом.лист ()
  • Список элементов в альбоме: мы увидели, как перечислить все средства массовой информации внутри альбома, используя Альбом ID , с методом Media.Search_Album (Album_id)
  • Покажите изображение с TK и PIL: мы видели, как использовать TKinter, Python поставляется UI, чтобы показать изображение, полученное из альбома (используя библиотеку обработки PIL Image, чтобы построить изображение)

В этом руководстве мы увидим некоторые способы извлечения средств массовой информации внутри нашей учетной записи.

Список медиа

Когда мы впервые откроем наш аккаунт, СМИ показывают дату (обычно) независимо от категоризации альбома.

Это соответствует Фотографии раздел Вы можете увидеть под меню Burgher, а внутри меню, а также внутри меню (по общему признанию немного запутанно); Это называется Фотографии Но он содержит фотографии и видео (да, это запутано).

На данный момент также есть временная шкала перетягивания для поиска по дате.

Мы можем перечислить содержание этого раздела с Media.List () Отказ

Этот метод, аналогично Альбом.List () который показывает средства массовой информации внутри альбома, Paginated в API. Однако в Gphotospy Эта страница происходит на заднем плане: метод просто возвращает итератор.

Первые вещи первыми, мы снова получаем службу (используя файл ключа и файл токена, как сохранены в первом уроке), и построив Media Manager:

>>> from gphotospy import authorize
>>> from gphotospy.media import *

Мы выбираем файл секретов, сохраненных заранее (в первом руководстве)

>>> CLIENT_SECRET_FILE = "gphoto_oauth.json"

Если мы не удалили .token Файл у нас все еще будет авторизацию, поэтому нам не нужно снова разрешать наше приложение.

Итак, мы получаем авторизацию и вернем объект сервиса:

>>> service = authorize.init(CLIENT_SECRET_FILE)

Теперь мы можем построить Media Manager:

>>> media_manager = Media(service)

Наконец, мы можем получить итератор по поводу списка медиа (все средства массовой информации):

>>> media_iterator = media_manager.list()

Важно помнить, что если учетная запись подключена к устройству Android, обычно количество предметов большим, поэтому лучше не потреблять все (с помощью List () , например).

Вместо этого давайте проверим первый товар с следующий()

>>> first_media = next(media_iterator)
>>> first_media
{'id': 'AB1M5bKJueYgZdoz1c5Us..... # cut out

Хорошо, эта штука меняется, результат всегда сопоставлен на словарь Python, но на самом деле его «JSON». Когда это напечатано, хотя это не так красиво.

Мы можем исправить, сопоставив СМИ к Медиатем объект:

>>> media_obj = MediaItem(first_media)
>>> media_obj

Теперь этот объект имеет интересные свойства, которые мы увидим позже, но один из них довольно печатает:

>>> print(media_obj)
{
    "id": "...",
    "productUrl": "https://photos.google.com/lr/photo/...",
    "baseUrl": "https://lh3.googleusercontent.com/lr/...",
    "mimeType": "image/jpeg",
    "mediaMetadata": {
        "creationTime": "2020-05-24T11:39:32Z",
        "width": "720",
        "height": "720",
        "photo": {
           "cameraMake": "...",
           "cameraModel": "...",
           "focalLength": "...",
           "apertureFNumber": "...",
           "isoEquivalent": "...",
           "exposureTime": "..."
        }
    },
    "filename": "...jpg"
}

Внутренне он использует Python’s JSON Модуль с этими настройками:

json.dumps(media, indent=4)

Остерегайтесь, что некоторая информация не присутствует все время, например, для фотографий, сделанных с помощью камеры смартфона, обычно Фото поле внутри MediaMetadata это пустой объект.

Фильтры

Допустим, мы хотим показать все СМИ, принятые сегодня, как в интерфейсе учетной записи. Мы могли бы получить список всех средств массовой информации и искать их по дате создания. Тем не менее, API Google позволяет нам лучше: мы можем искать носитель с фильтрами.

Конечно, дата является одним из таких фильтров, однако фильтрация не ограничивается датой.

Вот список фильтров, доступных нам:

  • Категории содержания
  • Даты и диапазоны даты
  • СМИ Типы
  • Функции
  • Архивный штат

Все эти фильтры доступны с Media.Search () ; Тем не менее, есть некоторые чтены.

Мы постараемся все, начиная с даты.

Даты

Основы поиска:

Media.search(filter, exclude=None)

Для датов мы должны построить Дата Объект (A Val объект действительно, типа Дата ) и пропустите его как фильтр к Поиск метод.

Дата () Функция содержится внутри gphotospy.media со следующей подписью:

date(year=0, month=0, day=0)

Год , месяц и Дата целые числа

  • Год Необходимо выразить в качестве 4-значного года, например 1998 или 2020.
  • месяц Должен быть выражены как 1 или 2 цифр целочисленного, например 3 Для марта или 11 за ноябрь.
  • день должны быть выражены как 1 или 2 цифр целочисленного и должны быть действительными датой на месяц (30 за февраль – это неисправность)

Кроме того, некоторые поля могут быть предрешены для повторяющихся дат: например, вы можете оставить год и получить все

>>> xmas = date(month=12, day=25)

Таким образом, вы можете получить все фотографии для всех Рождеств.

На момент написания этих слов 1 июня 2020 года, так что давайте сегодня отправимся (обновление свободно)

>>> today = date(2020, 6, 1)

Теперь у нас есть два дата, чтобы играть с; Пусть квест (… поиск …) начинается!

>>> xmas_iterator = media_manager.search(xmas)
>>> next(xmas_iterator)

Давайте посмотрим на сегодняшний день Сколько новых СМИ на нашем счете

>>> today_iterator = media_manager.search(today)
>>> today_media = list(today_iterator)
>>> len(today_media)
3

Для меня только 3, но все еще рано утром

Дата диапазонов

Мы также можем фильтровать по ряду даты. Нам нужны date_range () Функция:

date_range(start_date=date1, end_date=date2)

Например

>>> festivities = date_range(xmas, date(0, 12, 31))
>>> festivities_iterator = media_manager.search(festivities)
>>> next(festivities_iterator)

Типы носителей и сопоставление медиа

После даты мы переходим к категорическим фильтрам, для которых есть три конкретных класса для использования в качестве фильтров.

Существует метод API для поиска только видео или только фотографий, для которых мы используем MediaFilter.

Есть три доступных типа:

  • MediaFilter.all_media Все типы средств массовой информации включены (по умолчанию, не нужны на самом деле)
  • MediaFilter.photo СМИ фото
  • MediaFilter.video СМИ – это видео

Например, чтобы получить только фотографии:

>>> photo_iterator = media_manager.search(MEDIAFILTER.PHOTO)
>>> next(photo_iterator)

Тот же принцип применяется для MediaFilter.video Отказ

Сопоставление

Через некоторое время мы увидим, как применить несколько фильтров (спойлер: просто используйте массив фильтров), однако, как только у нас есть медиа, чтобы узнать, если это фотография или видео, нам нужно сначала сопоставить СМИ класс Медиатем , а затем проверьте, действительно ли это видео или фотография:

Например, давайте снова будем использовать список today_media. Мы создали ранее:

>>> a_media = MediaItem(today_media[0])

Мы сопоставляем первый элемент сегодняшнего дня до Медиатем объект

Теперь мы можем получить несколько вещей, помимо довольно печатного объекта JSON: мы можем проверить тип!

>>> a_media.is_photo()
True

Давайте получим объект метаданных

>>> a_media.metadata()
{'creationTime': '2020-05-26T12:38:24Z', 'width': '480', 'height': '341', 'photo': {}}

Позже увидим, как использовать его немного больше.

Избранные фильтры

Мы можем найти показанные СМИ, если таковые имеются. Это «снятые» СМИ, давайте посмотрим, если у нас есть.

  • ScoreFilter.none Не рекомендуемые СМИ (по умолчанию)
  • ApplicationFilter. Фавориты СМИ, помеченные как любимые (снятые)

Фотографии Google не поощряют снимающую СМИ, поэтому очень вероятно, что любая данная учетная запись не имеет фаворита вообще (моя не сделала, пока мне не пришлось делать некоторые тесты для этой функции!)

>>> favourite_iterator = media_manager.search(FEATUREFILTER.FAVORITES)
>>> next(favourite_iterator)
Traceback (most recent call last):
  File "", line 1, in 

  ...

TypeError: 'NoneType' object is not iterable

Да, пустой итератор!

Давайте немного поговорим о охранниках, потому что в обычный сценарий вы найдете много использования для следующего рисунка:

try:
    print(next(favourite_iterator))
except (StopIteration, TypeError) as e:
    print("No featured media.")

Теперь я получил церный ответ:

No featured media.

Что мы сделали, это попробуйте Наш поиск и поймать этих двух кроме : Заставка и Типеррр Отказ Они необходимы при использовании итераторов (и все поиски в Gphotospy выполняются через итераторы). Эти ошибки возникают на пустом итераторе (если элемент не присутствует) и при велосипеде через поиск он защищает от конца итерации (больше нет присутствующего предмета).

Просто чтобы убедиться, что фильтр работает, я снимал товар. Мы должны снова извлечь из API, в противном случае он будет кэш ранее результатом:

>>> favourite_iterator = media_manager.search(FEATUREFILTER.FAVORITES)
>>> len(list(favourite_iterator))
1

Теперь есть хотя бы элемент, чтобы показать!

Фильтр по содержанию

Каждый раз, когда мы сохраняем средства массовой информации в Google Photos, проходит через некоторые алгоритмы изучения машин, которые классифицируют медиа-контент. Мы можем искать эти категории с классом CondentFilter Отказ Это классы доступны:

  • Condentfilter.none
  • Condentfilter.landscapes
  • Condentfilter.receipts.
  • Condentfilter.cityscapes
  • Condentfilter.landmarks.
  • Condentfilter.shies.
  • Condentfilter.people.
  • Condentfilter.pets.Pets.
  • Condentfilter.weddings.
  • CondentFilter. Работы
  • Condentfilter.documents.
  • CONTENTFILTER.TRAVEL
  • Condentfilter.animals.
  • CONTENTFILTER.FOOD
  • CONTENTFILTER.SPORT
  • Condentfilter.night
  • Condentfilter.performances.
  • Condentfilter.whiteboards.
  • Condentfilter.screenshots.
  • Condentfilter.uctility.
  • Condentfilter.arts.
  • Condentfilter.crafts.
  • CONTENTFILTER.FASHION
  • Condentfilter.houses.
  • Condentfilter.gardens.
  • CONTENTFILTER.FLOWERS
  • Condentfilter.holidays

Давайте попробуем, будем ли мы? Ниже придет время, чтобы выступить на большинстве учетных записей сегодня

>>> selfies_iterator = media_manager.search(CONTENTFILTER.SELFIES)
>>> selfies = list(selfies_iterator)
>>> len(selfies) # never got to this part... CTRL+C !!!

Я оставил, что он продолжается некоторое время, а затем прервал его Ctrl + C. . Проблема в том, что если есть много предметов Список () Функциональные квадраты для употребления всего итератора, выполняющие много запросов на сервер (на 50 одновременно). Все эти запросы являются словой.

Вместо этого давайте по-прежним, подобно этому:

>>> houses_iterator = media_manager.search(CONTENTFILTER.HOUSES)
>>> next(houses_iterator).get("filename")
'IMG-20200522-WA0005.jpg'

Объединение фильтров и исключая некоторые

Мы можем комбинировать фильтры по желанию

>>> combined_search_iterator = media_manager.search([CONTENTFILTER.HOUSES, CONTENTFILTER.SPORT])

Осторожно, будьте осторожны Вопреки тому, что вы можете подумать, Комбинированный фильтр не вынимает Поиск!!!

Комбичающие фильтры предназначены для работы в качестве логического «или», поэтому оно подводит сумму категорий

В сумме, если вы объедините Condentfilter.food и Condentfilter.travel. Эта операция не Вернуть только изображения экзотической пищи, которую вы получили в этой поездке на рынке морепродуктов в Китае (летучие мыши, а?). Это возвращает Все Фотографии пищевых продуктов (и видео), включая кашу бабушки, и Все Туристические фотографии, в том числе эти глупые картины, сделанные в уборных в Италии (да, Мы знали все это время!).

Отфильтровано

Как мы уже видели, объединение просто добавляет, он не имеет смысла по поиску. Однако вы можете исключить категории (скудное утешение).

Если вы помните Поиск Подпись, есть Исключить Аргумент:

>>> exclude_some_iterator = media_manager.search(CONTENTFILTER.ARTS, CONTENTFILTER.CRAFTS)

Так что да, вы должны помнить, что второй аргумент – это исключение, а не другой фильтр для добавления (на самом деле вы должны поставить все фильтры в массиве)

Поиск: положить все вместе

Мы можем поставить все вместе, например:

>>> combined_iterator = media_manager.search(
    filter=[
        FEATUREFILTER.NONE,
        CONTENTFILTER.TRAVEL,
        CONTENTFILTER.SELFIES,
        MEDIAFILTER.PHOTO,
        date(2020, 4, 24),
        date_range(
            start_date=date(2020, 4, 19),
            end_date=date(2020, 4, 21)
        )
    ],
    exclude=[
        CONTENTFILTER.PEOPLE,
        CONTENTFILTER.GARDENS])

Очень сложно все еще, и я получил некоторые результаты

>>> combined = list(combined_iterator)
>>> len(combined)
9

Девять картинок. Сопросите его со следующим, который является только списком видео

>>> combined_iterator = media_manager.search(
...     filter=[
...         FEATUREFILTER.NONE,
...         CONTENTFILTER.TRAVEL,
...         CONTENTFILTER.SELFIES,
...         MEDIAFILTER.VIDEO,
...         date(2020, 4, 24),
...         date_range(
...             start_date=date(2020, 4, 19),
...             end_date=date(2020, 4, 21)
...         )
...     ],
...     exclude=[
...         CONTENTFILTER.PEOPLE,
...         CONTENTFILTER.GARDENS])
>>> combined= list(combined_iterator)
Traceback (most recent call last):
  File "", line 1, in 

  ...

Вы догадались, нет видео

Тот же поиск, но без контентных фильтров или исключения, только даты; все еще ищет видео

>>> combined_videos = media_manager.search(
...     filter=[
...         FEATUREFILTER.NONE,
...         MEDIAFILTER.VIDEO,
...         date(2020, 4, 24),
...         date_range(
...             start_date=date(2020, 4, 19),
...             end_date=date(2020, 4, 21)
...         )
...     ])
>>> combined = list(combined_videos)
>>> len(combined)
8

Восемь видео в общей сложности

Загрузка СМИ

Время скачивания!

Давайте получим СМИ; Например видео

>>> video_iterator = media_manager.search(MEDIAFILTER.VIDEO)
>>> media = MediaItem(next(video_iterator))

Теперь загружаю это как тривиальное, как открытие файла и сохранить Raw_download данные!

>>> with open(media.filename(), 'wb') as output:
...         output.write(media.raw_download())
...

С Media.filename () Мы получили имя файла и с Media.raw_download () Необработанные данные читают из "BaseUrl" правильные флаги.

Мы могли бы так же легко сохранить картину:

>>> photo_iterator = media_manager.search(MEDIAFILTER.PHOTO)
>>> media = MediaItem(next(photo_iterator))
>>> with open(media.filename(), 'wb') as output:
...     output.write(media.raw_download())
...
43463

Если вы хотите синхронизировать информацию о загруженном изображении с оригиналом, вам нужно скопировать информацию, полученную с Media.metadata () Для этого загруженного изображения, потому что они выключены. Например, загруженные изображения имеют поле метаданных под названием Программное обеспечение со значением Picasa набор. Может быть, не так много людей знают это, но Google Photo – «римейк» Google Picasa; Вы можете увидеть здесь Что случилось с Picasa

Посмотреть видео (с трюком)

В прошлый раз мы видели, как просматривать картину с Tkinter в Python. На этот раз мы увидим, как просматривать видео.

Первые вещи сначала мы должны установить openc.

pip install opencv-python

Мы уже установили подушка , в противном случае нам это тоже нужно

Тогда мы импортируем Tkinter

>>> import tkinter

Далее я создал файл (в Gist ) с двумя классами:

  1. Imgvideocapture : класс HHIS обертывает OpenCV CV2.Videocapture (Video_url) и обеспечивает способ извлечения кадров в виде пильных изображений. Это необходимо, потому что Tkinter имеет родные функции только для показать изображения, через Imagetk Отказ Более того, как мы видели в прошлый раз, даже лучше использовать обертку подушки для того же класса Pil.imagetk.

  2. Видеопп : Это класс, который создает окно TKinter с холстом, где показать Пили.магетк. Кроме того, он имеет функцию обновления, которая постоянно называет экстрактор кадра в Imgvideocapture и снова называет себя и снова (каждые 15 миллисец, но его можно настроить) с window.after () Отказ Этот класс содержит также вызов window.mainloop () Так что это манистого в живых во время видео и после окончания этого.

Итак, давайте скачам Гист и сохранить его в текущем каталоге как Video_show.py. .

Далее мы импортируем два класса от него

>>> from video_show import ImgVideoCapture, VideoApp

Давайте принесем видео для просмотра:

>>> video_iterator = media_manager.search(MEDIAFILTER.VIDEO)
>>> media = MediaItem(next(video_iterator))

Мы создаем корню Tkinter, и мы получаем попкорны:

>>> root = tkinter.Tk()
>>> VideoApp(root, media)

Расслабьтесь и наслаждайтесь шоу.

Как это мета? Видео, показывающее видео …

Выводы

Ну, мы сделали так много вещей сегодня сегодня, мне нужно действительно расслабиться.

Вы просто остаетесь настроен на следующий учебник, чтобы взять на себя полный зарядку ваших фотографий Google с Python

Код

Вы можете найти весь код в Этот гид кроме Video_show.py , который в этом другом Гист Отказ

Учебник Gphotospy (2 части серии)

Оригинал: “https://dev.to/davidedelpapa/manage-your-google-photo-account-with-python-p-2-3kaa”