Compare commits
3 Commits
ca76bdd564
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c111fd637
|
||
|
|
777cff600c
|
||
|
|
be6bfb10cd
|
51
README.md
51
README.md
@@ -1,15 +1,54 @@
|
|||||||
# issuu2epub
|
# Issuu to EPUB Converter
|
||||||
|
|
||||||
Download Documents from Issuu as EPUB Files.
|
Ein Python-Skript zum Konvertieren von Issuu-Dokumenten in EPUB-Dateien,
|
||||||
|
optimiert für Kindle E-Reader.
|
||||||
|
|
||||||
|
## 📋 Übersicht
|
||||||
|
|
||||||
|
Dieses Tool lädt Dokumente von Issuu herunter und konvertiert sie in das
|
||||||
|
EPUB-Format. Das erste Bild wird als Cover verwendet, und alle Bilder werden für
|
||||||
|
optimale Darstellung auf E-Readern komprimiert.
|
||||||
|
|
||||||
|
## ✨ Features
|
||||||
|
|
||||||
|
- **Einfache Befehlszeilenschnittstelle** mit Click
|
||||||
|
- **Automatisches Cover** aus der ersten Seite
|
||||||
|
- **Kindle-optimierte** Bildkompression
|
||||||
|
- **Kein Inhaltsverzeichnis** für direkten Zugriff auf den Inhalt
|
||||||
|
- **Temporäre Verzeichnisse** für saubere Verarbeitung
|
||||||
|
- **Unterstützt große Dokumente** mit Stream-Download
|
||||||
|
|
||||||
|
## 🚀 Verwendung
|
||||||
|
|
||||||
|
### Einfache Verwendung
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python issuu2epub.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Skript fragt interaktiv nach allen benötigten Informationen:
|
||||||
|
|
||||||
|
1. Issuu URL: Die URL des Issuu-Dokuments
|
||||||
|
2. Document Title: Titel des Dokuments
|
||||||
|
3. Document Author: Autor des Dokuments
|
||||||
|
4. EPUB Output Filename: Name der Ausgabedatei (z.B. mein_dokument.epub)
|
||||||
|
|
||||||
|
### Direkte Befehlszeilenverwendung
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python issuu2epub.py --url "https://issuu.com/bscyb1898/docs/yb_mag_nr._1_saison_2025_26" --title "YB Mag 2025 01" --author "BSC YB" --output "YB_Mag_2025_01.epub"
|
||||||
|
```
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- Educational Use Only: These tools are intended for educational purposes.
|
Dieses Tool ist für den persönlichen Gebrauch bestimmt. Stellen Sie sicher, dass
|
||||||
Always respect the terms of service of Issuu and other websites.
|
Sie die Urheberrechte der Dokumente respektieren und nur Inhalte verwenden, für
|
||||||
- Responsibility: The repository author is not responsible for any misuse of
|
die Sie die entsprechenden Rechte besitzen oder die unter einer freien Lizenz
|
||||||
these tools.
|
stehen.
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
- AhmedOsamaMath/issuu-downloader
|
- AhmedOsamaMath/issuu-downloader
|
||||||
|
|
||||||
|
```
|
||||||
|
```
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
pkgs.python313Packages.ebooklib
|
pkgs.python313Packages.ebooklib
|
||||||
pkgs.python313Packages.requests
|
pkgs.python313Packages.requests
|
||||||
pkgs.python313Packages.pip
|
pkgs.python313Packages.pip
|
||||||
|
pkgs.python313Packages.pillow
|
||||||
pkgs.python313Packages.types-requests
|
pkgs.python313Packages.types-requests
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
|
import io
|
||||||
import re
|
import re
|
||||||
import secrets
|
import secrets
|
||||||
import tempfile
|
import tempfile
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
import click
|
||||||
from ebooklib import epub # type: ignore
|
from ebooklib import epub # type: ignore
|
||||||
from requests import HTTPError, auth, request
|
from PIL import Image
|
||||||
|
from requests import HTTPError, request
|
||||||
|
|
||||||
|
|
||||||
def parse_issuu_url(url: str) -> tuple[str, str]:
|
def parse_issuu_url(url: str) -> tuple[str, str]:
|
||||||
@@ -68,6 +71,24 @@ def download_pages(page_urls: list[str], working_dir: Path) -> list[Path]:
|
|||||||
return page_paths
|
return page_paths
|
||||||
|
|
||||||
|
|
||||||
|
def convert_image(image_path: Path) -> io.BytesIO:
|
||||||
|
"""convert image and return bytes array."""
|
||||||
|
max_image_size = (1000, 1400)
|
||||||
|
target_quality = 50
|
||||||
|
|
||||||
|
with Image.open(image_path.as_posix()) as img:
|
||||||
|
|
||||||
|
if img.mode in ("RGBA", "P"):
|
||||||
|
img = img.convert("RGB")
|
||||||
|
|
||||||
|
img.thumbnail(max_image_size, Image.Resampling.LANCZOS)
|
||||||
|
img_byte_arr = io.BytesIO()
|
||||||
|
img.save(img_byte_arr, format="JPEG", optimize=True, quality=target_quality)
|
||||||
|
img_byte_arr = img_byte_arr.getvalue() # type: ignore[assignment]
|
||||||
|
|
||||||
|
return img_byte_arr # type: ignore[return-value]
|
||||||
|
|
||||||
|
|
||||||
def generate_epub(
|
def generate_epub(
|
||||||
pages: list[Path], output_file: Path, title: str, author: str
|
pages: list[Path], output_file: Path, title: str, author: str
|
||||||
) -> None:
|
) -> None:
|
||||||
@@ -80,12 +101,51 @@ def generate_epub(
|
|||||||
|
|
||||||
chapters = []
|
chapters = []
|
||||||
|
|
||||||
for i, page in enumerate(pages, start=1):
|
# Use first image as Cover
|
||||||
|
title_page = epub.EpubHtml(title=title, file_name="title_page.xhtml", lang="de")
|
||||||
|
|
||||||
|
cover_image = epub.EpubImage()
|
||||||
|
cover_image.file_name = f"images/cover.jpg"
|
||||||
|
cover_image.media_type = "image/jpeg"
|
||||||
|
cover_image.content = convert_image(pages[0])
|
||||||
|
|
||||||
|
book.add_item(cover_image)
|
||||||
|
|
||||||
|
title_page.content = f"""
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{title}</title>
|
||||||
|
<style>
|
||||||
|
body {{
|
||||||
|
margin: 0;
|
||||||
|
padding: 20px;
|
||||||
|
text-align: center;
|
||||||
|
}}
|
||||||
|
img {{
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
max-height: 90vh;
|
||||||
|
}}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<img src="{cover_image.file_name}" alt="Cover"/>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
"""
|
||||||
|
|
||||||
|
book.add_item(title_page)
|
||||||
|
chapters.append(title_page)
|
||||||
|
|
||||||
|
# Add Pages.
|
||||||
|
for i, page in enumerate(pages[1:], start=1):
|
||||||
page_title = f"Page {i}"
|
page_title = f"Page {i}"
|
||||||
|
|
||||||
image_item = epub.EpubImage()
|
image_item = epub.EpubImage()
|
||||||
image_item.file_name = page.as_posix()
|
image_item.file_name = f"images/page_{i:03d}.jpg"
|
||||||
image_item.media_type = "image/png"
|
image_item.media_type = "image/jpeg"
|
||||||
|
image_item.content = convert_image(page)
|
||||||
|
|
||||||
book.add_item(image_item)
|
book.add_item(image_item)
|
||||||
|
|
||||||
chapter = epub.EpubHtml(
|
chapter = epub.EpubHtml(
|
||||||
@@ -118,23 +178,26 @@ def generate_epub(
|
|||||||
book.add_item(chapter)
|
book.add_item(chapter)
|
||||||
chapters.append(chapter)
|
chapters.append(chapter)
|
||||||
|
|
||||||
book.toc = chapters
|
|
||||||
book.spine = ["nav"] + chapters
|
book.spine = ["nav"] + chapters
|
||||||
|
|
||||||
book.add_item(epub.EpubNcx())
|
|
||||||
book.add_item(epub.EpubNav())
|
|
||||||
|
|
||||||
epub.write_epub(output_file, book, {})
|
epub.write_epub(output_file, book, {})
|
||||||
|
|
||||||
print(f"EPUB erfolgreich erstellt: {output_file}")
|
print(f"✅ Kindle-optimiertes EPUB erstellt: {output_file}")
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
@click.command()
|
||||||
|
@click.option("--url", prompt="Issuu URL", help="Issuu URL to convert to EPUB")
|
||||||
|
@click.option("--title", prompt="Document Title", help="Document Title")
|
||||||
|
@click.option("--author", prompt="Document Author", help="Document Author")
|
||||||
|
@click.option(
|
||||||
|
"--output",
|
||||||
|
prompt="EPUB Output Filename",
|
||||||
|
help="EPUB Output File",
|
||||||
|
)
|
||||||
|
def main(url: str, title: str, author: str, output: str) -> None:
|
||||||
"""main function."""
|
"""main function."""
|
||||||
cwd = create_working_dir()
|
cwd = create_working_dir()
|
||||||
username, document_id = parse_issuu_url(
|
username, document_id = parse_issuu_url(url=url)
|
||||||
"https://issuu.com/bscyb1898/docs/yb_mag_nr._1_saison_2025_26"
|
|
||||||
)
|
|
||||||
|
|
||||||
urls = get_page_urls(username, document_id)
|
urls = get_page_urls(username, document_id)
|
||||||
|
|
||||||
@@ -142,9 +205,9 @@ def main() -> None:
|
|||||||
|
|
||||||
generate_epub(
|
generate_epub(
|
||||||
pages=pages,
|
pages=pages,
|
||||||
output_file=Path("/home/michael/Downloads/YBMag-2025-01.epub"),
|
output_file=Path(output),
|
||||||
title="YB Mag 2025 01",
|
title=title,
|
||||||
author="BSC YB",
|
author=author,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user