Project: danbooru-gallery-android
package tw.idv.palatis.danboorugallery.siteapi;
 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.io.StringWriter; 
import java.io.UnsupportedEncodingException; 
import java.io.Writer; 
import java.net.URL; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.List; 
import java.util.TreeSet; 
 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
 
import tw.idv.palatis.danboorugallery.defines.D; 
import tw.idv.palatis.danboorugallery.model.Post; 
import tw.idv.palatis.danboorugallery.model.Tag; 
import tw.idv.palatis.danboorugallery.siteapi.utils.DanbooruJSONPostParser; 
import tw.idv.palatis.danboorugallery.siteapi.utils.DanbooruXMLPostParser; 
 
public abstract class DanbooruStyleAPI 
 extends SiteAPI 
 private static final int _BUFFER_SIZE 8192
 
 
 
 public DanbooruStyleAPI() 
 
  super(); 
 
 
 public DanbooruStyleAPI(String siteUrl) 
 
  super( siteUrl ); 
 
 
 public DanbooruStyleAPI(String siteUrl, int api) throws UnsupportedAPIException 
 
  super( siteUrl, api ); 
 
 
 /**
  * This is a helper function to fetch {@link List< {@link Post} >} from Danbooru's JSON API. 
  * 
  * @param url_format 
  *            the format of URL in {@link String} 
  * @param page 
  *            page index 
  * @param tags 
  *            tags to filter 
  * @param limit 
  *            posts to retrieve per page 
  * @return the posts fetched 
  */
 
 protected List<Post> fetchPostsIndexJSON(String url_format, int page, String tags, int limit) 
 
  try 
  
   URL fetchUrl = new URL( String.format( url_format, page, tags, limit ) ); 
   D.Log.v( "DanbooruStyleAPI::fetchPostsIndexJSON(): fetching %s", fetchUrl ); 
 
   return (new DanbooruJSONPostParser()).fetchPosts(fetchUrl); 
  
  catch (IOException e) 
  
   D.Log.wtf( e ); 
  
  return null
 
 
 /**
  * This is a helper function to fetch {@link List< {@link Post} >} from Danbooru's API. 
  * 
  * @param url_format 
  *            the format of URL in {@link String} 
  * @param page 
  *            page index 
  * @param tags 
  *            tags to filter 
  * @param limit 
  *            posts to retrieve per page 
  * @return the posts fetched 
  */
 
 @Deprecated 
 protected List<Post> fetchPostsIndexXML(String url_format, int page, String tags, int limit) 
 
  try 
  
   URL fetchUrl = new URL( String.format( url_format, page, tags, limit ) ); 
   D.Log.v( "DanbooruStyleAPI::fetchPostsIndexXML(): fetching %s", fetchUrl ); 
 
   return (new DanbooruXMLPostParser()).fetchPosts(fetchUrl); 
  
 
  catch (IOException e) 
  
   D.Log.wtf( e ); 
  
  return null
 
 
 @Deprecated 
 protected List < Tag > fetchTagsIndexJSON(String url_format, int page, String name, int limit) 
 
  TreeSet < Tag > ret = new TreeSet < Tag >( new Tag.CompareById() ); 
  String keywords[] = new HashSet < String >( Arrays.asList( name.split( "\\+" ) ) ).toArray( new String[] { } ); 
 
  char buffer[] = new char[_BUFFER_SIZE]; 
  for (String keyword : keywords) 
  
   // trim leading and trailing whitespace, then replace spaces 
   // with underscores. 
   // because typing underscore with soft-keyboard is a pain in the 
   // ass... 
   keyword = keyword.trim().replace( ' ', '_' ); 
 
   // get data from network... 
   try 
   
    URL fetchUrl = new URL( String.format( url_format, page, keyword, limit ) ); 
    D.Log.v( "DanbooruStyleAPI::fetchTagsIndexJSON(): fetching %s", fetchUrl ); 
 
    Reader input = new BufferedReader( new InputStreamReader( fetchUrl.openStream(), "UTF-8" ) ); 
    Writer output = new StringWriter(); 
 
    int count = 0
    while ((count = input.read( buffer )) > 0
    
     output.write( buffer, 0, count ); 
     if (isCanceled()) 
      return null
    
 
    JSONArray array = new JSONArray( output.toString() ); 
    int length = array.length(); 
    for (int i = 0; i < length; ++i) 
     try 
     
      ret.add( new Tag( array.getJSONObject( i ) ) ); 
      if (isCanceled()) 
       return null
     
     catch (JSONException e) 
     
     
   
   catch (UnsupportedEncodingException e) 
   
    D.Log.wtf( e ); 
   
   catch (IOException e) 
   
    D.Log.wtf( e ); 
   
   catch (JSONException e) 
   
    D.Log.wtf( e ); 
   
  
 
  return Arrays.asList( ret.toArray( new Tag[] { } ) ); 
 
 
 @Deprecated 
 protected List < Tag > fetchTagsIndexXML(String url_format, int page, String name, int limit) 
 
  TreeSet < Tag > ret = new TreeSet < Tag >( new Tag.CompareById() ); 
  String keywords[] = new HashSet < String >( Arrays.asList( name.split( "\\+" ) ) ).toArray( new String[] { } ); 
 
  for (String keyword : keywords) 
  
   // trim leading and trailing whitespace, then replace spaces with underscores. 
   // because typing underscore with soft-keyboard is a pain in the ass... 
   keyword = keyword.trim().replace( ' ', '_' ); 
 
   // get data from network... 
   try 
   
    URL fetchUrl = new URL( String.format( url_format, page, keyword, limit ) ); 
    D.Log.v( "DanbooruStyleAPI::fetchTagsIndexXML(): fetching %s", fetchUrl ); 
 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse( new InputSource( fetchUrl.openStream() ) ); 
    doc.getDocumentElement().normalize(); 
 
    NodeList nodes = doc.getElementsByTagName( "tag" ); 
 
    int length = nodes.getLength(); 
    for (int i = 0; i < length; ++i) 
    
     ret.add( new Tag( (Element) nodes.item( i ) ) ); 
     if (isCanceled()) 
      return null
    
   
   catch (UnsupportedEncodingException e) 
   
    D.Log.wtf( e ); 
   
   catch (IOException e) 
   
    D.Log.wtf( e ); 
   
   catch (SAXException e) 
   
    D.Log.wtf( e ); 
   
   catch (ParserConfigurationException e) 
   
    D.Log.wtf( e ); 
   
  
 
  return Arrays.asList( ret.toArray( new Tag[] { } ) ); 
 
}