Photofile — скачивание фотографий с фотохостингов

Речь пойдет о плагине Photofile для файлового менеджера Total Commander. Обращаю внимание, что разработкой плагина я давно не занимаюсь. Статья носит ознакомительный характер. Как мне кажется идея плагина была интересной, но видимо не ко времени.

Возникла как то у меня необходимость скачать с http://photofile.ru все фотографии альбома. Приезжали в гости знакомые и попросили сохранить им фотографии с покатушек PIN-MIX. Пришлось открывать для просмотра каждую фотографию, потом разворачивать ее в исходный размер и только после этого можно было сохранить фотографию. Где-то после 20-ой фотографии понял, что нужно писать плагин, который бы все это дело автоматизировал.

Плагин позволял копировать оригинальные фотографии, размещенные в фотоальбомах на сайтах:
1. http://photofile.ru
2. http://fotki.yandex.ru
3. http://fotoplenka.ru
4. http://photocenter.ru
5. http://foto.mail.ru
6. http://www.shareapic.net
7. http://www.pixa.ru
8. http://picasaweb.google.ru
9. http://www.netprint.ru
10. http://fotohoster.ru

Возможности плагина:

  • копирование оригинальных фотографий с фотохостингов
  • копирование всех фотографий альбома
  • копирование всех фотографий автора
  • отображение размера фотографий
  • добавление закладок на альбом
  • пред просмотр фотографий по Ctrl + Q с настройкой размера превьюшек
  • синхронизация альбомов
  • правила работы плагина для каждого хостинга описываются в скрипте с помощью регулярных выражений
  • оповещает пользователя о том, что доступны новые скрипты
  • файловый интерфейс для скачивания обновленных скриптов
  • локализован на различные языки

Photofile является плагином расширения файловой системы, так называемый FS-плагин. После установки найти его можно в папке сетевого окружения Total Commander. Так как это плагин файловой системы то все действий пользователя происходят с помощью манипуляций с папками и файлами. Зайдя в плагин (запустив его) пользователю доступны 3 действия: добавить закладку, установить соединение с требуемым файлом (альбомов), вызвать окно настроек.

Если кликнуть (нажать Enter) на папку «соединение» то откроется диалог ввода URL. По имени сервиса в URL плагин подгружает необходимый скрипт. С помощью загруженного скрипта разбирается URL для определения какой ресурс запросил пользователь. В случае если URL ссылается на страницу пользователя, то плагин отображает список фотоальбомов в виде папок. Если URL ссылается на альбом пользователя, то плагин отображает список фотографий в альбоме.

Если кликнуть на папку «добавить закладку» то откроется диалог для ввода URL пользователя или фотоальбома пользователя и ввода названия для отображения в панели.

По клику по настройкам выведется список доступных настроек.

На рисунке изображен процесс копирования фотографий сразу из нескольких альбомов. Если добавить закладку на пользователя, то при копировании закладки запустится процесс копирования всех альбомов (с фотографиями) пользователя.

Так как это плагин файловой системы, то он поддерживает возможность синхронизации папок. Очень удобно если пользователь часто добавляет фотографии в альбомы. В этом случае Total Commander покажет новые файлы и вы сможете скопировать только их.

Попробую рассказать немного о формате скрипта . Многое уже не помню. Собственно скрипт выглядит следующим образом:

[photofile.ru]
DirExpression = (photofile.ru)(\/)(users)(\/)([^\/]+)
AlbumExpression = (<td class=\»albomsTop\»><a href=\»\/users\/)(%s)(\/)([^\/]+)(\/\»>)([^\<]+)(</a>)`User;
NameAlbum = %s`Match[6];
UrlAlbum = /users/%s/%s/`User`Match[4];
IfNextPageAlbum = (<a href=\»\/users\/)(%s)(\/)(\?page=)(%d)(\» >)`User`Page;
NextPageAlbum = /users/%s/?page=%d`User`Page;

FileExpression = (photofile.ru)(\/)(users)(\/)([^\/]+)(\/)([^\/]+)
FotoExpression = (<a href=\»\/users\/)(%s)(\/)([^\/]+)(\/)([^\/]+)(\/)(#mainImageLink)(\»>)`User;
OrigExpression = (<a href=\»\/users\/)(%s)(\/)([^\/]+)(\/)([^\/]+)(\/)(#mainImageLink)(\»>)`User;
NameFoto = %s.jpg`Match[6];
UrlFoto = /photo/%s/%s/%s.jpg`User`Album`Match[6];
UrlPrev = /photo/%s/%s/middle/%s.jpg`User`Album`Match[6];
IfNextPageFoto = (<a href=\»\/users\/)(%s)(\/)(%s)(\/)(\?page=)(%d)(\» >)`User`Album`Page;
NextPageFoto = /users/%s/%s/?page=%d`User`Album`Page;

User = 5
Album = 7
Original = 0

Жирным шрифтом выделены переменные, а справа от них правила их получения. Правила описаны с помощью регулярных выражений. Зеленым глобальные переменные. Красным индекс аргумента полученного в результате выполнения  предыдущего регулярного выражения. Дело в том, что сервисы фотохостинга не предоставляли API для доступа к ним. Потому мне приходилось парсить HTML страницы. Все сервисы можно структурно описать в виде дерева с тройной вложенностью: Пользователь -> Альбомы пользователя -> Фотографии в альбоме. Для работы плагина достаточно описать правила получения списка альбомов и списка фотографий.

В представленном примере верхняя группа правил описывает как получать список альбомов.

Переменная DirExpression служит для проверки является ли введеный URL пользователя. Если URL удовлетворяет условию, то из него извлекается ID пользователя с помощью переменной User = 5 которая говорит, что ID пользователя равен 5-му аргументу результата выполнения регулярного выражения.

Переменная AlbumExpression определяет правило получения описания альбомов в HTML. Я немного расширил регулярные выражения добавив специальный символ «`» подстановки в регулярное выражение ранее полученных значений. Для параметра AlbumExpression запись (</a>)`User; означает, что вместо `User будет подставлено  полученное значение ID пользователя.

Переменная NameAlbum определяет правило формирования (сборки) названия альбома. Название альбома будет равно 6-му аргументу результата выполнения регулярного выражения AlbumExpression. 

Переменная UrlAlbum определяет правило формирования URL на альбом. Вместо символов %s будут подставлены значения ID пользователя и 4-й аргументу результата выполнения регулярного выражения AlbumExpression.

И напоследок. Так как список альбомов сервер возвращает постранично. Необходимо описать правила перехода на следующую страницу списка. Переменная IfNextPageAlbum служит для проверки наличия следующей страницы, а NextPageAlbum для получения URL на следующую страницу.

Нижняя группа правил служит для получения списка фотографий внутри альбома.

Так уж получилось, что не смотря на то, что я реализовал работу плагина по скриптам, работы мне это не убавило. Так как сайты часто меняли форматирование страницы мне приходилось часто править скрипты и следить за их работоспособностью. Через некоторое время я выложил исходники программы и забросил ее.

Недавно узнал, что на форуме все еще идет обсуждение работы плагина. Пользователи разобрались в работе скриптов и сами выкладывают обновленные версии.

Страничка плагина на wincmd.ru 

Плагин все еще можно обсудить на форуме

Так выглядели первые версии плагина :-D. Стыдно, очень стыдно  😳

Запись опубликована в рубрике Photofile, Total Commander. Добавьте в закладки постоянную ссылку.