Projekt
Projekt
POBIERANIE STRON WWW
Klasa: Downloader
- całe pobieranie w run()
- przykładowe stałe:
public static final int TIMEOUT=60; (czas pomiędzy powtórzeniami 60 sekund)
- przykładowe konstruktory:
Downloader d = new Downloader(properties);
gdzie properties - obiekt klasy Properties - określa:
• adres strony,
• timeout,
• liczbę ponowień pobrania,
• flagę czy pobierać plik z ErrorStream, itp.
Downloader(String) --- adres strony
Downloader(URL) --- adres strony
Downloader(String, String) --- adres strony, plik na dysku
Downloader(URL, File) --- adres strony, plik na dysku
- przykładowe metody:
getFile() --- zwraca pobrany File lub null, jeśli plik nie został pobrany
setProperties(Properties) --- ustawiamy nagłówki
setAuthorization(login, password) --- przekazujemy dane do pobrania strony wymagającej hasła
Klasa: DownloaderPool
DownloaderPool dp = new DownloaderPool(propertiesA);
dp.stopNow() --- kończy natychmiast pracę wątków.
dp.addAll(list); --- dodajemy obiekt który ma się wykonać, gdzie list - obiekt: ArrayList<Downloader>. Metoda zwraca ArrayList<Future>, i rozpoczyna pobieranie - lista do pobrania jest zamknięta.
PARSOWANIE
Parsujemy (TYLKO!) lokalny plik używając Jericho, JSoup lub korzystając z JSON.
Na przykład dla Jericho: Source s = new Source(file.toURI().toURL() );
3 - aplikacja graficzna dla ENIGMA2
Celem aplikacji graficznej jest prezentacja danych opisujących kanały dekoderów z systemem ENIGMA2. Wszelka informacja o stronach pobieranych zapisywana jest jako plik properties, w standardzie XML lub txt.
Uwaga: Przykładowe pliki dl ENIGMA2:
[students.zip] [wiele stron wyjaśniających zależności i strukturę lamedb bouquets w środowsisku ENIGMA2]
Proszę pamiętać, że plikiem nadrzędnym jest lamedb (baza danych o kanałach), kanały zaś są zorganizowane w paczki których opisy znajdują się w plikach nadrzędnych bouquets.tv i bouquets.radio.
1 - aplikacja parsująca
Pobieramy zadane strony, przy czym lista stron może być modyfikowana, użytkownik może dodać stronę, usunąć stronę, a także dla każdej strony ustawić specyficzne dane (lub wykorzystać domyślne - chodzi tu o timeout, listę ponowień, ustawienie cookies, nazwa i hasło, itp.).
Aplikacja winna wielowątkowo pobierać pliki. Prawidłowe pobranie winno zostać oznaczone. Proszę obejrzeć inne aplikacje tego typu, jak np. JDownloader.
Lista stron może być modyfikowana przez użytkownika (w tym może on ustawić specyficzne dane lub wykorzystać domyślne parametry dostępu, takie jak timeout, listę ponowień, ustawienie cookies, nazwa i hasło, itp.). Wszelka informacja o stronach pobieranych odczytywana jest jako plik properties, w standardzie XML lub txt.
1A - Zapis sparsowanych danych do pliku tekstowego
Należy pobrać zadaną listę plików i następnie każdy z nich sparsować wyłuskując zawarte tam stosowne informacje a następnie zapisać je w pliku pliku tekstowym.
Proszę pamiętać o zdefiniowaniu formatu pliku (można zapisywać w XML).
1B - Zapis sparsowanych danych do pliku xmltv
Należy pobrać zadaną listę plików i następnie każdy z nich sparsować wyłuskując zawarte tam stosowne informacje a następnie zapisać je w pliku w standardzie xmltv.
Odsyłam na stronę: http://wiki.xmltv.org/index.php/Main_Page. Warto też zapoznać się z działaniem (istotą działania tej aplikacji lub tej).
1C - Zapis sparsowanych danych do bazy SQLite
Należy pobrać zadaną listę plików i następnie każdy z nich sparsować wyłuskując zawarte tam stosowne informacje. W przypadku zapisu do bazy SQLite należy wcześniej przeanalizować strukturę treści strony i zaproponować odpowiednią strukturę bazy danych. Kilka tabel winno zawierać stałe wartości - polecam pobrać: http://www.softpedia.com/progDownload/SQlite-Designer-Download-170178.html lub http://sourceforge.net/projects/sqlitebrowser/files/latest/download
I. INFORMACJE
II. UWAGI ZASADNICZE
Należy zastosować następujące zasady:
1.Piszemy kod wykonujący pewne czynności i umieszczamy je jako klasy w pakiecie o określonej nazwie, na przykład: agh.project.
Nasze własne klasy wyjątków (o ile je stosujemy) umieszczamy w określonym pakiecie, przykładowo: agh.project.exception
Wszelkie inne klasy dodatkowe mogą być w podpakietach: agh.project.util, agh.project.test, etc.
2.Wszelkie aplikacje nie wchodzą w skład żadnego pakietu lecz korzystają z klas znajdujących się w pakietach.
3.Mile widziane będzie wygenerowanie stosownej dokumentacji za pomocą javadoc.
4.Wszelkie czynności logujemy stosując pakiet: log4j
5.Należy opracować zbiór klas odpowiedzialnych za pobieranie dowolnej strony WWW:
- Klasa: Downloader i opcjonalne własne klasy wyjątków
- Klasa Downloader odpowiada za pobieranie pojedynczej strony.
- Stosujemy obsługę kodowania (znaki międzynarodowe) i "udawania" przeglądarki.
- Klasa próbuje pobrać stronę (InputStream lub ErrorStream, ew. połączenie uwierzytelnione)
- Parametry w konstruktorze. (Kilka konstruktorów)
- Aplikacja testująca pokazuje jak korzystać z konstruktorów z klasy Downloader
6.Klasa do pobierania wielowątkowego to: DownloaderPool, TestDownloaderPool to klasa do przetestowania aplikacji, oraz stosowne klasy do obsługi wyjątków.
7.Proszę pamiętać, że nazwa klasy stanowiącej wyjątek winna kończyć się na Exception
8.Klasa DownloaderPool korzysta z Downloader, która implementuje Runnable.
9.Proszę zaproponować stosowną klasę do obsługi (tworzenia i odczytu) plików .properties.
Stosowne pliki .properties dotyczą parametrów pobierania stron (obsługa Downloader - na przykład parametry przeglądarki, oraz dla DownloaderPool tu np. timeouty połączeń).
10. Proszę (o ile dotyczy) zaproponować klasę do obsługi parsowania pobranych plików i zapisu danych. Klasa parsująca pobrany plik czyni to zgodnie z ustawieniami zawartymi s tosownym pliku lub plikach: .properties.
11. Po sparsowaniu wyniki (w zależności od zadania) zapisujemy do bazy SQLite lub pliku w standardzie xmltv, czy innego pliku tekstowego.
III. INNE UWAGI
Strony dla zadań 1A/1B/1C
(a) TEMATYKA: Parsowanie listy kanałów satelitarnych
Pobieranie danych o kanałach telewizyjnych i radiowych
W szczególności (1):
http://www.lyngsat.com/Eutelsat-Hot-Bird-13A.html
http://www.lyngsat.com/Eutelsat-Hot-Bird-13B.html
http://www.lyngsat.com/Eutelsat-Hot-Bird-13C.html
http://www.lyngsat.com/Eutelsat-36A.html
http://www.lyngsat.com/Eutelsat-36B.html
oraz przykładowo:
http://www.lyngsat.com/packages/NC-.html
http://www.lyngsat.com/packages/Cyfrowy-Polsat.html
http://www.lyngsat.com/packages/Tricolor-TV-36E.html
http://www.lyngsat.com/packages/NTV-Plus.html
(b) TEMATYKA: Parsowanie listy programów telewizyjnych (JSON):
Pobieramy i analizujemy stronę (2):
http://www.cyfraplus.pl/program
Po wykorzystaniu Firebug warto zobaczyć co jest pobierane, przykładowo:
http://www.cyfraplus.pl/page/schedule/select_channels.ajax?channels=&sort=undefined
http://www.cyfraplus.pl/page/schedule/broadcasts.json?date=2015-06-07&channels=ACN
http://www.cyfraplus.pl/page/schedule/broadcasts.json?date=2015-06-09&channels=HBO
(c) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
Po wykorzystaniu Firebug warto zobaczyć co jest pobierane, przykładowo:
http://tv.wp.pl/program.html?name=TVP-1&stid=1&date=2015-06-10&time=
http://tv.wp.pl/name,Polityka-przy-kawie,prid,8771120,opis.html
http://tv.wp.pl/date,2015-06-10,name,TVN-24,stid,151,time,0,program.html
http://tv.wp.pl/opisdlg.html?prid=8771120&name=Polityka-przy-kawie
(d) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
Po wykorzystaniu Firebug warto zobaczyć co jest pobierane, przykładowo:
http://www.telemagazyn.pl/tvp_2/20150605,3,1,dz,go,cpr.html
http://www.telemagazyn.pl/wyszukiwarka/wyniki/22,20150605,3,1,1,1,st,dz,go,cpl,cpr,cpa.html
oraz przykładowo:
http://www.telemagazyn.pl/tv/618165/wojciech-cejrowski-boso-przez-swiat
http://www.telemagazyn.pl//tv/582002/ziemia-planeta-roslin
(e) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
Należy rozpracować stronę i pozyskać informację jak pobrać: listę kanałów, a przede wszystkim program tv dla pojedynczego kanału TV na konkretny okres.
(f) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
Po analizie (Firebug) sprawdzamy stosowne podstrony
(g) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
Po analizie (Firebug) sprawdzamy stosowne podstrony
(g) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
http://tvprogram.idnes.cz/stanice.asp
Po analizie (Firebug) sprawdzamy stosowne podstrony
(h) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
Po analizie (Firebug) sprawdzamy stosowne podstrony
(i) TEMATYKA: Parsowanie listy programów telewizyjnych (HTML):
Pobieramy i analizujemy stronę (2):
http://www.vida.ru/tvgrid/base.asp
Po analizie (Firebug) sprawdzamy stosowne podstrony
IV. TEMATY ZADAŃ
RADIO
VIDEO
provider
ścieżka AUDIO wraz
z informacją
o języku m.in. ścieżki:
E - English
Po - Polish
NA DANYM TRANSPONDERZE ZNAJDUJĄ SIĘ PROGRAMY WCHODZĄCE W SKŁAD PAKIETU I SĄ ONE WYŚWIETLANE NA STRONIE PAKIETÓW DANEGO PROVIDERA
11075 V
tp 128
UWAGI:
(1)Celem aplikacji jest utworzenie bazy danych zawierającej (stosowne części) struktury opisywanej na stronach Lyngsat.
Dokładnie chodzi o zapisanie informacji o satelitach, i ich lokalizacjach, transponderach, kanałach i pakietach.
W szczególności ALGORYTM zadania 1A i 1C:
- wejść na stronę (zapisaną w ustawieniach) www.lyngsat.com i następnie po sparsowaniu strony (jak sparsować jest zapisane w ustawieniach) pobieramy dane o grupach satelitów z całego świata (tak jak zaznaczono)
Wybieramy wiersz dla Satelites i pobieramy dane Asia, Europe, Atlantic i America, oraz obszary których dana grupa dotyczy, a także adresy WWW.
W GUI (1A/1C) użytkownik określa jaki zakres wschód E i zachód W go interesuje.
Następnie wielowątkowa aplikacja łączy się i pobiera dane dla wszystkich obszarów tworząc jedną listę satelitów.
Np. dla Europe (http://www.lyngsat.com/europe.html) wstępnie parsujemy
i odczytujemy: nazwa satelity, pozycja orbitalna oraz data modyfikacji.
Ostatecznie ma zostać wyświetlona lista satelitów w GUI (Zadanie A1 - wybrany zakres lub całość) a stosowne pliki zostaną pobrane wielowątkowo i zapisane na dysk.
W przypadku zadania 1C, zostanie sprawdzone czy coś uległo zmianie i jeśli tak to baza o satelitach zostanie zaktualizowana. Zapisujemy: pozycja orbitalna, nazwa satelity, link (URL) do strony oraz data modyfikacji i data wprowadzenia przez nas zmiany (oraz charakter: dodanie satelity, usunięcie z listy, modyfikacja). Modyfikacja może mieć charakter: zmiany pozycji orbitalnej (rzadko) oraz modyfikacji listy kanałów transponderów, czyli wprowadzenie daty ostatniej zmiany tak, jak stanowi 3 kolumna w tabelce na rysunku powyżej. Na koniec pobieramy ze strony (jak poniżej i wybieramy tylko i wyłącznie listę transponderów (nazwa / częstotliwość i polaryzacja).
W przypadku zadania 1A:
- wejść na strony (zapisane w ustawieniach) i następnie po sparsowaniu strony (jak sparsować jest zapisane w ustawieniach Aplikacji) pobieramy dane o kanałach zawartych na wybranych satelitach i zapisujemy w pliku tekstowym.
Ważne (warianty):
- tylko pobieranie zadanej listy satelitów i zapisanie jej na dysk. Dla pobranego satelity wyświetlanie listy transponderów, zaś przy wybraniu listy transpondera wyświetlanie nazwy stacji, kodowania i kilku innych informacji. Ponadto informacji o pakietach TV.
- pobieranie zadanej listy satelitów i zapisanie sparsowanej informacji do bazy.
Proszę pamiętać przy tworzeniu bazy danych, że kanał (Channel Name) - jeden kanał może być na wielu satelitach, zaś na tym samym satelicie może być na różnych transponderach (nadajnikach) (Tp).
Dany transponder (Tp) jest przypisany oczywiście tylko do jednego satelity i ma określone parametry nadawania, tj. częstotliwość (Freq.) i polaryzacja. Polaryzacja może przyjmować jedną z czterech wartości: H, V, L i R, czyli odpowiednio: pozioma, pionowa, lewoskrętna i prawoskrętna. Transpondery nie muszą nadawać żadnych kanałów, lub mogą nadawać przekazy (feed) lub kanały radiowe czy telewizyjne, oraz inne dane (np. strumień danych - internet). Transmisja może być analogowa lub cyfrowa. Transmisja cyfrowa opisywana jest parametrami SR i FEC. Jeden transponder nadając cyfrowo może nadawać więcej niż jeden program TV/radio. Każdy taki kanał posiada unikalny identyfikator SID. Ponadto istotnym parametrem transmisji wideo jest przekaz wizji (parametr VPID) i fonii (APID). Stacje radiowe mają tylko parametr APID. Stacje telewizyjne mogą mieć więcej niż jedną ścieżkę AUDIO. Proszę zwrócić uwagę, że oznaczenia na Lyngsat nie odpowadają zdefiniowanym standardom (Po - Polish, E - English).
(2) ALGORYTM zadania 1B:
- pobranie listy kanałów TV dostępnych oraz zakresu czasu dla których dostępny jest EPG.
- następnie należy pobrać programy dla 5 kanałów na 3 kolejne dni.
- po pobraniu i zapisaniu na lokalny dysk należy odpowiednio sparsować opisy i umieścić je w bazie SQLite lub pliku XMLTV.
- Czasem dostępny jest szczegółowy opis dla danej pozycji. Opis taki należy pobrać i po sparsowaniu umieścić w stosownym miejscu.
UWAGA:
Proszę sprawdzić za pomocą Firebug co i jak jest przekazywane, czasem stosowane są pobrania w oparciu AJAX, a wartości zwracana zgodnie z formatem JSON.
W GUI pobranie winno być płynne, czyli najpierw pobierana jest lista dostępnych kanałów, oraz okres opisów EPG.
Użytkownik zaznacza kilka kanałów TV oraz okres dla których nastąpi pobranie stacji TV.
W przypadku aplikacji z zapisem do bazy danych można to zrealizować jako kilka osobnych aplikacji: pobranie listy programów - sprawdzenie w bazie / update / insert, tego czego nie ma. Druga aplikacja: użytkownik podając kody kanałów i konkretną datę wymusza pobranie EPG kanału (z pełną informacją o programie) i każdorazowo następuje aktualizacja bazy.
W obu przypadkach (EPG) można to zrealizować jako kilka osobnych aplikacji: pobranie listy programów - zapisanie listy do pliku .properties. Druga aplikacja: użytkownik podając listę kodów kanałów i konkretne daty wymusza pobranie EPG kanałów (z pełną informacją o programie) a następnie zostanie stworzony stosowny plik XMLTV.
Dany kanał może być kodowany w więcej niż jednym systemie. Wynika to z tego, że jest on dołączaniu do pakietów więcej niż jednego providera - proszę przyglądnąć się tp128
i porównać z listą stacji wchodzących w skład pakietów (trzy rysunki poniżej).
Rysunek pochodzi ze strony: http://www.lyngsat.com/Eutelsat-Hot-Bird-13A-13B-13C.html
Proszę także zwrócić uwagę na poniższe oznaczenie:
Widać z tego, że kanały providera zazwyczaj jednak nie są prezentowane na zbiorczej liście, lecz na liście kanałów oferowanych przez danego providera.
Klikając na literę P zobaczymy stronę: http://www.lyngsat.com/packages/NC-.html
Dopiero tutaj zobaczymy pełną listę stacji.
Poniżej wspomniana zdublowana informacja o kanałach z tp128 - też na stronie providera:
http://www.lyngsat.com/packages/NC-.html
Ostateczna rzecz którą należy zauważyć to kolory komórek tabeli. Legenda jest poniżej i informację tę również należy przetworzyć.
Ważne jest aby baza danych została sensownie rozplanowana zgodnie z informacjami zawartymi powyżej.
2 - GUI dla bazy SQLite
Należy zaprojektować określoną strukturę bazy danych (minimum 3 tabele). Zastoswać normalizację w celu zdefiniowania optymalnej struktury. Używać należy kluczy obcych.
Aplikacja winna wspierać przeglądanie, aktualizację danych, usuwanie rekordów i wporwadzanie nowych.
Kilka tabel winno zawierać stałe wartości - polecam pobrać: http://www.softpedia.com/progDownload/SQlite-Designer-Download-170178.html lub http://sourceforge.net/projects/sqlitebrowser/files/latest/download