Giter Site home page Giter Site logo

filmatyk's People

Contributors

noiredd avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

filmatyk's Issues

Czyszczenie cache plakatów

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.

Żądania HTML w wątkach

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).

Skalowanie GUI

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).

Osobne GUI instalacji przykrywające konsolę

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 pipa).

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).

Chcę zobaczyć/zagrać

Obsługa list "chcę zobaczyć" powinna działać tak samo jak ocen.
Co trzeba zbadać/zrobić:

  • parsowanie list wanna-see
  • przełączanie Presentera w tryb "chcę zobaczyć" + konfiguracja
  • wymienność list "ocenione" i "chcę zobaczyć" - tzn. co z pozycjami, które są naraz tu i tu

...

Zaznaczanie wielu krajów

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).

Automatyczna instalacja pakietów

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:

  • launcher sprawdza faktyczne spełnienie zależności poprzez uruchomienie testowego skryptu, który próbuje zaimportować biblioteki; brakujące są gromadzone w listę, którą launcher przekazuje do pipa przez -r
  • launcher sprawdza, czy ustawiona jest flaga spełnienia zależności (np. plik z odpowiednią wartością), a jeśli nie to uruchamia pipa, 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).

Pobranie duplikatu oceny

"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.

Dziwne zachowanie ekranu logowania

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.

Tryb imprezy

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:

  • spotykam się z Pawłem i Asią
  • z listy znajomych wybieram Pawła i Asię
  • Filmatyk wynajduje wszystkie te filmy, które zarówno ja, jak i moi znajomi chcą zobaczyć
  • filtrujemy w normalny sposób (dziś mamy ochotę bardziej na akcję niż kostiumowy)

Fajne?

Z punktu widzenia implementacji nie jest to bardzo złożone - dzięki setowi wyznaczamy część wspólną, np. tworząc wirtualną bazę danych jako widok i wyświetlamy w osobnym Presenterze trybu imprezy. Więcej problemów jest raczej z wydajnością pobierania i przechowywania list kilku znajomych.

Nie pobiera plakatów

Najpewniej zmiana po stronie Filmwebu - trzeba sprawdzić czy to zmiana formatu URL plakatów czy jakieś problemy z pobieraniem.

Pluginy

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.

Ekstrakcja stanu wszystkich baz naraz prosto ze strony głównej profilu

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:

  • odnaleźć, gdzie w dokumencie przechowywane są te informacje (prawdopodobnie JSON)
  • oprogramować ekstrakcję tych informacji
  • zaimplementować dla nich cache i przerobić FilmwebAPI.getNumOf by zeń korzystał

A w przyszłości także:

  • przerobić 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),
  • przerobić Database na działanie w tle, by aktualizacja wywoływana była automatycznie w osobnym wątku,
  • zabezpieczyć API i żądające obiekty na wypadek utraty połączenia i innych problemów (możliwość bezpiecznego anulowania żądania).

Automatyczne odświeżanie danych filmu w oknie podglądu

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ć Blueprinty.

Raczej słaba proporcja impaktu do nakładu pracy.

Zaawansowane statystyki

Marzy mi się dodatkowe okno z bardziej szczegółowymi, ciekawymi statystykami, np.

  • łączny czas oglądania filmów
  • częstość oglądania (ile filmów w skali: ogólnej, roku, miesiąca, średnio co ile dni film, ...)
  • proporcje gatunków/krajów
  • analizy rozkładów ocen: ulubione/znienawidzone gatunki, okresy, reżyserowie, ...

Propozycje mile widziane. Mamy pakiet matplotlib więc można robić dowolne wykresy :)

Opcje

Potrzebny prosty mechanizm przechowywania "opcji" razem z danymi użytkownika - np. do rzeczy tak banalnej jak "zapamiętaj mnie" przy logowaniu.

Uruchamianie

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?

Scraper nie zapisuje, czy film jest ulubiony

Niezależnie od tego, czy film oznaczono jako ulubiony czy nie, dict z filmem w polu "favourite" i tak zawiera '0'.
Możliwe powody:

  • scraper nie ściąga informacji (mało prawdopodobne, powinien wtedy wrzucić None)
  • informacja gubiona jest gdzieś pomiędzy scraperem a bazą

Moja biblioteczka

(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.

Testy

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...

Różnice w GUI między Windowsem a Linuksem

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

Notatki

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.

Wielowątkowe pobieranie

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.

Bardziej miękki, elastyczny system pobierania ocen

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:

  • od razu przy uruchomieniu programu sprawdzany jest stan baz zewnętrznych,
  • jeśli dostępne są nowe oceny aktualizacja wykonuje się w tle,
  • po pobraniu interfejs jest automatycznie odświeżany w tych samych ustawieniach.

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:

  • zielony - wszystko gra, bazy aktualne,
  • niebieski, najlepiej animowany - pracuję, pobieram nowe dane,
  • pomarańczowy - mamy problem (np. brak internetu).

Lepsze przechowywanie danych użytkownika

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.

[Windows 10] Główne okno nie ustępuje z wierzchu

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

Aktualizacja bazy gdy wcześniej odznaczono ocenę

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?

"X" niszczy okno podglądu zamiast je ukryć

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.

Błąd parsowania userdata dla filmów

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.

  • problem 1: dlaczego nie pobiera danych
  • problem 2: dlaczego od razu się sypie

UX

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ń.

Eksport do CSV

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.

Zarządzanie sesją

  1. Możliwość korzystania bez logowania, jeśli oceny użytkownika są dostępne publicznie.
  2. Zapamiętywanie sesji, by nie trzeba było się co chwilę logować ponownie.

Najwygodniej byłoby zapamiętać hasło, ale ciężko zrobić to w bezpieczny sposób. Najlepiej byłoby zachować ciasteczko autentykujące.

TODO

  • serializacja sesji w taki sposób, żeby była użyteczna "na drugi dzień"
  • przechowywanie sesji na dysku (po wyłączeniu programu)
  • opcjonalność zachowywania sesji ("zapamiętaj mnie")
  • inteligentniejsze checkSession - może wcale nie trzeba się logować? może sesja wygasła?

Okno szczegółów nie wskakuje na wierzch

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.

Fonty (detailviews)

  • Zdecydować się na font plota
  • FAV_SIGN jest nieużywany -- sam Blueprint od favourite definiuje go jako metodę przedstawiania

Dziwne zachowanie górnej granicy filtru daty ocenienia

Domyś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.

Zaznaczanie w TreeView

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.