Nie da się? Czyli jak z przeglądarki zapisać 14639 tekstów z fantastyka.pl w plikach EPUB

Kilka miesięcy temu zachciało mi się przejrzeć teksty z fantastyka.pl, ale... strona nie ma wersji mobilnej. Czytanie na telefonie z przeglądarki nie wchodziło w grę, więc zrobiłem dwie rzeczy:

  1. usiadłem i na szybko napisałem w PHP konwerter do EPUB (post)
  2. zaproponowałem napisanie CMSa, który mógłby obsługiwać tę stronę i mieć dodaną taką funkcjonalność (ostatni post o projekcie)

Konwerter spotkał się raczej ze średnim przyjęciem, ale uaktualniałem go o kolejne opcje i dodałem podobną funkcjonalność dla fantastykapolska.pl. Na chwilę obecną całość sprawdza się całkiem nieźle i pozwala chociażby na szybkie uaktualnianie plików, które mamy na dysku. Wersja z github "z pudełka" jest przystosowana do Linuxa (operuje w /tmp i zawiera takie komendy jak "rm").

Przyszedł sierpień i zauważyłem taką bibliotekę jak JSZip.

Czy kod w JavaScript może mieć taką samą funkcjonalność jak konwerter w PHP?

Pytanie to nie dawało mi spokoju przez kilka nocy, więc usiadłem i napisałem co potrzeba.

Jak tego użyć?

  1. pobieramy i rozpakowujemy https://github.com/marcinwiacek/fantastyka/archive/master.zip
  2. wczytujemy plik fantastyka.htm w przeglądarce
  3. wybieramy dział z fantastyka.pl, (jeżeli mamy) stary plik i to, czy chcemy usunąć z pliku "martwe" teksty
  4. klikamy "Start" i czekamy, a na końcu zapisujemy nasz plik

Od strony technicznej:

  • wersja w JavaScript obsługuje lwią większość funkcji z wersji w PHP
  • w obu zdecydowałem się na czytanie stron i tekstów jeden po drugim, żeby nie obciążać serwera docelowego (nie chcę rozwijać tego tematu)
  • testowałem w wersji desktopowej w Chromium i Firefox, nie sprawdzałem w Safari
  • w konsoli przeglądarki widać komunikat typu "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience"
  • w Chrome konieczne jest kliknięcie od czasu do czasu na przycisk Wait

Co poszło nie tak?

Z pełną premedytacją napisałem kod, który nie obciąża fantastyka.pl i robi rzeczy sekwencyjnie. Wiąże się to z tym, że kod w wątku przeglądarki działa poniekąd tak długo, że przeglądarka "zauważa", że ten się zawiesił (stąd też informacje o stanie podaję w tytule strony - w Chromium DOM nie jest wystarczająco szybko odświeżany).

Mógłbym oczywiście użyć Web Workera i przetwarzanie robić w jednym wątku, a wyświetlanie stanu w drugim... ale wtedy strona nie mogłaby być używana lokalnie z dysku.

Kolejną ciekawostką tutaj jest, że strony musiałem czytać przez serwis zewnętrzny.

A sam JSZip?

Powiedziałbym, że pewne rzeczy nie są do końca intuicyjne (przykładowo nie znalazłem synchronicznej metody do czytania zawartości pliku wewnątrz skompresowanego pliku), ale całość daje radę.

Swoją drogą widać, jaką drogę przeszedł JavaScript - z prostego narzędzia do wyświetlania okienek dialogowych i wyniku 2+2 (przypominają mi się książki Heliona i czerwone papierowe Chipy z okolic 1997) doszliśmy do tego, że do języka przemycana jest wielowątkowość i wiele konstrukcji z innych języków.

Bardzo mi to przypomina historię Basica - z prostego z numerowanymi liniami, przechodził poprzez QBasic, Visual Basic, VBA i wersje .NET, aż w końcu został odsunięty na boczny tor.

Niezależnie jednak od wszystkiego - całość działa wystarczająco dobrze, a ja pewnie będę sukcesywnie dodawał nowe funkcjonalności czy usuwał ewentualne usterki.

Miłego czytania!

PS. Nie planuję tego dodać na stronę domową mwiacek.com - chcę uniknąć sytuacji, że jakaś mądra duszyczka przyjdzie i zacznie się czepiać o to, że przechowuję pirackie pliki. 

PS2. https://github.com/marcinwiacek/fantastyka