public void PushExisting(MediaModel book) { //Push existing book to goodreads by editing review //Edit book review string shelf = ""; if (book.Status == "Completed") { shelf = "read"; } else if (book.Status == "In Progress") { shelf = "currently-reading"; } else if (book.Status == "Wish List") { shelf = "to-read"; } var putRequest = new RestRequest(string.Format("review/{0}.xml", book.GoodreadsReviewID), Method.POST); putRequest.AddParameter("id", book.GoodreadsReviewID); putRequest.AddParameter("review[rating]", book.Rating); //if (book.Date != "") putRequest.AddParameter("review[read_at]", book.Date); putRequest.AddParameter("shelf", shelf); var putResponse = Client.Execute(putRequest); //Edit shelf var postRequest = new RestRequest("shelf/add_to_shelf.xml", Method.POST); postRequest.AddParameter("book_id", book.GoodreadsBookID); postRequest.AddParameter("name", shelf); var postResponse = Client.Execute(postRequest); }
public (string bookID, string reviewID) PushNew(MediaModel book) { //Push new book to goodreads and return IDs to update local record //Search goodreads for book id and take top one var request = new RestRequest("search/index.xml", DataFormat.Xml); request.AddParameter("q", string.Format("{0} {1}", book.Creator, book.Title)); request.AddParameter("page", 1); request.AddParameter("key", DeveloperKey); request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer(); var response = Client.Execute <CatalogueSearch>(request); var deserialiser = new CustomXmlDeserialiser(); //Use custom deserialiser to handle non-escapted characters CatalogueSearch data = deserialiser.DeserializeRegEx <CatalogueSearch>(response); var bookID = data.search.results.work[0].bestBook.id; //Add book string shelf = ""; if (book.Status == "Completed") { shelf = "read"; } else if (book.Status == "In Progress") { shelf = "currently-reading"; } else if (book.Status == "Wish List") { shelf = "to-read"; } var postRequest = new RestRequest("review.xml", Method.POST); postRequest.AddParameter("book_id", bookID); if (book.Rating != 0) { postRequest.AddParameter("review[rating]", book.Rating); } //if (book.Date != "") postRequest.AddParameter("review[read_at]", book.Date); postRequest.AddParameter("shelf", shelf); var postResponse = Client.Execute <Review>(postRequest); string reviewID = postResponse.Data.id; return(bookID, reviewID); }
partial void AddMediaClicked(NSObject sender) { //Add media to database from user form //Create new media record and add to local database string media = AddMediaMedia.TitleOfSelectedItem; string title = AddMediaTitle.StringValue; string creator = AddMediaCreator.StringValue; string language = AddMediaLanguage.StringValue; int rating = AddMediaRating.IntValue; var dateTime = DateTime.Parse(AddMediaDate.DateValue.ToString()); string date = dateTime.ToString("dd-MM-yyyy"); string completion = AddMediaCompletion.TitleOfSelectedItem; var record = new MediaModel(media, title, creator, language, date, rating, completion); record.Edited = true; var conn = GetDatabaseConnection(); record.Create(conn); SearchMedia(); //refresh search }
public void SearchMedia() { //Search database for user query //Open database connection var conn = GetDatabaseConnection(); conn.Open(); var command = conn.CreateCommand(); //Get search string string field = SearchMediaField.TitleOfSelectedItem; string search = SearchMediaSearch.StringValue; command.CommandText = string.Format("SELECT * FROM media WHERE {0} LIKE '{1}';", field, search); //Get IDs of matching results SQLiteDataReader reader = command.ExecuteReader(); List <string> recordIDs = new List <string>(); while (reader.Read()) { string ID = reader.GetString(0); recordIDs.Add(ID); } conn.Close(); //Get media records and update table var DataSource = new MediaTableDataSource(); foreach (string ID in recordIDs) { var record = new MediaModel(); record.Load(conn, ID); DataSource.MediaRecords.Add(record); } MediaTable.DataSource = DataSource; MediaTable.Delegate = new MediaTableDelegate(this, DataSource); MediaTable.ReloadData(); }
public List <MediaModel> Pull(string shelf) { //Get all user books from goodreads account //Loop through record pages and extract books var books = new List <MediaModel>(); int page = 1; string endRecord, totalRecord; //Loop until pagination complete do { //Get list of user reviwers var request = new RestRequest(string.Format("review/list/{0}.xml", UserID), DataFormat.Xml); request.AddParameter("v", 2); request.AddParameter("id", UserID); request.AddParameter("shelf", shelf); request.AddParameter("page", page); request.AddParameter("per_page", 200); request.AddParameter("key", DeveloperKey); var response = ExecuteGetRequest <ShelfResponse>(request); //Loop over each review and convert to media foreach (Review review in response.Data.reviews.reviews) { //Extract book information string bookTitle = review.book.titleWithoutSeries; int bookRating = review.rating; string bookAuthor = ""; string bookDate = ""; foreach (ReviewAuthor reviewAuthor in review.book.authors) { bookAuthor += reviewAuthor.name; } try { string dateTmp = ""; for (int i = 0; i < review.readAt.Length; ++i) { if (i < 20 || i > 25) { dateTmp += review.readAt[i]; } } DateTime dt = DateTime.ParseExact(dateTmp, "ddd MMM dd HH:mm:ss yyyy", CultureInfo.InvariantCulture); bookDate = dt.ToString("dd-MM-yyyy"); } catch { bookDate = ""; } string GoodreadsBookID = review.book.id; string GoodreadsReviewID = review.id; string BookStatus = ""; if (shelf == "read") { BookStatus = "Completed"; } else if (shelf == "currently-reading") { BookStatus = "In Progress"; } else if (shelf == "to-read") { BookStatus = "Wish List"; } var book = new MediaModel("Book", bookTitle, bookAuthor, "", bookDate, bookRating, BookStatus, GoodreadsBookID, GoodreadsReviewID); books.Add(book); } endRecord = response.Data.reviews.end; totalRecord = response.Data.reviews.end; ++page; } while (endRecord != totalRecord); return(books); }
partial void GoodreadsSyncClicked(NSObject sender) { //Sync with goodreads account //Get sync options string syncType = GoodreadsSyncType.TitleOfSelectedItem; bool force; var conn = GetDatabaseConnection(); if (ForceSyncOption.State.ToString() == "On") { force = true; } else { force = false; } //Pull from goodreads if (syncType == "Pull") { //Pull completed books var pulledBooks = goodreads.Pull("read"); foreach (MediaModel Book in pulledBooks) { Book.Create(conn, force); } //Pull in progress books pulledBooks = goodreads.Pull("currently-reading"); foreach (MediaModel Book in pulledBooks) { Book.Create(conn, force); } //Pull wish list books pulledBooks = goodreads.Pull("to-read"); foreach (MediaModel Book in pulledBooks) { Book.Create(conn, force); } } //Push to goodreads else { //Push edited books to goodreads var editedBookIDs = new List <string>(); var editedBooks = new List <MediaModel>(); //Get IDs of edited books var command = conn.CreateCommand(); command.CommandText = string.Format("SELECT * FROM media WHERE media='Book' AND edited=1;"); conn.Open(); SQLiteDataReader reader = command.ExecuteReader(); while (reader.Read()) { string ID = reader.GetString(0); editedBookIDs.Add(ID); } conn.Close(); //Get edited books foreach (string ID in editedBookIDs) { var book = new MediaModel(); book.Load(conn, ID); editedBooks.Add(book); } //Push media foreach (MediaModel book in editedBooks) { //Add media without goodreads id if (book.GoodreadsBookID == "X") { var res = goodreads.PushNew(book); book.GoodreadsBookID = res.bookID; book.GoodreadsReviewID = res.reviewID; book.Edited = false; } //Add media with existing id else { goodreads.PushExisting(book); book.Edited = false; } } } SearchMedia(); //refresh search }