fix(metadata): read proper description field for LubimyCzytac#877
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository YAML (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📜 Recent review details🧰 Additional context used🔀 Multi-repo context grimmory-tools/grimmory-docsFindings for grimmory-tools/grimmory-docs
Conclusion: Documentation already expects a "description" field from LubimyCzytac and warns about scraping fragility. The parser change to target "#book-description" aligns with docs and appears not to require changes in docs or other repos. 📝 WalkthroughWalkthroughBook description extraction now targets Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~18 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
343a5f9 to
d3d9139
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java (2)
185-187: Brittle exact-length assertion may fight future fixture maintenance.
assertEquals(827, result.getDescription().length())couples the test to the precise whitespace/HTML structure ofexample-book.html. Any unrelated trim/normalize change in the parser (or a fixture re-save that touches whitespace) will require updating the magic number. Consider replacing with a loose lower-bound check (e.g.,assertTrue(result.getDescription().length() > 500)) plus the existing prefix assertion, which is what the comment "in the right ballpark" suggests anyway.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java` around lines 185 - 187, The test in LubimyCzytacParserTest is too brittle because it asserts an exact description length with assertEquals(827, result.getDescription().length()); change this to a loose bound check to tolerate harmless whitespace/HTML changes: remove or replace the assertEquals on result.getDescription().length() with an assertion like assertTrue(result.getDescription().length() > 500) (or another sensible lower bound) while keeping the existing prefix check assertEquals("Jedno z najoryginalniejszych", result.getDescription().substring(0, 28)) to ensure content is in the right ballpark.
191-195: Replaceassertwith an explicit null check.JVM assertions are off by default; if
lubimyczytac/example-search.htmlorlubimyczytac/example-book.htmlis ever missing from the test classpath, you'll get a confusing NPE onis.readAllBytes()rather than a clear failure pointing at the missing fixture. Surefire typically enables-ea, but relying on that is fragile — preferObjects.requireNonNull(is, filename)or an explicitthrow new FileNotFoundException(filename).🔧 Proposed fix
private String readResourceFile(String filename) throws IOException { try (InputStream is = getClass().getClassLoader().getResourceAsStream(filename)) { - assert is != null; - - return new String(is.readAllBytes()); + if (is == null) { + throw new IOException("Test fixture not found on classpath: " + filename); + } + return new String(is.readAllBytes(), StandardCharsets.UTF_8); } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java` around lines 191 - 195, Replace the fragile JVM assertion in the resource-loading block with an explicit null check: in the method that reads the test fixture (where InputStream is = getClass().getClassLoader().getResourceAsStream(filename) is used in LubimyCzytacParserTest), detect if is == null and throw a clear exception (e.g., new FileNotFoundException(filename) or use Objects.requireNonNull(is, filename)) before calling is.readAllBytes(), so missing test resources produce an explicit, informative failure rather than a NPE.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java`:
- Around line 190-196: The readResourceFile method in LubimyCzytacParserTest
uses new String(is.readAllBytes()) which relies on the platform default charset;
change it to decode bytes explicitly as UTF-8 (e.g., use new
String(is.readAllBytes(), StandardCharsets.UTF_8) or wrap the stream in an
InputStreamReader/BufferedReader with StandardCharsets.UTF_8) so the Polish HTML
fixture is read deterministically; update imports to include StandardCharsets if
needed and keep the method signature and exception behavior unchanged.
---
Nitpick comments:
In
`@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java`:
- Around line 185-187: The test in LubimyCzytacParserTest is too brittle because
it asserts an exact description length with assertEquals(827,
result.getDescription().length()); change this to a loose bound check to
tolerate harmless whitespace/HTML changes: remove or replace the assertEquals on
result.getDescription().length() with an assertion like
assertTrue(result.getDescription().length() > 500) (or another sensible lower
bound) while keeping the existing prefix check assertEquals("Jedno z
najoryginalniejszych", result.getDescription().substring(0, 28)) to ensure
content is in the right ballpark.
- Around line 191-195: Replace the fragile JVM assertion in the resource-loading
block with an explicit null check: in the method that reads the test fixture
(where InputStream is =
getClass().getClassLoader().getResourceAsStream(filename) is used in
LubimyCzytacParserTest), detect if is == null and throw a clear exception (e.g.,
new FileNotFoundException(filename) or use Objects.requireNonNull(is, filename))
before calling is.readAllBytes(), so missing test resources produce an explicit,
informative failure rather than a NPE.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: 812a3b51-2ee3-4437-a21b-f273c03a4ed1
📒 Files selected for processing (4)
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.javabackend/src/test/resources/lubimyczytac/example-book.htmlbackend/src/test/resources/lubimyczytac/example-search.html
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
- GitHub Check: Test Suite / Backend Tests
- GitHub Check: Test Suite / Frontend Tests
- GitHub Check: Analyze (javascript-typescript)
- GitHub Check: Analyze (java-kotlin)
- GitHub Check: Frontend Lint Threshold Check
🧰 Additional context used
📓 Path-based instructions (2)
backend/src/**/*.java
📄 CodeRabbit inference engine (AGENTS.md)
backend/src/**/*.java: Use 4-space indentation and match surrounding Java style in backend code
Prefer constructor injection via Lombok patterns already used in the codebase. Do not introduce@Autowiredfield injection in backend code
Use MapStruct for entity/DTO mapping in backend code
Keep JPA entities on the *Entity suffix in backend code
Files:
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
backend/src/test/**/*.java
📄 CodeRabbit inference engine (AGENTS.md)
Prefer focused unit tests; use
@SpringBootTestonly when the Spring context is required in backend code
Files:
backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
🧠 Learnings (2)
📚 Learning: 2026-04-10T08:15:37.436Z
Learnt from: imnotjames
Repo: grimmory-tools/grimmory PR: 449
File: booklore-api/src/main/java/org/booklore/service/book/BookDownloadService.java:139-145
Timestamp: 2026-04-10T08:15:37.436Z
Learning: When using Spring `ContentDisposition.builder(...).filename(name, StandardCharsets.UTF_8).build()` (i.e., explicitly providing UTF-8), the resulting header value should include both the quoted `filename="=?UTF-8?..."` and the RFC 5987 `filename*=` parameters. In this case, any extra ASCII fallback computation (e.g., deriving an ASCII `fallbackFilename` via `NON_ASCII_PATTERN` and calling `.filename(fallbackFilename)`) is likely redundant—prefer calling only `.filename(fallbackName?, StandardCharsets.UTF_8)` as appropriate and let Spring handle the UTF-8 header parameters. Verify by comparing the emitted header for `filename` and `filename*` before deciding to keep an ASCII fallback.
Applied to files:
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
📚 Learning: 2026-04-14T12:43:08.698Z
Learnt from: balazs-szucs
Repo: grimmory-tools/grimmory PR: 502
File: booklore-api/src/main/java/org/booklore/service/reader/ChapterCacheService.java:0-0
Timestamp: 2026-04-14T12:43:08.698Z
Learning: For this codebase (booklore-api), target Java 25 with `--enable-preview`, so `_` is intentionally used as an unnamed/ignored variable (e.g., lambda parameter or pattern variable) per Java’s preview feature JEP 456. Do not flag `_` in those contexts as an invalid/reserved identifier; only flag it if it’s used in a non-supported position (e.g., where an unnamed variable is not applicable for the Java preview rules).
Applied to files:
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
🔀 Multi-repo context grimmory-tools/grimmory-docs
Findings
grimmory-tools/grimmory-docs
-
docs/metadata/lubimyczytac.md — provider guide describing fields returned (title, authors, description, cover image, publisher, published date, page count, language, ISBNs, categories, tags, series), notes that LubimyCzytac has no API and Grimmory uses web scraping which "may occasionally break if the LubimyCzytac website structure changes." [::grimmory-tools/grimmory-docs::docs/metadata/lubimyczytac.md]
-
docs/metadata/metadata-settings.md — lists Lubimyczytac as a provider and mentions Lubimyczytac ID and Rating as metadata fields. [::grimmory-tools/grimmory-docs::docs/metadata/metadata-settings.md]
-
docs/metadata/metadata-fetch-configuration.md — references Lubimyczytac in provider lists and fetch configuration. [::grimmory-tools/grimmory-docs::docs/metadata/metadata-fetch-configuration.md]
-
docs/magic-shelf.md — includes lubimyczytacRating and lubimyczytacId among metadata keys used in UI/configuration. [::grimmory-tools/grimmory-docs::docs/magic-shelf.md]
Relevance
- Documentation explicitly documents that Grimmory scrapes LubimyCzytac and warns that site structure changes can break parsing; this PR fixing the selector from ".collapse-content" to "#book-description" aligns with that risk and should be reflected in docs/known-issues if desired. [::grimmory-tools/grimmory-docs::docs/metadata/lubimyczytac.md]
🔇 Additional comments (2)
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.java (1)
235-241: Selector change LGTM — targeted ID is more robust than the previous class.Switching to
#book-descriptioncorrectly addresses the issue where.collapse-contentwas the first match for review content rather than the book description. The surrounding null/blank guards remain intact, so behavior on missing elements is preserved. Worth noting (per linked docs warning that LubimyCzytac scraping "may occasionally break if the LubimyCzytac website structure changes") that an ID-based selector is also more stable than a generic class selector.backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java (1)
198-212: The static-mock pattern is safe — the parser's call path is fully mocked.The parser invokes only
Jsoup.connect(url).userAgent(...).timeout(...).get()(lines 151–154) with no direct calls toJsoup.parse()or other static methods. The test mocks the entire chain (mockConnectionforuserAgent,timeout, andget), andConnection.get()returns a pre-builtDocument, so no internal re-parsing can occur. The explicit mock ofJsoup.parse(response)withthenCallRealMethod()is only used by the test itself (line 208), not by the parser. Jsoup 1.22.2 confirms the API surface matches the mocking strategy.
it seems the description field has changed and now can be targeted with an ID attribute instead. without this, the retrieval was pulling a review for the description.
d3d9139 to
04c0077
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (2)
backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java (2)
146-153: MismatchedBook.titlevs. request title is confusing.
Bookis built with"Wiedźmin"while theFetchMetadataRequestuses"Sklepy cynamonowe". The parser drives its search off the request title, so the test still works, but the leftover"Wiedźmin"reads like a copy/paste from earlier iterations and could mislead future readers debugging the fixture flow.✏️ Proposed cleanup
Book book = Book.builder() - .title("Wiedźmin") + .title("Sklepy cynamonowe") .build();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java` around lines 146 - 153, In LubimyCzytacParserTest update the test fixture so the Book's title matches the FetchMetadataRequest title to avoid confusion: change the Book built via Book.builder().title("Wiedźmin") to use the same title string as the request (e.g., "Sklepy cynamonowe") or otherwise use a clearly labeled placeholder; ensure the variables referenced (Book.builder(), the Book instance, and FetchMetadataRequest.builder() / request) are consistent so readers see that the parser is driven by request.title.
198-212: Reusing a single parsedDocumentacross all book-detail fetches.
mockResponseparsesresponseonce and stubsmockConnection.get()to always return that sameDocumentinstance. InparseBookDetails, the loop infetchMetadatainvokesfetchWithRetryfor every URL returned from search, so every iteration receives the sameDocument. That works for the current single-result assertions, but:
resultswill contain duplicates (one per search hit, capped atMAX_RESULTS), which is misleading if anyone later asserts onresults.size().- Jsoup's
Documentis mutable; if any future parser logic mutates the DOM (e.g.,.remove(),.unwrap()), state would leak across iterations and tests.Consider parsing the fixture fresh on each
get()call (e.g., have the stub returnJsoup.parse(response)lazily viathenAnswer) so each invocation gets an independentDocument.♻️ Proposed refactor
- // There may be a better way to get the parse to work here. - // However, this was the quickest and simplest way I could find. - mockJsoup.when(() -> Jsoup.parse(response)).thenCallRealMethod(); - Document document = Jsoup.parse(response); - - when(mockConnection.get()).thenReturn(document); + // Re-parse on each call so iterations don't share mutable DOM state. + mockJsoup.when(() -> Jsoup.parse(response)).thenCallRealMethod(); + when(mockConnection.get()).thenAnswer(inv -> Jsoup.parse(response));🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java` around lines 198 - 212, The test reuses a single mutable Jsoup Document by stubbing mockConnection.get() to always return the same parsed instance in mockResponse, causing duplicated/tainted state across fetchWithRetry iterations invoked by fetchMetadata/parseBookDetails; change the stub to lazily return a fresh parse each call (replace when(mockConnection.get()).thenReturn(document) with a thenAnswer that returns Jsoup.parse(response) on each invocation) and remove or adjust the earlier mockJsoup.parse stubbing so each get() yields an independent Document.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In
`@backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java`:
- Around line 146-153: In LubimyCzytacParserTest update the test fixture so the
Book's title matches the FetchMetadataRequest title to avoid confusion: change
the Book built via Book.builder().title("Wiedźmin") to use the same title string
as the request (e.g., "Sklepy cynamonowe") or otherwise use a clearly labeled
placeholder; ensure the variables referenced (Book.builder(), the Book instance,
and FetchMetadataRequest.builder() / request) are consistent so readers see that
the parser is driven by request.title.
- Around line 198-212: The test reuses a single mutable Jsoup Document by
stubbing mockConnection.get() to always return the same parsed instance in
mockResponse, causing duplicated/tainted state across fetchWithRetry iterations
invoked by fetchMetadata/parseBookDetails; change the stub to lazily return a
fresh parse each call (replace when(mockConnection.get()).thenReturn(document)
with a thenAnswer that returns Jsoup.parse(response) on each invocation) and
remove or adjust the earlier mockJsoup.parse stubbing so each get() yields an
independent Document.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: 5c087d43-bf85-413a-8830-2d88a857cf2f
📒 Files selected for processing (4)
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.javabackend/src/test/resources/lubimyczytac/example-book.htmlbackend/src/test/resources/lubimyczytac/example-search.html
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Analyze (java-kotlin)
- GitHub Check: Test Suite / Backend Tests
🧰 Additional context used
📓 Path-based instructions (2)
backend/src/**/*.java
📄 CodeRabbit inference engine (AGENTS.md)
backend/src/**/*.java: Use 4-space indentation and match surrounding Java style in backend code
Prefer constructor injection via Lombok patterns already used in the codebase. Do not introduce@Autowiredfield injection in backend code
Use MapStruct for entity/DTO mapping in backend code
Keep JPA entities on the *Entity suffix in backend code
Files:
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
backend/src/test/**/*.java
📄 CodeRabbit inference engine (AGENTS.md)
Prefer focused unit tests; use
@SpringBootTestonly when the Spring context is required in backend code
Files:
backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
🧠 Learnings (3)
📚 Learning: 2026-04-10T08:15:37.436Z
Learnt from: imnotjames
Repo: grimmory-tools/grimmory PR: 449
File: booklore-api/src/main/java/org/booklore/service/book/BookDownloadService.java:139-145
Timestamp: 2026-04-10T08:15:37.436Z
Learning: When using Spring `ContentDisposition.builder(...).filename(name, StandardCharsets.UTF_8).build()` (i.e., explicitly providing UTF-8), the resulting header value should include both the quoted `filename="=?UTF-8?..."` and the RFC 5987 `filename*=` parameters. In this case, any extra ASCII fallback computation (e.g., deriving an ASCII `fallbackFilename` via `NON_ASCII_PATTERN` and calling `.filename(fallbackFilename)`) is likely redundant—prefer calling only `.filename(fallbackName?, StandardCharsets.UTF_8)` as appropriate and let Spring handle the UTF-8 header parameters. Verify by comparing the emitted header for `filename` and `filename*` before deciding to keep an ASCII fallback.
Applied to files:
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
📚 Learning: 2026-04-14T12:43:08.698Z
Learnt from: balazs-szucs
Repo: grimmory-tools/grimmory PR: 502
File: booklore-api/src/main/java/org/booklore/service/reader/ChapterCacheService.java:0-0
Timestamp: 2026-04-14T12:43:08.698Z
Learning: For this codebase (booklore-api), target Java 25 with `--enable-preview`, so `_` is intentionally used as an unnamed/ignored variable (e.g., lambda parameter or pattern variable) per Java’s preview feature JEP 456. Do not flag `_` in those contexts as an invalid/reserved identifier; only flag it if it’s used in a non-supported position (e.g., where an unnamed variable is not applicable for the Java preview rules).
Applied to files:
backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.javabackend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
📚 Learning: 2026-04-23T14:49:01.089Z
Learnt from: balazs-szucs
Repo: grimmory-tools/grimmory PR: 790
File: backend/src/main/java/org/booklore/nativelib/NativeLibraries.java:71-77
Timestamp: 2026-04-23T14:49:01.089Z
Learning: In grimmory-tools/grimmory, the `catch (Throwable)` in `NativeLibraries.runProbe()` (`backend/src/main/java/org/booklore/nativelib/NativeLibraries.java`) is intentional design: any failure during native library probing (including fatal JVM errors) is treated as "library unavailable" rather than propagating. Do not flag this as an issue in future reviews.
Applied to files:
backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java
🔀 Multi-repo context grimmory-tools/grimmory-docs
Findings for grimmory-tools/grimmory-docs
-
docs/metadata/lubimyczytac.md documents LubimyCzytac as a provider, lists description as one of the returned fields, and explicitly warns that Grimmory uses web scraping and that parsing "may occasionally break if the LubimyCzytac website structure changes." This confirms docs already acknowledge fragility of HTML selectors and is relevant context for the parser selector change. [::grimmory-tools/grimmory-docs::docs/metadata/lubimyczytac.md]
-
docs/metadata/metadata-settings.md mentions Lubimyczytac provider fields (Lubimyczytac ID, Lubimyczytac Rating) and lists the provider among available metadata sources; no code-level consumers or references to specific DOM structure or selectors. [::grimmory-tools/grimmory-docs::docs/metadata/metadata-settings.md]
-
docs/magic-shelf.md references lubimyczytacRating and lubimyczytacId as metadata keys used for filtering; nothing depends on the parser's internal HTML selectors or description extraction specifics. [::grimmory-tools/grimmory-docs::docs/magic-shelf.md]
Conclusion: Documentation acknowledges scraping fragility and lists description as a provided field; no other repositories or docs appear to depend on the previous ".collapse-content" selector. The change in the parser (targeting "#book-description") is consistent with recorded risks in docs; you may optionally update docs/metadata/lubimyczytac.md to note the recent parser fix, but no cross-repo code changes are required.
🔇 Additional comments (2)
backend/src/test/java/org/booklore/service/metadata/parser/LubimyCzytacParserTest.java (1)
190-196: Specify UTF-8 explicitly when reading the HTML fixture.
new String(is.readAllBytes())decodes with the JVM default charset, which is platform-dependent. The Polish fixture contains UTF-8 multi-byte characters (ą/ę/ł/ź/ć), and a non-UTF-8 default will silently corrupt bytes and can flip thelength() == 827assertion or the substring comparison, producing flaky CI failures on contributor machines.🔧 Proposed fix
-import java.io.IOException; -import java.io.InputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets;private String readResourceFile(String filename) throws IOException { try (InputStream is = getClass().getClassLoader().getResourceAsStream(filename)) { assert is != null; - return new String(is.readAllBytes()); + return new String(is.readAllBytes(), StandardCharsets.UTF_8); } }backend/src/main/java/org/booklore/service/metadata/parser/LubimyCzytacParser.java (1)
235-241: LGTM — selector change correctly targets the description.Switching from
.collapse-contentto#book-descriptionaligns with the actual DOM structure (the fixture confirms the element is<div id="book-description" class="book__description ...">), so the parser will now return the book's description rather than review content. The surrounding null/blank guards are unchanged, so behavior degrades gracefully if the selector ever stops matching again.Worth noting (no change required here): the linked docs in
grimmory-tools/grimmory-docs(docs/metadata/lubimyczytac.md) already warn that LubimyCzytac scraping "may occasionally break if the LubimyCzytac website structure changes," so this is a known fragility class. Optionally, you could update those docs to mention the recent fix.
Description
it seems the description field has changed and now can be targeted with an ID attribute instead. without this, the retrieval was pulling a review for the description.
Linked Issue: Fixes #855
Changes
LubimyCzytacmetadata extractor to use the expected fieldSummary by CodeRabbit
Bug Fixes
Tests