Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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
        }
Exemplo n.º 4
0
        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();
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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
        }