Search in sources :

Example 1 with SongResult

use of com.github.mob41.osums.search.SongResult in project osumer by mob41.

the class OsumsOldParser method parseSearch.

@Override
public SongResult[] parseSearch(String category, Document doc) throws WithDumpException {
    List<SongResult> maps = new ArrayList<SongResult>();
    Element beatmapsDiv = doc.select("div.beatmapListing").first();
    Iterator<Element> it = beatmapsDiv.children().iterator();
    while (it.hasNext()) {
        Element el = it.next();
        Element artistEl = el.select("div.maintext span.artist").first();
        if (artistEl == null) {
            continue;
        }
        String artist = artistEl.html();
        if (artist.isEmpty()) {
            continue;
        }
        Element titleEl = el.select("div.maintext a.title").first();
        if (titleEl == null) {
            continue;
        }
        String title = titleEl.html();
        if (title.isEmpty()) {
            continue;
        }
        Element creatorEl = el.select("div.left-aligned div a").first();
        if (creatorEl == null) {
            continue;
        }
        String creator = creatorEl.html();
        if (creator.isEmpty()) {
            continue;
        }
        int id = -1;
        try {
            id = Integer.parseInt(el.attr("id"));
        } catch (NumberFormatException e) {
            continue;
        }
        List<String> tagsList = new ArrayList<String>(30);
        Element tagsEl = el.select("div.right-aligned div.tags").first();
        if (tagsEl == null) {
            continue;
        }
        Iterator<Element> tagsChildIt = tagsEl.children().iterator();
        while (tagsChildIt.hasNext()) {
            Element childIt = tagsChildIt.next();
            tagsList.add(childIt.html());
        }
        // TODO: Implement Hearts and Plays readings
        String[] tags = new String[tagsList.size()];
        for (int j = 0; j < tags.length; j++) {
            tags[j] = tagsList.get(j);
        }
        Element thumbEl = el.select("div.bmlistt").first();
        String styleStr = thumbEl.attr("style");
        // 17
        int startingIndex = styleStr.indexOf("background: url(\"");
        // 4
        int endingIndex = styleStr.indexOf("\")");
        if (startingIndex == -1 || endingIndex == -1) {
            System.out.println(styleStr);
            return null;
        }
        maps.add(new SongResult(id, category, artist, title, creator, tags, -1, -1));
    }
    SongResult[] out = new SongResult[maps.size()];
    for (int i = 0; i < out.length; i++) {
        out[i] = maps.get(i);
    }
    return out;
}
Also used : SongResult(com.github.mob41.osums.search.SongResult) Element(org.jsoup.nodes.Element) ArrayList(java.util.ArrayList)

Example 2 with SongResult

use of com.github.mob41.osums.search.SongResult in project osumer by mob41.

the class OsumsServer method searchSong.

public SearchResult searchSong(String keywords, SearchFilter[] filters, int items, int page) {
    PreparedStatement pst = null;
    try {
        String sql = "SELECT * FROM songs";
        if (keywords != null && !keywords.isEmpty()) {
            sql += " WHERE (id LIKE ?" + " OR artist LIKE ?" + " OR title LIKE ?" + " OR creator LIKE ?" + " OR tags LIKE ?)";
        }
        sql += " LIMIT ? OFFSET ?";
        pst = conn.prepareStatement(sql);
        int offset = 0;
        if (keywords != null && !keywords.isEmpty()) {
            for (int i = 1; i <= 5; i++) {
                pst.setString(i, "%" + keywords + "%");
            }
            offset = 5;
        }
        pst.setInt(offset + 1, items);
        pst.setInt(offset + 2, items * (page - 1));
        List<SongResult> list = new ArrayList<SongResult>();
        ResultSet rows = pst.executeQuery();
        while (rows.next()) {
            String[] tags = rows.getString("tags").split(",");
            list.add(new SongResult(rows.getInt("id"), rows.getString("rank"), rows.getString("artist"), rows.getString("title"), rows.getString("creator"), tags, rows.getInt("favourites"), rows.getInt("plays")));
        }
        SongResult[] out = new SongResult[list.size()];
        for (int i = 0; i < out.length; i++) {
            out[i] = list.get(i);
        }
        pst.close();
        int totalPages = (int) Math.ceil(getTotalSongs() / items);
        return new SearchResult(out, page, totalPages);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
Also used : SongResult(com.github.mob41.osums.search.SongResult) ArrayList(java.util.ArrayList) ResultSet(java.sql.ResultSet) PreparedStatement(java.sql.PreparedStatement) SearchResult(com.github.mob41.osums.search.SearchResult) SQLException(java.sql.SQLException) IOException(java.io.IOException)

Example 3 with SongResult

use of com.github.mob41.osums.search.SongResult in project osumer by mob41.

the class QueryServlet method doGet.

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String itemsStr = req.getParameter("i");
    String pageStr = req.getParameter("p");
    String key = req.getParameter("k");
    resp.setContentType("application/json");
    QueryOutput output = new QueryOutput();
    if (itemsStr == null || pageStr == null) {
        output.result = -1;
        output.msg = "Invalid request";
        resp.setStatus(400);
        end(resp, output);
        return;
    }
    if (key == null) {
        key = "";
    }
    int items = -1;
    int page = -1;
    try {
        items = Integer.parseInt(itemsStr);
        page = Integer.parseInt(pageStr);
    } catch (NumberFormatException e) {
        output.result = -1;
        output.msg = "Invalid request";
        resp.setStatus(400);
        end(resp, output);
        return;
    }
    /*
		int max = (int) Math.ceil(results.length / items);
		
		if (page > max) {
			output.result = -1;
			output.msg = "Invalid request";
			resp.setStatus(400);
			end(resp, output);
			return;
		}
		*/
    SearchResult result = null;
    try {
        result = srv.searchSong(key, null, items, page);
    } catch (Exception e) {
        e.printStackTrace();
        output.result = -2;
        output.msg = "Server Error";
        resp.setStatus(503);
        end(resp, output);
        return;
    }
    SongResult[] results = result.getResult();
    if (results == null) {
        output.result = -3;
        output.msg = "No result";
        end(resp, output);
        return;
    }
    output.currentPage = page;
    output.totalPages = result.getTotalPages();
    output.result = 0;
    output.output = results;
    end(resp, output);
    return;
}
Also used : SongResult(com.github.mob41.osums.search.SongResult) SearchResult(com.github.mob41.osums.search.SearchResult) ServletException(javax.servlet.ServletException) IOException(java.io.IOException)

Example 4 with SongResult

use of com.github.mob41.osums.search.SongResult in project osumer by mob41.

the class OsumsOldParser method searchOnlineMaps.

@Override
public SearchResult searchOnlineMaps(String keywords, SearchFilter[] filters, int page) throws WithDumpException {
    if (keywords == null) {
        keywords = "";
    }
    String url = SEARCH_URL + keywords;
    String rank = null;
    if (filters != null) {
        for (SearchFilter filter : filters) {
            if (filter instanceof RankFilter) {
                rank = ((RankFilter) filter).getRank();
            }
            url = filter.handleUrl(url);
        }
    }
    if (rank == null) {
        rank = RANK_ANY;
    }
    if (rank.equals(RANK_RANKED)) {
        url += "&r=" + RANK_RANKED_INT;
    } else if (rank.equals(RANK_PENDING)) {
        url += "&r=" + RANK_PENDING_INT;
    } else if (rank.equals(RANK_QUALIFIED)) {
        url += "&r=" + RANK_QUALIFIED_INT;
    } else if (rank.equals(RANK_LOVED)) {
        url += "&r=" + RANK_LOVED_INT;
    } else if (rank.equals(RANK_ANY)) {
        url += "&r=" + RANK_ALL_INT;
    } else {
        System.out.println("Unknown beatmap rank: " + rank);
    }
    try {
        String data = getHttpCookiedContent(url + "&page=" + page);
        Document doc = Jsoup.parse(data);
        Element pagination = doc.getElementsByClass("pagination").first();
        String paginationText = pagination.html();
        int totalPages = 1;
        int brIndex = paginationText.indexOf("<br>");
        if (brIndex == -1) {
            throw new WithDumpException(paginationText, "Get br index in pagination", "Validate brIndex != -1", "Extract pagination text before br", "Could not find at least one br element!", false);
        }
        String pageText = paginationText.substring(0, brIndex);
        // 11
        int displayingIndex = pageText.indexOf("Displaying ");
        // 4
        int toIndex = pageText.indexOf(" to ");
        // 4
        int ofIndex = pageText.indexOf(" of ");
        // 9
        int resultIndex = pageText.indexOf(" results.");
        if (displayingIndex == -1 || toIndex == -1 || ofIndex == -1 || resultIndex == -1) {
            throw new WithDumpException(paginationText, "Get all text indexes", "Validate all text indexes != -1", "Extract result pages data", "The pagination is invalid or unregonized.", false);
        }
        // int nowPage = -1;
        int currPageMaps = -1;
        int totalResultMaps = -1;
        try {
            // nowPage = Integer.parseInt(pageText.substring(displayingIndex + 11, toIndex));
            String currPageMapsStr = pageText.substring(toIndex + 4, ofIndex);
            if (!currPageMapsStr.equals("many")) {
                currPageMaps = Integer.parseInt(currPageMapsStr);
            }
            String totalResultMapsStr = pageText.substring(ofIndex + 4, resultIndex);
            if (!totalResultMapsStr.equals("many")) {
                totalResultMaps = Integer.parseInt(totalResultMapsStr);
            }
        } catch (NumberFormatException e) {
            throw new WithDumpException(pageText, "Validate all text indexes != -1", "Extract result pages data", "Get page data", "Pagination number-text data cannot be decoded as number.", false, e);
        }
        if (totalResultMaps != -1 && currPageMaps != -1 && currPageMaps != totalResultMaps) {
            currPageMaps -= 40 * (page - 1);
            // System.out.println("Using method 1 to identify Total Pages");
            // System.out.println("TRM/CPM: " + totalResultMaps + " / " + currPageMaps);
            float calc = ((float) totalResultMaps / currPageMaps);
            totalPages = (int) calc;
            if (calc != totalPages) {
                // System.out.println("Calc != totalPages: " + calc + " != " + totalPages);
                totalPages++;
            }
        // System.out.println("Now total pages: " + totalPages);
        } else {
            // System.out.println("Using method 2 to identify Total Pages");
            Elements pageLinkEls = pagination.children();
            int size = pageLinkEls.size();
            if (size < 2) {
                totalPages = 1;
            /*
                    throw new WithDumpException(pageText, "Get page links size",
                            "Validate children size >= 2", "Get last page link element",
                            "Invalid page! The page has less than 2 page links!", false);
                    */
            } else {
                Element lastPageLinkEl = pageLinkEls.get(size - 2);
                if (lastPageLinkEl != null) {
                    int lastPageNum = -1;
                    try {
                        lastPageNum = Integer.parseInt(lastPageLinkEl.html());
                    } catch (NumberFormatException e) {
                        throw new WithDumpException(pageText, "Get last page link element", "Parse last page number String to number", "Set as total page", "Pagination last page number-text data cannot be decoded as number.", false, e);
                    }
                    if (lastPageNum > totalPages) {
                        // System.out.println("Last page num is bigger than total pages: " + lastPageNum + " > " + totalPages);
                        totalPages = lastPageNum;
                    } else {
                    // System.out.println("Last page num is sammler than total pages: " + lastPageNum + " < " + totalPages);
                    }
                }
            }
        }
        SongResult[] results = parseSearch(rank, doc);
        return new SearchResult(results, page, totalPages);
    } catch (Exception e) {
        throw new WithDumpException(url, "(Try&catch try) getting search result links", "Throw debuggable exception on catch", "(End of function)", "Error occurred when getting search result links", false, e);
    }
}
Also used : WithDumpException(com.github.mob41.osumer.debug.WithDumpException) SongResult(com.github.mob41.osums.search.SongResult) Element(org.jsoup.nodes.Element) SearchFilter(com.github.mob41.osums.search.SearchFilter) SearchResult(com.github.mob41.osums.search.SearchResult) Document(org.jsoup.nodes.Document) Elements(org.jsoup.select.Elements) IOException(java.io.IOException) WithDumpException(com.github.mob41.osumer.debug.WithDumpException) RankFilter(com.github.mob41.osums.search.RankFilter)

Example 5 with SongResult

use of com.github.mob41.osums.search.SongResult in project osumer by mob41.

the class OsumsServer method downloadBasicSongResults.

public void downloadBasicSongResults() throws Exception {
    logger.info("[Stage 1/2] Downloading all results from all rank status...");
    String[] ranks = { OsumsNewParser.RANK_LOVED, OsumsNewParser.RANK_PENDING, OsumsNewParser.RANK_QUALIFIED, OsumsNewParser.RANK_RANKED };
    SearchResult result;
    SearchFilter[] filters;
    String rank;
    List<SongResult> list = new ArrayList<SongResult>();
    for (int i = 0; i < ranks.length; i++) {
        rank = ranks[i];
        logger.info("[Stage 1/2] Requesting results from \"" + rank + "...");
        filters = new SearchFilter[] { new StringRankFilter(rank) };
        int page = 1;
        do {
            logger.info("[Stage 1/2] [" + rank + "] Requesting results from page " + page + "...");
            result = osums.searchOnlineMaps(null, filters, page);
            if (result == null) {
                logger.error("[Stage 1/2] [" + rank + "] No results returned at " + page + "!");
                continue;
            }
            list.addAll(Arrays.asList(result.getResult()));
            logger.info("[Stage 1/2] [" + rank + "] Completed fetching results from page " + page + ". (" + page + "/" + result.getTotalPages() + ") (" + (int) (Math.floor((page / (float) result.getTotalPages() + i) / (float) ranks.length * 100.0)) + "%)");
            if (result.getCurrentPage() < result.getTotalPages()) {
                page++;
            }
        } while (result != null && result.getCurrentPage() < result.getTotalPages());
    }
    logger.info("[Stage 2/2] Importing all results to database...");
    int error = 0;
    PreparedStatement pst = conn.prepareStatement("INSERT INTO songs (id, rank, artist, title, creator, tags, favourites, plays) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
    SongResult r;
    for (int i = 0; i < list.size(); i++) {
        r = list.get(i);
        logger.info("[Stage 2/2] Importing " + r.getId() + " (" + (i + 1) + "/" + list.size() + ") (" + (int) (Math.floor(i / (float) list.size() * 100)) + "%)");
        pst.setInt(1, r.getId());
        pst.setString(2, r.getRank());
        pst.setString(3, r.getArtist());
        pst.setString(4, r.getTitle());
        pst.setString(5, r.getCreator());
        pst.setString(6, join(r.getTags(), ","));
        pst.setInt(7, r.getFavourites());
        pst.setInt(8, r.getPlays());
        try {
            pst.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            error++;
        }
    }
    pst.close();
    logger.info("SQL Statements ended with " + error + " errors.");
    logger.info("All basic song results have been downloaded and imported.");
    prop.put(KEY_DOWNLOAD_BASIC_RESULTS, "false");
    save();
}
Also used : SongResult(com.github.mob41.osums.search.SongResult) ArrayList(java.util.ArrayList) SearchResult(com.github.mob41.osums.search.SearchResult) SearchFilter(com.github.mob41.osums.search.SearchFilter) StringRankFilter(com.github.mob41.osums.search.StringRankFilter) PreparedStatement(java.sql.PreparedStatement) SQLException(java.sql.SQLException) IOException(java.io.IOException)

Aggregations

SongResult (com.github.mob41.osums.search.SongResult)5 SearchResult (com.github.mob41.osums.search.SearchResult)4 IOException (java.io.IOException)4 ArrayList (java.util.ArrayList)3 SearchFilter (com.github.mob41.osums.search.SearchFilter)2 PreparedStatement (java.sql.PreparedStatement)2 SQLException (java.sql.SQLException)2 Element (org.jsoup.nodes.Element)2 WithDumpException (com.github.mob41.osumer.debug.WithDumpException)1 RankFilter (com.github.mob41.osums.search.RankFilter)1 StringRankFilter (com.github.mob41.osums.search.StringRankFilter)1 ResultSet (java.sql.ResultSet)1 ServletException (javax.servlet.ServletException)1 Document (org.jsoup.nodes.Document)1 Elements (org.jsoup.select.Elements)1