# Chapter-sync
[![Actions Status](https://github.com/DanCardin/chapter-sync/actions/workflows/test.yml/badge.svg)](https://github.com/dancardin/chapter-sync/actions)
[![codecov](https://codecov.io/gh/DanCardin/chapter-sync/graph/badge.svg?token=e8T6QN2tTz)](https://codecov.io/gh/DanCardin/chapter-sync)
[![Documentation Status](https://readthedocs.org/projects/chapter-sync/badge/?version=latest)](https://chapter-sync.readthedocs.io/en/latest/?badge=latest)
[![Docker](https://img.shields.io/docker/v/dancardin/chapter-sync?label=Docker&style=flat)](https://hub.docker.com/r/dancardin/chapter-sync)
- [Full documentation here](https://chapter-sync.readthedocs.io/en/latest/).
- [Installation/Usage](https://chapter-sync.readthedocs.io/en/latest/installation.html).
A tool for recording serialized web content, in partial web-serial type novels,
or other serialized content for which you want to be sent updates as they're
published.
The other tools in the space (at least that I'm aware of: Leech, FanFicFare) are
mostly designed around manual one-off usage of the tool to capture the current
state of a story/series and turn it into an ebook.
`chapter-sync`, by contrast, records everything it captures to a sqlite database
and will only collect new/missing chapters. It also bakes in (through supported
subscription methods) the ability to send new chapters to "subscribers" who have
not yet received it.
## Quickstart
```bash
❯ chapter-sync series add some-book 'https://some-book.com/table-of-contents/' --title 'Some Book' --settings '{"content_selector": "#main .entry-content", "chapter_selector": "#main .entry-content > ul > li > a"}'
Added series "some-book" at "https://some-book.com/table-of-contents/"
❯ chapter-sync series list
┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ID ┃ Name ┃ URL ┃
┡━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 1 │ some-book │ https://some-book.com/table-of-cont… │
└────┴────────────────────────────┴──────────────────────────────────────┘
❯ chapter-sync sync
...
Done
❯ chapter-sync chapter list 1
Some Book
┏━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Title ┃ Chapter ┃ Size (Kb) ┃ Sent ┃ Published ┃ Created ┃
┡━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Chapter 1 │ 1 │ 37.3 │ 2024-03-02 │ 2023-07-28 │ 2024-03-02 │
│ Chapter 2 │ 2 │ 37.1 │ 2024-03-02 │ 2023-08-04 │ 2024-03-02 │
│ Chapter 3 │ 3 │ 36.9 │ 2024-03-02 │ 2023-08-11 │ 2024-03-02 │
│ Chapter 4 │ 4 │ 36.9 │ 2024-03-02 │ 2023-08-18 │ 2024-03-02 │
└────────────┴─────────┴───────────┴────────────┴────────────┴────────────┘
❯ chapter-sync chapter export 1 4
❯ ls
Some Book: Chapter 4.epub
❯ chapter-sync series export 1
❯ ls
Some Book.epub
```
## Web
The tool also ships with a web service which can be used to view and manage
subscriptions.
![Web Example](docs/web.png)
## Inspiration
**this** tool started off as an attempt at a refactor/PR to
[Leech](https://github.com/kemayo/leech) to enable it to more granularly record
updates to books as they changed.
However, `chapter-sync` is designed from the ground up to be able to
individually record/send chapters as they are published, which ultimately means
the to tools ultimately end up being almost entirely different.
I **had** been using InstaPaper to send updates of series to my kindle, until
they made that a paid feature. Additionally the drawback there, was that the
file they'd send would contain all chapters in the whole series, in reverse.
Raw data
{
"_id": null,
"home_page": "https://github.com/dancardin/sqlalchemy-declarative-extensions",
"name": "chapter-sync",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": "chapter, sync, epub, ebook, leech",
"author": "Dan Cardin",
"author_email": "ddcardin@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/75/92/111271706f85087dc17568ae306f994e1c62bfec81828c46da79ec48b4b4/chapter_sync-0.3.7.tar.gz",
"platform": null,
"description": "# Chapter-sync\n\n[![Actions Status](https://github.com/DanCardin/chapter-sync/actions/workflows/test.yml/badge.svg)](https://github.com/dancardin/chapter-sync/actions)\n[![codecov](https://codecov.io/gh/DanCardin/chapter-sync/graph/badge.svg?token=e8T6QN2tTz)](https://codecov.io/gh/DanCardin/chapter-sync)\n[![Documentation Status](https://readthedocs.org/projects/chapter-sync/badge/?version=latest)](https://chapter-sync.readthedocs.io/en/latest/?badge=latest)\n[![Docker](https://img.shields.io/docker/v/dancardin/chapter-sync?label=Docker&style=flat)](https://hub.docker.com/r/dancardin/chapter-sync)\n\n- [Full documentation here](https://chapter-sync.readthedocs.io/en/latest/).\n- [Installation/Usage](https://chapter-sync.readthedocs.io/en/latest/installation.html).\n\nA tool for recording serialized web content, in partial web-serial type novels,\nor other serialized content for which you want to be sent updates as they're\npublished.\n\nThe other tools in the space (at least that I'm aware of: Leech, FanFicFare) are\nmostly designed around manual one-off usage of the tool to capture the current\nstate of a story/series and turn it into an ebook.\n\n`chapter-sync`, by contrast, records everything it captures to a sqlite database\nand will only collect new/missing chapters. It also bakes in (through supported\nsubscription methods) the ability to send new chapters to \"subscribers\" who have\nnot yet received it.\n\n## Quickstart\n\n```bash\n\u276f chapter-sync series add some-book 'https://some-book.com/table-of-contents/' --title 'Some Book' --settings '{\"content_selector\": \"#main .entry-content\", \"chapter_selector\": \"#main .entry-content > ul > li > a\"}'\nAdded series \"some-book\" at \"https://some-book.com/table-of-contents/\"\n\n\u276f chapter-sync series list\n\u250f\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 ID \u2503 Name \u2503 URL \u2503\n\u2521\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 1 \u2502 some-book \u2502 https://some-book.com/table-of-cont\u2026 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u276f chapter-sync sync\n...\nDone\n\n\u276f chapter-sync chapter list 1\n Some Book\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Title \u2503 Chapter \u2503 Size (Kb) \u2503 Sent \u2503 Published \u2503 Created \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 Chapter 1 \u2502 1 \u2502 37.3 \u2502 2024-03-02 \u2502 2023-07-28 \u2502 2024-03-02 \u2502\n\u2502 Chapter 2 \u2502 2 \u2502 37.1 \u2502 2024-03-02 \u2502 2023-08-04 \u2502 2024-03-02 \u2502\n\u2502 Chapter 3 \u2502 3 \u2502 36.9 \u2502 2024-03-02 \u2502 2023-08-11 \u2502 2024-03-02 \u2502\n\u2502 Chapter 4 \u2502 4 \u2502 36.9 \u2502 2024-03-02 \u2502 2023-08-18 \u2502 2024-03-02 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u276f chapter-sync chapter export 1 4\n\u276f ls\nSome Book: Chapter 4.epub\n\n\u276f chapter-sync series export 1\n\u276f ls\nSome Book.epub\n```\n\n## Web\n\nThe tool also ships with a web service which can be used to view and manage\nsubscriptions.\n\n![Web Example](docs/web.png)\n\n## Inspiration\n\n**this** tool started off as an attempt at a refactor/PR to\n[Leech](https://github.com/kemayo/leech) to enable it to more granularly record\nupdates to books as they changed.\n\nHowever, `chapter-sync` is designed from the ground up to be able to\nindividually record/send chapters as they are published, which ultimately means\nthe to tools ultimately end up being almost entirely different.\n\nI **had** been using InstaPaper to send updates of series to my kindle, until\nthey made that a paid feature. Additionally the drawback there, was that the\nfile they'd send would contain all chapters in the whole series, in reverse.\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": null,
"version": "0.3.7",
"project_urls": {
"Homepage": "https://github.com/dancardin/sqlalchemy-declarative-extensions",
"Repository": "https://github.com/dancardin/sqlalchemy-declarative-extensions"
},
"split_keywords": [
"chapter",
" sync",
" epub",
" ebook",
" leech"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "9e9836465c7f7f0075e36a58855c8f35d5cd9509d93aaedace732371dbdbad33",
"md5": "a4d0c726f5d8a6239a8ff00c27c7472e",
"sha256": "7d2f1fb34440fe97e926ba5f57c02a41da1ffbfeda905597d82820dc97540270"
},
"downloads": -1,
"filename": "chapter_sync-0.3.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a4d0c726f5d8a6239a8ff00c27c7472e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 56343,
"upload_time": "2024-07-23T00:11:52",
"upload_time_iso_8601": "2024-07-23T00:11:52.756849Z",
"url": "https://files.pythonhosted.org/packages/9e/98/36465c7f7f0075e36a58855c8f35d5cd9509d93aaedace732371dbdbad33/chapter_sync-0.3.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7592111271706f85087dc17568ae306f994e1c62bfec81828c46da79ec48b4b4",
"md5": "be59c4062322a9029625a93c6c4112a0",
"sha256": "bac460c8014c5a2324538303b39b818fc1f06a8213c0e6e39c6b98ea1dc917b5"
},
"downloads": -1,
"filename": "chapter_sync-0.3.7.tar.gz",
"has_sig": false,
"md5_digest": "be59c4062322a9029625a93c6c4112a0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 40760,
"upload_time": "2024-07-23T00:11:54",
"upload_time_iso_8601": "2024-07-23T00:11:54.413372Z",
"url": "https://files.pythonhosted.org/packages/75/92/111271706f85087dc17568ae306f994e1c62bfec81828c46da79ec48b4b4/chapter_sync-0.3.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-23 00:11:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dancardin",
"github_project": "sqlalchemy-declarative-extensions",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "chapter-sync"
}