M3UContentHandler.java
上传用户:liming6160
上传日期:2022-06-07
资源大小:785k
文件大小:6k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  *    Copyright (C) 2001 - 2007 Mobicom-Kavkaz, Inc
  3.  *    MFRadio - stream radio client for Java 2 Micro Edition
  4.  *    
  5.  *    Visit the project page at: http://mfradio.sourceforge.net
  6.  *
  7.  *    This program is free software; you can redistribute it and/or modify
  8.  *    it under the terms of the GNU General Public License as published by
  9.  *    the Free Software Foundation; either version 2 of the License, or
  10.  *    (at your option) any later version.
  11.  *
  12.  *    This program is distributed in the hope that it will be useful,
  13.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *    GNU General Public License for more details.
  16.  *
  17.  *    You should have received a copy of the GNU General Public License
  18.  *    along with this program; if not, write to the Free Software
  19.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *
  21.  *    Java (TM) and all Java (TM)-based marks are a trademark or 
  22.  *    registered trademark of Sun Microsystems, Inc, in the United States 
  23.  *    and other countries.
  24.  */
  25. package ru.mobicomk.mfradio.util;
  26. import java.io.IOException;
  27. import java.io.InputStream;
  28. import javax.microedition.io.Connector;
  29. import javax.microedition.io.HttpConnection;
  30. import ru.mobicomk.mfradio.Constants;
  31. import ru.mobicomk.mfradio.controller.UIController;
  32. import ru.mobicomk.mfradio.iface.ContentHandler;
  33. /**
  34.  * Content handler for M3U-files.
  35.  * <p>Handler gets content of given resource through HTTP-request, then make
  36.  * String from this content and interpret it as URL of audio stream and store
  37.  * link in Player's playlist.</p>
  38.  *
  39.  * @author  Roman Bondarenko
  40.  */
  41. public class M3UContentHandler
  42.     implements ContentHandler, Runnable {
  43.     
  44.     /**
  45.      * Suffix of M3U file.
  46.      */
  47.     public static final String FILE_NAME_SUFFIX = ".m3u";
  48.     
  49.     private UIController controller_;
  50.     private String url_ = "";
  51.     private String name_ = "";
  52.     
  53.     /**
  54.      * Creates a new instance of handler.
  55.      * @param controller Application controller object.
  56.      */
  57.     public M3UContentHandler(UIController controller) {
  58.         controller_ = controller;
  59.     }
  60.     
  61.     // ContentHandler implementation ///////////////////////////////////////////
  62.     
  63.     /**
  64.      * Implements method {@link ru.mobicomk.mfradio.iface.ContentHandler#close}
  65.      * <p>NOTE: Do nothing in current class.</p>
  66.      * @see ru.mobicomk.mfradio.iface.ContentHandler
  67.      * @see ru.mobicomk.mfradio.iface.ContentHandler#close
  68.      */
  69.     public void close() {
  70.     }
  71.     
  72.     /**
  73.      * Implements method {@link ru.mobicomk.mfradio.iface.ContentHandler#canHandle}
  74.      * @param url URL to check.
  75.      * @return <b>true</b> if URL is supported, <b>false</b> otherwise.
  76.      * <p>NOTE: current implementation supports URL, which ends with 
  77.      * "<i>.m3u</i>" (case insensitive).</p>
  78.      * @see ru.mobicomk.mfradio.iface.ContentHandler
  79.      * @see ru.mobicomk.mfradio.iface.ContentHandler#canHandle
  80.      */
  81.     public boolean canHandle(String url) {
  82.         return url.toLowerCase().endsWith(FILE_NAME_SUFFIX);
  83.     }
  84.     
  85.     /**
  86.      * Implements method {@link ru.mobicomk.mfradio.iface.ContentHandler#handle}
  87.      * <p>For detail see {@link M3UContentHandler}.
  88.      *
  89.      * @param name Text of link to handle.
  90.      * @param url URL of link to handle.
  91.      * @see M3UContentHandler
  92.      * @see ru.mobicomk.mfradio.iface.ContentHandler
  93.      * @see ru.mobicomk.mfradio.iface.ContentHandler#handle
  94.      */
  95.     public void handle(String name, String url) {
  96.         name_ = name;
  97.         url_ = url;
  98.         new Thread(this).start();
  99.     }
  100.     
  101.     // Runnable implementation ///////////////////////////////////////////////// 
  102.     
  103.     /** 
  104.      * Implements method {@link java.lang.Runnable#run}
  105.      * <p>{@link #handle} starts this thread.</p>
  106.      *
  107.      * @see #handle
  108.      * @see java.lang.Runnable
  109.      * @see java.lang.Runnable#run
  110.      */
  111.     public void run() {
  112. Locale locale = controller_.getLocale();
  113.         if (url_ == null || "".equals(url_)) {
  114.             return;
  115.         }
  116.         
  117.         String audioURL;
  118.         try {
  119.             audioURL = getFile(url_);
  120.             if (isValidURL(audioURL)){
  121.                 controller_.addStation(new StationInfo(audioURL, name_));
  122.                 controller_.showInfo(name_ + locale.getString(Constants.STR_Saved_in_playlist), null);
  123.                 name_ = "";
  124.                 url_ = "";
  125.             } else {
  126.                 controller_.showError(locale.getString(Constants.STR_Invalid_URL), null);
  127.             }
  128.         } catch (IOException ex) {
  129.             controller_.showError(locale.getString(Constants.STR_Error_get_file) + ex.toString(), null);
  130.         }
  131.     }
  132.     
  133.     // Privates ////////////////////////////////////////////////////////////////
  134.     
  135.     private boolean isValidURL(String url) {
  136.         return (url != null
  137.             && !"".equals(url)
  138.             && url.toLowerCase().startsWith("http://")
  139.             && (-1 == url.indexOf("n"))
  140.             && (255 > url.length())
  141.             );
  142.     }
  143.     
  144.     private String getFile(String url) throws IOException {
  145.         HttpConnection conn = null;
  146.         InputStream is = null;
  147.         StringBuffer sb = new StringBuffer();
  148.         try {
  149.             conn = (HttpConnection)Connector.open(url);
  150.             conn.setRequestMethod(HttpConnection.GET);
  151.             conn.setRequestProperty("User-Agent","Profile/MIDP-2.0 Confirguration/CLDC-1.1");
  152.             //conn.setRequestProperty("Content-Language", "en-CA");
  153.             is = conn.openDataInputStream();
  154.             int ch;
  155.             while ((ch = is.read()) != -1) {
  156.                 sb.append((char) ch);
  157.             }
  158.         } finally {
  159.             if(is!= null) {
  160.                 is.close();
  161.                 is = null;
  162.             }
  163.             if(conn != null) {
  164.                 conn.close();
  165.                 conn = null;
  166.             }
  167.         }
  168.         return sb.toString().trim();
  169.     }
  170. }