Commit ed8b2172cb8f2c4384fe58bc4ff03e5e583294ff
1 parent
ba5a364f
--no commit message
Showing
17 changed files
with
353 additions
and
578 deletions
res/layout/help.xml
src/com/upc/pbe/upcnews/BandwidthMeasurer.java
... | ... | @@ -2,22 +2,20 @@ package com.upc.pbe.upcnews; |
2 | 2 | |
3 | 3 | import android.net.TrafficStats; |
4 | 4 | |
5 | -public class BandwidthMeasurer | |
6 | -{ | |
7 | - public double Measure(long rxBytes, long Time) | |
8 | - { | |
5 | +//Mesura la velocitat (Bandwidth) d'Internet | |
6 | +public class BandwidthMeasurer{ | |
7 | + | |
8 | + public double Measure(long rxBytes, long Time){ | |
9 | 9 | long AfterTime = System.currentTimeMillis(); |
10 | 10 | double bps; |
11 | 11 | long TotalRxAfterTest = TrafficStats.getTotalRxBytes(); |
12 | 12 | double TimeDifference = AfterTime - Time; |
13 | 13 | double rxDiff = TotalRxAfterTest - rxBytes; |
14 | 14 | |
15 | - if(rxDiff != 0) | |
16 | - { | |
15 | + if(rxDiff != 0){ | |
17 | 16 | bps = ((rxDiff*8) / (TimeDifference/1000)); // total rx bits per second. |
18 | 17 | } |
19 | - else | |
20 | - { | |
18 | + else{ | |
21 | 19 | bps = -1; //No transmitted data |
22 | 20 | } |
23 | 21 | return bps; | ... | ... |
src/com/upc/pbe/upcnews/Descarrega.java
... | ... | @@ -14,47 +14,43 @@ import java.net.URLConnection; |
14 | 14 | import android.os.AsyncTask; |
15 | 15 | import android.util.Log; |
16 | 16 | |
17 | +//Descarrega un arxiu i el guarda o retorna en String | |
17 | 18 | public class Descarrega extends AsyncTask<Object, Object, Object> { |
19 | + | |
18 | 20 | final static String TAG = "Descarrega"; |
19 | - private String url; | |
20 | - private String carpeta; | |
21 | - private String nomarxiu; | |
22 | - private String html; | |
21 | + private String url, carpeta, nomarxiu, html; | |
23 | 22 | private File arxiu; |
24 | 23 | |
25 | 24 | public Descarrega() { |
26 | 25 | nomarxiu = "ejemplo.xml"; |
27 | 26 | carpeta = "Environment.getExternalStorageDirectory.getPath()"; |
28 | - | |
29 | 27 | this.carpeta = null; |
30 | 28 | this.html = ""; |
31 | 29 | this.arxiu = null; |
32 | 30 | } |
33 | 31 | |
34 | 32 | public void descarregarguardar(String u, String nom, String car) { |
33 | + //Descarrega un arxiu i el guarda | |
35 | 34 | this.nomarxiu = nom; |
36 | 35 | this.carpeta = car; |
37 | 36 | this.url = u; |
38 | - // Creem el directori | |
37 | + //Creem el directori | |
39 | 38 | File dir = new File(carpeta); |
40 | 39 | if (!dir.exists()) { |
41 | 40 | if (!dir.mkdir()) { |
42 | 41 | return; // No s'ha pogut crear (ja existeix) |
43 | 42 | } |
44 | 43 | } |
45 | - | |
46 | - // Creem l'arxiu | |
44 | + //Creem l'arxiu | |
47 | 45 | arxiu = new File(carpeta + nomarxiu); |
48 | - | |
49 | - // Iniciem la descà rrega | |
46 | + //Iniciem la descarrega | |
50 | 47 | try { |
51 | 48 | URLConnection conn = new URL(url).openConnection(); |
52 | 49 | conn.connect(); |
53 | 50 | Log.d(TAG, "\nDescarregant: \n"); |
54 | 51 | Log.d(TAG, " >> URL: " + url + " >> Nom: " + nomarxiu |
55 | 52 | + " >> Tamany: " + conn.getContentLength() + " bytes"); |
56 | - | |
57 | - // Llegeix cada byte i l'escriu en un arxiu fins que arriba a -1 | |
53 | + //Llegeix cada byte i l'escriu en un arxiu fins que arriba a -1 | |
58 | 54 | InputStream in = conn.getInputStream(); |
59 | 55 | OutputStream out = new FileOutputStream(arxiu); |
60 | 56 | int b = 0; |
... | ... | @@ -66,7 +62,6 @@ public class Descarrega extends AsyncTask<Object, Object, Object> { |
66 | 62 | } |
67 | 63 | out.close(); |
68 | 64 | in.close(); |
69 | - | |
70 | 65 | } catch (MalformedURLException e) { |
71 | 66 | e.printStackTrace(); |
72 | 67 | } catch (IOException e) { |
... | ... | @@ -75,30 +70,27 @@ public class Descarrega extends AsyncTask<Object, Object, Object> { |
75 | 70 | } |
76 | 71 | |
77 | 72 | protected String doInBackground(String u) throws IOException { |
73 | + //Descarrega un arxiu i el retorna en un String | |
78 | 74 | this.url = u; |
79 | 75 | html = ""; |
80 | - | |
81 | - URLConnection conn = new URL(url).openConnection(); | |
82 | - BufferedReader in = new BufferedReader(new InputStreamReader( | |
83 | - conn.getInputStream())); | |
84 | - Log.d(TAG, "\nDescarregant: \n"); | |
85 | - Log.d(TAG, | |
86 | - ">> URL: " + url + " >> Tamany: " + conn.getContentLength() | |
87 | - + " bytes"); | |
88 | - String inputLine; | |
89 | - while ((inputLine = in.readLine()) != null) { | |
90 | - html = html + "\n" + inputLine; | |
91 | - } | |
92 | - Log.d(TAG, "Descarrega finalitzada"); | |
93 | - | |
94 | - in.close(); | |
76 | + //Iniciem la connexió i creem els Streams | |
77 | + URLConnection conn = new URL(url).openConnection(); | |
78 | + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); | |
79 | + //Iniciem la descarrega i anem guardant al String | |
80 | + Log.d(TAG, "\nDescarregant: \n"); | |
81 | + Log.d(TAG, ">> URL: " + url + " >> Tamany: " + conn.getContentLength()+ " bytes"); | |
82 | + String inputLine; | |
83 | + while ((inputLine = in.readLine()) != null) { | |
84 | + html = html + "\n" + inputLine; | |
85 | + } | |
86 | + Log.d(TAG, "Descarrega finalitzada"); | |
87 | + in.close(); | |
95 | 88 | return html; |
96 | - | |
97 | 89 | } |
98 | 90 | |
99 | 91 | @Override |
100 | 92 | protected Object doInBackground(Object... arg0) { |
101 | - | |
93 | + //Metode Overrided, no te utilitat | |
102 | 94 | return null; |
103 | 95 | } |
104 | 96 | } | ... | ... |
src/com/upc/pbe/upcnews/Directoris.java
... | ... | @@ -17,71 +17,44 @@ import android.widget.TextView; |
17 | 17 | import android.widget.AdapterView.OnItemClickListener; |
18 | 18 | import android.widget.Toast; |
19 | 19 | |
20 | -public class Directoris extends Activity implements OnItemClickListener | |
21 | -{ | |
20 | +//Segona Activity, mostra els directoris i arxius del servidor | |
21 | +public class Directoris extends Activity implements OnItemClickListener { | |
22 | + | |
22 | 23 | final static String TAG = "Directoris"; |
23 | 24 | private Descarrega d = new Descarrega(); |
24 | - private String URL; | |
25 | - private String currentFolder; | |
25 | + private String URL, currentFolder; | |
26 | 26 | private HTMLParser parser; |
27 | 27 | |
28 | - public void onCreate(Bundle savedInstanceState) | |
29 | - { | |
28 | + public void onCreate(Bundle savedInstanceState){ | |
29 | + //Creem el layout | |
30 | 30 | Log.d(TAG, "onCreated"); |
31 | - | |
32 | - | |
33 | 31 | super.onCreate(savedInstanceState); |
32 | + //Passem del layout anterior al actual | |
34 | 33 | setContentView(R.layout.dirs); |
35 | - | |
34 | + //Canviem la direccio de la URL a la actual | |
36 | 35 | currentFolder = ((UpcApp) getApplication()).getUrl() + "/"; |
37 | 36 | URL = currentFolder; |
37 | + //Creem un HTMLParser | |
38 | 38 | parser = new HTMLParser(URL); |
39 | - | |
39 | + //Fem una llista ListView i la omplim amb la informacio trobada | |
40 | 40 | ((ListView)findViewById(R.id.listView1)).setOnItemClickListener(this); |
41 | - | |
42 | 41 | this.showResources(); |
43 | 42 | } |
44 | - | |
45 | - public boolean onCreateOptionsMenu(Menu menu) | |
46 | - { | |
47 | - getMenuInflater().inflate(R.menu.menu, menu); | |
48 | - Log.d(TAG, "Menu"); | |
49 | - return true; | |
50 | - } | |
51 | - | |
52 | - public boolean onOptionsItemSelected(MenuItem item) | |
53 | - { | |
54 | - switch (item.getItemId()) | |
55 | - { | |
56 | - case R.id.itemprefs: | |
57 | - startActivity(new Intent(this, Prefs.class)); | |
58 | - Log.d(TAG, "Preferences"); | |
59 | - return true; | |
60 | - case R.id.itemhelp: | |
61 | - startActivity(new Intent(this, Help.class)); | |
62 | - Log.d(TAG, "Help"); | |
63 | - return true; | |
64 | - default: | |
65 | - return false; | |
66 | - } | |
67 | - } | |
68 | 43 | |
69 | - public void showResources() | |
70 | - { | |
44 | + public void showResources(){ | |
45 | + //Actualitza la informacio que mostra la ListView a mesura que ens desplacem pels directoris | |
71 | 46 | ArrayList<String> entries; |
72 | - try | |
73 | - { | |
47 | + try{ | |
74 | 48 | entries = parser.parse(d.doInBackground(currentFolder)); |
75 | 49 | this.createEntries(entries); |
76 | 50 | } |
77 | - catch (IOException e) | |
78 | - { | |
79 | - // Nunca llegará aquà la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
51 | + catch (IOException e){ | |
52 | + // Nunca llegara aqui la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
80 | 53 | } |
81 | 54 | } |
82 | 55 | |
83 | - public void createEntries(ArrayList<String> directories) | |
84 | - { | |
56 | + public void createEntries(ArrayList<String> directories){ | |
57 | + //Crea les entrades de la ListView | |
85 | 58 | String[] entries = directories.toArray(new String[directories.size()]); |
86 | 59 | ListView listView = (ListView) findViewById(R.id.listView1); |
87 | 60 | listView.setAdapter(null); |
... | ... | @@ -89,68 +62,79 @@ public class Directoris extends Activity implements OnItemClickListener |
89 | 62 | listView.setAdapter(adapter); |
90 | 63 | } |
91 | 64 | |
92 | - public void onItemClick(AdapterView<?> parent, View view, int position, long id) | |
93 | - { | |
65 | + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |
66 | + //Determina el funcionament al clickar en una de les entrades de al ListView | |
94 | 67 | String path = ((TextView)view).getText().toString(); |
95 | - if(path.endsWith(".m3u8")) | |
96 | - { | |
68 | + //Si es un m3u8, el descarrega, parseja i inicia la reproducció | |
69 | + if(path.endsWith(".m3u8")){ | |
97 | 70 | path = currentFolder + path; |
98 | 71 | String playlist; |
99 | - try | |
100 | - { | |
101 | - playlist = d.doInBackground(path); | |
102 | - | |
72 | + try{ | |
73 | + playlist = d.doInBackground(path); | |
103 | 74 | Parser p = new Parser(path.substring(0, path.lastIndexOf("/") + 1), this); |
104 | - try | |
105 | - { | |
75 | + try{ | |
106 | 76 | ArrayList<ParentList> m3u8parsed = p.parseFile(playlist); |
107 | 77 | Log.d(TAG, "parsing completed"); |
108 | 78 | HLS h = new HLS(m3u8parsed,((UpcApp)getApplication()).getLocalPath()); |
109 | 79 | h.start(); |
110 | 80 | } |
111 | - catch (ErrorException e) | |
112 | - { | |
81 | + catch (ErrorException e){ | |
113 | 82 | Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); |
114 | 83 | Log.d(TAG, e.getMessage()); |
115 | 84 | } |
116 | - catch (WarningException e) | |
117 | - { | |
85 | + catch (WarningException e){ | |
118 | 86 | Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); |
119 | 87 | Log.d(TAG, e.getMessage()); |
120 | 88 | } |
121 | - catch (InfoException e) | |
122 | - { | |
89 | + catch (InfoException e){ | |
123 | 90 | Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); |
124 | 91 | Log.d(TAG, e.getMessage()); |
125 | 92 | } |
126 | 93 | } |
127 | - catch (IOException e1) | |
128 | - { | |
129 | - // Nunca llegará aquà la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
94 | + catch (IOException e1){ | |
95 | + // Nunca llegara aqui la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
130 | 96 | } |
131 | 97 | |
132 | 98 | } |
133 | - else //Se trata de una carpeta | |
134 | - { | |
135 | - if(!path.startsWith("http://")) | |
136 | - { | |
99 | + //Si es una carpeta, hi entra i mostra el seu contingut | |
100 | + else{ | |
101 | + if(!path.startsWith("http://")){ | |
137 | 102 | currentFolder += path; |
138 | 103 | } |
139 | - else | |
140 | - { | |
104 | + else{ | |
141 | 105 | currentFolder = path; |
142 | 106 | } |
143 | 107 | showResources(); |
144 | 108 | } |
145 | - } | |
146 | - | |
109 | + } | |
110 | + | |
111 | + public boolean onCreateOptionsMenu(Menu menu){ | |
112 | + //Determina el funcionament al apretar la tecla d'opcions | |
113 | + getMenuInflater().inflate(R.menu.menu, menu); | |
114 | + Log.d(TAG, "Menu"); | |
115 | + return true; | |
116 | + } | |
117 | + | |
118 | + public boolean onOptionsItemSelected(MenuItem item){ | |
119 | + //Determina el funcionament al clickar en el menu d'opcions | |
120 | + switch (item.getItemId()){ | |
121 | + case R.id.itemprefs: | |
122 | + startActivity(new Intent(this, Prefs.class)); | |
123 | + Log.d(TAG, "Preferences"); | |
124 | + return true; | |
125 | + case R.id.itemhelp: | |
126 | + startActivity(new Intent(this, Help.class)); | |
127 | + Log.d(TAG, "Help"); | |
128 | + return true; | |
129 | + default: | |
130 | + return false; | |
131 | + } | |
132 | + } | |
147 | 133 | |
148 | - | |
149 | 134 | public boolean onKeyDown(int keyCode, KeyEvent event) { |
150 | - if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) | |
151 | - { | |
152 | - if(currentFolder.equals(URL)) | |
153 | - { | |
135 | + //Determina el funcionament al apretar la tecla de tornar enrere | |
136 | + if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){ | |
137 | + if(currentFolder.equals(URL)){ | |
154 | 138 | super.finish(); |
155 | 139 | return true; |
156 | 140 | } | ... | ... |
src/com/upc/pbe/upcnews/ErrorException.java
1 | 1 | package com.upc.pbe.upcnews; |
2 | 2 | |
3 | -public class ErrorException extends Exception | |
4 | -{ | |
3 | +//Excepcio d'error critic, finalitza l'aplicacio | |
4 | +public class ErrorException extends Exception { | |
5 | + | |
5 | 6 | private static final long serialVersionUID = 1L; |
6 | - public ErrorException(String message) | |
7 | - { | |
7 | + | |
8 | + public ErrorException(String message){ | |
8 | 9 | super(message); |
9 | 10 | } |
10 | 11 | } | ... | ... |
src/com/upc/pbe/upcnews/HLS.java
... | ... | @@ -4,20 +4,20 @@ import java.util.ArrayList; |
4 | 4 | |
5 | 5 | import android.util.Log; |
6 | 6 | |
7 | +//Gestor del protocol HTTP Live Streaming | |
7 | 8 | public class HLS { |
8 | 9 | |
9 | 10 | private static final String TAG = "HLS"; |
10 | 11 | private ArrayList<ParentList> videos; |
11 | 12 | private int currentVideo ; |
12 | - private int currentQuality; //0 es la más alta | |
13 | + private int currentQuality; //0 es la mas alta | |
13 | 14 | private int currentSegment; |
14 | 15 | private boolean endReached; |
15 | 16 | private String localFolder; |
16 | 17 | //private fileDownloader fd; |
17 | 18 | private BandwidthMeasurer bm; |
18 | 19 | |
19 | - public HLS(ArrayList<ParentList> parsed, String localFolder) | |
20 | - { | |
20 | + public HLS(ArrayList<ParentList> parsed, String localFolder){ | |
21 | 21 | currentVideo = currentQuality = currentSegment = 0; |
22 | 22 | this.videos = parsed; |
23 | 23 | endReached = false; |
... | ... | @@ -25,32 +25,26 @@ public class HLS { |
25 | 25 | bm = new BandwidthMeasurer(); |
26 | 26 | } |
27 | 27 | |
28 | - public void start() | |
29 | - { | |
30 | - for(currentVideo = 0; currentVideo < videos.size(); currentVideo++) | |
31 | - { | |
28 | + public void start(){ | |
29 | + for(currentVideo = 0; currentVideo < videos.size(); currentVideo++){ | |
32 | 30 | ArrayList<Video> qualities = videos.get(currentVideo++).getLists(); |
33 | - while(!endReached) | |
34 | - { | |
31 | + while(!endReached){ | |
35 | 32 | ArrayList<Segment> segments = qualities.get(currentQuality).getSegments(); |
36 | - while(true) | |
37 | - { | |
33 | + while(true){ | |
38 | 34 | Segment seg = segments.get(currentSegment++); |
39 | 35 | Log.d(TAG, seg.getName() + " " + seg.getURL()); |
40 | 36 | long startTime = System.currentTimeMillis(); |
41 | 37 | //long segmentBytes = fd.Download(seg.getURL(),localFolder); |
42 | 38 | long segmentBytes = 0; |
43 | 39 | double bps = bm.Measure(segmentBytes,startTime); |
44 | - if((bps < qualities.get(currentQuality).getQuality()) && (bps != -1)) | |
45 | - { | |
40 | + if((bps < qualities.get(currentQuality).getQuality()) && (bps != -1)){ | |
46 | 41 | currentQuality++; |
47 | 42 | break; |
48 | 43 | } |
49 | 44 | /* |
50 | 45 | * REPRODUCIR SEGMENTO |
51 | 46 | */ |
52 | - if(currentSegment == segments.size()) | |
53 | - { | |
47 | + if(currentSegment == segments.size()){ | |
54 | 48 | endReached = true; |
55 | 49 | break; |
56 | 50 | } |
... | ... | @@ -58,4 +52,4 @@ public class HLS { |
58 | 52 | } |
59 | 53 | } |
60 | 54 | } |
61 | -} | |
55 | +} | |
62 | 56 | \ No newline at end of file | ... | ... |
src/com/upc/pbe/upcnews/HTMLParser.java
... | ... | @@ -4,23 +4,23 @@ import java.util.ArrayList; |
4 | 4 | |
5 | 5 | import android.util.Log; |
6 | 6 | |
7 | -public class HTMLParser | |
8 | -{ | |
7 | +//Parseja arxius HTML | |
8 | +public class HTMLParser { | |
9 | + | |
9 | 10 | private final static String TAG = "HTMLParser"; |
10 | - private ArrayList<String> resources; | |
11 | - private String server; | |
11 | + private ArrayList<String> resources; //Llista de recursos trobats | |
12 | + private String server; //URL Server | |
12 | 13 | |
13 | - public HTMLParser(String u) | |
14 | - { | |
14 | + public HTMLParser(String u){ | |
15 | + //Separem host i server en la direccio donada | |
15 | 16 | String host = u.substring(7); |
16 | 17 | server = u.substring(0,host.indexOf("/")+7); |
17 | 18 | resources = new ArrayList<String>(); |
18 | 19 | } |
19 | 20 | |
20 | - public ArrayList<String> parse(String code) | |
21 | - { | |
22 | - if(!resources.isEmpty()) | |
23 | - { | |
21 | + public ArrayList<String> parse(String code){ | |
22 | + //Metode principal, nejetem la llista si hi ha continguts i parsejem | |
23 | + if(!resources.isEmpty()){ | |
24 | 24 | resources.clear(); |
25 | 25 | } |
26 | 26 | parseDirectories(resources,code); |
... | ... | @@ -28,38 +28,28 @@ public class HTMLParser |
28 | 28 | return resources; |
29 | 29 | } |
30 | 30 | |
31 | - public void parseDirectories(ArrayList<String> resources, String code) | |
32 | - { | |
33 | - // Separem el codi en linies | |
31 | + public void parseDirectories(ArrayList<String> resources, String code){ | |
32 | + //Busca directoris en un arxiu HTML | |
33 | + //Separem el codi en linies | |
34 | 34 | String[] split = code.split("\n"); |
35 | - /* | |
36 | - * Busquemos el tag <a>, descartando comentarios: | |
37 | - */ | |
38 | - for (int i = 0; i < split.length; i++) | |
39 | - { | |
40 | - while (split[i].startsWith("<!--")) | |
41 | - { | |
42 | - if (split[i++].endsWith("-->")) | |
43 | - { | |
35 | + //Busquem el tag <a>, descartant comentaris: | |
36 | + for (int i = 0; i < split.length; i++){ | |
37 | + while (split[i].startsWith("<!--")){ | |
38 | + if (split[i++].endsWith("-->")){ | |
44 | 39 | break; |
45 | 40 | } |
46 | 41 | } |
47 | - // Posible comentario descartado | |
48 | - if (split[i].indexOf("<a ") != -1) //Enlace | |
49 | - { | |
50 | - if (split[i].indexOf("href=") != -1) //Esto tiene buena pinta | |
51 | - { | |
52 | - String dirpath = split[i].substring(split[i].indexOf("href=\"") + 6); //Eliminamos morralla del principio. | |
53 | - dirpath = dirpath.substring(0, dirpath.indexOf("\"")); //Quitamos la morralla del final, nos queda el valor de href sólo. | |
54 | - if(dirpath.lastIndexOf("/") != -1) //Mira que sea una carpeta y no un fichero suelto. | |
55 | - { | |
56 | - dirpath = dirpath.substring(0,dirpath.lastIndexOf("/")+1); //Elimina parte que no es carpeta | |
57 | - if(dirpath.startsWith("/")) | |
58 | - { | |
42 | + // Posible comentari descartat | |
43 | + if (split[i].indexOf("<a ") != -1){ //Enllaç | |
44 | + if (split[i].indexOf("href=") != -1) { //Aixo te bona pinta | |
45 | + String dirpath = split[i].substring(split[i].indexOf("href=\"") + 6); //Eliminem morralla del principi. | |
46 | + dirpath = dirpath.substring(0, dirpath.indexOf("\"")); //Treiem la morralla del final, ens queda el valor de href. | |
47 | + if(dirpath.lastIndexOf("/") != -1) { //Mira que sigui una carpeta y no un arxiu sol. | |
48 | + dirpath = dirpath.substring(0,dirpath.lastIndexOf("/")+1); //Elimina la part que no es carpeta | |
49 | + if(dirpath.startsWith("/")){ | |
59 | 50 | dirpath = server + dirpath; |
60 | 51 | } |
61 | - if(!resources.contains(dirpath)) //No seamos repetitivos | |
62 | - { | |
52 | + if(!resources.contains(dirpath)) { //No siguem repetitius | |
63 | 53 | resources.add(dirpath); |
64 | 54 | } |
65 | 55 | Log.d(TAG, "DIRECTORY FOUND: " + dirpath); |
... | ... | @@ -69,40 +59,32 @@ public class HTMLParser |
69 | 59 | } |
70 | 60 | } |
71 | 61 | |
72 | - public void parseFiles(ArrayList<String> resources, String code) | |
73 | - { | |
62 | + public void parseFiles(ArrayList<String> resources, String code){ | |
63 | + //Parseja arxius en un arxiu HTML | |
64 | + //Separem el codi en linies | |
74 | 65 | String[] split = code.split("\n"); |
75 | - for (int i = 0; i < split.length; i++) | |
76 | - { | |
77 | - while (split[i].startsWith("<!--")) | |
78 | - { | |
79 | - if (split[i++].endsWith("-->")) | |
80 | - { | |
66 | + for (int i = 0; i < split.length; i++){ | |
67 | + while (split[i].startsWith("<!--")){ | |
68 | + if (split[i++].endsWith("-->")){ | |
81 | 69 | break; |
82 | 70 | } |
83 | 71 | } |
84 | - // Posible comentario descartado | |
85 | - if (split[i].contains("<a ")) //Enlace | |
86 | - { | |
87 | - if (split[i].contains("href=")) //Esto tiene buena pinta | |
88 | - { | |
89 | - String filepath = split[i].substring(split[i].indexOf("href=\"") + 6); //Eliminamos morralla del principio. | |
90 | - filepath = filepath.substring(0, filepath.indexOf("\"")); //Quitamos la morralla del final, nos queda el valor de href sólo. | |
91 | - if(filepath.endsWith(".m3u8")) //Mira que sea una lista. | |
92 | - { | |
72 | + // Possible comentari descartat | |
73 | + if (split[i].contains("<a ")) { //Enllaç | |
74 | + if (split[i].contains("href=")) { //Aixo te bona pinta | |
75 | + String filepath = split[i].substring(split[i].indexOf("href=\"") + 6); //Eliminem morralla del principi. | |
76 | + filepath = filepath.substring(0, filepath.indexOf("\"")); //Treiem la morralla del final, ens queda el valor de href. | |
77 | + if(filepath.endsWith(".m3u8")) { //Mira que sigui una llista. | |
93 | 78 | String filename; |
94 | - //Deteccion de ficheros ocultos | |
95 | - if(filepath.indexOf("/") != -1) | |
96 | - { | |
79 | + //Deteccio d'arxius ocults | |
80 | + if(filepath.indexOf("/") != -1){ | |
97 | 81 | filename = filepath.substring(filepath.lastIndexOf("/")); |
98 | 82 | } |
99 | - else | |
100 | - { | |
83 | + else{ | |
101 | 84 | filename = filepath; |
102 | 85 | } |
103 | - if(!filename.startsWith(".")) | |
104 | - { | |
105 | - if(!resources.contains(filepath)) //No seamos repetitivos | |
86 | + if(!filename.startsWith(".")){ | |
87 | + if(!resources.contains(filepath)) //No siguem repetitius | |
106 | 88 | { |
107 | 89 | resources.add(filepath); |
108 | 90 | } | ... | ... |
src/com/upc/pbe/upcnews/Help.java
src/com/upc/pbe/upcnews/InfoException.java
src/com/upc/pbe/upcnews/MainActivity.java
... | ... | @@ -16,48 +16,35 @@ import android.widget.ImageButton; |
16 | 16 | import android.widget.TextView; |
17 | 17 | import android.widget.Toast; |
18 | 18 | |
19 | +//Finestra incial i principal del programa | |
19 | 20 | public class MainActivity extends Activity implements OnClickListener { |
21 | + | |
20 | 22 | private final static String TAG = "Main"; |
21 | 23 | private static String html; |
22 | 24 | private ImageButton buttonDescarrega; |
23 | 25 | private TextView URLText; |
24 | - | |
25 | 26 | |
26 | 27 | @Override |
27 | - public void onCreate(Bundle savedInstanceState) | |
28 | - { | |
28 | + public void onCreate(Bundle savedInstanceState){ | |
29 | + //Creem el layout | |
29 | 30 | super.onCreate(savedInstanceState); |
30 | 31 | setContentView(R.layout.main_activity); |
31 | 32 | Log.d(TAG, "onCreated"); |
33 | + //Especifiquem la ruta de descàrrega | |
32 | 34 | File tempFolder = new File(((UpcApp)getApplication()).getLocalPath()); |
33 | 35 | if(tempFolder.mkdirs()) |
34 | 36 | { |
35 | 37 | Log.d(TAG,"Directory " + tempFolder.toString() + " created"); |
36 | 38 | } |
39 | + //Creem els botons i text | |
37 | 40 | URLText = (TextView) findViewById(R.id.textViewUrl); |
38 | 41 | buttonDescarrega = (ImageButton) findViewById(R.id.button); |
39 | 42 | buttonDescarrega.setOnClickListener(this); |
40 | 43 | updateURL(); |
41 | 44 | } |
42 | 45 | |
43 | - public void onResume() | |
44 | - { | |
45 | - super.onResume(); | |
46 | - updateURL(); | |
47 | - } | |
48 | - | |
49 | - public void updateURL() | |
50 | - { | |
51 | - URLText.setText(((UpcApp)getApplication()).getUrl()); | |
52 | - } | |
53 | - | |
54 | - public boolean onCreateOptionsMenu(Menu menu) { | |
55 | - getMenuInflater().inflate(R.menu.menu, menu); | |
56 | - Log.d(TAG, "Menu"); | |
57 | - return true; | |
58 | - } | |
59 | - | |
60 | 46 | public void onClick(View v) { |
47 | + //Al polsar el boto s'inicia la descarrega | |
61 | 48 | Log.d(TAG, "onClicked"); |
62 | 49 | this.descarregar(); |
63 | 50 | if(!html.equals("EMPTY")) |
... | ... | @@ -66,8 +53,10 @@ public class MainActivity extends Activity implements OnClickListener { |
66 | 53 | startActivity(new Intent(this, Directoris.class)); |
67 | 54 | } |
68 | 55 | } |
69 | - | |
56 | + | |
70 | 57 | public void descarregar() { |
58 | + //Descarrega del document HTML de la URL especificada | |
59 | + //Si hi ha errors, els mostrem en Toasts | |
71 | 60 | Descarrega d = new Descarrega(); |
72 | 61 | html="EMPTY"; |
73 | 62 | try |
... | ... | @@ -83,8 +72,25 @@ public class MainActivity extends Activity implements OnClickListener { |
83 | 72 | Toast.makeText(this, "Can't find URL", Toast.LENGTH_LONG).show(); |
84 | 73 | } |
85 | 74 | } |
75 | + | |
76 | + public void onResume(){ | |
77 | + super.onResume(); | |
78 | + updateURL(); | |
79 | + } | |
80 | + | |
81 | + public void updateURL(){ | |
82 | + URLText.setText(((UpcApp)getApplication()).getUrl()); | |
83 | + } | |
84 | + | |
85 | + public boolean onCreateOptionsMenu(Menu menu) { | |
86 | + //Determina el funcionament al apretar la tecla d'opcions | |
87 | + getMenuInflater().inflate(R.menu.menu, menu); | |
88 | + Log.d(TAG, "Menu"); | |
89 | + return true; | |
90 | + } | |
86 | 91 | |
87 | 92 | public boolean onOptionsItemSelected(MenuItem item) { |
93 | + //Determina el funcionament al clickar en el menu d'opcions | |
88 | 94 | switch (item.getItemId()) { |
89 | 95 | case R.id.itemprefs: |
90 | 96 | startActivity(new Intent(this, Prefs.class)); | ... | ... |
src/com/upc/pbe/upcnews/ParentList.java
... | ... | @@ -7,7 +7,7 @@ public class ParentList |
7 | 7 | private String ID; |
8 | 8 | private int currentQuality; |
9 | 9 | private String Type, Name; |
10 | - private boolean Default; //Estos 3 últimos son para los ext-x-media, los ext-x-stream lo IGNORAN | |
10 | + private boolean Default; //Estos 3 ultimos son para los ext-x-media, los ext-x-stream lo IGNORAN | |
11 | 11 | private ArrayList<Video> lists; //per cada qualitat |
12 | 12 | |
13 | 13 | |
... | ... | @@ -71,6 +71,4 @@ public class ParentList |
71 | 71 | { |
72 | 72 | return lists; |
73 | 73 | } |
74 | - | |
75 | - | |
76 | -} | |
74 | +} | |
77 | 75 | \ No newline at end of file | ... | ... |
src/com/upc/pbe/upcnews/Parser.java
... | ... | @@ -7,63 +7,51 @@ import java.util.ArrayList; |
7 | 7 | import android.app.Activity; |
8 | 8 | import android.widget.Toast; |
9 | 9 | |
10 | -public class Parser | |
11 | -{ | |
10 | +//Parser d'arxius m3u8 | |
11 | +public class Parser{ | |
12 | + | |
12 | 13 | private static final String STARTWORD = "#EXTM3U"; |
13 | - private String path; // CWD, completes implicit paths such as "file.m3u8" | |
14 | - // appending the CWD in order to download the file | |
15 | - private int fileType; // indicates if segment list or media list | |
14 | + private String path; //CWD, completes implicit paths such as "file.m3u8" appending the CWD in order to download the file | |
15 | + private int fileType; //Indica si es segment list o media list | |
16 | 16 | private int currentLine; |
17 | - private int currentSegment; // Cada segmento de cada calidad distinta | |
18 | - private int currentList; // Indice de cada recurso distinto | |
17 | + private int currentSegment; //Cada segment de cada qualitat distinta | |
18 | + private int currentList; //Index de cada recurso distint | |
19 | 19 | private boolean expectSegment = false; |
20 | 20 | private boolean expectList = false; |
21 | 21 | private Descarrega download; |
22 | - private Activity caller; // Where to send notifications and warnings | |
23 | - private boolean validated; // Wether if list starts with #EXTM3U or not | |
22 | + private Activity caller; //On enviar les notificacions i warnings | |
23 | + private boolean validated; //Indica si la llista comença amb #EXTM3U o no | |
24 | 24 | |
25 | - public Parser(String p, Activity caller) | |
26 | - { | |
25 | + public Parser(String p, Activity caller){ | |
27 | 26 | this.caller = caller; |
28 | 27 | path = p; |
29 | 28 | currentLine = 0; |
30 | 29 | currentSegment = 0; |
31 | 30 | currentList = 0; |
32 | - fileType = -1; | |
33 | - /* | |
34 | - * -1 indicates UNDETERMINED 0 indicates SEGMENTS 1 indicates MEDIA | |
35 | - */ | |
31 | + fileType = -1;//-1 indica UNDETERMINED, 0 indica SEGMENTS, 1 indica MEDIA | |
36 | 32 | download = new Descarrega(); |
37 | 33 | validated = false; |
38 | 34 | } |
39 | 35 | |
40 | - public ArrayList<ParentList> parseFile(String file) throws ErrorException, WarningException, InfoException | |
41 | - { | |
36 | + public ArrayList<ParentList> parseFile(String file) throws ErrorException, WarningException, InfoException { | |
37 | + //Parseja un arxiu m3u8 | |
42 | 38 | ArrayList<ParentList> lists = new ArrayList<ParentList>(); |
43 | 39 | lists.add(new ParentList("")); |
44 | 40 | lists.get(0).getLists().add(new Video(-1)); |
45 | 41 | String[] lines = file.split("\n"); |
46 | - for (int i = 0; i < lines.length; i++) | |
47 | - { | |
48 | - if (lines[i].endsWith("\\")) | |
49 | - { | |
50 | - /* | |
51 | - * Merge multiline entries, which are those lines ending with | |
52 | - * backslash. | |
53 | - */ | |
42 | + for (int i = 0; i < lines.length; i++){ | |
43 | + if (lines[i].endsWith("\\")){ | |
44 | + //Barreja les entrades multilinea, que son les que acaben en backslash | |
54 | 45 | lines[++i] = lines[i - 1].substring(0, lines[i - 1].indexOf("\\") - 1) |
55 | 46 | + lines[i]; |
56 | 47 | } |
57 | - try | |
58 | - { | |
48 | + try{ | |
59 | 49 | parseLine(lines[i], lists); |
60 | 50 | } |
61 | - catch (InfoException iE) | |
62 | - { | |
51 | + catch (InfoException iE){ | |
63 | 52 | Toast.makeText(caller, iE.getMessage(), Toast.LENGTH_SHORT).show(); |
64 | 53 | } |
65 | - catch (WarningException wE) | |
66 | - { | |
54 | + catch (WarningException wE){ | |
67 | 55 | Toast.makeText(caller, wE.getMessage(), Toast.LENGTH_SHORT).show(); |
68 | 56 | } |
69 | 57 | } |
... | ... | @@ -73,20 +61,18 @@ public class Parser |
73 | 61 | * Si no te gusta mis VERSOS, |
74 | 62 | * te mando a la mierda sin SUTILIDADES. |
75 | 63 | * |
76 | - * -- Imanol, hasta las cejas de cafeÃna. | |
64 | + * -- Imanol, hasta las cejas de cafeina. | |
77 | 65 | * |
78 | - * PD: En el último nivel de profundidad hay una lista de segmentos | |
79 | - * (debajo de calidades). Allà está el auténtico tesoro de Narnia. | |
66 | + * PD: En el ultimo nivel de profundidad hay una lista de segmentos | |
67 | + * (debajo de calidades). Alli esta el autentico tesoro de Narnia. | |
80 | 68 | */ |
81 | - for (int i = 0; i < lists.size(); i++) | |
82 | - { | |
69 | + for (int i = 0; i < lists.size(); i++){ | |
83 | 70 | sortQuality(lists.get(i)); |
84 | 71 | } |
85 | 72 | return lists; |
86 | 73 | } |
87 | 74 | |
88 | - private int searchID(String ID, ArrayList<ParentList> lists) | |
89 | - { | |
75 | + private int searchID(String ID, ArrayList<ParentList> lists){ | |
90 | 76 | for (int i = 0; i < lists.size(); i++) |
91 | 77 | { |
92 | 78 | if (lists.get(i).getID().equals(ID)) |
... | ... | @@ -97,159 +83,110 @@ public class Parser |
97 | 83 | return -1; |
98 | 84 | } |
99 | 85 | |
100 | - private void sortQuality(ParentList ppls) | |
101 | - { | |
86 | + private void sortQuality(ParentList ppls){ | |
102 | 87 | ArrayList<Video> lists = ppls.getLists(); |
103 | - if (lists.get(0).getQuality() == -1) | |
104 | - { | |
105 | - /* | |
106 | - * That's the case of Media lists and Segment lists, they don't have | |
107 | - * distinct qualities. | |
108 | - */ | |
88 | + if (lists.get(0).getQuality() == -1){ | |
89 | + //Es el cas de Media Lists i Segment Lists, no tenen diferenciacio de qualitats | |
109 | 90 | return; |
110 | 91 | } |
111 | - // Bubblesort | |
112 | - while (true) | |
113 | - { | |
92 | + //Bubblesort | |
93 | + while (true){ | |
114 | 94 | boolean sorted = true; |
115 | 95 | int i = 0; |
116 | - do | |
117 | - { | |
118 | - if (lists.get(i).getQuality() < lists.get(i + 1).getQuality()) | |
119 | - { | |
96 | + do{ | |
97 | + if (lists.get(i).getQuality() < lists.get(i + 1).getQuality()){ | |
120 | 98 | sorted = false; |
121 | 99 | Video aux = lists.get(i); |
122 | 100 | lists.set(i, lists.get(i + 1)); |
123 | 101 | lists.set(i + 1, aux); |
124 | 102 | } |
125 | 103 | |
126 | - } | |
127 | - while (++i != lists.size() - 1); | |
128 | - if (sorted) | |
129 | - { | |
104 | + }while (++i != lists.size() - 1); | |
105 | + if (sorted){ | |
130 | 106 | break; |
131 | 107 | } |
132 | 108 | } |
133 | 109 | |
134 | 110 | } |
135 | 111 | |
136 | - public void parseLine(String line, ArrayList<ParentList> lists) throws ErrorException, WarningException, InfoException | |
137 | - { | |
138 | - if (line.isEmpty()) | |
139 | - { | |
112 | + public void parseLine(String line, ArrayList<ParentList> lists) throws ErrorException, WarningException, InfoException { | |
113 | + //Parseja una linea de l'arxiu | |
114 | + if (line.isEmpty()){ | |
140 | 115 | currentLine++; |
141 | 116 | return; |
142 | 117 | } |
143 | - else | |
144 | - { | |
118 | + else{ | |
145 | 119 | ParentList ppls = lists.get(currentList); |
146 | 120 | Video pls = ppls.getLists().get(ppls.getLists().size() - 1); |
147 | - if (!validated) | |
148 | - { | |
149 | - if (line.equals(STARTWORD)) | |
150 | - { | |
121 | + if (!validated){ | |
122 | + if (line.equals(STARTWORD)){ | |
151 | 123 | validated = true; |
152 | 124 | } |
153 | - else | |
154 | - { | |
155 | - throw new ErrorException("Playlist is not valid"); | |
125 | + else{ | |
126 | + throw new ErrorException("Playlist no valida"); | |
156 | 127 | } |
157 | 128 | } |
158 | - else | |
159 | - { | |
160 | - if (line.charAt(0) == '#') | |
161 | - { | |
162 | - if (line.substring(0, 4).equals("#EXT")) | |
163 | - { | |
164 | - if (expectSegment && !line.startsWith("#EXT-X-BYTERANGE")) | |
165 | - { | |
166 | - throw new ErrorException("Expected segment URI, got an EXT-TAG instead"); | |
129 | + else{ | |
130 | + if (line.charAt(0) == '#'){ | |
131 | + if (line.substring(0, 4).equals("#EXT")){ | |
132 | + if (expectSegment && !line.startsWith("#EXT-X-BYTERANGE")){ | |
133 | + throw new ErrorException("S'esperava segment URI, en comptes tenim EXT-TAG"); | |
167 | 134 | } |
168 | - if (expectList) | |
169 | - { | |
170 | - throw new ErrorException("Expected List, got an EXT-TAG instead"); | |
135 | + if (expectList){ | |
136 | + throw new ErrorException("S'esperava llista, en comptes tenim EXT-TAG"); | |
171 | 137 | } |
172 | 138 | String[] extTag = line.split(":", 2); |
173 | - if (extTag[0].equals("#EXT-X-MEDIA-SEQUENCE")) | |
174 | - { | |
139 | + if (extTag[0].equals("#EXT-X-MEDIA-SEQUENCE")){ | |
175 | 140 | pls.setSequence(Integer.parseInt(extTag[1])); |
176 | 141 | } |
177 | - else if (extTag[0].equals("#EXT-X-TARGETDURATION")) | |
178 | - { | |
142 | + else if (extTag[0].equals("#EXT-X-TARGETDURATION")){ | |
179 | 143 | pls.setMaxDuration(Integer.parseInt(extTag[1])); |
180 | 144 | } |
181 | - else if (extTag[0].equals("#EXTINF")) | |
182 | - { | |
183 | - if (fileType == -1) | |
184 | - { | |
145 | + else if (extTag[0].equals("#EXTINF")){ | |
146 | + if (fileType == -1){ | |
185 | 147 | fileType = 0; |
186 | 148 | } |
187 | - else if (fileType == 1) | |
188 | - { | |
189 | - throw new ErrorException("Invalid file, should contain Lists, " | |
190 | - + "but segments were found."); | |
149 | + else if (fileType == 1){ | |
150 | + throw new ErrorException("Arxiu invalid, hauria de contenir llistes pero s'han trobat segments"); | |
191 | 151 | } |
192 | 152 | String[] args = extTag[1].split(","); |
193 | 153 | float duration = Float.parseFloat(args[0]); |
194 | - if (duration > pls.getMaxDuration()) | |
195 | - { | |
196 | - throw new ErrorException("Segment " | |
197 | - + currentSegment + 1 + " on line " | |
198 | - + currentLine + " exceeds max duration"); | |
154 | + if (duration > pls.getMaxDuration()){ | |
155 | + throw new ErrorException("Segment " + currentSegment + 1 + " en linea " + currentLine + " supera la duracio maxima"); | |
199 | 156 | } |
200 | 157 | Segment s = new Segment(duration); |
201 | - if (args.length == 1) | |
202 | - { | |
158 | + if (args.length == 1){ | |
203 | 159 | s.setName(""); |
204 | 160 | } |
205 | - else | |
206 | - { | |
161 | + else{ | |
207 | 162 | s.setName(args[1]); |
208 | 163 | } |
209 | 164 | pls.getSegments().add(s); |
210 | 165 | expectSegment = true; |
211 | 166 | } |
212 | - | |
213 | - else if (extTag[0].equals("#EXT-X-STREAM-INF")) | |
214 | - { | |
215 | - if (fileType == -1) | |
216 | - { | |
167 | + else if (extTag[0].equals("#EXT-X-STREAM-INF")){ | |
168 | + if (fileType == -1){ | |
217 | 169 | fileType = 1; |
218 | 170 | } |
219 | - else if (fileType == 0) | |
220 | - { | |
221 | - throw new ErrorException("Invalid file, should contain Segments, " | |
222 | - + "but lists were found."); | |
171 | + else if (fileType == 0){ | |
172 | + throw new ErrorException("Arxiu invalid, hauria de contenir segments pero s'han trobat llistes"); | |
223 | 173 | } |
224 | 174 | expectList = true; |
225 | 175 | String programID = ""; |
226 | 176 | double bandwidth = -1; |
227 | 177 | String[] arguments = extTag[1].split(","); |
228 | - for (int i = 0; i < arguments.length; i++) | |
229 | - { | |
178 | + for (int i = 0; i < arguments.length; i++){ | |
230 | 179 | String[] argument = arguments[i].split("="); |
231 | - /* | |
232 | - * In case current argument contains several | |
233 | - * values like "val1,val2,val3" detect the " | |
234 | - * character and merge them all in one single | |
235 | - * string | |
236 | - */ | |
237 | - if (argument[1].startsWith("\"") | |
238 | - && !argument[1].endsWith("\"")) | |
239 | - { | |
180 | + //Si l'argument en questio conte diferents valors, detecta el caracter " i els ajunta en un String | |
181 | + if (argument[1].startsWith("\"") && !argument[1].endsWith("\"")){ | |
240 | 182 | int j = i; |
241 | - while (true) | |
242 | - { | |
243 | - if (i == arguments.length - 1) | |
244 | - { | |
245 | - throw new ErrorException("Malformed argument on line " | |
246 | - + currentLine); | |
183 | + while (true){ | |
184 | + if (i == arguments.length - 1){ | |
185 | + throw new ErrorException("Argument mal expressat en linea " + currentLine); | |
247 | 186 | } |
248 | - if (arguments[++i].endsWith("\"")) | |
249 | - { | |
187 | + if (arguments[++i].endsWith("\"")){ | |
250 | 188 | String end = arguments[i]; |
251 | - for (int k = j + 1; k < i; k++) | |
252 | - { | |
189 | + for (int k = j + 1; k < i; k++){ | |
253 | 190 | argument[1] += arguments[k]; |
254 | 191 | } |
255 | 192 | argument[1] += end; |
... | ... | @@ -257,44 +194,26 @@ public class Parser |
257 | 194 | } |
258 | 195 | } |
259 | 196 | } |
260 | - if (argument[0].equals("PROGRAM-ID")) | |
261 | - { | |
197 | + if (argument[0].equals("PROGRAM-ID")){ | |
262 | 198 | programID = argument[1]; |
263 | 199 | } |
264 | - else if (argument[0].equals("BANDWIDTH")) | |
265 | - { | |
200 | + else if (argument[0].equals("BANDWIDTH")){ | |
266 | 201 | bandwidth = Double.parseDouble(argument[1]); |
267 | 202 | } |
268 | 203 | } |
269 | - if (programID.equals("") || bandwidth == -1) | |
270 | - { | |
271 | - throw new ErrorException("Playlist on line " | |
272 | - + currentLine | |
273 | - + " has missing arguments"); | |
204 | + if (programID.equals("") || bandwidth == -1){ | |
205 | + throw new ErrorException("Playlist en linea " + currentLine + " no te arguments"); | |
274 | 206 | } |
275 | - if (!programID.equals(ppls.getID())) | |
276 | - { | |
277 | - /* | |
278 | - * If Program-ID doesn't match, search it or | |
279 | - * create a new one. | |
280 | - */ | |
281 | - if (ppls.getID().equals("")) | |
282 | - { | |
283 | - /* | |
284 | - * If working with the default ParentList, | |
285 | - * then modify it, don't create a new one. | |
286 | - */ | |
207 | + if (!programID.equals(ppls.getID())){ | |
208 | + //Si el Program-ID no coincideix, buscar o crear un de nou | |
209 | + if (ppls.getID().equals("")){ | |
210 | + //Si es treballa amb la ParentList per defecte, modificar, no crear una nova | |
287 | 211 | lists.get(0).setID(programID); |
288 | 212 | } |
289 | - else | |
290 | - { | |
213 | + else{ | |
291 | 214 | currentList = searchID(programID, lists); |
292 | - if (currentList == -1) | |
293 | - { | |
294 | - /* | |
295 | - * ParentList not found, creating a new | |
296 | - * one. | |
297 | - */ | |
215 | + if (currentList == -1){ | |
216 | + //No s'ha trobat ParentList, es crea una nova | |
298 | 217 | lists.add(new ParentList(programID)); |
299 | 218 | currentList = lists.size() - 1; |
300 | 219 | } |
... | ... | @@ -302,35 +221,21 @@ public class Parser |
302 | 221 | pls = ppls.getLists().get(ppls.getLists().size() - 1); |
303 | 222 | } |
304 | 223 | } |
305 | - /* | |
306 | - * Now we create a new List inside the correct | |
307 | - * ParentList. | |
308 | - */ | |
309 | - if ((ppls.getLists().size() == 1) | |
310 | - && (pls.getQuality() == -1) | |
311 | - && pls.getSegments().isEmpty()) | |
312 | - { | |
313 | - /* | |
314 | - * If working with the default List, then modify | |
315 | - * it, don't create a new one. | |
316 | - */ | |
224 | + //Creem una List dins el ParentList correcte | |
225 | + if ((ppls.getLists().size() == 1) && (pls.getQuality() == -1) && pls.getSegments().isEmpty()){ | |
226 | + //Si es treballa amb la List per defecte, modificar, no crear una nova | |
317 | 227 | pls.setQuality(bandwidth); |
318 | 228 | } |
319 | - else | |
320 | - { | |
229 | + else{ | |
321 | 230 | ppls.getLists().add(new Video(bandwidth)); |
322 | 231 | } |
323 | 232 | } |
324 | - else if (extTag[0].equals("#EXT-X-MEDIA")) | |
325 | - { | |
326 | - if (fileType == -1) | |
327 | - { | |
233 | + else if (extTag[0].equals("#EXT-X-MEDIA")){ | |
234 | + if (fileType == -1){ | |
328 | 235 | fileType = 1; |
329 | 236 | } |
330 | - else if (fileType == 0) | |
331 | - { | |
332 | - throw new ErrorException("Invalid file, should contain Segments, " | |
333 | - + "but lists were found."); | |
237 | + else if (fileType == 0){ | |
238 | + throw new ErrorException("Arxiu invalid, hauria de contenir segments pero s'han trobat llistes"); | |
334 | 239 | } |
335 | 240 | String Type = ""; |
336 | 241 | String Name = ""; |
... | ... | @@ -338,31 +243,18 @@ public class Parser |
338 | 243 | String URI = ""; |
339 | 244 | boolean Default = false; |
340 | 245 | String[] arguments = extTag[1].split(","); |
341 | - for (int i = 0; i < arguments.length; i++) | |
342 | - { | |
246 | + for (int i = 0; i < arguments.length; i++){ | |
343 | 247 | String[] argument = arguments[i].split("="); |
344 | - /* | |
345 | - * In case current argument contains several | |
346 | - * values like "val1,val2,val3" detect the " | |
347 | - * character and merge them all in one single | |
348 | - * string | |
349 | - */ | |
350 | - if (argument[1].startsWith("\"") | |
351 | - && !argument[1].endsWith("\"")) | |
352 | - { | |
248 | + //Si l'argument en questio conte diferents valors, detecta el caracter " i els ajunta en un String | |
249 | + if (argument[1].startsWith("\"") && !argument[1].endsWith("\"")){ | |
353 | 250 | int j = i; |
354 | - while (true) | |
355 | - { | |
356 | - if (i == arguments.length - 1) | |
357 | - { | |
358 | - throw new ErrorException("Malformed argument on line " | |
359 | - + currentLine); | |
251 | + while (true){ | |
252 | + if (i == arguments.length - 1){ | |
253 | + throw new ErrorException("Argument mal expressat en linea " + currentLine); | |
360 | 254 | } |
361 | - if (arguments[++i].endsWith("\"")) | |
362 | - { | |
255 | + if (arguments[++i].endsWith("\"")){ | |
363 | 256 | String end = arguments[i]; |
364 | - for (int k = j + 1; k < i; k++) | |
365 | - { | |
257 | + for (int k = j + 1; k < i; k++){ | |
366 | 258 | argument[1] += arguments[k]; |
367 | 259 | } |
368 | 260 | argument[1] += end; |
... | ... | @@ -370,82 +262,55 @@ public class Parser |
370 | 262 | } |
371 | 263 | } |
372 | 264 | } |
373 | - if (argument[0].equals("NAME")) | |
374 | - { | |
265 | + if (argument[0].equals("NAME")){ | |
375 | 266 | Name = argument[1].substring(1, argument[1].length() - 1); |
376 | 267 | } |
377 | - else if (argument[0].equals("TYPE")) | |
378 | - { | |
268 | + else if (argument[0].equals("TYPE")){ | |
379 | 269 | Type = argument[1]; |
380 | 270 | } |
381 | - else if (argument[0].equals("GROUP-ID")) | |
382 | - { | |
271 | + else if (argument[0].equals("GROUP-ID")){ | |
383 | 272 | GroupID = argument[1].substring(1, argument[1].length() - 1); |
384 | 273 | } |
385 | - else if (argument[0].equals("DEFAULT")) | |
386 | - { | |
387 | - if (argument[1].equals("YES")) | |
388 | - { | |
274 | + else if (argument[0].equals("DEFAULT")){ | |
275 | + if (argument[1].equals("YES")){ | |
389 | 276 | Default = true; |
390 | 277 | } |
391 | - else if (argument[1].equals("NO")) | |
392 | - { | |
278 | + else if (argument[1].equals("NO")){ | |
393 | 279 | Default = true; |
394 | 280 | } |
395 | - else | |
396 | - { | |
397 | - throw new ErrorException("Invalid value for argument DEFAULT on line " | |
398 | - + currentLine); | |
281 | + else{ | |
282 | + throw new ErrorException("Valor invalid per l'argument DEFAULT en linea " + currentLine); | |
399 | 283 | } |
400 | 284 | } |
401 | - else if (argument[0].equals("URI")) | |
402 | - { | |
403 | - if (!argument[1].contains("http://")) | |
404 | - { | |
405 | - /* | |
406 | - * In case the path read is RELATIVE | |
407 | - */ | |
408 | - URI = path | |
409 | - + argument[1].substring(1, argument[1].length() - 1); | |
285 | + else if (argument[0].equals("URI")){ | |
286 | + if (!argument[1].contains("http://")){ | |
287 | + //En cas de que la ruta llegida es RELATIVE | |
288 | + URI = path + argument[1].substring(1, argument[1].length() - 1); | |
410 | 289 | } |
411 | - else | |
412 | - { | |
290 | + else{ | |
413 | 291 | URI = argument[1].substring(1, argument[1].length() - 1); |
414 | 292 | } |
415 | 293 | } |
416 | 294 | } |
417 | - if (Type.equals("") || Name.equals("") | |
418 | - || URI.equals("") || GroupID.equals("")) | |
419 | - { | |
420 | - throw new ErrorException("Playlist on line " | |
421 | - + currentLine | |
422 | - + " has missing arguments"); | |
295 | + if (Type.equals("") || Name.equals("") || URI.equals("") || GroupID.equals("")) { | |
296 | + throw new ErrorException("Playlist en linea " + currentLine + " no te arguments"); | |
423 | 297 | } |
424 | 298 | Parser p = new Parser(URI.substring(0, URI.lastIndexOf("/") + 1), caller); |
425 | 299 | Video newList; |
426 | - try | |
427 | - { | |
300 | + try{ | |
428 | 301 | newList = p.parseFile(download.doInBackground(URI)).get(0).getLists().get(0); |
429 | - if (!GroupID.equals(ppls.getID())) | |
430 | - { | |
431 | - if (ppls.getID().equals("")) | |
432 | - { | |
433 | - /* | |
434 | - * If working with the default ParentList, | |
435 | - * then modify it, don't create a new one. | |
436 | - */ | |
302 | + if (!GroupID.equals(ppls.getID())){ | |
303 | + if (ppls.getID().equals("")){ | |
304 | + //Si es treballa amb la ParentList per defecte, modificar, no crear una nova | |
437 | 305 | ppls.setDefault(Default); |
438 | 306 | ppls.setName(Name); |
439 | 307 | ppls.setType(Type); |
440 | 308 | ppls.getLists().set(0, newList); |
441 | 309 | ppls.setID(GroupID); |
442 | 310 | } |
443 | - else | |
444 | - { | |
445 | - | |
311 | + else{ | |
446 | 312 | currentList = searchID(GroupID, lists); |
447 | - if (currentList == -1) | |
448 | - { | |
313 | + if (currentList == -1){ | |
449 | 314 | ParentList pl = new ParentList(GroupID); |
450 | 315 | pl.setDefault(Default); |
451 | 316 | pl.setName(Name); |
... | ... | @@ -457,92 +322,65 @@ public class Parser |
457 | 322 | ppls.getLists().add(newList); |
458 | 323 | } |
459 | 324 | } |
460 | - else | |
461 | - { | |
325 | + else{ | |
462 | 326 | ppls.getLists().add(newList); |
463 | 327 | } |
464 | 328 | } |
465 | - catch (IOException e) | |
466 | - { | |
467 | - // Nunca llegará aquà la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
329 | + catch (IOException e){ | |
330 | + // Nunca llegara aqui la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
468 | 331 | } |
469 | 332 | } |
470 | - | |
471 | - else if (extTag[0].equals("#EXT-X-ENDLIST")) | |
472 | - { | |
473 | - if (expectSegment || expectList) | |
474 | - { | |
475 | - throw new ErrorException("Unexpected end of list!"); | |
333 | + else if (extTag[0].equals("#EXT-X-ENDLIST")){ | |
334 | + if (expectSegment || expectList){ | |
335 | + throw new ErrorException("Final de llista no esperat!"); | |
476 | 336 | } |
477 | 337 | } |
478 | - | |
479 | - else if (extTag[0].equals("#EXT-X-VERSION")) | |
480 | - { | |
481 | - // IGNORE | |
338 | + else if (extTag[0].equals("#EXT-X-VERSION")){ | |
339 | + //IGNORE | |
482 | 340 | } |
483 | - | |
484 | - else if (extTag[0].equals("#EXT-X-PLAYLIST-TYPE")) | |
485 | - { | |
486 | - // IGNORE | |
341 | + else if (extTag[0].equals("#EXT-X-PLAYLIST-TYPE")){ | |
342 | + //IGNORE | |
487 | 343 | } |
488 | - | |
489 | - else | |
490 | - { | |
344 | + else{ | |
491 | 345 | currentLine++; |
492 | - throw new WarningException("Tag not implemented: " | |
493 | - + extTag[0]); | |
346 | + throw new WarningException("Tag no implementat: " + extTag[0]); | |
494 | 347 | } |
495 | 348 | } |
496 | - else | |
497 | - { | |
349 | + else{ | |
498 | 350 | String comment = line.substring(1); |
499 | - throw new InfoException("Comment on line " | |
500 | - + currentLine++ + " " + comment); | |
351 | + throw new InfoException("Comentari en linea " + currentLine++ + " " + comment); | |
501 | 352 | } |
502 | 353 | } |
503 | - else | |
504 | - { | |
505 | - if (expectSegment) | |
506 | - { | |
354 | + else{ | |
355 | + if (expectSegment){ | |
507 | 356 | expectSegment = false; |
508 | - try | |
509 | - { | |
357 | + try{ | |
510 | 358 | pls.getSegments().get(currentSegment).setURL(line); |
511 | 359 | } |
512 | - catch (MalformedURLException e) | |
513 | - { | |
360 | + catch (MalformedURLException e){ | |
514 | 361 | throw new ErrorException(e.getMessage()); |
515 | 362 | } |
516 | 363 | currentSegment++; |
517 | 364 | } |
518 | - else if (expectList) | |
519 | - { | |
520 | - /* | |
521 | - * Download list and merge the entries with the current | |
522 | - * list | |
523 | - */ | |
365 | + else if (expectList){ | |
366 | + //Descarregar llista i juntar les entrades amb les de la llista actual | |
524 | 367 | expectList = false; |
525 | 368 | Parser p = new Parser(line.substring(0, line.lastIndexOf("/") + 1), caller); |
526 | 369 | Video newList; |
527 | - try | |
528 | - { | |
370 | + try{ | |
529 | 371 | newList = p.parseFile(download.doInBackground(line)).get(0).getLists().get(0); |
530 | 372 | pls.setMaxDuration(newList.getMaxDuration()); |
531 | 373 | pls.setSequence(newList.getSequence()); |
532 | - for (int i = 0; i < newList.getSegments().size(); i++) | |
533 | - { | |
374 | + for (int i = 0; i < newList.getSegments().size(); i++){ | |
534 | 375 | pls.getSegments().add(newList.getSegments().get(i)); |
535 | 376 | } |
536 | 377 | } |
537 | - catch (IOException e) | |
538 | - { | |
539 | - // Nunca llegará aquà la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
378 | + catch (IOException e){ | |
379 | + // Nunca llegara aqui la cosa, y si lo hace ES CULPA DEL SERVIDOR!! | |
540 | 380 | } |
541 | 381 | } |
542 | - else | |
543 | - { | |
544 | - throw new ErrorException("ERROR: Unexpected string " | |
545 | - + line); | |
382 | + else{ | |
383 | + throw new ErrorException("ERROR: String no esperat" + line); | |
546 | 384 | } |
547 | 385 | } |
548 | 386 | } | ... | ... |
src/com/upc/pbe/upcnews/Prefs.java
src/com/upc/pbe/upcnews/ResourceAdapter.java
... | ... | @@ -10,15 +10,14 @@ import android.view.ViewGroup; |
10 | 10 | import android.widget.ArrayAdapter; |
11 | 11 | import android.widget.TextView; |
12 | 12 | |
13 | -public class ResourceAdapter extends ArrayAdapter<String> | |
14 | -{ | |
13 | +//Modificacio de l'Adapter d'Adnroid, creat al nostre gust per donar estil als elements de la ListView de directoris i arxius | |
14 | +public class ResourceAdapter extends ArrayAdapter<String> { | |
15 | 15 | |
16 | 16 | Context context; |
17 | 17 | int layoutResourceId; |
18 | 18 | String[] entries = null; |
19 | 19 | |
20 | - public ResourceAdapter(Context context, int layoutResourceId, String[] data) | |
21 | - { | |
20 | + public ResourceAdapter(Context context, int layoutResourceId, String[] data) { | |
22 | 21 | super(context, layoutResourceId, data); |
23 | 22 | this.layoutResourceId = layoutResourceId; |
24 | 23 | this.context = context; |
... | ... | @@ -26,29 +25,24 @@ public class ResourceAdapter extends ArrayAdapter<String> |
26 | 25 | } |
27 | 26 | |
28 | 27 | @Override |
29 | - public View getView(int position, View convertView, ViewGroup parent) | |
30 | - { | |
28 | + public View getView(int position, View convertView, ViewGroup parent) { | |
31 | 29 | TextView row; |
32 | 30 | |
33 | - if (convertView == null) | |
34 | - { | |
31 | + if (convertView == null) { | |
35 | 32 | LayoutInflater inflater = ((Activity)context).getLayoutInflater(); |
36 | 33 | row = (TextView) inflater.inflate(R.layout.rowlayout, parent, false); |
37 | 34 | } |
38 | - else | |
39 | - { | |
35 | + else { | |
40 | 36 | row = (TextView) convertView; |
41 | 37 | } |
42 | - | |
43 | 38 | final String text = entries[position]; |
44 | 39 | row.setText(text); |
45 | - if(text.endsWith(".m3u8")) //Playlists | |
46 | - { | |
47 | - //row.setTypeface(null, Typeface.BOLD); | |
40 | + //Si es un m3u8, posem el text en verd | |
41 | + if(text.endsWith(".m3u8")) { | |
48 | 42 | row.setTextColor(Color.parseColor("#5FB404")); |
49 | 43 | } |
50 | - else //Normal entries | |
51 | - { | |
44 | + //Si no, posem el text en blau | |
45 | + else{ | |
52 | 46 | row.setTypeface(null,Typeface.NORMAL); |
53 | 47 | row.setTextColor(((Activity)context).getResources().getColor(R.color.BlueAndroid)); |
54 | 48 | } | ... | ... |
src/com/upc/pbe/upcnews/Segment.java
... | ... | @@ -3,39 +3,33 @@ package com.upc.pbe.upcnews; |
3 | 3 | import java.net.MalformedURLException; |
4 | 4 | import java.net.URL; |
5 | 5 | |
6 | -public class Segment | |
7 | -{ | |
6 | +public class Segment { | |
7 | + | |
8 | 8 | private String name; |
9 | 9 | private float duration; |
10 | 10 | private URL url; |
11 | 11 | |
12 | - public Segment(float dur) | |
13 | - { | |
12 | + public Segment(float dur) { | |
14 | 13 | name = ""; |
15 | 14 | duration = dur; |
16 | 15 | } |
17 | 16 | |
18 | - public void setName(String nam) | |
19 | - { | |
17 | + public void setName(String nam) { | |
20 | 18 | name = nam; |
21 | 19 | } |
22 | 20 | |
23 | - public String getName() | |
24 | - { | |
21 | + public String getName() { | |
25 | 22 | return name; |
26 | 23 | } |
27 | 24 | |
28 | - public float getDuration() | |
29 | - { | |
25 | + public float getDuration() { | |
30 | 26 | return duration; |
31 | 27 | } |
32 | - public void setURL(String url) throws MalformedURLException | |
33 | - { | |
28 | + public void setURL(String url) throws MalformedURLException { | |
34 | 29 | this.url = new URL(url); |
35 | 30 | } |
36 | 31 | |
37 | - public String getURL() | |
38 | - { | |
32 | + public String getURL() { | |
39 | 33 | return url.toString(); |
40 | 34 | } |
41 | 35 | } | ... | ... |
src/com/upc/pbe/upcnews/Video.java
... | ... | @@ -2,53 +2,43 @@ package com.upc.pbe.upcnews; |
2 | 2 | |
3 | 3 | import java.util.ArrayList; |
4 | 4 | |
5 | -public class Video | |
6 | -{ | |
5 | +public class Video { | |
7 | 6 | |
8 | - private double quality; | |
7 | + private double quality; //Indica la qualitat | |
9 | 8 | private int sequenceFirst; |
10 | 9 | private int maxDuration; |
11 | 10 | private ArrayList<Segment> segments; //Lista de SEGMENTOS |
12 | 11 | |
13 | - public Video(double q) | |
14 | - { | |
12 | + public Video(double q){ | |
15 | 13 | quality = q; |
16 | 14 | segments = new ArrayList<Segment>(); |
17 | 15 | } |
18 | 16 | |
19 | - public void setSequence(int seq) | |
20 | - { | |
17 | + public void setSequence(int seq){ | |
21 | 18 | sequenceFirst = seq; |
22 | 19 | } |
23 | 20 | |
24 | - public int getSequence() | |
25 | - { | |
21 | + public int getSequence(){ | |
26 | 22 | return sequenceFirst; |
27 | 23 | } |
28 | 24 | |
29 | - public void setMaxDuration(int dur) | |
30 | - { | |
25 | + public void setMaxDuration(int dur){ | |
31 | 26 | maxDuration = dur; |
32 | 27 | } |
33 | 28 | |
34 | - public int getMaxDuration() | |
35 | - { | |
29 | + public int getMaxDuration(){ | |
36 | 30 | return maxDuration; |
37 | 31 | } |
38 | 32 | |
39 | - public double getQuality() | |
40 | - { | |
33 | + public double getQuality(){ | |
41 | 34 | return quality; |
42 | 35 | } |
43 | 36 | |
44 | - public void setQuality(double q) | |
45 | - { | |
37 | + public void setQuality(double q){ | |
46 | 38 | quality = q; |
47 | 39 | } |
48 | 40 | |
49 | - public ArrayList<Segment> getSegments() | |
50 | - { | |
41 | + public ArrayList<Segment> getSegments(){ | |
51 | 42 | return segments; |
52 | 43 | } |
53 | -} | |
54 | - | |
44 | +} | |
55 | 45 | \ No newline at end of file | ... | ... |
src/com/upc/pbe/upcnews/WarningException.java