[Mediaportal-svn] SF.net SVN: mediaportal: [14771] trunk/mediaportal/WindowPlugins/ GUIPrograms
Turn your PC into a very advanced MediaCenter/HTPC
Brought to you by:
gereonheitmann,
morpheus_xx
From: <che...@us...> - 2007-05-31 17:45:01
|
Revision: 14771 http://svn.sourceforge.net/mediaportal/?rev=14771&view=rev Author: chef_koch Date: 2007-05-31 10:44:56 -0700 (Thu, 31 May 2007) Log Message: ----------- fixed: Packshot and Screenshot download for AllGameInfoScraper Modified Paths: -------------- trunk/mediaportal/WindowPlugins/GUIPrograms/AllGameInfoScraper.cs trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfo.cs trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.cs trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.resx Modified: trunk/mediaportal/WindowPlugins/GUIPrograms/AllGameInfoScraper.cs =================================================================== --- trunk/mediaportal/WindowPlugins/GUIPrograms/AllGameInfoScraper.cs 2007-05-31 17:05:39 UTC (rev 14770) +++ trunk/mediaportal/WindowPlugins/GUIPrograms/AllGameInfoScraper.cs 2007-05-31 17:44:56 UTC (rev 14771) @@ -49,10 +49,14 @@ public class AllGameInfoScraper { #region Base & Content Variables + List<FileInfo> gameList = new List<FileInfo>(); string templateSearch = String.Empty; string templateSearchTags = String.Empty; + + bool _extensiveLogging = true; + #endregion #region Constructor / Destructor @@ -65,6 +69,7 @@ using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) { + _extensiveLogging = xmlreader.GetValueAsBool("general", "extendedLogging", true); templateSearch = xmlreader.GetValue("templateSearch", "template"); templateSearchTags = xmlreader.GetValue("templateSearch", "tags"); } @@ -85,9 +90,9 @@ public string GetSearchURL(string gameTitle) { string cleanTitle = String.Empty; - - gameTitle = gameTitle.ToLower(); - + + gameTitle = gameTitle.ToLower(); + for (int i = 0; i < gameTitle.Length; i++) { if (gameTitle[i] >= 'a' && gameTitle[i] <= 'z') @@ -97,12 +102,19 @@ else if (gameTitle[i] >= '0' && gameTitle[i] <= '9') cleanTitle += gameTitle[i]; else if (!cleanTitle.EndsWith("+")) - cleanTitle += '+'; + cleanTitle += '+'; } return String.Format("{0}/cg/agg.dll?sql={1}&P=agg&opt1=31", BaseURL, cleanTitle); } + public string GetScreenshotURL(FileInfo curGame) + { + string cleanTitle = String.Empty; + + return String.Format("{0}~T5", curGame.GameURL); + } + public string MakeURL(string url) { url = url.Replace("&", "&"); ; @@ -125,11 +137,11 @@ } } - #endregion - private void WriteFileToLog(FileInfo file) { - Log.Info("MyPrograms FileItem:" + + if (_extensiveLogging) + { + Log.Info("MyPrograms FileItem:" + "\n Title: " + file.Title + "\n Year: " + file.Year + "\n Platform: " + file.Platform + @@ -143,8 +155,14 @@ "\n RatNorm: " + file.RatingNorm.ToString() + "\n Overview: " + file.Overview ); + + foreach (string imgURL in file.ImageURLs) + Log.Info("MyPrograms FileItem-ImageURL: {0}", imgURL); + } } + #endregion + public bool FindGameinfo(string gameTitle) { gameList.Clear(); @@ -153,44 +171,21 @@ HtmlParserTemplate template = new HtmlParserTemplate(); template.SectionTemplate = new HtmlSectionTemplate(); - /* - <tr class="visible" id="trlink" onclick="z('1:23413')"> - <td class="sorted-cell"><div class="bar" style="width: 56px;"> </div></td> - <td class="cell"> </td> - <td class="cell" style="width: 214px;"><a href="/cg/agg.dll?p=agg&sql=1:23413">Mario Kart 64 <i>European</i></a></td> - <td class="cell"> </td> - <td class="cell" style="width: 40px;">1997</td> - <td class="cell" style="width: 60px;">Racing</td> - <td class="cell" style="width: 70px;">Go-Kart Racing</td> - <td class="cell" style="width: 180px;">Nintendo 64</td> - <td class="cell-img"><img src="/img/stars/st_r7.gif" alt="4 Stars" title="4 Stars"></td> - */ - - // ok here we cycle throuh the 8 columns of one table row: - // col 0: "Relevance" => see width of the picture to measure this - // col 1: "Year" - // col 2: "buy it"-link - // col 3: "Title" => includes the detail URL - // col 4: "Genre" - // col 5: "Style" - // col 6: "Platform" - // col 7: "Rating" => use imagename to get rating: "st_gt1.gif" to "st_gt9.gif" - // setup the template template.SectionTemplate.Tags = templateSearchTags; - Log.Info("MyPrograms templateSearchTags {0}", templateSearchTags); + if (_extensiveLogging) Log.Info("MyPrograms templateSearchTags {0}", templateSearchTags); template.SectionTemplate.Template = templateSearch; - Log.Info("MyPrograms templateSearch {0}", templateSearch); + if (_extensiveLogging) Log.Info("MyPrograms templateSearch {0}", templateSearch); HtmlParser parser = new HtmlParser(template, typeof(FileInfo), null); // Build a request of the site to parse - Log.Info("MyPrograms parsing URL: {0}", GetSearchURL(gameTitle)); + if (_extensiveLogging) Log.Info("MyPrograms parsing URL: {0}", GetSearchURL(gameTitle)); HTTPRequest request = new HTTPRequest(GetSearchURL(gameTitle)); // Load the site and see how many times the template occurs int count = parser.ParseUrl(request); - Log.Info("MyPrograms template was found on url {0} times", count.ToString()); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", count.ToString()); // now we can get the data for each occurance for (int i = 0; i < count; i++) @@ -207,61 +202,11 @@ file.GameURL = MakeURL(file.GameURL); WriteFileToLog(file); - gameList.Add(file); } - - - /* - string gameRelevance = ""; - int startOfWidthTag = -1; - int endOfWidthTag = -1; - startOfWidthTag = columnHTML.IndexOf("width=\""); - if (startOfWidthTag != -1) - { - startOfWidthTag = columnHTML.IndexOf("\"", startOfWidthTag); - if (startOfWidthTag != -1) - { - endOfWidthTag = columnHTML.IndexOf("\"", startOfWidthTag + 1); - if ((endOfWidthTag != -1) && (endOfWidthTag > startOfWidthTag)) - { - gameRelevance = columnHTML.Substring(startOfWidthTag + 1, endOfWidthTag - startOfWidthTag - 1); - } - } - } - newGame.RelevanceOrig = gameRelevance; - newGame.RelevanceNorm = (ProgramUtils.StrToIntDef(gameRelevance, -1) + 44); - */ - - - /* - // ex: - // "<FONT SIZE=-1><A HREF=/cg/agg.dll?p=agg&SQL=GIH|||||1002>Super Mario 64</A></FONT>" - string gameURL = ""; - int startOfURLTag = -1; - int endOfURLTag = -1; - startOfURLTag = columnHTML.ToLower().IndexOf("<a href"); - if (startOfURLTag != -1) - { - startOfURLTag = columnHTML.IndexOf("/", startOfURLTag); - if (startOfURLTag != -1) - { - endOfURLTag = columnHTML.IndexOf(">", startOfURLTag + 1); - if ((endOfURLTag != -1) && (endOfURLTag > startOfURLTag)) - { - gameURL = columnHTML.Substring(startOfURLTag, endOfURLTag - startOfURLTag); - // and add the prefix! - gameURL = "http://www.allgame.com" + gameURL; - } - } - } - */ - - - /* string strRating = ""; // ex. // <A HREF=/cg/agg.dll?p=agg&SQL=GRH|||||1002><IMG SRC=/im/agg/st_gt9.gif BORDER=0 WIDTH=75 HEIGHT=15 VSPACE=2></A> @@ -285,6 +230,8 @@ } } */ + + if (count > 0) return true; else @@ -295,21 +242,58 @@ { try { - // Again we build a request with site URL - Log.Info("MyPrograms parsing URL: {0}", curGame.GameURL); - HTTPRequest request = new HTTPRequest(curGame.GameURL); + if (curItem == null) return false; + if (curGame == null) return false; + if (curGame.GameURL == "") return false; - //but instead of calling HtmlParser we will first get the source - HTMLPage page = new HTMLPage(request); - string source = page.GetPage(); + string sourceData = GetSourceFromURL(curGame.GameURL); + if (saveType == ScraperSaveType.DataAndImages || saveType == ScraperSaveType.Data) + { + curGame = ParseValues(curGame, sourceData); + curGame = ParseValueRating(curGame, sourceData); + curGame = ParseValueLists(curGame, sourceData); + curGame = ParseTexts(curGame, sourceData); + } - curGame = ParseValues(curGame, source); - curGame = ParseValueRating(curGame, source); - curGame = ParseValueLists(curGame, source); - curGame = ParseTexts(curGame, source); + if (saveType == ScraperSaveType.DataAndImages || saveType == ScraperSaveType.Images) + { + curGame.ImageURLs.Clear(); + curGame = ParsePackshot(curGame, sourceData); + + string sourceImages = GetSourceFromURL(GetScreenshotURL(curGame)); + curGame = ParseScreenshots(curGame, sourceImages); + + // no screenshots are found for this game + // will try to download screenshots with same or better relevance + // for example, other country versions + if (curGame.ImageURLs.Count <= 1) + { + Log.Info("MyPrograms: AllGameInfoScraper: No Screenshots found, will try to find, screenies for a similar game now."); + if (curItem != null) + if (curItem.FileInfoList != null) + foreach (FileInfo info in curItem.FileInfoList) + { + // is it the same game again? + if (info.GameURL == curGame.GameURL) continue; + // is this game worse that the current-selected? + if (info.RelevanceNorm < curGame.RelevanceNorm) continue; + + string nextSource = GetSourceFromURL(GetScreenshotURL(info)); + FileInfo tempInfo = ParseScreenshots(info, nextSource); + + if (tempInfo.ImageURLs.Count > 1) + { + curGame.ImageURLs.AddRange(tempInfo.ImageURLs); + break; + } + } + } + WriteFileToLog(curGame); + curGame.DownloadImages(curApp, curItem); + } + curGame.Loaded = true; - return true; } catch (Exception ex) @@ -320,37 +304,10 @@ #region oldstuff /* - if (curItem == null) - return false; - if (curGame == null) - return false; - if (curGame.GameURL == "") - return false; - - HTMLUtil util = new HTMLUtil(); - - // query string is as in the following example: - // ALTERED BEAST for sega genesis - // http://www.allgame.com/cg/agg.dll?p=agg&SQL=GIH|||||||66 - // To use PostHTTP, we have to split the parameters from the full url - - //string strPostData="p=agg&SQL=GIH|||||||66"; - string strPostData = curGame.GetGameURLPostParams(); - if (strPostData == "") - return false; - string strHTML = PostHTTP("http://www.allgame.com/cg/agg.dll", strPostData); - - if (strHTML.Length == 0) - return false; - - string strHTMLLow = strHTML; - strHTMLLow = strHTMLLow.ToLower(); - - // 1) get MANUFACTURER string strManufacturer = ""; int startOfManuTag = - 1; - int endOfManuTag = - 1; + int endOfManuTag = - 1; // ex: // <TR><TD ALIGN=RIGHT BGCOLOR="#FF9933" WIDTH=122><FONT COLOR="#000000" SIZE=-1>Developer</FONT></TD> // <TD WIDTH=482 BGCOLOR="#D8D8D8" VALIGN=bottom><TABLE WIDTH=484 BGCOLOR="#D8D8D8" BORDER=0 CELLSPACING=0 CELLPADDING=0><TR> @@ -376,103 +333,33 @@ } } + */ +#endregion + } - curGame.ImageURLs = ""; // clear all imageurls + private string GetSourceFromURL(string url) + { + // Again we build a request with site URL + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: downloading URL: {0}", url); + HTTPRequest request = new HTTPRequest(url); - // 2) get OVERVIEW / COVERSHOT - string strOverview = ""; - string strCovershot = ""; - int startOfOvTag = - 1; - int endOfOvTag = - 1; - startOfOvTag = strHTMLLow.IndexOf("<img src=\"http://image.allmusic.com/00/agg/cov200"); - if (startOfOvTag == - 1) - { - // no covershot found: maybe there's still a review there.... - startOfOvTag = strHTMLLow.IndexOf("<table border=0 bgcolor=\"#d8d8d8\""); - // Log.Info("dw scraper: {0}", iStartOfOV); - } - if (startOfOvTag != - 1) - { - endOfOvTag = strHTMLLow.IndexOf("</tr>", startOfOvTag); - if ((endOfOvTag != - 1) && (endOfOvTag > startOfOvTag)) - { - strOverview = strHTML.Substring(startOfOvTag, endOfOvTag - startOfOvTag); - util.RemoveTags(ref strOverview); + //but instead of calling HtmlParser we will first get the source + HTMLPage page = new HTMLPage(request); - if (strOverview != "") - { - strOverview = strOverview.Replace("\r", "\r\n"); - strOverview = strOverview.Replace("\n", "\r\n"); - strOverview = strOverview.Replace("—", "\r\n"); - curGame.Overview = strOverview; - } - - } - int startOfCovershot = startOfOvTag; - int endOfCovershot = - 1; - if (startOfCovershot != - 1) - { - startOfCovershot = strHTMLLow.IndexOf("\"", startOfCovershot); - if (startOfCovershot != - 1) - { - endOfCovershot = strHTMLLow.IndexOf("\"", startOfCovershot + 1); - if ((endOfCovershot != - 1) && (endOfCovershot > startOfCovershot)) - { - strCovershot = strHTML.Substring(startOfCovershot + 1, endOfCovershot - startOfCovershot - 1); - curGame.AddImageURL(strCovershot); - } - } - } - } - - - // 3) get SCREENSHOTS - string strCurScreen = ""; - int startOfImgTag = - 1; - int startOfLink = - 1; - int endOfLink = - 1; - bool bGoOn = true; - startOfImgTag = strHTMLLow.IndexOf("<a href=http://image.allmusic.com/00/agg/screen250"); - bGoOn = (startOfImgTag != - 1); - while (bGoOn) - { - startOfLink = strHTMLLow.IndexOf("=", startOfImgTag); - if (startOfLink != - 1) - { - startOfLink++; - endOfLink = strHTMLLow.IndexOf(">", startOfLink); - if ((endOfLink != - 1) && (endOfLink > startOfLink)) - { - strCurScreen = strHTML.Substring(startOfLink, endOfLink - startOfLink); - if (strCurScreen != "") - { - curGame.AddImageURL(strCurScreen); - } - } - } - - startOfImgTag = strHTMLLow.IndexOf("<a href=http://image.allmusic.com/00/agg/screen250", startOfImgTag + 1); - bGoOn = (startOfImgTag != - 1); - } - - if ((saveType == ScraperSaveType.DataAndImages) || (saveType == ScraperSaveType.Images)) - { - curGame.DownloadImages(curApp, curItem); - } - return true; - */ -#endregion + return page.GetPage(); } private FileInfo ParseValues(FileInfo curGame, string source) { - string tValue = String.Empty; - string tValueTags = String.Empty; + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: ParseValues()"); + string template = String.Empty; + string tags = String.Empty; + using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) { - tValue = xmlreader.GetValue("templateValue", "template"); - tValueTags = xmlreader.GetValue("templateValue", "tags"); + template = xmlreader.GetValue("templateValue", "template"); + tags = xmlreader.GetValue("templateValue", "tags"); } // VALUES @@ -483,22 +370,25 @@ // This time only a section template and not a parser template HtmlSectionTemplate templateValue = new HtmlSectionTemplate(); - templateValue.Tags = tValueTags; - templateValue.Template = tValue; - Log.Info("MyPrograms template tags: {0}", tValueTags); - Log.Info("MyPrograms template \n{0}", tValue); + templateValue.Tags = tags; + templateValue.Template = template; + if (_extensiveLogging) + { + Log.Info("MyPrograms template tags: {0}", tags); + Log.Info("MyPrograms template \n{0}", template); + } // With the template we create a profiler HtmlProfiler profilerValue = new HtmlProfiler(templateValue); // and use this to get the number of times the template occurs in our source int countValue = profilerValue.MatchCount(source); - Log.Info("MyPrograms template was found on url {0} times", countValue.ToString()); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", countValue.ToString()); for (int i = 0; i < countValue; i++) { // Here we can get the source of each section - Log.Info("MyPrograms template ::: {0}", profilerValue.GetSource(i)); + if (_extensiveLogging) Log.Info("MyPrograms template ::: {0}", profilerValue.GetSource(i)); string sectionSource = profilerValue.GetSource(i); // we must also create a place for the parsed data @@ -512,10 +402,9 @@ // Finally we can parse the section source parser.ParseSection(sectionSource, ref iData); - for (int j = 0; j < data.Count; j++) - { - Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); - } + if (_extensiveLogging) + for (int j = 0; j < data.Count; j++) + Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); switch (data.GetElement("#KEY")) { @@ -535,21 +424,22 @@ break; } } - + WriteFileToLog(curGame); - return curGame; } private FileInfo ParseValueRating(FileInfo curGame, string source) { - string tValue = String.Empty; - string tValueTags = String.Empty; + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: ParseValueRating()"); + string template = String.Empty; + string tags = String.Empty; + using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) { - tValue = xmlreader.GetValue("templateValueRating", "template"); - tValueTags = xmlreader.GetValue("templateValueRating", "tags"); + template = xmlreader.GetValue("templateValueRating", "template"); + tags = xmlreader.GetValue("templateValueRating", "tags"); } // VALUES @@ -560,22 +450,25 @@ // This time only a section template and not a parser template HtmlSectionTemplate templateValue = new HtmlSectionTemplate(); - templateValue.Tags = tValueTags; - templateValue.Template = tValue; - Log.Info("MyPrograms template tags: {0}", tValueTags); - Log.Info("MyPrograms template \n{0}", tValue); + templateValue.Tags = tags; + templateValue.Template = template; + if (_extensiveLogging) + { + Log.Info("MyPrograms template tags: {0}", tags); + Log.Info("MyPrograms template \n{0}", template); + } // With the template we create a profiler HtmlProfiler profilerValue = new HtmlProfiler(templateValue); // and use this to get the number of times the template occurs in our source int countValue = profilerValue.MatchCount(source); - Log.Info("MyPrograms template was found on url {0} times", countValue.ToString()); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", countValue.ToString()); for (int i = 0; i < countValue; i++) { // Here we can get the source of each section - Log.Info("MyPrograms template ::: {0}", profilerValue.GetSource(i)); + if (_extensiveLogging) Log.Info("MyPrograms template ::: {0}", profilerValue.GetSource(i)); string sectionSource = profilerValue.GetSource(i); // we must also create a place for the parsed data @@ -589,10 +482,9 @@ // Finally we can parse the section source parser.ParseSection(sectionSource, ref iData); - for (int j = 0; j < data.Count; j++) - { - Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); - } + if (_extensiveLogging) + for (int j = 0; j < data.Count; j++) + Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); switch (data.GetElement("#KEY")) { @@ -612,13 +504,15 @@ private FileInfo ParseValueLists(FileInfo curGame, string source) { - string tValueList = String.Empty; - string tValueListTags = String.Empty; + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: ParseValueLists()"); + string template = String.Empty; + string tags = String.Empty; + using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) { - tValueList = xmlreader.GetValue("templateValueList", "template"); - tValueListTags = xmlreader.GetValue("templateValueList", "tags"); + template = xmlreader.GetValue("templateValueList", "template"); + tags = xmlreader.GetValue("templateValueList", "tags"); } // VALUES LISTS @@ -629,22 +523,25 @@ // This time only a section template and not a parser template HtmlSectionTemplate templateValueList = new HtmlSectionTemplate(); - templateValueList.Tags = tValueListTags; - templateValueList.Template = tValueList; - Log.Info("MyPrograms template tags: {0}", tValueListTags); - Log.Info("MyPrograms template \n{0}", tValueList); + templateValueList.Tags = tags; + templateValueList.Template = template; + if (_extensiveLogging) + { + Log.Info("MyPrograms template tags: {0}", tags); + Log.Info("MyPrograms template \n{0}", template); + } // With the template we create a profiler HtmlProfiler profilerValueList = new HtmlProfiler(templateValueList); // and use this to get the number of times the template occurs in our source int countValueList = profilerValueList.MatchCount(source); - Log.Info("MyPrograms template was found on url {0} times", countValueList.ToString()); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", countValueList.ToString()); for (int i = 0; i < countValueList; i++) { // Here we can get the source of each section - Log.Info("MyPrograms template ::: {0}", profilerValueList.GetSource(i)); + if (_extensiveLogging) Log.Info("MyPrograms template ::: {0}", profilerValueList.GetSource(i)); string sectionSource = profilerValueList.GetSource(i); // we must also create a place for the parsed data @@ -658,10 +555,9 @@ // Finally we can parse the section source parser.ParseSection(sectionSource, ref iData); - for (int j = 0; j < data.Count; j++) - { - Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); - } + if (_extensiveLogging) + for (int j = 0; j < data.Count; j++) + Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); switch (data.GetElement("#KEY")) { @@ -689,13 +585,15 @@ private FileInfo ParseTexts(FileInfo curGame, string source) { - string tText = String.Empty; - string tTextTags = String.Empty; + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: ParseTexts()"); + string template = String.Empty; + string tags = String.Empty; + using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) { - tText = xmlreader.GetValue("templateText", "template"); - tTextTags = xmlreader.GetValue("templateText", "tags"); + template = xmlreader.GetValue("templateText", "template"); + tags = xmlreader.GetValue("templateText", "tags"); } // TEXTS @@ -706,22 +604,25 @@ // This time only a section template and not a parser template HtmlSectionTemplate templateText = new HtmlSectionTemplate(); - templateText.Tags = tTextTags; - templateText.Template = tText; - Log.Info("MyPrograms template tags: {0}", tTextTags); - Log.Info("MyPrograms template \n{0}", tText); + templateText.Tags = tags; + templateText.Template = template; + if (_extensiveLogging) + { + Log.Info("MyPrograms template tags: {0}", tags); + Log.Info("MyPrograms template \n{0}", template); + } // With the template we create a profiler HtmlProfiler profilerText = new HtmlProfiler(templateText); // and use this to get the number of times the template occurs in our source int countText = profilerText.MatchCount(source); - Log.Info("MyPrograms template was found on url {0} times", countText.ToString()); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", countText.ToString()); for (int i = 0; i < countText; i++) { // Here we can get the source of each section - Log.Info("MyPrograms template ::: {0}", profilerText.GetSource(i)); + if (_extensiveLogging) Log.Info("MyPrograms template ::: {0}", profilerText.GetSource(i)); string sectionSource = profilerText.GetSource(i); // we must also create a place for the parsed data @@ -735,10 +636,9 @@ // Finally we can parse the section source parser.ParseSection(sectionSource, ref iData); - for (int j = 0; j < data.Count; j++) - { - Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); - } + if (_extensiveLogging) + for (int j = 0; j < data.Count; j++) + Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); switch (data.GetElement("#KEY")) { @@ -754,5 +654,146 @@ return curGame; } + + private FileInfo ParsePackshot(FileInfo curGame, string source) + { + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: ParsePackshot()"); + + string template = String.Empty; + string tags = String.Empty; + + using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) + { + template = xmlreader.GetValue("packshot", "template"); + tags = xmlreader.GetValue("packshot", "tags"); + } + + // TEXTS + + // now that we have the source we can work on it before going to the parser + + // To parser the source we need again a template + // This time only a section template and not a parser template + HtmlSectionTemplate templateText = new HtmlSectionTemplate(); + + templateText.Tags = tags; + templateText.Template = template; + if (_extensiveLogging) + { + Log.Info("MyPrograms template tags: {0}", tags); + Log.Info("MyPrograms template \n{0}", template); + } + + // With the template we create a profiler + HtmlProfiler profilerText = new HtmlProfiler(templateText); + + // and use this to get the number of times the template occurs in our source + int countText = profilerText.MatchCount(source); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", countText.ToString()); + + for (int i = 0; i < countText; i++) + { + // Here we can get the source of each section + if (_extensiveLogging) Log.Info("MyPrograms template ::: {0}", profilerText.GetSource(i)); + string sectionSource = profilerText.GetSource(i); + + // we must also create a place for the parsed data + ParserData data = new ParserData(); + + IParserData iData = data; + + // to parse each section we use a section parser + HtmlSectionParser parser = new HtmlSectionParser(templateText); + + // Finally we can parse the section source + parser.ParseSection(sectionSource, ref iData); + + if (_extensiveLogging) + for (int j = 0; j < data.Count; j++) + Log.Info("MyPrograms DATA: {0} --- {1}", data.GetElementName(j), data.GetElementValue(j)); + + curGame.ImageURLs.Add(data.GetElement("#URL")); + } + + WriteFileToLog(curGame); + return curGame; + } + + private FileInfo ParseScreenshots(FileInfo curGame, string source) + { + if (_extensiveLogging) Log.Info("MyPrograms: AllGameInfoScraper: ParseScreenshots()"); + + string section = "screenshots"; + + string KeyName = String.Empty; + string KeyString = String.Empty; + string ValueName = String.Empty; + string template = String.Empty; + string tags = String.Empty; + + using (Settings xmlreader = new Settings(Config.GetFile(Config.Dir.Config, "grabber_AllGame_com.xml"))) + { + KeyName = xmlreader.GetValueAsString(section, "KeyName", null); + KeyString = xmlreader.GetValueAsString(section, "KeyString", null); + ValueName = xmlreader.GetValueAsString(section, "ValueName", null); + template = xmlreader.GetValueAsString(section, "template", null); + tags = xmlreader.GetValueAsString(section, "tags", null); + } + + if (KeyString == null || KeyString == string.Empty) return curGame; + if (template == null || template == string.Empty) return curGame; + if (tags == null || tags == string.Empty) return curGame; + if (_extensiveLogging) + { + Log.Info("MyPrograms KeyName: {0}", KeyName); + Log.Info("MyPrograms KeyString: {0}", KeyString); + Log.Info("MyPrograms ValueName: {0}", ValueName); + Log.Info("MyPrograms template tags: {0}", tags); + Log.Info("MyPrograms template \n{0}", template); + } + + // To parser the source we need again a template + // This time only a section template and not a parser template + HtmlSectionTemplate templateText = new HtmlSectionTemplate(); + + templateText.Tags = tags; + templateText.Template = template; + // With the template we create a profiler + HtmlProfiler profilerText = new HtmlProfiler(templateText); + + // and use this to get the number of times the template occurs in our source + int countText = profilerText.MatchCount(source); + if (_extensiveLogging) Log.Info("MyPrograms template was found on url {0} times", countText.ToString()); + + for (int i = 0; i < countText; i++) + { + // Here we can get the source of each section + if (_extensiveLogging) Log.Info("MyPrograms template ::: {0}", profilerText.GetSource(i)); + string sectionSource = profilerText.GetSource(i); + + // we must also create a place for the parsed data + ParserData data = new ParserData(); + + IParserData iData = data; + + // to parse each section we use a section parser + HtmlSectionParser parser = new HtmlSectionParser(templateText); + + // Finally we can parse the section source + parser.ParseSection(sectionSource, ref iData); + + if (data.Count != 2) continue; + if (_extensiveLogging) + for (int j = 0; j < data.Count; j++) + { + Log.Info("MyPrograms DATA name : {0} {1}", j.ToString(), data.GetElement(KeyName)); + Log.Info("MyPrograms DATA value: {0} {1}", j.ToString(), data.GetElementValue(j)); + } + + if (data.GetElement(KeyName).StartsWith(KeyString)) + curGame.ImageURLs.Add(data.GetElement(ValueName)); + } + return curGame; + } } } Modified: trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfo.cs =================================================================== --- trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfo.cs 2007-05-31 17:05:39 UTC (rev 14770) +++ trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfo.cs 2007-05-31 17:44:56 UTC (rev 14771) @@ -25,6 +25,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -54,7 +55,7 @@ private string mPlatform = string.Empty; private string mRating = string.Empty; private int mRatingNorm = 0; - private string mImageURLs = string.Empty; + private List<string> mImageURLs = new List<string>(); private string mManufacturer = string.Empty; private string mOverview = string.Empty; private bool bLoaded = false; @@ -268,16 +269,12 @@ } } - public string ImageURLs + public List<string> ImageURLs { get { return mImageURLs; } - set - { - mImageURLs = value; - } } public bool Loaded @@ -322,23 +319,10 @@ return result; } - public void AddImageURL(string strURL) - { - if (mImageURLs != "") - { - mImageURLs = mImageURLs + "\n" + strURL; - } - else - { - mImageURLs = strURL; - } - } - public void DownloadImages(AppItem curApp, FileItem curFile) { - if (curFile == null) - return ; - ArrayList mImgUrls = new ArrayList(this.ImageURLs.Split('\n')); + if (curFile == null) return; + int i = 0; string strFile = ""; @@ -347,7 +331,7 @@ curFile.Imagefile = ""; // download all images - foreach (string strImgUrl in mImgUrls) + foreach (string strImgUrl in ImageURLs) { // strImgUrl contains a full URL with one picture to download @@ -373,6 +357,9 @@ { try { + if (tag == null) return; + if (value == null) return; + switch (tag) { case "#RELEVANCE": Modified: trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.cs =================================================================== --- trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.cs 2007-05-31 17:05:39 UTC (rev 14770) +++ trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.cs 2007-05-31 17:44:56 UTC (rev 14771) @@ -60,7 +60,6 @@ private MediaPortal.UserInterface.Controls.MPButton checkAllButton; private ToolTip toolTip1; private MediaPortal.UserInterface.Controls.MPButton uncheckAllButton; - private MediaPortal.UserInterface.Controls.MPButton buttonSelectBestMatch; private MediaPortal.UserInterface.Controls.MPLabel filterLabel; private MediaPortal.UserInterface.Controls.MPComboBox filterComboBox; private MediaPortal.UserInterface.Controls.MPButton ResetFilterButton; @@ -155,7 +154,6 @@ this.ResetFilterButton = new MediaPortal.UserInterface.Controls.MPButton(); this.filterComboBox = new MediaPortal.UserInterface.Controls.MPComboBox(); this.filterLabel = new MediaPortal.UserInterface.Controls.MPLabel(); - this.buttonSelectBestMatch = new MediaPortal.UserInterface.Controls.MPButton(); this.allGameLink = new System.Windows.Forms.LinkLabel(); this.btnCancel = new MediaPortal.UserInterface.Controls.MPButton(); this.btnSaveSearch = new MediaPortal.UserInterface.Controls.MPButton(); @@ -200,7 +198,6 @@ this.bottomPanel.Controls.Add(this.ResetFilterButton); this.bottomPanel.Controls.Add(this.filterComboBox); this.bottomPanel.Controls.Add(this.filterLabel); - this.bottomPanel.Controls.Add(this.buttonSelectBestMatch); this.bottomPanel.Controls.Add(this.allGameLink); this.bottomPanel.Controls.Add(this.btnCancel); this.bottomPanel.Controls.Add(this.btnSaveSearch); @@ -339,19 +336,6 @@ this.filterLabel.TabIndex = 21; this.filterLabel.Text = "Platform:"; // - // buttonSelectBestMatch - // - this.buttonSelectBestMatch.Enabled = false; - this.buttonSelectBestMatch.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonSelectBestMatch.Location = new System.Drawing.Point(168, 34); - this.buttonSelectBestMatch.Name = "buttonSelectBestMatch"; - this.buttonSelectBestMatch.Size = new System.Drawing.Size(160, 35); - this.buttonSelectBestMatch.TabIndex = 20; - this.buttonSelectBestMatch.Text = "2) Select Best Match"; - this.toolTip1.SetToolTip(this.buttonSelectBestMatch, "Select the best match for all checked files ("); - this.buttonSelectBestMatch.UseVisualStyleBackColor = true; - this.buttonSelectBestMatch.Click += new System.EventHandler(this.buttonSelectBestMatch_Click); - // // allGameLink // this.allGameLink.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); @@ -584,7 +568,6 @@ // // menuDataAndImages // - this.menuDataAndImages.Enabled = false; this.menuDataAndImages.Index = 0; this.menuDataAndImages.Text = "Save Data and download images"; this.menuDataAndImages.Click += new System.EventHandler(this.menuDataAndImages_Click); @@ -602,7 +585,6 @@ // // menuImages // - this.menuImages.Enabled = false; this.menuImages.Index = 3; this.menuImages.Text = "Download images only"; this.menuImages.Click += new System.EventHandler(this.menuImages_Click); @@ -725,18 +707,14 @@ InitProgressBar("Starting search"); foreach (ListViewItem curItem in FileList.CheckedItems) { - if (stopSearching) - break; + if (stopSearching) break; + if (curItem.Tag == null) continue; + FileItem file = curItem.Tag as FileItem; + if (file == null) continue; + ListViewItem nextItem = null; - FileItem file = (FileItem)curItem.Tag; - if (file == null) - continue; - if (file.FileInfoList != null) - if (file.FileInfoList.Count > 0) - continue; - if (curItem.Index < FileList.Items.Count - 1) { nextItem = FileList.Items[curItem.Index + 1]; @@ -763,18 +741,10 @@ curItem.Font = new Font(curItem.Font, curItem.Font.Style | FontStyle.Bold); System.Windows.Forms.Application.DoEvents(); bSuccess = file.FindFileInfo(myProgScraperType.ALLGAME); - foreach (FileInfo info in file.FileInfoList) - { - if (file.GameURL == info.GameURL) - { - file.FileInfoFavourite = info; - break; - } - } - curItem.SubItems[1].Text = String.Format("{0} matches", file.FileInfoList.Count); + SelectBestMatch(curItem); + StepProgressBar(); - buttonSelectBestMatch.Enabled = true; System.Windows.Forms.Application.DoEvents(); } ChangeFileSelection(); @@ -790,35 +760,24 @@ } + private FileItem GetSelectedFileItem() { - FileItem res = null; - if (FileList.FocusedItem != null) - { - if (FileList.FocusedItem.Tag != null) - { - res = (FileItem)FileList.FocusedItem.Tag; - } - } - return res; + if (FileList.FocusedItem == null) return null; + if (FileList.FocusedItem.Tag == null) return null; + + return FileList.FocusedItem.Tag as FileItem; } private FileInfo GetSelectedMatchItem() { - FileInfo res = null; + if (MatchList.CheckedItems == null) return null; + if (MatchList.CheckedItems[0] == null) return null; + if (MatchList.CheckedItems[0].Tag == null) return null; - if (MatchList.CheckedItems == null) - return res; - if (MatchList.CheckedItems[0] == null) - return res; - if (MatchList.CheckedItems[0].Tag == null) - return res; - - res = (FileInfo)MatchList.CheckedItems[0].Tag; - return res; + return MatchList.CheckedItems[0].Tag as FileInfo; } - private bool IsGoodMatch(FileInfo info) { bool result = (filterComboBox.Text == "") || (info.Platform.ToLower().IndexOf(filterComboBox.Text.ToLower()) == 0); @@ -837,99 +796,84 @@ { MatchList.Items.Clear(); - if (file == null) - return; - if (file.FileInfoList == null) - return; + if (file == null) return; + if (file.FileInfoList == null) return; foreach (FileInfo item in file.FileInfoList) { - if (IsGoodMatch(item)) - { - ListViewItem curItem = new ListViewItem(String.Format("{0} ({1})", item.Title, item.Platform)); - curItem.SubItems.Add(String.Format("{0}%", item.RelevanceNorm)); - // curItem.SubItems[1].Text = String.Format("{0}%", item.Relevance); - curItem.Tag = item; + if (!IsGoodMatch(item)) continue; - // selected item? - if ((file.FileInfoFavourite != null) && (file.FileInfoFavourite == item)) + ListViewItem curItem = new ListViewItem(String.Format("{0} ({1})", item.Title, item.Platform)); + curItem.SubItems.Add(String.Format("{0}%", item.RelevanceNorm)); + curItem.Tag = item; + + // selected item? + if (file.FileInfoFavourite != null) + if (file.FileInfoFavourite == item) { curItem.Checked = true; LaunchURLButton.Enabled = true; } - curItem = MatchList.Items.Add(curItem); - } + MatchList.Items.Add(curItem); } } finally { MatchList.EndUpdate(); } - } - private void ChangeFileSelection() { - FileItem file = GetSelectedFileItem(); - SyncMatchesList(file); + SyncMatchesList(GetSelectedFileItem()); } - private void allGameLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + void SelectBestMatch(ListViewItem curItem) { - if (allGameLink.Text == null) - return; - if (allGameLink.Text.Length > 0) + if (curItem.Tag == null) return; + + FileItem file = curItem.Tag as FileItem; + if (file == null) return; + if (file.FileInfoList == null) return; + + foreach (FileInfo info in file.FileInfoList) { - ProcessStartInfo sInfo = new ProcessStartInfo(allGameLink.Text); - Process.Start(sInfo); - } - } + // check if + // - info is from platform, which is set in combobox + // - has minimum relevance + if (!IsGoodMatch(info)) continue; - private void LaunchSelectedMatchURL() - { - /* - FileInfo info = GetSelectedMatchItem(); - if (info == null) - return; - info.LaunchURL(); - */ - } + // if file has no favourite yet + if (file.FileInfoFavourite == null) + { + file.FileInfoFavourite = info; + continue; + } + // prevously selected infoitem + if (file.GameURL == info.GameURL) + { + file.FileInfoFavourite = info; + continue; + } - private void MatchList_DoubleClick(object sender, EventArgs e) - { - //LaunchSelectedMatchURL(); - } + // file has already a favourite + // is info's relevance better than current favourite's relevance + if (info.RelevanceNorm > file.FileInfoFavourite.RelevanceNorm) + file.FileInfoFavourite = info; + } - private void checkAllButton_Click(object sender, EventArgs e) - { - foreach (ListViewItem curItem in FileList.Items) + if (file.FileInfoFavourite != null) { - curItem.Checked = true; + curItem.SubItems[1].Text = String.Format("best: {0}%", file.FileInfoFavourite.RelevanceNorm); } - btnStartSearch.Enabled = (FileList.CheckedItems.Count > 0); - SyncFileLabel(); - } - - private void uncheckAllButton_Click(object sender, EventArgs e) - { - foreach (ListViewItem curItem in FileList.Items) + else { - curItem.Checked = false; + curItem.SubItems[1].Text = "no match"; } - btnStartSearch.Enabled = false; - buttonSelectBestMatch.Enabled = false; - btnSaveSearch.Enabled = false; - SyncFileLabel(); } - private void btnSaveSearch_Click(object sender, EventArgs e) - { - menuSaveDetails.Show(btnSaveSearch, new Point(0, btnSaveSearch.Height)); - } - void SaveSearch(ScraperSaveType saveType) { int numberOfSearches = 0; @@ -988,6 +932,62 @@ stopSearching = false; } + + + + private void allGameLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (allGameLink.Text == null) + return; + if (allGameLink.Text.Length > 0) + { + ProcessStartInfo sInfo = new ProcessStartInfo(allGameLink.Text); + Process.Start(sInfo); + } + } + + private void LaunchSelectedMatchURL() + { + /* + FileInfo info = GetSelectedMatchItem(); + if (info == null) + return; + info.LaunchURL(); + */ + } + + + private void MatchList_DoubleClick(object sender, EventArgs e) + { + //LaunchSelectedMatchURL(); + } + + private void checkAllButton_Click(object sender, EventArgs e) + { + foreach (ListViewItem curItem in FileList.Items) + { + curItem.Checked = true; + } + btnStartSearch.Enabled = (FileList.CheckedItems.Count > 0); + SyncFileLabel(); + } + + private void uncheckAllButton_Click(object sender, EventArgs e) + { + foreach (ListViewItem curItem in FileList.Items) + { + curItem.Checked = false; + } + btnStartSearch.Enabled = false; + btnSaveSearch.Enabled = false; + SyncFileLabel(); + } + + private void btnSaveSearch_Click(object sender, EventArgs e) + { + menuSaveDetails.Show(btnSaveSearch, new Point(0, btnSaveSearch.Height)); + } + private void filterComboBox_SelectedIndexChanged(object sender, EventArgs e) { ChangeFileSelection(); @@ -1007,58 +1007,6 @@ ChangeFileSelection(); } - private void buttonSelectBestMatch_Click(object sender, EventArgs e) - { - foreach (ListViewItem curItem in FileList.CheckedItems) - { - FileItem file = (FileItem)curItem.Tag; - - if (file == null) - continue; - if (file.FileInfoList == null) - continue; - - foreach (FileInfo info in file.FileInfoList) - { - // check if - // - info is from platform, which is set in combobox - // - has minimum relevance - if (!IsGoodMatch(info)) - continue; - - // if file has no favourite yet - if (file.FileInfoFavourite == null) - { - file.FileInfoFavourite = info; - continue; - } - - if (file.FileInfoFavourite.GameURL == info.GameURL) - { - file.FileInfoFavourite = info; - break; - } - - // file has already a favourite - // is info's relevance better than current favourite's relevance - if (info.RelevanceNorm > file.FileInfoFavourite.RelevanceNorm) - file.FileInfoFavourite = info; - - btnSaveSearch.Enabled = true; - } - - if (file.FileInfoFavourite != null) - { - curItem.SubItems[1].Text = String.Format("best: {0}%", file.FileInfoFavourite.RelevanceNorm); - } - else - { - curItem.SubItems[1].Text = "no match"; - } - } - ChangeFileSelection(); - } - private void MinRelevanceNum_ValueChanged(object sender, EventArgs e) { ChangeFileSelection(); @@ -1076,7 +1024,6 @@ btnStartSearch.Enabled = (FileList.CheckedItems.Count > 0); if (!btnStartSearch.Enabled) { - buttonSelectBestMatch.Enabled = false; btnSaveSearch.Enabled = false; } SyncFileLabel(); @@ -1165,29 +1112,30 @@ private void MatchList_ItemCheck(object sender, ItemCheckEventArgs e) { - foreach (ListViewItem item in MatchList.CheckedItems) - item.Checked = false; - - if (e.CurrentValue == CheckState.Checked) + if (e.NewValue == CheckState.Checked) { - e.NewValue = CheckState.Checked; + if (MatchList.CheckedItems == null) return; + foreach (ListViewItem item in MatchList.CheckedItems) + if (item.Index != e.Index) + item.Checked = false; } } private void MatchList_ItemChecked(object sender, ItemCheckedEventArgs e) { - if (e.Item.Checked == true) - { - FileItem file = GetSelectedFileItem(); - if (file == null) - return; + if (e.Item.Checked == false) return; - FileInfo info = (FileInfo)e.Item.Tag; - file.FileInfoFavourite = info; - LaunchURLButton.Enabled = true; - btnSaveSearch.Enabled = true; - FileList.FocusedItem.SubItems[1].Text = String.Format("best: {0}%", file.FileInfoFavourite.RelevanceNorm); - } + FileItem file = GetSelectedFileItem(); + if (file == null) return; + + if (e.Item.Tag == null) return; + FileInfo info = e.Item.Tag as FileInfo; + if (info == null) return; + + file.FileInfoFavourite = info; + LaunchURLButton.Enabled = true; + btnSaveSearch.Enabled = true; + FileList.FocusedItem.SubItems[1].Text = String.Format("best: {0}%", file.FileInfoFavourite.RelevanceNorm); } } } Modified: trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.resx =================================================================== --- trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.resx 2007-05-31 17:05:39 UTC (rev 14770) +++ trunk/mediaportal/WindowPlugins/GUIPrograms/FileInfoScraperForm.resx 2007-05-31 17:44:56 UTC (rev 14771) @@ -124,35 +124,35 @@ <data name="uncheckAllButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> Qk0GAwAAAAAAADYAAAAoAAAADwAAAA8AAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA//////// - ////////////////////////////////////////////////////29uy////////gVIdgVIdgVIdgVId - gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVId29uy////////gVId7/Hx8fPz9PX19vf3+Pn5+vv7/P39 - /v7+////////////gVId29uy////////gVId7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39/v7+//////// - gVId29uy////////gVId6ezs7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39/v7+////gVId29uy//////// - gVId5ejo6ezs7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39/v7+gVId29uy////////gVId4uXl5ejo6ezs - 7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39gVId29uy////////gVId3uLi4uXl5ejo6ezs7O/v7/Hx8fPz - 9PX19vf3+Pn5+vv7gVId29uy////////gVId2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPz9PX19vf3+Pn5 - gVId29uy////////gVId2d7e2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPz9PX19vf3gVId29uy//////// - gVId19zc2d7e2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPz9PX1gVId29uy////////gVId19zc19zc2d7e - 2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPzgVId29uy////////gVId19zc19zc19zc2d7e2+Dg3uLi4uXl - 5ejo6ezs7O/v7/HxgVId29uy////////gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVId - gVId29uy////////////////////////////////////////////////////////////29uy + ////////////////////////////////////////////////////AAAA////////gVIdgVIdgVIdgVId + gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdAAAA////////gVId7/Hx8fPz9PX19vf3+Pn5+vv7/P39 + /v7+////////////gVIdAAAA////////gVId7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39/v7+//////// + gVIdAAAA////////gVId6ezs7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39/v7+////gVIdAAAA//////// + gVId5ejo6ezs7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39/v7+gVIdAAAA////////gVId4uXl5ejo6ezs + 7O/v7/Hx8fPz9PX19vf3+Pn5+vv7/P39gVIdAAAA////////gVId3uLi4uXl5ejo6ezs7O/v7/Hx8fPz + 9PX19vf3+Pn5+vv7gVIdAAAA////////gVId2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPz9PX19vf3+Pn5 + gVIdAAAA////////gVId2d7e2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPz9PX19vf3gVIdAAAA//////// + gVId19zc2d7e2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPz9PX1gVIdAAAA////////gVId19zc19zc2d7e + 2+Dg3uLi4uXl5ejo6ezs7O/v7/Hx8fPzgVIdAAAA////////gVId19zc19zc19zc2d7e2+Dg3uLi4uXl + 5ejo6ezs7O/v7/HxgVIdAAAA////////gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVId + gVIdAAAA////////////////////////////////////////////////////////////AAAA </value> </data> <data name="checkAllButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> Qk0GAwAAAAAAADYAAAAoAAAADwAAAA8AAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA//////// - ////////////////////////////////////////////////////29uy////////gVIdgVIdgVIdgVId - gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVId29uy////////gVId8fPz8/X19vf3+Pn5+fr6+/z8/f39 - /v7+////////////gVId29uy////////gVId7/Hx8fPz8/X19vf3+Pn5+fr6+/z8/f39/v7+//////// - gVId29uy////////gVId7O/v7/Hx8fPz8/X1IqEi+Pn5+fr6+/z8/f39/v7+////gVId29uy//////// - gVId6ezs7O/v7/HxIqEiIqEiIqEi+Pn5+fr6+/z8/f39/v7+gVId29uy////////gVId5urq6ezsIqEi - IqEiIqEiIqEiIqEi+Pn5+fr6+/z8/f39gVId29uy////////gVId4+fn5urqIqEiIqEi7/HxIqEiIqEi - IqEi+Pn5+fr6+/z8gVId29uy////////gVId4eXl4+fnIqEi6ezs7O/v7/HxIqEiIqEiIqEi+Pn5+fr6 - gVId29uy////////gVId3+Pj4eXl4+fn5urq6ezs7O/v7/HxIqEiIqEi9vf3+Pn5gVId29uy//////// - gVId3eLi3+Pj4eXl4+fn5urq6ezs7O/v7/HxIqEi8/X19vf3gVId29uy////////gVId3eLi3eLi3+Pj - 4eXl4+fn5urq6ezs7O/v7/Hx8fPz8/X1gVId29uy////////gVId3eLi3eLi3eLi3+Pj4eXl4+fn5urq - 6ezs7O/v7/Hx8fPzgVId29uy////////gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVId - gVId29uy////////////////////////////////////////////////////////////29uy + ////////////////////////////////////////////////////AAAA////////gVIdgVIdgVIdgVId + gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdAAAA////////gVId8fPz8/X19vf3+Pn5+fr6+/z8/f39 + /v7+////////////gVIdAAAA////////gVId7/Hx8fPz8/X19vf3+Pn5+fr6+/z8/f39/v7+//////// + gVIdAAAA////////gVId7O/v7/Hx8fPz8/X1IqEi+Pn5+fr6+/z8/f39/v7+////gVIdAAAA//////// + gVId6ezs7O/v7/HxIqEiIqEiIqEi+Pn5+fr6+/z8/f39/v7+gVIdAAAA////////gVId5urq6ezsIqEi + IqEiIqEiIqEiIqEi+Pn5+fr6+/z8/f39gVIdAAAA////////gVId4+fn5urqIqEiIqEi7/HxIqEiIqEi + IqEi+Pn5+fr6+/z8gVIdAAAA////////gVId4eXl4+fnIqEi6ezs7O/v7/HxIqEiIqEiIqEi+Pn5+fr6 + gVIdAAAA////////gVId3+Pj4eXl4+fn5urq6ezs7O/v7/HxIqEiIqEi9vf3+Pn5gVIdAAAA//////// + gVId3eLi3+Pj4eXl4+fn5urq6ezs7O/v7/HxIqEi8/X19vf3gVIdAAAA////////gVId3eLi3eLi3+Pj + 4eXl4+fn5urq6ezs7O/v7/Hx8fPz8/X1gVIdAAAA////////gVId3eLi3eLi3eLi3+Pj4eXl4+fn5urq + 6ezs7O/v7/Hx8fPzgVIdAAAA////////gVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVIdgVId + gVIdAAAA////////////////////////////////////////////////////////////AAAA </value> </data> <metadata name="menuFileList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |