public void setSongDownloading(ArchiveSongObj song, long id) {
   Logging.Log(LOG_TAG, "Start Downloading " + song.getFileName() + ": " + id);
   db.execSQL(
       "UPDATE songTbl "
           + "SET download_id = '"
           + id
           + "' WHERE fileName = '"
           + song.getFileName()
           + "'");
 }
 public boolean getSongIsDownloading(ArchiveSongObj song) {
   Logging.Log(LOG_TAG, "Get downloading status for " + song.getFileName());
   Cursor cur =
       db.rawQuery(
           "Select count(1) as count from songTbl "
               + "where fileName = '"
               + song.getFileName()
               + "' and download_id is not null and isDownloaded = 'false'",
           null);
   cur.moveToFirst();
   int count = cur.getInt(cur.getColumnIndex("count"));
   Logging.Log(LOG_TAG, "Result: " + count);
   cur.close();
   return count > 0;
 }
 public void addSongToNowPlaying(ArchiveSongObj s) {
   db.execSQL(
       "INSERT INTO playlistSongsTbl(playlist_id,song_id,trackNum) "
           + "Select 0,"
           + s.getID()
           + ",MAX(trackNum) "
           + "from playlistSongsTbl where playlist_id = 0");
 }
  public void setNowPlayingSongs(ArrayList<ArchiveSongObj> songs) {
    clearNowPlayingSongs();
    if (songs.size() > 0) {
      StringBuilder sql = new StringBuilder();
      sql.append("INSERT INTO playlistSongsTbl(playlist_id,song_id,trackNum)");

      int index = 0;
      for (ArchiveSongObj s : songs) {
        sql.append("SELECT 0," + s.getID() + "," + index + " ");
        if (index < songs.size() - 1) {
          sql.append("UNION ALL ");
          index++;
        }
      }
      db.execSQL(sql.toString());
    }
  }
 public void setSongDeleted(ArchiveSongObj song) {
   db.execSQL(
       "UPDATE songTbl "
           + "SET isDownloaded = 'false', download_id = null "
           + "WHERE fileName = '"
           + song.getFileName()
           + "'");
 }
 public int insertSong(ArchiveSongObj song) {
   db.execSQL(
       "INSERT INTO songTbl(fileName,songTitle,show_id,isDownloaded,folderName) "
           + "SELECT '"
           + song.getFileName()
           + "','"
           + song.toString().replaceAll("'", "''")
           + "',show._id,'false','' "
           + "FROM showTbl show "
           + "WHERE show.showIdent = '"
           + song.getShowIdentifier()
           + "' "
           + "AND NOT EXISTS (SELECT 1 FROM songTbl song WHERE song.fileName = '"
           + song.getFileName()
           + "')");
   Cursor cur =
       db.rawQuery(
           "Select _id as song_id from songTbl " + "where fileName = '" + song.getFileName() + "'",
           null);
   cur.moveToFirst();
   int id = cur.getInt(cur.getColumnIndex(PLAYLISTSONG_SONG_KEY));
   cur.close();
   if (song.hasFolder()) {
     db.execSQL("Update songTbl set folderName = '" + song.getFolder() + "' where _id = " + id);
   }
   return id;
 }
 public void insertKnownSongIntoPlaylist(int playlist_id, ArchiveSongObj song, int position) {
   if (playlist_id <= 0) {
     // Playlist not saved yet
     return;
   }
   db.execSQL(
       "INSERT INTO playlistSongsTbl(playlist_id,song_id,trackNum) "
           + "SELECT "
           + playlist_id
           + ",song._id,"
           + position
           + " FROM songTbl song "
           + "WHERE song.fileName = '"
           + song.getFileName()
           + "'");
 }
  public static void getSongs(
      ArchiveShowObj show,
      ArrayList<ArchiveSongObj> songs,
      StaticDataStore db,
      boolean processSongs) {

    HtmlCleaner pageParser = new HtmlCleaner();
    CleanerProperties props = pageParser.getProperties();
    props.setAllowHtmlInsideAttributes(true);
    props.setAllowMultiWordAttributes(true);
    props.setRecognizeUnicodeChars(true);
    props.setOmitComments(true);

    ArrayList<String> songLinks = new ArrayList<String>();
    ArrayList<String> songTitles = new ArrayList<String>();
    String showTitle = show.getArtistAndTitle();
    String showIdent = show.getIdentifier();

    // XPATH says "Select out of all 'table' elements with attribute 'class'
    // equal to 'fileFormats' which contain element 'tr'..."
    // String songXPath = "//table[@class='fileFormats']//tr";

    // XPATH says "Select out of all 'script' elements with attribute 'type'
    // equal to 'text/javascript'..."
    String m3uXPath = "//script";
    String titlePath = "//head//title";

    if (db.getShowExists(show) && processSongs) {

      songs.addAll(db.getSongsFromShow(show.getIdentifier()));
      show.setFullTitle(db.getShow(show.getIdentifier()).getArtistAndTitle());
      return;
    }

    try {
      HttpParams params = new BasicHttpParams();
      int timeout = (int) (15 * DateUtils.SECOND_IN_MILLIS);
      HttpConnectionParams.setConnectionTimeout(params, timeout);
      HttpConnectionParams.setSoTimeout(params, timeout);
      HttpClient client = new DefaultHttpClient(params);

      HttpGet page = new HttpGet(show.getShowURL().toString());
      HttpResponse pageResponse = client.execute(page);
      StatusLine pageStatus = pageResponse.getStatusLine();
      if (pageStatus.getStatusCode() == HttpStatus.SC_OK) {
        ResponseHandler<String> pageResponseHandler = new BasicResponseHandler();
        TagNode node = pageParser.clean(pageResponseHandler.handleResponse(pageResponse));

        String queryString = show.getLinkPrefix();

        if (db.getPref("downloadFormat").equalsIgnoreCase("LBR")) {
          if (show.hasLBR()) {
            queryString += "_64kb.m3u";
          } else if (show.hasVBR()) {
            queryString += "_vbr.m3u";
          }
        } else {
          if (show.hasVBR()) {
            queryString += "_vbr.m3u";
          } else if (show.hasLBR()) {
            queryString += "_64kb.m3u";
          }
        }

        HttpGet M3Urequest = new HttpGet(queryString);

        HttpResponse M3Uresponse = client.execute(M3Urequest);
        StatusLine M3Ustatus = M3Uresponse.getStatusLine();
        if (M3Ustatus.getStatusCode() == HttpStatus.SC_OK) {
          ResponseHandler<String> M3UresponseHandler = new BasicResponseHandler();
          String m3uString = M3UresponseHandler.handleResponse(M3Uresponse);

          client.getConnectionManager().shutdown();

          // Now split the .M3U file based on newlines. This will give
          // us the download links, which we store..

          String m3uLinks[] = m3uString.split("\n");
          for (String link : m3uLinks) {
            songLinks.add(link);
          }

          // Now use an XPATH evaluation to find all of the javascript scripts on the page.
          // If one of them can be split by "IAD.mrss = ", it should have the track names
          // in it. The second half of the split is valid javascript and can be interpreted,
          // therefore, as JSON. Pull the song titles out of that, and together with the
          // download links make ArchiveSongObjs and add them to the list of songs.
          Object[] titleNodes = node.evaluateXPath(m3uXPath);
          for (Object titleNode : titleNodes) {
            //
            List x = ((TagNode) titleNode).getChildren();
            String songTitle = "";
            for (Object y : x) {
              if (y instanceof ContentNode) {
                songTitle = ((ContentNode) y).toString();
                songTitle = songTitle.trim();
                if (songTitle.startsWith("Play(")) {
                  String[] titles = songTitle.split("\\{\"title\"");
                  for (int i = 1; i < titles.length; i++) {
                    try {
                      String title =
                          titles[i].substring(
                              nthIndexOf(titles[i], '"', 1), nthIndexOf(titles[i], '"', 2));
                      songTitles.add(title.substring(title.indexOf('.') + 2));
                    } catch (StringIndexOutOfBoundsException e) {
                    }
                  }
                }
              }
            }
          }
          if (show.getShowTitle().length() < 2) {

            String s =
                ((TagNode) node.evaluateXPath(titlePath)[0])
                    .getChildren()
                    .toString()
                    .replaceFirst(Pattern.quote("["), "");
            show.setFullTitle(s.substring(0, s.lastIndexOf(": Free") - 1));
            showTitle = show.getArtistAndTitle();
            db.updateShow(show);
          }

          if (processSongs) {
            if (songLinks.size() == 0) {

            } else {
              // Do things for successful show parse
              db.insertShow(show);
            }
            // If we have the same amount of song titles as song links,
            // we should be all set.
            if (songTitles.size() == songLinks.size()) {
              for (int i = 0; i < songTitles.size(); i++) {
                String songLink = songLinks.get(i);
                String songTitle = songTitles.get(i);
                // If the show has a "selectedSong"
                // meaning that it was opened by
                // the user clicking on a song link, do
                // a comparison to see
                // if the song being added is the
                // selected song. If it is, set
                // selectedPos to the right index so
                // that the song can be played
                // once the ListView is filled.  This is
                // inefficient, though it probably doesn't make a difference,
                // but we might consider making this a bit more efficient/elegant in the future.
                // FIXME.
                //						if (show.hasSelectedSong()) {
                //							if (songLink.equals(show.getSelectedSong())) {
                //								selectedPos = i;
                //							}
                //						} else {
                //							selectedPos = -1;
                //						}
                ArchiveSongObj song = new ArchiveSongObj(songTitle, songLink, showTitle, showIdent);
                song.setID(db.insertSong(song));
                songs.add(song);
              }
              db.setShowExists(show);
              db.insertRecentShow(show);
            } else {

            }
          }

        } else {
          client.getConnectionManager().shutdown();
        }
      } else {
        client.getConnectionManager().shutdown();
      }

    } catch (XPatherException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

    // TODO Auto-generated method stub

  }