public static StandardResult postBarnesNoble(BarnesDto bnDto) { using (WebClient webClient = new WebClient()) { webClient.Headers["Content-type"] = "application/json"; var memoryStream = new MemoryStream(); var serializedJson = new DataContractJsonSerializer(typeof(BarnesDto)); serializedJson.WriteObject(memoryStream, bnDto); var uri = new Uri(@"http://apps.apprendacloud.com/api/services/json/r/bookcavetest(v1)/BookService/IBook/books"); byte[] res1 = webClient.UploadData(uri.ToString(), "POST", memoryStream.ToArray()); StandardResult stdres = standardResult(res1, bnDto.Isbn13); return stdres; } }
public ResultDto PostBarnesData(BarnesDto barnesDto) { ResultDto result = new ResultDto { ResultDescription = "" }; using (var context = new BookcaveEntities()) { var bookRecords = context.Database.SqlQuery<BookRecord>("Select * from BookRecords where Isbn13 = {0}", barnesDto.Isbn13); if (bookRecords.FirstOrDefault() == null) return new ResultDto { ResultDescription = "no general info exists yet for " + barnesDto.Isbn13 }; var ratingRecords = context.Database.SqlQuery<RatingRecord>("Select * from RatingRecords where Isbn13 = {0}", barnesDto.Isbn13); RatingRecord currentRatingRecord = null; if (ratingRecords.Count() > 0) currentRatingRecord = ratingRecords.FirstOrDefault(); Mapper.CreateMap<BarnesDto, RatingRecord>(); if (currentRatingRecord != null) { var modifiedRatingRecord = Mapper.Map<BarnesDto, RatingRecord>(barnesDto, currentRatingRecord); context.Database.ExecuteSqlCommand("update RatingRecords set BarnesAvg={0} where Isbn13={1}", barnesDto.BarnesAvg, barnesDto.Isbn13); result.ResultDescription += barnesDto.Isbn13 + " ratings updated "; } else { var newRatingRecord = Mapper.Map<BarnesDto, RatingRecord>(barnesDto); context.RatingRecords.Add(newRatingRecord); result.ResultDescription += barnesDto.Isbn13 + " ratings added "; } var contentRecords = context.Database.SqlQuery<ContentRecord>("Select * from ContentRecords where Isbn13 = {0}", barnesDto.Isbn13); ContentRecord currentContentRecord = null; if (contentRecords.Count() > 0) currentContentRecord = contentRecords.FirstOrDefault(); Mapper.CreateMap<BarnesDto, ContentRecord>(); if (currentContentRecord != null) { var modifiedContentRecord = Mapper.Map(barnesDto, currentContentRecord); var averageContentAge = DataFunctions.GetAverageContentAge(modifiedContentRecord); context.Database.ExecuteSqlCommand ( "update ContentRecords set BarnesAgeYoung={0},BarnesAgeOld={1},AverageContentAge={2} where Isbn13={3}", barnesDto.BarnesAgeYoung, barnesDto.BarnesAgeOld, averageContentAge, barnesDto.Isbn13 ); context.SaveChanges(); result.ResultDescription += barnesDto.Isbn13 + " contents updated"; } else { var newContentRecord = Mapper.Map<BarnesDto, ContentRecord>(barnesDto); newContentRecord.AverageContentAge = DataFunctions.GetAverageContentAge(newContentRecord); context.ContentRecords.Add(newContentRecord); context.SaveChanges(); result.ResultDescription += barnesDto.Isbn13 + " contents added"; } //try //{ //} //catch (DbUpdateException e) //{ // Console.WriteLine("book metadata wasn't found in primary table."); // return new ResultDto { ResultDescription = e.Message }; //} } return result; }
public static List<StandardResult> getbndata(List<string> isbns, string action = "post") { List<StandardResult> resultlist = new List<StandardResult>(); // for each isbn, get info from bn.com using (WebClient client = new WebClient()) { foreach (string isbn in isbns) { BarnesDto bndata = new BarnesDto(); bndata.Isbn13 = isbn; //create url for bn with incoming isbn string url = "http://www.barnesandnoble.com/s/" + isbn + "?store=book&keyword=" + isbn; //add user agent client.Headers.Add("user-agent", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"); string html = client.DownloadString(url); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); //parse through the html HtmlAgilityPack.HtmlNode ratingnode = doc.DocumentNode.SelectSingleNode("//span[@class='starDisplay']"); try { HtmlAgilityPack.HtmlNode starnode = ratingnode.SelectSingleNode("//span/span[1]"); string ratingstring = starnode.GetAttributeValue("title", "attribute not found"); // if rating is found, string will be "Average rating of 4.33333 out of 5 stars" // exception cases: "attribute not found", or "No rating data available yet" if (ratingstring != "attribute not found" && ratingstring != "No rating data available yet") { string rPattern = "(\\d+(?:\\.\\d*)?|\\.\\d+)"; Match rMatch = Regex.Match(ratingstring, rPattern); string rating = rMatch.Value; bndata.BarnesAvg = double.Parse(rating) * .02; } } catch { } // get Product Details node, searching for Age Range HtmlAgilityPack.HtmlNodeCollection detailsnode = doc.DocumentNode.SelectNodes("//div[@class='product-details box']/ul/li"); try { foreach (HtmlAgilityPack.HtmlNode detailnode in detailsnode) { //check through details nodes searching for <span>Age range: </span> //the text node which follows is the age range string agerangestring = "no age range found"; string tPattern = "Age range"; Match tMatch = Regex.Match(detailnode.InnerHtml, tPattern); if (tMatch.Success) { agerangestring = detailnode.InnerHtml; string arPattern = "(\\d+)"; MatchCollection arMatches = Regex.Matches(agerangestring, arPattern); if (arMatches.Count > 0) { bndata.BarnesAgeYoung = byte.Parse(arMatches[0].Value); } if (arMatches.Count > 1) { bndata.BarnesAgeOld = byte.Parse(arMatches[1].Value); } } } } catch { } StandardResult result = new StandardResult(); if (action == "post" || action == "both") { //post new csmdata to BookCaveSvc result = BookCaveSvc.postBarnesNoble(bndata); } if (action == "loaddb" || action == "both") { string msg = loadbndata(bndata); if (result.isbn13 == null) { result.isbn13 = bndata.Isbn13; result.message = msg; } else { string postmsg = result.message; result.message = postmsg + " " + msg; } } resultlist.Add(result); } } return resultlist; }
public static string loadbndata(BarnesDto bndata) { string msg = "(Unable to load to local db)"; // receive bndata, load to database try { using (LexileTitlesEntities lr = new LexileTitlesEntities()) { List<BarnesAndNoble> existing = new List<BarnesAndNoble>(from b in lr.BarnesAndNobles where b.Isbn13 == bndata.Isbn13 select b); if (existing.Count == 0) { // create new BarnesAndNoble BarnesAndNoble bn = new BarnesAndNoble(); bn.Isbn13 = bndata.Isbn13; bn.AgeHigh = bndata.BarnesAgeOld; bn.AgeLow = bndata.BarnesAgeYoung; bn.Rating = (decimal)bndata.BarnesAvg; lr.BarnesAndNobles.Add(bn); lr.SaveChanges(); msg = "(Loaded new BN to DB)"; } else { // update fields on existing BarnesAndNoble existing[0].AgeHigh = bndata.BarnesAgeOld; existing[0].AgeLow = bndata.BarnesAgeYoung; existing[0].Rating = (decimal)bndata.BarnesAvg; lr.SaveChanges(); msg = "(Updated existing BN in DB)"; } } } catch { } return msg; }
public static List<StandardResult> postBarnesNoble(List<BarnesAndNoble> bns) { List<StandardResult> resultset = new List<StandardResult>(); foreach (BarnesAndNoble bn in bns) { // map bn to BarnesDto var bnDto = new BarnesDto(); bnDto.Isbn13 = bn.Isbn13; bnDto.BarnesAvg = (double?)bn.Rating; bnDto.BarnesAgeYoung = (byte)bn.AgeLow; bnDto.BarnesAgeOld = (byte)bn.AgeHigh; using (WebClient webClient = new WebClient()) { webClient.Headers["Content-type"] = "application/json"; var memoryStream = new MemoryStream(); var serializedJson = new DataContractJsonSerializer(typeof(BarnesDto)); serializedJson.WriteObject(memoryStream, bnDto); var uri = new Uri(@"http://apps.apprendacloud.com/api/services/json/r/bookcavetest(v1)/BookService/IBook/books"); byte[] res1 = webClient.UploadData(uri.ToString(), "POST", memoryStream.ToArray()); StandardResult stdres = standardResult(res1, bnDto.Isbn13); resultset.Add(stdres); } } return resultset; }
public void PostBarnesData() { // Create an instance of StreamReader to read from a file. // The using statement also closes the StreamReader. using (var sr = new StreamReader(@"C:\Users\tiliska\Documents\bn-sample.csv")) { string svLine; // Read and display lines from the file until the end of // the file is reached. using (var webClient = new WebClient()) { while ((svLine = sr.ReadLine()) != null) { var barnesNobleData = svLine.Split(','); var barnesDto = new BarnesDto(); var isbn13 = barnesNobleData[0]; barnesDto.Isbn13 = isbn13; try { var ageLow = Convert.ToByte(barnesNobleData[1]); barnesDto.BarnesAgeYoung = ageLow; var ageHigh = Convert.ToByte(barnesNobleData[2]); barnesDto.BarnesAgeOld = ageHigh; var rating = Convert.ToDouble(barnesNobleData[3]); barnesDto.BarnesAvg = rating; } catch (FormatException) { Console.WriteLine("data in csv aren't valid"); } if (post) { var sourceCode = "barnes"; if (useCloud) uri = new Uri(cloudUrl + sourceCode); else uri = new Uri(localUrl + sourceCode); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); webClient.Headers["Content-type"] = "application/json"; var memoryStream = new MemoryStream(); var serializedJson = new DataContractJsonSerializer(typeof(BarnesDto)); serializedJson.WriteObject(memoryStream, barnesDto); byte[] res1 = webClient.UploadData(uri.ToString(), "POST", memoryStream.ToArray()); try { } catch (WebException) { Console.WriteLine(barnesDto.Isbn13 + " has no general data"); } } else { var service = new BookService(); service.PostBarnesData(barnesDto); try { } catch (Exception) { } } }//while }//using }//using }