Skip to content

Epub downloaded with OPDS has commas in filename replaced with underscores #13973

Description

@puhtahtoe

Device

Kobo

KOReader version

2025.04

Model and firmware version

Kobo Libra Colour (Kernel Version: 4.9.77 Touch Firmware: 64dc /3937)

Issue description

When downloading a file through OPDS, commas in the filename are replaced with an underscore.

The download prompt in the OPDS menu:
Image

The file after download:
Image

Steps to reproduce

  1. Open OPDS plugin
  2. Select a book with commas in the title to download
  3. Observe that the download prompt shows a filename that contains commas
  4. Download the file
  5. Observe that the downloaded file has underscores where the commas used to be

Log

abridged log:


06/21/25-02:58:34 DEBUG Downloads available: {
  acquisitions = {
    {
      href = "http://192.168.1.202:9348/get/epub/277/books",
      type = "application/epub+zip"
    } --[[table: 0xb5232fa0]]
  } --[[table: 0xb5134160]],
  author = "Asimov, Isaac",
  content = "<div xmlns=\"http://www.w3.org/1999/xhtml\">Read: Yes<br />\nReading Status: Read<br /></div>\n    ",
  idx = 3,
  image = "http://192.168.1.202:9348/get/cover/277/books",
  text = "I, Robot (The Robot Series) - Asimov, Isaac",
  thumbnail = "http://192.168.1.202:9348/get/thumb/277/books",
  title = "I, Robot (The Robot Series)"
} --[[table: 0xb3a65c98]] 
06/21/25-02:58:34 DEBUG Filetype for download is 202:9348/get/epub/277/books 
06/21/25-02:58:34 DEBUG show widget: table: 0xb58df640 
06/21/25-02:58:34 DEBUG setDirty nil from widget table: 0xb58df640 w/ NO region; dithering: nil 
06/21/25-02:58:34 DEBUG setDirty via a func from widget table: 0xb58df640 
06/21/25-02:58:34 DEBUG painting widget: table: 0xb58df640 
06/21/25-02:58:34 DEBUG _refresh: Enqueued ui update for region 0 366 1264 889 dithering: false 
06/21/25-02:58:34 DEBUG triggering refresh {
  dither = false,
  mode = "ui",
  region = "1264x889+0+366"
} --[[table: 0xb514fc58]] 
06/21/25-02:58:34 DEBUG refresh: ui-mode 0 366 1264 889 false 
06/21/25-02:58:34 DEBUG mxc_update: 1264x912 region @ (0, 352) with marker 22 (WFM: 257 & UPD: 0) 
06/21/25-02:58:34 DEBUG refresh: wait for submission of marker 22 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: 1683, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 55 (ABS_MT_TOOL_TYPE), value: 0, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG key event => code: 330 (BTN_TOUCH), value: 1, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 48 (ABS_MT_TOUCH_MAJOR), value: 1632, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 58 (ABS_MT_PRESSURE), value: 1632, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 53 (ABS_MT_POSITION_X), value: 686, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 54 (ABS_MT_POSITION_Y), value: 700, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG input event => type: 0 (EV_SYN), code: 0 (SYN_REPORT), value: 0, time: 1750489116.330870 
06/21/25-02:58:36 DEBUG slot 0 in tap state... 
06/21/25-02:58:36 DEBUG set up hold timer 
06/21/25-02:58:36 DEBUG AutoSuspend: onInputEvent 
06/21/25-02:58:36 DEBUG MovableContainer:onMovableTouch {
  ges = "touch",
  pos = "0x0+700+993",
  time = 1750489116330870
} --[[table: 0xb5239b00]] 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: 1683, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 55 (ABS_MT_TOOL_TYPE), value: 0, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 48 (ABS_MT_TOUCH_MAJOR), value: 1632, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 58 (ABS_MT_PRESSURE), value: 1632, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 53 (ABS_MT_POSITION_X), value: 686, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 54 (ABS_MT_POSITION_Y), value: 700, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG input event => type: 0 (EV_SYN), code: 0 (SYN_REPORT), value: 0, time: 1750489116.344272 
06/21/25-02:58:36 DEBUG slot 0 in tap state... 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: 1683, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 55 (ABS_MT_TOOL_TYPE), value: 0, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 48 (ABS_MT_TOUCH_MAJOR), value: 1632, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 58 (ABS_MT_PRESSURE), value: 1632, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 53 (ABS_MT_POSITION_X), value: 686, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 54 (ABS_MT_POSITION_Y), value: 700, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG input event => type: 0 (EV_SYN), code: 0 (SYN_REPORT), value: 0, time: 1750489116.359096 
06/21/25-02:58:36 DEBUG slot 0 in tap state... 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: 1683, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 55 (ABS_MT_TOOL_TYPE), value: 0, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 48 (ABS_MT_TOUCH_MAJOR), value: 1120, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 58 (ABS_MT_PRESSURE), value: 1120, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 53 (ABS_MT_POSITION_X), value: 686, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 54 (ABS_MT_POSITION_Y), value: 700, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG input event => type: 0 (EV_SYN), code: 0 (SYN_REPORT), value: 0, time: 1750489116.372717 
06/21/25-02:58:36 DEBUG slot 0 in tap state... 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: 1683, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 55 (ABS_MT_TOOL_TYPE), value: 0, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 48 (ABS_MT_TOUCH_MAJOR), value: 1120, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 58 (ABS_MT_PRESSURE), value: 1120, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 53 (ABS_MT_POSITION_X), value: 686, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 54 (ABS_MT_POSITION_Y), value: 700, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG input event => type: 0 (EV_SYN), code: 0 (SYN_REPORT), value: 0, time: 1750489116.387666 
06/21/25-02:58:36 DEBUG slot 0 in tap state... 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: 1683, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 55 (ABS_MT_TOOL_TYPE), value: 0, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 48 (ABS_MT_TOUCH_MAJOR), value: 0, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 58 (ABS_MT_PRESSURE), value: 0, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 53 (ABS_MT_POSITION_X), value: 686, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 54 (ABS_MT_POSITION_Y), value: 700, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 3 (EV_ABS), code: 57 (ABS_MT_TRACKING_ID), value: -1, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG key event => code: 330 (BTN_TOUCH), value: 0, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG input event => type: 0 (EV_SYN), code: 0 (SYN_REPORT), value: 0, time: 1750489116.401224 
06/21/25-02:58:36 DEBUG slot 0 in tap state... 
06/21/25-02:58:36 DEBUG Contact:handleDoubleTap: single tap detected @ 700 993 
06/21/25-02:58:36 DEBUG AutoSuspend: onInputEvent 
06/21/25-02:58:36 DEBUG Explicit widgetRepaint: table: 0xb6c42298 @ 72 946 
06/21/25-02:58:36 DEBUG _refresh: Enqueued fast update for region 72 946 1119 87 dithering: false 
06/21/25-02:58:36 DEBUG setDirty fast from widget nil w/ region 72 946 1119 87 dithering: nil 
06/21/25-02:58:36 DEBUG triggering refresh {
  dither = false,
  mode = "fast",
  region = "1119x87+72+946"
} --[[table: 0xb5238328]] 
06/21/25-02:58:36 DEBUG refresh: fast 72 946 1119 87 false 
06/21/25-02:58:36 DEBUG mxc_update: 1136x96 region @ (64, 944) with marker 23 (WFM: 1 & UPD: 0) 
06/21/25-02:58:36 DEBUG Explicit widgetRepaint: table: 0xb6c42298 @ 72 946 
06/21/25-02:58:36 DEBUG _refresh: Enqueued fast update for region 72 946 1119 87 dithering: false 
06/21/25-02:58:36 DEBUG setDirty fast from widget nil w/ region 72 946 1119 87 dithering: nil 
06/21/25-02:58:36 DEBUG close widget: table: 0xb58df640 
06/21/25-02:58:36 DEBUG setDirty via a func from widget nil 
06/21/25-02:58:36 DEBUG Lower widget table: 0xb559a0f8 was dithered, honoring the dithering hint 
06/21/25-02:58:36 DEBUG Lower widget table: 0xb559a0f8 covers the full screen 
06/21/25-02:58:36 DEBUG setDirty nil from widget table: 0xb559a0f8 w/ NO region; dithering: true 
06/21/25-02:58:36 DEBUG setDirty nil from widget table: 0xb3af2658 w/ NO region; dithering: nil 
06/21/25-02:58:36 DEBUG Downloading file /mnt/onboard/koreader_books/Asimov_ Isaac - I_ Robot (The Robot Series).epub from http://192.168.1.202:9348/get/epub/277/books 
06/21/25-02:58:36 DEBUG File downloaded to /mnt/onboard/koreader_books/Asimov_ Isaac - I_ Robot (The Robot Series).epub 

full log:

https://github.com/user-attachments/files/20845492/crash.log

Additional information

I also tested this with Android (Pixel 8), a KOReader container and in Debian WSL.

The issue does also happen on the Pixel 8.

The issue does NOT happen in the container or Debian WSL.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions