internetarchive / openlibrary

One webpage for every book ever published!
https://openlibrary.org
GNU Affero General Public License v3.0
5.11k stars 1.33k forks source link

Book Battles #8872

Open mekarpeles opened 6 months ago

mekarpeles commented 6 months ago

See: https://docs.google.com/document/d/1Ddeg-fWWZ0iCFzVtZR0yGY_vCPttIUrd4tCIWwvYj6g/edit#heading=h.hwsgbba3g9bn

Describe the problem that you'd like solved

OpenLibrary.org is a catalog of millions of books, which can make finding the best books challenging. A traditional approach is to give books star ratings or reviews, but (a) this creates floating point in space and (b) many books may have 5 star ratings so this gives readers a limited understanding of whether one book is better than another. Book Battles is a way for readers to collaboratively surface the best books by voting that one book may be better than another.

How does it work?

A reader adds books that they’ve read to the “Already Read” shelf of their Reading Log. The reader then selects two books from their Already Read shelf and creates a Book Battle. The reader chooses one of these two books to be the winner and optionally enters a short review explaining why.

Proposal & Constraints

Additional context

Stakeholders

QuantuM410 commented 6 months ago

Hey @mekarpeles! I am very interested to work on this project and would definitely love to give it a try. How should I continue and go about it :)

noobCoderVP commented 6 months ago

This looks a great idea!! It is basically like product comparing feature of amazon image

Something similar to above right? I would be happy to contribute such a nice feature, I can help up with the logical design part, @mekarpeles amazing idea!!

mekarpeles commented 6 months ago

I think the first step is for folks to propose ideas / designs / implementations.

A drawing might be useful about:

  1. what such a feature might look like on Open Library and
  2. what does the flow look like for using this feature? (e.g. figma, screenshots, or pencil/paper)

Open Questions:

The idea is to make this feature as simple as possible to still be useful. So it would be useful to separate out what is essential versus what would be fun into 2 different buckets!

noobCoderVP commented 6 months ago

Oh my bad, it is not like compare feature. I read your docs carefully now. We would need to create different clusters of book and battles between two books of the same cluster will only be allowed, if we already have the classification of books by their genre then we can use it. giving readers suggestions of filling battle based on the books they have read is also a requirement, we can show them as the pending battles but there can be a problem once the user has read more than a limit amount of books, after that user will have too many battles to fill in but I have an alternative idea where we can do it more efficiently

Instead of having one to one battle let us give user the opportunity to rank the book he has just read w.r.t other books of the same genre he read in past, let me explain with a diagram

image

suppose user have already read orange, banana and apple books, now he reads a book called mango and ranks it 3 rd, now using the rank what we can do is

  1. add a battle orange vs mango, make mango loose in the battle
  2. add two battles mango vs banana and mango vs apple, make mango win in the battle.

Using this strategy, we will have a better UI, UX experience for the readers and save their time. What do you think about this @mekarpeles?

noobCoderVP commented 6 months ago

Hey @mekarpeles, so which implementation do you think will work the best?

noobCoderVP commented 4 months ago

I would like to work on this issue under GSOC 2024

prasad14070 commented 3 months ago

Hi @mekarpeles

I hope you're well. I'm Prasad Bhujbal, and I'm excited about the "Book Battles" project on OpenLibrary.org. I believe this can significantly improve book discovery by allowing users to compare books directly.

I have experience in full stack web development, Application development, UI/UX design and would love to contribute. Specifically, I can help with:

Looking forward to contributing!

Best,
Prasad Bhujbal https://github.com/prasad14070

mekarpeles commented 3 months ago

Hi @prasad14070 feel free to join one of our upcoming community calls on Tuesday @ 9am PT https://zoom.us/j/369477551 if you'd like to learn more or discuss the feature. @noobCoderVP is currently leading development on this project and I'm sure there are opportunities for us to leverage your contributions. Thank you :)

mekarpeles commented 3 months ago

Possible schema:

superlatives
------------
superlative_id (Primary Key)
topic_id (Foreign Key to Topics)
submitter_id (Foreign Key to Patrons)
created_at
updated_at

superlative_criteria
--------------------
superlative_criteria_id (Primary Key)
superlative_id (Foreign Key to Superlatives)
criteria_id (Foreign Key to Criteria)

nominations
-----------
nomination_id (Primary Key)
superlative_id (Foreign Key to Superlatives)
submitter_id (Foreign Key)
winner_book_id
text_review
contestant_id (Nullable Foreign Key to Nominations, default NULL)
created_at
updated_at

This would allow us to factor out all our criteria for best book or a battle into a single data structure called superlatives. It would also allow us to treat bestbook and battles as the same because a nomination either has a contestant or it doesn't... If it doesn't then it's a best book. This also solves the problem that nominations always involve one book, but a patron can submit multiple nominations for a book so long as its (nomination_id, superlative_id, submitter_id, winner, contestant_id) is unique.