/* This file is part of Subsonic. Subsonic is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Subsonic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Subsonic. If not, see <http://www.gnu.org/licenses/>. Copyright 2016 (C) Scott Jackson */ package github.daneren2005.dsub.fragments; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import github.daneren2005.dsub.R; import github.daneren2005.dsub.adapter.InternetRadioStationAdapter; import github.daneren2005.dsub.adapter.SectionAdapter; import github.daneren2005.dsub.domain.InternetRadioStation; import github.daneren2005.dsub.service.DownloadService; import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.TabBackgroundTask; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.view.UpdateView; public class SelectInternetRadioStationFragment extends SelectRecyclerFragment<InternetRadioStation> { private static final String TAG = SelectInternetRadioStationFragment.class.getSimpleName(); @Override public int getOptionsMenu() { return R.menu.abstract_top_menu; } @Override public SectionAdapter<InternetRadioStation> getAdapter(List<InternetRadioStation> objs) { return new InternetRadioStationAdapter(context, objs, this); } @Override public List<InternetRadioStation> getObjects(MusicService musicService, boolean refresh, ProgressListener listener) throws Exception { return musicService.getInternetRadioStations(refresh, context, listener); } @Override public int getTitleResource() { return R.string.button_bar_internet_radio; } @Override public void onItemClicked(UpdateView<InternetRadioStation> updateView, final InternetRadioStation item) { new TabBackgroundTask<Void>(this) { @Override protected Void doInBackground() throws Throwable { DownloadService downloadService = getDownloadService(); if(downloadService == null) { return null; } getStreamFromPlaylist(item); downloadService.download(item); return null; } @Override protected void done(Void result) { context.openNowPlaying(); } }.execute(); } @Override public void onCreateContextMenu(Menu menu, MenuInflater menuInflater, UpdateView<InternetRadioStation> updateView, InternetRadioStation item) { menuInflater.inflate(R.menu.select_internet_radio_context, menu); } @Override public boolean onContextItemSelected(MenuItem menuItem, UpdateView<InternetRadioStation> updateView, InternetRadioStation item) { switch (menuItem.getItemId()) { case R.id.internet_radio_info: displayInternetRadioStationInfo(item); break; } return false; } private void getStreamFromPlaylist(InternetRadioStation internetRadioStation) { if(internetRadioStation.getStreamUrl() != null && (internetRadioStation.getStreamUrl().indexOf(".m3u") != -1 || internetRadioStation.getStreamUrl().indexOf(".pls") != -1)) { try { URL url = new URL(internetRadioStation.getStreamUrl()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); try { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while((line = in.readLine()) != null) { // Not blank line or comment if(line.length() > 0 && line.indexOf('#') != 0) { if(internetRadioStation.getStreamUrl().indexOf(".m3u") != -1) { internetRadioStation.setStreamUrl(line); break; } else { if(line.indexOf("File1=") == 0) { internetRadioStation.setStreamUrl(line.replace("File1=", "")); } else if(line.indexOf("Title1=") == 0) { internetRadioStation.setTitle(line.replace("Title1=", "")); } } } } } finally { connection.disconnect(); } } catch (Exception e) { Log.e(TAG, "Failed to get stream data from playlist", e); } } } private void displayInternetRadioStationInfo(final InternetRadioStation station) { List<Integer> headers = new ArrayList<>(); List<String> details = new ArrayList<>(); headers.add(R.string.details_title); details.add(station.getTitle()); headers.add(R.string.details_home_page); details.add(station.getHomePageUrl()); headers.add(R.string.details_stream_url); details.add(station.getStreamUrl()); Util.showDetailsDialog(context, R.string.details_title_internet_radio_station, headers, details); } }