noiredd / filmatyk Goto Github PK
View Code? Open in Web Editor NEWZaimportuj swoje oceny z Filmweb.pl i przeglądaj je na swoim komputerze!
License: MIT License
Zaimportuj swoje oceny z Filmweb.pl i przeglądaj je na swoim komputerze!
License: MIT License
Filmatyk (Posterman
) pobiera plakaty filmowe (serialowe, growe) do folderu cache, ale... nigdy ich nie usuwa. Teoretycznie może to spowodować puchnięcie tego folderu, ale na razie z nieco ponad 200 plakatami mam 4 MB więc raczej nie jest to bardzo palące.
To nie może tak być, że operacje związane z żądaniem danych po połączeniu internetowym idą w tym samym wątku co całe GUI i callbacki. Szczególnie problem dotyczy pobierania posterów i synchronizacji bazy ocen.
Może przydałaby się klasa zarządzająca żądaniami w taki sposób, że obiekt wykonujący żądanie zwraca się do takiego menedżera z żądaniem a następnie kontynuuje wykonanie (jeśli to możliwe - a w przypadku np. DetailWindow
tak jest). Uzyskanie zasobu powoduje wykonanie zależnej od niej akcji - albo przez przekazanie explicite odpowiedniego callbacka, albo przez ustawienie flagi, którą oczekujący obiekt periodycznie sprawdza (np. przez Tk.after
).
Czasami okno podglądu szczegółów "rozpływa" się nieco - nie mieszczą się kraje/gatunki (na szerokość) albo ploty (na wysokość, ucina 1-2 linie).
Ukrycie przed użytkownikiem spraw związanych z instalacją pakietów jest niekompletne - faktyczny moment instalacji wygląda jak błąd (instrukcja mówi: kliknij a pokaże się okienko; realnie pojawia się konsola, która dłużej lub krócej mieli pip
a).
Na pewno trzeba w instrukcji obsługi nadmienić chociaż, że za pierwszym razem pojawi się taka kwestia. Idealnie natomiast byłoby przysłonić straszną konsolę okienkiem z informacją "trwa instalacja" i paskiem postępu (a jeśli nie da się zupełnie przykryć, to chociaż obok dołożyć takie okno).
Obsługa list "chcę zobaczyć" powinna działać tak samo jak ocen.
Co trzeba zbadać/zrobić:
wanna-see
Presenter
a w tryb "chcę zobaczyć" + konfiguracja...
Nic nie stoi na przeszkodzie, by CountryFilter
był w trybie EXTENDED
zamiast SINGLE
(zwłaszcza, że zwracana przez niego funkcja i tak wspiera wielokrotne zaznaczenia).
Konieczność odpalenia setup.bat
przy pierwszym uruchomieniu jest nieco niewygodna - zwłaszcza w sytuacji, w której aktualizacja programu wprowadza nową zależność. Znacznie bardziej uniwersalnym rozwiązaniem byłoby, gdyby to skrypt uruchamiający bezpośrednio sprawdzał czy wymagane pakiety są zainstalowane, a w razie ich braku - zachowywał się jak obecny setup i pobierał je.
Widzę dwa rozwiązania:
pip
a przez -r
pip
a, nakazując instalację wszystkich wymaganych pakietów, po czym ustawia flagę; przy aktualizacji dodającej nowe zależności, updater czyści flagęPierwsza opcja ma tę przewagę, że podjęta zostanie tylko próba instalacji brakujących pakietów (a nie wszystkich). Może jednak być wolniejsza, bo trzeba dodatkowo wystartować cały nowy interpreter Pythona - tylko celem próbnego importu. W obu przypadkach będzie trzeba w jakiś sposób poradzić sobie z potencjalnymi błędami instalacji.
Tak czy inaczej, opcja ze spakowaniem wymagań do pliku ułatwi życie użytkownikom linuksów (wystarczy pip -r requirements.txt
).
BeautifulSoup
trzeba osobno doinstalować.
PS: ponieważ requests_html
wymaga Pythona 3.6, warto by dodać wzmiankę o tym w readme.
"Mechaniczną pomarańczę" (id 1275) obejrzałem po 6-7 latach i oceniłem ponownie, ale nowy algorytm (fd121b9) z jakiegoś powodu pobrał najnowszą wersję jej oceny podwójnie.
Wygląda to, jakby nie tylko enter triggerował logowanie, ale pewne inne klawisze też - przez to program podejmuje próbę logowania niekompletnym hasłem. Do zbadania.
Killer feature!
Skoro Filmatyk potrafi pobrać listę filmów ocenionych, a będzie potrafił pobrać listę filmów "do zobaczenia", to może też pobrać podobne listy dla naszych znajomych. A gdyby wiedzieć, co chcą zobaczyć nasi znajomi, to można wyobrazić sobie taki scenariusz:
Fajne?
Z punktu widzenia implementacji nie jest to bardzo złożone - dzięki set
owi wyznaczamy część wspólną, np. tworząc wirtualną bazę danych jako widok i wyświetlamy w osobnym Presenter
ze trybu imprezy. Więcej problemów jest raczej z wydajnością pobierania i przechowywania list kilku znajomych.
Najpewniej zmiana po stronie Filmwebu - trzeba sprawdzić czy to zmiana formatu URL plakatów czy jakieś problemy z pobieraniem.
Ciekawa byłaby opcja umożliwiająca użytkownikowi modyfikowanie programu za pomocą własnych modułów, które po umieszczeniu w odpowiednim folderze Filmatyk sam by importował i uruchamiał, pozwalając na rozszerzanie funkcjonalności.
Z braku czasu na zaprojektowanie i implementację kompletnego API, najprostsze byłoby po prostu ustalenie konwencji, np. w pliku musi znaleźć się klasa Plugin
, której konstruktor przyjmuje instancję filmatykowego Main
. Po załadowaniu głównego programu a tuż przed tk.mainloop()
następowałby import wszystkich takich plików, a następnie konstrukcję ich instancji - a one same działałyby modyfikując dowolnie program (mając nieograniczony dostęp do całego obiektu głównego).
W pewnych okolicznościach trzeba by tylko było je poinformować o zmianach stanu (np. zakomunikować, że użytkownik wyłącza program) - do opracowania.
Teraz każda baza z osobna musi odpytać API jaki jest stan odpowiadającej jej bazy zdalnej. FilmwebAPI
robi to przez sprawdzenie pierwszej strony dla każdej z baz.
Informacja ta jest jednak dostępna bezpośrednio na stronie głównej profilu użytkownika. Można by zatem wykonać takie zapytanie za jednym zamachem dla wszystkich baz naraz. API mogłoby to robić w tle, a poszczególne bazy pytając API o swoje stany zdalne (również w wątkach, czemu nie) już nie wykonywałyby kilku dodatkowych żądań tylko otrzymywały wyniki z cache'u.
TODO:
FilmwebAPI.getNumOf
by zeń korzystałA w przyszłości także:
FilmwebAPI
na działanie w tle (zewnętrzne obiekty zlecają requesty, które API realizuje w wątku, a one - w swoich wątkach - oczekują na rezultaty, np. otrzymując unikatowy token, po którym mogą pytać API czy żądany zasób jest już dostępny),Database
na działanie w tle, by aktualizacja wywoływana była automatycznie w osobnym wątku,Można by wybiórczo i po cichu aktualizować dane pojedynczych filmów - włącznie z ocenami - po wejściu w podgląd filmu.
Ceną za to - konieczność wzbogacenia API o zdolność parsowania pojedynczej strony, prawdopodobnie trzeba by też rozszerzyć Blueprint
y.
Raczej słaba proporcja impaktu do nakładu pracy.
Marzy mi się dodatkowe okno z bardziej szczegółowymi, ciekawymi statystykami, np.
Propozycje mile widziane. Mamy pakiet matplotlib
więc można robić dowolne wykresy :)
Potrzebny prosty mechanizm przechowywania "opcji" razem z danymi użytkownika - np. do rzeczy tak banalnej jak "zapamiętaj mnie" przy logowaniu.
Od b80a23b Filmatyk jest bardziej zaprzyjaźniony z Windowsem niż Linuksem - chodzi o skrypt automatycznie instalujący zależności oraz samo-restartowanie się po aktualizacji. Użytkownik linuksa musi samodzielnie odpalić gui.py
a po aktualizacji również samodzielnie włączyć program ponownie.
Najprostszym rozwiązaniem byłby osobny skrypt dla Linuxa, uruchamiający Filmatyka z dodatkową flagą (dzięki której Main
będzie wiedział, żeby przy restarcie nie próbować odpalić windowsowego .bat-a ale rzeczony skrypt), ale może jest jakieś bardziej eleganckie rozwiązanie?
Niezależnie od tego, czy film oznaczono jako ulubiony czy nie, dict
z filmem w polu "favourite"
i tak zawiera '0'
.
Możliwe powody:
None
)(Dla mnie) przydatnym narzędziem byłaby możliwość dodawania pozycji z listy "chcę zobaczyć" do czegoś w rodzaju "biblioteczki". To znaczy: w liście głównej są wszystkie np. gry, w które chciałbym zagrać, a gdy którąś kupię na Steamie, zaznaczam ją jako "w biblioteczce" - by odróżnić od tych, do których nie mam jeszcze dostępu.
Takie narzędzie bardzo ułatwiłoby potem wybór odpowiedniego filmu na konkretny wieczór.
Z punktu widzenia implementacji jest to trywialne (nowy Blueprint
typu bool, bez parsowania, plus prosty filtr na checkboksie), większym wyzwaniem jest uczynienie tego wygodnym w użyciu. Taki ficzer powinien być bardzo szybko dostępny - np. przycisk umieszczony w TreeView
, ale tego chyba nie da się zrobić w Tk
.
Fajnie byłoby mieć testy jednostkowe. Nie byłoby tego problemu, gdybym robił je od początku, ale gdy Filmatyk się rodził, był projektem raczej dla frajdy - a pisanie testów to nie frajda. I tak sobie aplikacja urosła do dzisiejszych rozmiarów, dostała automatyczny updater - a testy przed wydaniem aktualizacji robię manualnie i "na oko", czy wszystko działa w dwóch czy trzech standardowych scenariuszach...
Teoretycznie nie trzeba by żądać od użytkownika zalogowania, jeśli ma publicznie dostępny profil. Jest to wykonalne, ale na razie nakład pracy na to przewyższa zyski.
Interfejs nie skaluje się tak samo na Windowsie jak na Linuksie (sprawdzone na Xubuntu 14.04), przez co niektóre okna (zwłaszcza podglądu szczegółów, ale też kolumny w TreeView
) nieco się rozjeżdżają.
To jest pewnie przejaw głębszego problemu z Tk (bądź moim użyciem Tk): #15
Ja bardzo często dodaję do filmów jeszcze dodatkowe notatki, poza zwykłymi, ograniczonymi do 160 znaków komentarzami. Do tej pory przechowywałem je w Excelu czy różnych notatnikach, ale domyślnie to Filmatyk ma być centrum dowodzenia mojej kinomanii, więc powinna taka funkcjonalność się w nim znaleźć.
Prawdopodobnie zostanie to zrobione przez rozszerzenie okna podglądu szczegółowego (od strony GUI) i osobną bazę asocjacyjną (po ID) do przechowywania tekstów. Doklejanie notatek do samych obiektów (np. poprzez nowy Blueprint
) można rozważyć, ale niekoniecznie musi to być dobry krok w kontekście #11.
Możliwe że dałoby się znacznie przyspieszyć pobieranie danych, gdyby użyć multiprocessing
do pobierania każdej strony w osobnym procesie. W mojej bazie jest ~650 filmów i to już trwa kilkadziesiąt sekund, a pełne przeładowanie bazy na 2000 pozycji pójdzie pewnie w minuty.
Trzeba się zastanowić, kto miałby tworzyć podprocesy (baza? API?), kto odpowiadać za kolejkowanie itp, no i oczywiście sprawdzić czy to rzeczywiście przynosi jakiekolwiek zyski.
System, w którym użytkownik musi samodzielnie kliknąć "aktualizuj" jest toporny i tak nie może być. Działanie powinno być eleganckie i elastyczne, np. na takiej zasadzie:
Ponieważ jednak algorytm pobierania ma fundamentalne ograniczenia, potrzebna jest też funkcjonalność ciągłej aktualizacji bazy ocen w tle (bez komunikowania użytkownikowi). Prerekwizytem do wprowadzenia takiej funkcjonalności jest możliwość ograniczenia powtarzania pewnych czynności w czasie (np. aktualizuj program najwyżej raz dziennie, odświeżaj bazę raz na tydzień itp.). Możliwe też, że w tym kontekście przydatna byłaby też opcja wymuszenia takiego przeładowania.
Całość powinna być też komunikowana w dyskretny ale czytelny sposób użytkownikowi, np. przez ikonkę kodującą kolorem obecny stan programu. Na przykład:
Plik tekstowy z surowymi danymi w JSONie sprawdza się dla niewielkich baz, ale jeśli do tego miałyby dojść dodatkowe listy ("chcę zobaczyć", znajomi (#9)) to może się on okazać niewydajny. Zwłaszcza w kontekście wielokrotnego zapisu, który obecnie przebiega w całości od nowa.
Można rozważyć zaprzęgnięcie do tego jakiegoś SQLa czy czegoś podobnego, obawiam się jednak dokładania gigantycznego kombajnu do zasadniczo prostej rzeczy.
Przydałaby się opinia.
Na W10 główne okno aplikacji wygląda jakby było "zawsze na wierzchu" - nie pozwala innym aplikacjom przejść na wierzch przy zmianie focusu, w tym także okienku podglądu. To drugie jest jeszcze bardziej frustrujące, bo sprawia wrażenie, jakby podgląd nie działał (bo okienko aktywuje się, ale ukryte za oknem głównym).
To może być powiązane z #19
Na filmwebie było sobie 650 ocen, po czym 3 oceny sprzed iluś lat usunięto. Następnie dodano ~5 ocen i uruchomiono Filmatyka, by zaktualizować miękko bazę. Program jednak nie pobrał żadnej oceny. Bug?
Kliknięcie systemowego "x" w okienku podglądu powoduje jego zniszczenie zamiast ukrycia, przez co przy ponownym wywołaniu podglądu okno nie ukazuje się.
Prawdopodobnie sprawę załatwiłoby po prostu zarejestrowanie protocol handlera, podobnie jak to jest w głównym oknie.
Aktualizacja/przeładowanie bazy powoduje utworzenie elementów bez obiektu UserData
, co wysypuje program (bo nie ma po czym posortować). Co ciekawe, problem dotyczy tylko obiektów Movie
, nie seriali czy gier.
Jest kilka "dziwnostek" związanych z np. specyfiką algorytmu pobierającego dane z Filmweba (API) - na przykład, jeśli usunie się kilka ocen (weźmy 4) a potem oceni np. 2 nowe filmy, to prosta aktualizacja bazy nie zadziała - program stwierdzi, że nie było żadnych zmian i nie pobierze ani jednej strony ocen. OK, to pewnie można byłoby łatwo połatać. Ale nie da się obejść fundamentalnego ograniczenia (wynikającego z faktu, że nie mamy bezpośredniego dostępu do bazy danych FW i dane pobieramy przez mozolną analizę każdej strony ocen z osobna), że np. jeśli po 2 latach obejrzałem film ponownie i zmieniłem jego ocenę, to nie da się tej zmiany zauważyć. Byłoby to możliwe, jeśli film odznaczy się i zaznaczy ponownie z nową datą - ale nie jest to oczywiste dla użytkownika. Takich niuansów jest kilka i o ile niektóre może da się naprawić, to powyższego np. nie i takie rzeczy przydałoby się gdzieś zebrać, żeby nie było nieporozumień.
Mogę sobie wyobrazić, że ktoś chciałby do swoich własnych celów przejrzeć oceny w formacie zrozumiałym maszynowo. Teoretycznie nie byłoby wielkiego problemu z wyeksportowaniem całej bazy do np. CSV, niemniej jednak dopóki komuś faktycznie nie będzie to potrzebne, to się nie pojawi.
Najwygodniej byłoby zapamiętać hasło, ale ciężko zrobić to w bezpieczny sposób. Najlepiej byłoby zachować ciasteczko autentykujące.
TODO
checkSession
- może wcale nie trzeba się logować? może sesja wygasła?Gdy okno szczegółów jest pokazane, ale przykryte oknem głównym, gdy użytkownik dwukliknie jakąś pozycję, podgląd nie zostanie przywrócony na wierzch. Sprawdzone na Xubuntu 14.04, na Windowsie 7 problem nie występuje.
FAV_SIGN
jest nieużywany -- sam Blueprint od favourite
definiuje go jako metodę przedstawianiaDomyślnie YearFilter
ustawia górną datę na obecną. Jednak jeśli użytkownik w danym roku nie ocenił jeszcze żadnego filmu, to ustawiona data nie będzie należała do zbioru dozwolonych do wyboru w spinboksie dat. Wtedy kliknięcie strzałki w spinboksie powoduje dziwne zachowanie.
Proste rozwiązania: (1) wymusić dodanie obecnego roku do listy dozwolonych dat, (2) ustawić domyślną datę na datę ostatnio ocenionej pozycji. Pierwsza opcja wydaje się prostsza w implementacji i bardziej intuicyjna.
Testy wykazały, że możliwość zaznaczania pojedynczych elementów w TreeView
zwiększyłby jego czytelność. Być może wtedy bardziej intuicyjne stałoby się dotarcie do funkcji podglądu.
Zmiana jest trywialna, jedynym drobiazgiem techniczym do przeskoczenia jest odznaczanie przy przeniesieniu focusu na inny widget.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.