Pull to refresh

Экспорт избранного Хабра в FB2 — скоростная PHP-версия

Reading time 2 min
Views 15K
В своё время я уже видел такой конвертер здесь же на Хабре, написанный на питоне, но он на моей машинке сжирал много-много-много ресурсов и ни разу не смог моё избранное (а это 400+ постов) до конца сохранить, падая то на некорректном файле, то на «кривой» статье. Пришлось переписать, результаты трудов под катом.

  • Уже было (в pdf, на питоне), причем дважды (в fb2, на питоне)!
    • pdf на телефоне требует больше ресурсов для просмотра.
    • питоновский скрипт сохранения в fb2 съедал у меня около 3 Гб оперативной памяти (а на старом ноутбуке ровно 3 и было), и ни разу не смог успешно завершить процесс успешно.

  • Комментарии к постам сохраняются?
    В библиотеку парсера соответствующую функцию я добавил, но сохранение в файл не сделал. Если будут идеи, как красиво отобразить комментарии ограниченными возможностями fb2-разметки — поделитесь идеей, с удовольствием доделаю следующим патчем.
  • Валидация, работоспособность файла, известные проблемы?
    В CoolReader под android открывается 100%, windows-версия FBReader может падать на некоторых статьях.
    Не всё корректно отображается — тэги таблицы удаляются, код не оборачивается в соответствующий тэг (будет в следующем патче).
    Все некорретные статьи или картинки молча отбрасываются, никакого логгирования ошибок.
  • Как запустить?
    Качаем, распаковываем в любой виртуальный хост, правим config.php под себя и открываем в браузере.
    Все нужные библиотеки или в комплекте, или докачиваются сабмодулями.
  • Где взять то?
    На github'е, вестимо.
  • Настройки?
    В файле config.php, всё подписано русским utf'ом. Можно, например, отключить сохранение картинок или сменить папки для сохранения данных.
  • Что интересного в реализации?
    • парсинг ведётся силами библиотеки phpquery
    • все действия разнесены в отдельные файлы (скачивание списка, скачивание статьи, сохранение картинки)
    • за один шаг выполняется одно атомарное действие (скачивание одной статьи, скачивание одного вложенного файла и т.п.). Таким образом памяти каждый скрипт ест мало, а работает относительно быстро.

  • Я нашел ошибку/баг/кривой код/у меня есть идея!
    Делитесь здесь, в личку, на github'е — в свободное время могу заняться.


Пример файла (вторая версия). ~150 статей, размер 22мб., в сжатом виде 14 мб. Картинки в комплекте, комментарии — нет.

Update. Пример fb2-файла. 400+ статей, общий размер ~53мб., картинки сжаты до 400 пикселей, размер архив 33.8 мб. Выше — свежая версия файла.
Update 2. Для работы скрипта на сервере должны быть включены short tags. Не актуально для новой версии скрипта.
Update 3. Скриншот скрипта в процессе выполнения:

Update 4 (27.02.2013). Обновил скрипт. Теперь не выкидываются тэги и (в последней не работает сложное форматирование, но тем не менее). Добавлено логгирование (включается в config.php). Короткие тэги заменены на длинные.
Update 5 (27.02.2013). Обновил скрипт. Теперь он поддерживает сохранение комментариев, подробности - чуть ниже, тут.
Update 6 (28.02.2013). Обновление скрипта. Теперь файл более корректен (с токи зрения XML). Правда, FBreader на всех платформах его не принимает, так же как и одна из аппаратных книг, но большинство читалок файл всё-таки одолеет. Заменен демонстрационный файл.
Update 7 (28.02.2013). Обновил скрипт. По совету в комментариях - добавил возможность включить скачивание картинок параллельно, в несколько потоков.
Tags:
Hubs:
+37
Comments 59
Comments Comments 59

Articles