package dk.dr.radio.skrald; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; import dk.dr.radio.diverse.Log; import dk.dr.radio.net.Diverse; /** * Created by j on 06-06-14. */ public class HttpLiveStreamFiltrering_UBRUGT { public static final HttpLiveStreamFiltrering_UBRUGT instans = new HttpLiveStreamFiltrering_UBRUGT(); private String rensetMasterM3U8; private ServerSocket ss; private boolean fjernetNogen; private boolean fjernetAlle; public void setMasterM3U8Url(String lydUrl) throws IOException { String masterM3U3 = Diverse.læsStreng(new URL(lydUrl).openStream()); String[] lin = masterM3U3.split("[\r\n]"); fjernetNogen = false; fjernetAlle = true; for (int n = 1; n < lin.length; n++) { //Log.d(" "+n+" " + lin[n]); if (lin[n].startsWith("http")) try { URL u = new URL(lin[n]); InputStream is = u.openStream(); is.read(); is.close(); // URL er OK, fortsæt fjernetAlle = false; } catch (Exception e) { Log.e("Fjerner DØD URL: " + lin[n], e); // Død URL - fjern den fra listen lin[n] = null; // Fjern også foregående lin[n - 1] = null; fjernetNogen = true; } Log.d(" " + n + " " + lin[n]); } if (fjernetAlle) throw new IOException("Alle servere var døde"); if (!fjernetNogen) { // Ingen grund til at stykke den sammen igen rensetMasterM3U8 = masterM3U3; } else { // Styk ny m3u8-fil sammen med servere der var oppe StringBuilder sb = new StringBuilder(masterM3U3.length()); for (String l : lin) if (l != null) sb.append(l).append("\n"); rensetMasterM3U8 = sb.toString(); } } public String getRensetMasterM3U8Url() throws IOException { // Det følgende opretter en 'mini-webserver' if (ss == null) { ss = new ServerSocket(0); startTråd(); } return "http://localhost:" + ss.getLocalPort() + "/master.m3u8"; } private void startTråd() throws IOException { new Thread() { @Override public void run() { while (true) try { Log.d("Venter på socket " + ss); //startSignal.countDown(); // og.... NU må MediaPlayer godt spørge på URLen Socket s = ss.accept(); Log.d("VI FIK EN socket " + s); //int n = s.getInputStream().read(new byte[100]); //Log.d("Læste " + n + " byte. Sender " + bos); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String l = br.readLine(); while (l != null && l.length() > 0) { Log.d("Socket: " + l); l = br.readLine(); } //Log.d("Sender " + rensetMasterM3U8.replace('\n', '/')); Log.d("Sender rensetMasterM3U8"); byte[] ba = rensetMasterM3U8.getBytes(); OutputStream os = s.getOutputStream(); os.write(("HTTP/1.1 200 OK\n" + "Content-Type: application/vnd.apple.mpegurl\n" + "Content-Length: " + ba.length + "\n" + "Connection: close\n" + "Cache-Control: max-age=0, no-cache, no-store\n" + "Pragma: no-cache\n" + "\n").getBytes()); os.write(ba); } catch (Exception e) { Log.rapporterFejl(e); } // Skal aldrig lukkes: // ss.close(); } }.start(); } public String getRensetMasterM3U8() { return rensetMasterM3U8; } public boolean fjernedeNogen() { return fjernetNogen; } } //App.kortToast("Lav venligt en rapport hvis det ikke virker, tak!!!"); /* Følgende dur ikke, URLen skal starte med http:// og slutte med .m3u8 se http://androidxref.com/4.0.4/xref/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp#583 //File f = File.createTempFile("afspil_","master.m3u8",App.instans.getFilesDir()); File f = new File(Environment.getExternalStorageDirectory(), "master.m3u8"); Log.d(f + " <<-- "+lydUrl); InputStream is = new URL((lydUrl)).openStream(); FilCache.kopierOgLuk(is, new FileOutputStream(f)); FileInputStream fis = new FileInputStream(f); mediaPlayer.setDataSource(fis.getFD()); fis.close(); f.delete(); */ /* HTTP/1.1 200 OK Server: AkamaiGHost Mime-Version: 1.0 Content-Type: application/vnd.apple.mpegurl Content-Length: 596 Expires: Wed, 21 May 2014 14:58:46 GMT Cache-Control: max-age=0, no-cache, no-store Pragma: no-cache Date: Wed, 21 May 2014 14:58:46 GMT Connection: keep-alive Set-Cookie: _alid_=WzFUnunxc/iaxEroCqOV3A==; path=/i/p1_9@143503/; domain=drradio1-lh.akamaihd.net #EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000,CODECS="mp4a.40.2" http://drradio1-lh.akamaihd.net/i/p1_9@143503/index_64_a-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=64000,CODECS="mp4a.40.2" http://drradio1-lh.akamaihd.net/i/p1_9@143503/index_64_a-b.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=192000,CODECS="mp4a.40.2" http://drradio1-lh.akamaihd.net/i/p1_9@143503/index_192_a-p.m3u8?sd=10&rebase=on #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=192000,CODECS="mp4a.40.2" http://drradio1-lh.akamaihd.net/i/p1_9@143503/index_192_a-b.m3u8?sd=10&rebase=on */ /* //if (!lydUrl.endsWith("master.m3u8") || App.PRODUKTION || tæller++%2==0) { if (!lydUrl.endsWith("master.m3u8") || !App.prefs.getBoolean("Filtrér akamai", true)) { Log.d("Bruger oprindelig lyd-URL: "+lydUrl); mediaPlayer.setDataSource(lydUrl); return; } Log.d("Gemmer "+lydUrl+" lokalt og spiller den"); HttpLiveStreamFiltrering filter = HttpLiveStreamFiltrering.instans; filter.setMasterM3U8Url(lydUrl); String rensetMasterM3U8 = filter.getRensetMasterM3U8(); if (App.PRODUKTION && !filter.fjernedeNogen()) { mediaPlayer.setDataSource(lydUrl); // Alle servere er opppe, ingen grund til ikke at bruge den oprindelige URL return; } if (filter.fjernedeNogen()) { Log.rapporterFejl(new Exception("Nogle servere fjernet, hurra, det virker!"), lydUrl); } String rensetMasterM3U8Url = filter.getRensetMasterM3U8Url(); Log.d("mediaPlayer.setDataSource("+rensetMasterM3U8Url); mediaPlayer.setDataSource(rensetMasterM3U8Url); */