コード例 #1
0
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Context.User.Identity.GetUserId() != "190d22ec-44a8-4bf4-9579-0365a6b5af3e")
            {
                Response.Redirect("/Publib");
                return;
            }

            string CONSOLE;
            string qs = "";

            try
            {
                qs      = Request.QueryString["c"];
                CONSOLE = qs;
            }
            catch (Exception)
            {
                CONSOLE = "GBC";
                return;
            }


            HtmlDocument basepage = new HtmlAgilityPack.HtmlDocument();
            WebClient    cli      = new WebClient();

            cli.Encoding = System.Text.Encoding.UTF8;       // Atenção ao encoding!
            if (CONSOLE.Equals("NES"))
            {
                basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Nintendo_Entertainment_System_games"));                            // Seleção de consola
            }
            else if (CONSOLE.Equals("GB"))
            {
                basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Game_Boy_games"));
            }
            else if (CONSOLE.Equals("GBC"))
            {
                basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Game_Boy_Color_games"));
            }
            else if (CONSOLE.Equals("GBA"))
            {
                basepage.LoadHtml(cli.DownloadString("http://nintendo.wikia.com/wiki/List_of_Game_Boy_Advance_games"));
            }
            else if (CONSOLE.Equals("SMS"))
            {
                basepage.LoadHtml(cli.DownloadString("http://segaretro.org/List_of_Master_System_games"));
            }

            int           count      = 0;
            List <string> gametitles = new List <string>();

            if (CONSOLE.Equals("NES") || CONSOLE.Equals("GBC") || CONSOLE.Equals("GB") || CONSOLE.Equals("GBA"))              // Se for selecionada uma consola da nintendo, então utilizar a fonte nintendo.wikia.com
            {
                foreach (HtmlNode game_table in basepage.DocumentNode.SelectNodes("//table[@class='wikitable sortable']/tr")) // Percorrer todas as linhas das tabelas
                {
                    HtmlNodeCollection nodes     = game_table.ChildNodes;
                    string             gametitle = HttpUtility.HtmlDecode(nodes[1].InnerText);
                    System.Diagnostics.Debug.WriteLine(gametitle);
                    string  gameurl     = "";
                    int     gameurl_len = 0;
                    Boolean updated     = false;

                    HtmlAttributeCollection attribs = (nodes[1].ChildNodes)[0].Attributes;
                    foreach (HtmlAttribute attrib in attribs)
                    {
                        if (attrib.Name.Equals("href"))
                        {
                            gameurl     = attrib.Value;
                            gameurl_len = gameurl.Length;
                            break;
                        }
                    }

                    if (gameurl_len > 8 && gameurl.Substring(gameurl_len - 9).Equals("redlink=1"))
                    {
                        continue;                                                                            // Ignorar se se tratar de um redlink (página não existente na wiki)
                    }
                    if (gameurl.Equals(""))
                    {
                        continue;
                    }
                    if (gametitles.Contains(gametitle.Replace('é', 'e')))
                    {
                        continue;
                    }
                    gametitles.Add(gametitle.Replace('é', 'e'));

                    List <string> genres = new List <string>();

                    try
                    {
                        genres  = fetchGenre(gameurl, "nintendo");      // Obter o género
                        updated = true;
                    }
                    catch (Exception)
                    { }


                    if (!updated)               // Caso não tenha sido possível, então iremos alterar ligeiramente o URL
                    {
                        try
                        {
                            if (CONSOLE.Equals("NES"))
                            {
                                genres  = fetchGenre(gameurl + "_(NES)", "nintendo");
                                gameurl = gameurl + "_(NES)";
                            }
                            else if (CONSOLE.Equals("GBC"))
                            {
                                genres  = fetchGenre(gameurl + "_(GBC)", "nintendo");
                                gameurl = gameurl + "_(GBC)";
                            }
                            else if (CONSOLE.Equals("GB"))
                            {
                                genres  = fetchGenre(gameurl + "_(GB)", "nintendo");
                                gameurl = gameurl + "_(GB)";
                            }
                            else if (CONSOLE.Equals("GBA"))
                            {
                                genres  = fetchGenre(gameurl + "_(GBA)", "nintendo");
                                gameurl = gameurl + "_(GBA)";
                            }
                            updated = true;
                        }
                        catch (Exception) { }
                    }

                    if (!updated)        // Caso não tenha sido possível, então iremos alterar novamente o URL
                    {
                        try
                        {
                            if (CONSOLE.Equals("NES"))
                            {
                                genres  = fetchGenre(gameurl + "_(Famicom)", "nintendo");
                                gameurl = gameurl + "_(Famicom)";
                            }
                            else if (CONSOLE.Equals("GB"))
                            {
                                genres  = fetchGenre(gameurl + "_(Game_Boy)", "nintendo");
                                gameurl = gameurl + "_(Game_Boy)";
                            }
                            else if (CONSOLE.Equals("GBC"))
                            {
                                genres  = fetchGenre(gameurl + "_(Game_Boy_Color)", "nintendo");
                                gameurl = gameurl + "_(Game_Boy_Color)";
                            }
                            else if (CONSOLE.Equals("GBA"))
                            {
                                genres  = fetchGenre(gameurl + "_(Game_Boy_Advance)", "nintendo");
                                gameurl = gameurl + "_(Game_Boy_Advance)";
                            }
                            updated = true;
                        }
                        catch (Exception) { }
                    }

                    if (!updated)               // e novamente
                    {
                        try
                        {
                            genres  = fetchGenre(gameurl + "_(video_game)", "nintendo");
                            gameurl = gameurl + "_(video_game)";
                            updated = true;
                        }
                        catch (Exception) { }
                    }

                    if (!updated)
                    {
                        try
                        {
                            genres  = fetchGenre(gameurl + "_(game)", "nintendo");
                            gameurl = gameurl + "_(game)";
                            updated = true;
                        }
                        catch (Exception) { }
                    }



                    String genrestring;
                    if (!updated)
                    {
                        continue;               // Se não tiver sido encontrada informação, passar para o próximo elemento da tabela.
                    }
                    else if (genres.Count == 1 && genres[0].Equals("") || (genres.Count == 0 && CONSOLE.Equals("GB")))
                    {
                        genrestring = "unavailable";
                    }
                    else
                    {
                        genrestring = "";
                        foreach (string g in genres)
                        {
                            genrestring += (g + " & ");
                        }
                        genrestring = genrestring.Remove(genrestring.Length - 3);
                    }


                    gametitle = fixGameTitle(gametitle);

                    if (CONSOLE.Equals("NES"))  // Lista de jogos da NES cujo formato dos metadados não respeita o regular
                    {
                        if (gameurl.Equals("/wiki/Mother") || gameurl.Equals("/wiki/Dark_Lord") || gameurl.Equals("/wiki/Tecmo_Super_Bowl") || gameurl.Equals("/wiki/DuckTales_2") ||
                            gameurl.Equals("/wiki/Monster_Party") || gameurl.Equals("/wiki/Bigfoot") || gameurl.Equals("/wiki/Snake%27s_Revenge") || gameurl.Equals("/wiki/The_Simpsons:_Bart_vs._the_Space_Mutants") ||
                            gameurl.Equals("/wiki/Blackjack")
                            )
                        {
                            continue;
                        }
                    }

                    else if (CONSOLE.Equals("GB")) // Lista de jogos de Gameboy cujo formato dos metadados não respeita o regular
                    {
                        if (gameurl.Equals("/wiki/Tetris_(Game_Boy)") || gameurl.Equals("/wiki/Game_Boy_Camera") || gameurl.Equals("/wiki/Who_Framed_Roger_Rabbit") ||
                            gameurl.Equals("/wiki/Exodus:_Journey_to_the_Promised_Land") || gameurl.Equals("/wiki/Star_Trek:_25th_Anniversary") || gameurl.Equals("/wiki/Swamp_Thing") ||
                            gameurl.Equals("/wiki/Disney%27s_The_Little_Mermaid") || gameurl.Equals("/wiki/Robin_Hood:_Prince_of_Thieves") || gameurl.Equals("/wiki/Top_Rank_Tennis") ||
                            gameurl.Equals("/wiki/Earthworm_Jim_(handheld)") || gameurl.Equals("/wiki/NHL_Hockey_%2795") || gameurl.Equals("/wiki/Super_Star_Wars:_Return_of_the_Jedi") ||
                            gameurl.Equals("/wiki/NHL_96_(Game_Boy)") || gameurl.Equals("/wiki/Pinocchio") || gameurl.Equals("/wiki/Popeye") || gameurl.Equals("/wiki/Hatris") ||
                            gameurl.Equals("/wiki/R-Type") || gameurl.Equals("/wiki/World_Ice_Hockey") || gameurl.Equals("/wiki/Spy_vs._Spy") || gameurl.Equals("/wiki/Alfred_Chicken") ||
                            gameurl.Equals("/wiki/Pocket_Bomberman"))
                        {
                            continue;
                        }
                    }


                    else if (CONSOLE.Equals("GBC")) // Lista de jogos de Gameboy Color cujo formato dos metadados não respeita o regular
                    {
                        if (gameurl.Equals("/wiki/Hugo") || gameurl.Equals("/wiki/Scrabble") || gameurl.Equals("/wiki/Checkmate"))
                        {
                            continue;
                        }
                        if (gameurl.Equals("/wiki/Rayman"))
                        {
                            gameurl = "/wiki/Rayman_(video_game)";
                        }
                    }

                    else if (CONSOLE.Equals("GBA")) // Lista de jogos de Gameboy Advance cujo formato dos metadados não respeita o regular
                    {
                        if (gameurl.Equals("/wiki/Golden_Sun") || gameurl.Equals("/wiki/NFL_Blitz_20-03") || gameurl.Equals("/wiki/Rocky") ||
                            gameurl.Equals("/wiki/Wade_Hixton%27s_Counter_Punch") || gameurl.Equals("/wiki/The_Ant_Bully"))
                        {
                            continue;
                        }
                    }


                    addtoDB(gametitle.Trim(), gameurl, genres, CONSOLE);
                    Tuple <string, string, string, string> gamedata = scrapGameData(gameurl, CONSOLE);
                    gamedata = fixExceptions(gamedata, gametitle, gameurl);

                    datacontainer.InnerHtml += "<tr><td>" + gametitle + "</td><td>" + gameurl + "</td><td>" + genrestring + "</td><td>" + gamedata.Item3 + "</td><td>" + gamedata.Item4 + "</td><td>" + gamedata.Item2 + "</td><td><img src=\"" + gamedata.Item1 + "\"/></td></tr>";

                    count++;
                }
            }
            else if (CONSOLE.Equals("SMS"))             // Obter lista de jogos da Sega Master System. Fonte: segaretro.org
            {
                foreach (HtmlNode game_table in basepage.DocumentNode.SelectNodes("//table[@class='prettytable sortable'][1]/tr[position()>1]"))
                {
                    string gameurl   = "";
                    string gametitle = "";

                    HtmlNodeCollection nodes = game_table.ChildNodes[1].ChildNodes;
                    foreach (HtmlNode node in nodes)
                    {
                        HtmlNodeCollection subnodes = node.ChildNodes;
                        foreach (HtmlNode subnode in subnodes)
                        {
                            foreach (HtmlAttribute attr in subnode.Attributes)
                            {
                                if (attr.Name.Equals("href"))
                                {
                                    gameurl = attr.Value;
                                }
                            }
                            gametitle = subnode.InnerText;
                        }
                    }
                    List <string> genres = fetchGenre(gameurl, "sega");

                    String genrestring;
                    if (genres.Count == 1 && genres[0].Equals(""))
                    {
                        genrestring = "unavailable";
                    }
                    else
                    {
                        genrestring = "";
                        foreach (string g in genres)
                        {
                            genrestring += (g + " & ");
                        }
                        genrestring = genrestring.Remove(genrestring.Length - 3);
                    }

                    //addtoDB(gametitle.Trim(), gameurl, genres, CONSOLE);
                    datacontainer.InnerHtml += "<tr><td>" + gametitle + "</td><td>" + gameurl + "</td><td>" + genrestring + "</td></tr>";
                }
            }
            System.Diagnostics.Debug.WriteLine("Scraped " + count.ToString() + " games.");
        }