cro-dl 1.1.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cro_dl-1.1.7/PKG-INFO +154 -0
- cro_dl-1.1.7/README.md +138 -0
- cro_dl-1.1.7/assets/images/broadcast.png +0 -0
- cro_dl-1.1.7/assets/images/episode.png +0 -0
- cro_dl-1.1.7/assets/images/series.png +0 -0
- cro_dl-1.1.7/cro_dl.egg-info/PKG-INFO +154 -0
- cro_dl-1.1.7/cro_dl.egg-info/SOURCES.txt +41 -0
- cro_dl-1.1.7/cro_dl.egg-info/dependency_links.txt +1 -0
- cro_dl-1.1.7/cro_dl.egg-info/entry_points.txt +2 -0
- cro_dl-1.1.7/cro_dl.egg-info/requires.txt +8 -0
- cro_dl-1.1.7/cro_dl.egg-info/top_level.txt +1 -0
- cro_dl-1.1.7/crodl/__init__.py +1 -0
- cro_dl-1.1.7/crodl/exceptions/__init__.py +9 -0
- cro_dl-1.1.7/crodl/exceptions/exc.py +28 -0
- cro_dl-1.1.7/crodl/main.py +86 -0
- cro_dl-1.1.7/crodl/program/__init__.py +7 -0
- cro_dl-1.1.7/crodl/program/audiowork.py +228 -0
- cro_dl-1.1.7/crodl/program/content.py +15 -0
- cro_dl-1.1.7/crodl/program/series.py +181 -0
- cro_dl-1.1.7/crodl/program/show.py +184 -0
- cro_dl-1.1.7/crodl/run.py +11 -0
- cro_dl-1.1.7/crodl/settings.py +24 -0
- cro_dl-1.1.7/crodl/streams/__init__.py +6 -0
- cro_dl-1.1.7/crodl/streams/audioparts.py +71 -0
- cro_dl-1.1.7/crodl/streams/dash.py +235 -0
- cro_dl-1.1.7/crodl/streams/download.py +35 -0
- cro_dl-1.1.7/crodl/streams/hls.py +119 -0
- cro_dl-1.1.7/crodl/streams/mp3.py +48 -0
- cro_dl-1.1.7/crodl/streams/utils.py +250 -0
- cro_dl-1.1.7/crodl/tools/__init__.py +0 -0
- cro_dl-1.1.7/crodl/tools/logger.py +20 -0
- cro_dl-1.1.7/crodl/tools/scrap.py +177 -0
- cro_dl-1.1.7/crodl/tools/timer.py +25 -0
- cro_dl-1.1.7/pyproject.toml +57 -0
- cro_dl-1.1.7/setup.cfg +4 -0
- cro_dl-1.1.7/tests/test_audioparts.py +67 -0
- cro_dl-1.1.7/tests/test_audiowork.py +203 -0
- cro_dl-1.1.7/tests/test_crodl.py +26 -0
- cro_dl-1.1.7/tests/test_dash.py +273 -0
- cro_dl-1.1.7/tests/test_download.py +123 -0
- cro_dl-1.1.7/tests/test_mp3.py +46 -0
- cro_dl-1.1.7/tests/test_scrap.py +292 -0
- cro_dl-1.1.7/tests/test_utils.py +183 -0
cro_dl-1.1.7/PKG-INFO
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: cro-dl
|
|
3
|
+
Version: 1.1.7
|
|
4
|
+
Summary: Enjoy the ČRo offline
|
|
5
|
+
Author-email: Oldrich Klimanek <klimanek@scinet.cz>
|
|
6
|
+
Requires-Python: <4.0,>=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: requests<3.0.0,>=2.31.0
|
|
9
|
+
Requires-Dist: aiohttp<4.0.0,>=3.9.4
|
|
10
|
+
Requires-Dist: icecream<3.0.0,>=2.1.3
|
|
11
|
+
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.3
|
|
12
|
+
Requires-Dist: rich<14.0.0,>=13.8.1
|
|
13
|
+
Requires-Dist: lxml<6.0.0,>=5.3.0
|
|
14
|
+
Requires-Dist: yaspin<4.0.0,>=3.0.2
|
|
15
|
+
Requires-Dist: asyncclick<9.0.0.0,>=8.1.7.2
|
|
16
|
+
|
|
17
|
+
### 🇬🇧 English Summary
|
|
18
|
+
# 🐍 CRo-DL (Czech Radio Downloader)
|
|
19
|
+
Listen to MůjRozhlas.cz programs offline.
|
|
20
|
+
|
|
21
|
+
## Overview
|
|
22
|
+
CRo-DL is a Python-based 🐍 tool that allows Czech Radio license payers to download and store radio programs locally for offline listening. It supports individual broadcasts, full series, and entire program schedules. Series are saved with episode numbers and user-friendly titles.
|
|
23
|
+
|
|
24
|
+
⚠️ Respect copyright laws—downloaded content is for personal use only and should not be shared.
|
|
25
|
+
|
|
26
|
+
## Dependencies
|
|
27
|
+
* Python 3.10+ is required.
|
|
28
|
+
* Czech Radio mainly uses MP3 and HLS/DASH streams (AAC/M4A).
|
|
29
|
+
* FFmpeg is required for handling DASH streams (optional).
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
CRo-DL can be installed via:
|
|
33
|
+
|
|
34
|
+
### 📦 PyPI
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
pip install cro-dl
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 🚀 uv (alternative method)
|
|
41
|
+
Download the source code (zip) and sync dependencies:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
uv sync
|
|
45
|
+
uv run cro-dl <url>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 🔧 Git clone (development mode)
|
|
49
|
+
```
|
|
50
|
+
git clone git@github.com:klimanek/cro-dl.git
|
|
51
|
+
uv sync
|
|
52
|
+
uv run cro-dl <url>
|
|
53
|
+
```
|
|
54
|
+
## Usage
|
|
55
|
+
1️⃣ Open mujrozhlas.cz, find a broadcast, series, or episode.
|
|
56
|
+
|
|
57
|
+
2️⃣ Copy the URL from the address bar.
|
|
58
|
+
|
|
59
|
+
3️⃣ Run in the terminal:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
cro-dl <url>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If multiple formats are available, MP3 is preferred. To specify a format (e.g., HLS):
|
|
66
|
+
|
|
67
|
+
```cro-dl --stream-format "hls" <url>```
|
|
68
|
+
|
|
69
|
+
<hr />
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
### 🇨🇿 Česká verze
|
|
73
|
+
# CRo-DL (Český Rozhlas Downloader)
|
|
74
|
+
Poslouchejte pořady z MůjRozhlas.cz i offline.
|
|
75
|
+
|
|
76
|
+
## Popis
|
|
77
|
+
CRo-DL je nástroj umožňující každému koncesionáři ČRo stáhnout si pořady Českého rozhlasu lokálně na své zařízení s motivací je poslouchat mimo dosah vln. Dbejte autorských práv a díla stažená pro vlastní potřebu nešiřte dál.
|
|
78
|
+
|
|
79
|
+
Podporovány jsou jak jednotlivé rozhlasové příspěvky, tak i celé seriály a kompletní programy -- seriály se stahují s číslem dílu a pod svým názvem. Každý titul je uložen do vlastní složky.
|
|
80
|
+
|
|
81
|
+

|
|
82
|
+
|
|
83
|
+
Není-li ještě nějaký díl seriálu dostupný, CRo-DL vás upozorní a uvede datum i čas uvedení.
|
|
84
|
+
|
|
85
|
+
## Závislosti
|
|
86
|
+
Software je napsaný v jazyce Python 🐍, proto byste v systému měli mít Python ve verzi alespoň 3.10.
|
|
87
|
+
|
|
88
|
+
Můjrozhlas.cz v zásadě používá formát mp3 pro svá díla (ČRo) a streamy HLS a DASH pro díla třetích stran. Preferovány jsou formáty mp3 a HLS pro stream. Pokud byste však chtěli z různých důvodů použít DASH, pro vytvoření a uložení finálního souboru je nutné mít v systému nainstalovaný [ffmpeg](https://www.ffmpeg.org/).
|
|
89
|
+
|
|
90
|
+
Externí balíčky v Pythonu jsou uvedeny ve specifikaci (viz `pyproject.toml`). Při instalaci se stáhnou a nainstalují automaticky.
|
|
91
|
+
|
|
92
|
+
## Instalace
|
|
93
|
+
CRo-DL lze instalovat několika způsoby:
|
|
94
|
+
|
|
95
|
+
1. PyPi / pip
|
|
96
|
+
2. Zip + uv
|
|
97
|
+
3. Git clone + uv
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
### 📦 PyPi
|
|
101
|
+
Nejčastěji z PyPi pomocí nástroje `pip`:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
pip install cro-dl
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 🚀 uv
|
|
108
|
+
Alternativou je lokální použití CRo-DL pomocí nástroje [uv](https://docs.astral.sh/uv/) poté, co si stáhnete zde zip soubor s codebase.
|
|
109
|
+
|
|
110
|
+
`uv sync`
|
|
111
|
+
|
|
112
|
+
Nebo rovnou můžete stáhnout audio soubor z webu s <url>
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
uv run cro-dl <url>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
a všechny závislosti se nainstalují automaticky.
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
Pro vývoj pak nejlepší bude klonovat zdejší repozitář:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
git clone git@github.com:klimanek/cro-dl.git
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Použití
|
|
128
|
+
Otevřete stránku mujrozhlas.cz, najděte si pořad / epizodu / seriál a z adresního řádku zkopírujte aktuální URL. Otevřte terminál a zadejte
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
cro-dl <url>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Příklad
|
|
135
|
+
[„Tuk dá každý raději než kostní dřeň.“ Endokrinolog vyvíjí novou léčbu diabetu kmenovými buňkami](https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi). Zkopírujte URL z adresního řádku a abyste si pořad stáhli, do terminálu zadejte
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
cro-dl https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
Výsledkem bude:
|
|
143
|
+
|
|
144
|
+

|
|
145
|
+
|
|
146
|
+
V tomto případě jsou dostupné tři formáty: mp3, stream HLS a stream DASH. Většinou však bývá dostupný pouze stream, anebo soubor ve formátu mp3. Ten je preferován (viz soubor `settings.py`). Není-li dostupný, použije se HLS, DASH jako poslední.
|
|
147
|
+
|
|
148
|
+
Chcete-li si pořad stáhnout ve vámi preferovaném formátu, použijte možnost `--stream-format` (`-sf`):
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
cro-dl --stream-format "hls" https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi
|
|
153
|
+
|
|
154
|
+
```
|
cro_dl-1.1.7/README.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
### 🇬🇧 English Summary
|
|
2
|
+
# 🐍 CRo-DL (Czech Radio Downloader)
|
|
3
|
+
Listen to MůjRozhlas.cz programs offline.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
CRo-DL is a Python-based 🐍 tool that allows Czech Radio license payers to download and store radio programs locally for offline listening. It supports individual broadcasts, full series, and entire program schedules. Series are saved with episode numbers and user-friendly titles.
|
|
7
|
+
|
|
8
|
+
⚠️ Respect copyright laws—downloaded content is for personal use only and should not be shared.
|
|
9
|
+
|
|
10
|
+
## Dependencies
|
|
11
|
+
* Python 3.10+ is required.
|
|
12
|
+
* Czech Radio mainly uses MP3 and HLS/DASH streams (AAC/M4A).
|
|
13
|
+
* FFmpeg is required for handling DASH streams (optional).
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
CRo-DL can be installed via:
|
|
17
|
+
|
|
18
|
+
### 📦 PyPI
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
pip install cro-dl
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 🚀 uv (alternative method)
|
|
25
|
+
Download the source code (zip) and sync dependencies:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
uv sync
|
|
29
|
+
uv run cro-dl <url>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 🔧 Git clone (development mode)
|
|
33
|
+
```
|
|
34
|
+
git clone git@github.com:klimanek/cro-dl.git
|
|
35
|
+
uv sync
|
|
36
|
+
uv run cro-dl <url>
|
|
37
|
+
```
|
|
38
|
+
## Usage
|
|
39
|
+
1️⃣ Open mujrozhlas.cz, find a broadcast, series, or episode.
|
|
40
|
+
|
|
41
|
+
2️⃣ Copy the URL from the address bar.
|
|
42
|
+
|
|
43
|
+
3️⃣ Run in the terminal:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
cro-dl <url>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
If multiple formats are available, MP3 is preferred. To specify a format (e.g., HLS):
|
|
50
|
+
|
|
51
|
+
```cro-dl --stream-format "hls" <url>```
|
|
52
|
+
|
|
53
|
+
<hr />
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
### 🇨🇿 Česká verze
|
|
57
|
+
# CRo-DL (Český Rozhlas Downloader)
|
|
58
|
+
Poslouchejte pořady z MůjRozhlas.cz i offline.
|
|
59
|
+
|
|
60
|
+
## Popis
|
|
61
|
+
CRo-DL je nástroj umožňující každému koncesionáři ČRo stáhnout si pořady Českého rozhlasu lokálně na své zařízení s motivací je poslouchat mimo dosah vln. Dbejte autorských práv a díla stažená pro vlastní potřebu nešiřte dál.
|
|
62
|
+
|
|
63
|
+
Podporovány jsou jak jednotlivé rozhlasové příspěvky, tak i celé seriály a kompletní programy -- seriály se stahují s číslem dílu a pod svým názvem. Každý titul je uložen do vlastní složky.
|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+
Není-li ještě nějaký díl seriálu dostupný, CRo-DL vás upozorní a uvede datum i čas uvedení.
|
|
68
|
+
|
|
69
|
+
## Závislosti
|
|
70
|
+
Software je napsaný v jazyce Python 🐍, proto byste v systému měli mít Python ve verzi alespoň 3.10.
|
|
71
|
+
|
|
72
|
+
Můjrozhlas.cz v zásadě používá formát mp3 pro svá díla (ČRo) a streamy HLS a DASH pro díla třetích stran. Preferovány jsou formáty mp3 a HLS pro stream. Pokud byste však chtěli z různých důvodů použít DASH, pro vytvoření a uložení finálního souboru je nutné mít v systému nainstalovaný [ffmpeg](https://www.ffmpeg.org/).
|
|
73
|
+
|
|
74
|
+
Externí balíčky v Pythonu jsou uvedeny ve specifikaci (viz `pyproject.toml`). Při instalaci se stáhnou a nainstalují automaticky.
|
|
75
|
+
|
|
76
|
+
## Instalace
|
|
77
|
+
CRo-DL lze instalovat několika způsoby:
|
|
78
|
+
|
|
79
|
+
1. PyPi / pip
|
|
80
|
+
2. Zip + uv
|
|
81
|
+
3. Git clone + uv
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
### 📦 PyPi
|
|
85
|
+
Nejčastěji z PyPi pomocí nástroje `pip`:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
pip install cro-dl
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 🚀 uv
|
|
92
|
+
Alternativou je lokální použití CRo-DL pomocí nástroje [uv](https://docs.astral.sh/uv/) poté, co si stáhnete zde zip soubor s codebase.
|
|
93
|
+
|
|
94
|
+
`uv sync`
|
|
95
|
+
|
|
96
|
+
Nebo rovnou můžete stáhnout audio soubor z webu s <url>
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
uv run cro-dl <url>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
a všechny závislosti se nainstalují automaticky.
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
Pro vývoj pak nejlepší bude klonovat zdejší repozitář:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
git clone git@github.com:klimanek/cro-dl.git
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Použití
|
|
112
|
+
Otevřete stránku mujrozhlas.cz, najděte si pořad / epizodu / seriál a z adresního řádku zkopírujte aktuální URL. Otevřte terminál a zadejte
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
cro-dl <url>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Příklad
|
|
119
|
+
[„Tuk dá každý raději než kostní dřeň.“ Endokrinolog vyvíjí novou léčbu diabetu kmenovými buňkami](https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi). Zkopírujte URL z adresního řádku a abyste si pořad stáhli, do terminálu zadejte
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
cro-dl https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
Výsledkem bude:
|
|
127
|
+
|
|
128
|
+

|
|
129
|
+
|
|
130
|
+
V tomto případě jsou dostupné tři formáty: mp3, stream HLS a stream DASH. Většinou však bývá dostupný pouze stream, anebo soubor ve formátu mp3. Ten je preferován (viz soubor `settings.py`). Není-li dostupný, použije se HLS, DASH jako poslední.
|
|
131
|
+
|
|
132
|
+
Chcete-li si pořad stáhnout ve vámi preferovaném formátu, použijte možnost `--stream-format` (`-sf`):
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
cro-dl --stream-format "hls" https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi
|
|
137
|
+
|
|
138
|
+
```
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: cro-dl
|
|
3
|
+
Version: 1.1.7
|
|
4
|
+
Summary: Enjoy the ČRo offline
|
|
5
|
+
Author-email: Oldrich Klimanek <klimanek@scinet.cz>
|
|
6
|
+
Requires-Python: <4.0,>=3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: requests<3.0.0,>=2.31.0
|
|
9
|
+
Requires-Dist: aiohttp<4.0.0,>=3.9.4
|
|
10
|
+
Requires-Dist: icecream<3.0.0,>=2.1.3
|
|
11
|
+
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.3
|
|
12
|
+
Requires-Dist: rich<14.0.0,>=13.8.1
|
|
13
|
+
Requires-Dist: lxml<6.0.0,>=5.3.0
|
|
14
|
+
Requires-Dist: yaspin<4.0.0,>=3.0.2
|
|
15
|
+
Requires-Dist: asyncclick<9.0.0.0,>=8.1.7.2
|
|
16
|
+
|
|
17
|
+
### 🇬🇧 English Summary
|
|
18
|
+
# 🐍 CRo-DL (Czech Radio Downloader)
|
|
19
|
+
Listen to MůjRozhlas.cz programs offline.
|
|
20
|
+
|
|
21
|
+
## Overview
|
|
22
|
+
CRo-DL is a Python-based 🐍 tool that allows Czech Radio license payers to download and store radio programs locally for offline listening. It supports individual broadcasts, full series, and entire program schedules. Series are saved with episode numbers and user-friendly titles.
|
|
23
|
+
|
|
24
|
+
⚠️ Respect copyright laws—downloaded content is for personal use only and should not be shared.
|
|
25
|
+
|
|
26
|
+
## Dependencies
|
|
27
|
+
* Python 3.10+ is required.
|
|
28
|
+
* Czech Radio mainly uses MP3 and HLS/DASH streams (AAC/M4A).
|
|
29
|
+
* FFmpeg is required for handling DASH streams (optional).
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
CRo-DL can be installed via:
|
|
33
|
+
|
|
34
|
+
### 📦 PyPI
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
pip install cro-dl
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 🚀 uv (alternative method)
|
|
41
|
+
Download the source code (zip) and sync dependencies:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
uv sync
|
|
45
|
+
uv run cro-dl <url>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 🔧 Git clone (development mode)
|
|
49
|
+
```
|
|
50
|
+
git clone git@github.com:klimanek/cro-dl.git
|
|
51
|
+
uv sync
|
|
52
|
+
uv run cro-dl <url>
|
|
53
|
+
```
|
|
54
|
+
## Usage
|
|
55
|
+
1️⃣ Open mujrozhlas.cz, find a broadcast, series, or episode.
|
|
56
|
+
|
|
57
|
+
2️⃣ Copy the URL from the address bar.
|
|
58
|
+
|
|
59
|
+
3️⃣ Run in the terminal:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
cro-dl <url>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If multiple formats are available, MP3 is preferred. To specify a format (e.g., HLS):
|
|
66
|
+
|
|
67
|
+
```cro-dl --stream-format "hls" <url>```
|
|
68
|
+
|
|
69
|
+
<hr />
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
### 🇨🇿 Česká verze
|
|
73
|
+
# CRo-DL (Český Rozhlas Downloader)
|
|
74
|
+
Poslouchejte pořady z MůjRozhlas.cz i offline.
|
|
75
|
+
|
|
76
|
+
## Popis
|
|
77
|
+
CRo-DL je nástroj umožňující každému koncesionáři ČRo stáhnout si pořady Českého rozhlasu lokálně na své zařízení s motivací je poslouchat mimo dosah vln. Dbejte autorských práv a díla stažená pro vlastní potřebu nešiřte dál.
|
|
78
|
+
|
|
79
|
+
Podporovány jsou jak jednotlivé rozhlasové příspěvky, tak i celé seriály a kompletní programy -- seriály se stahují s číslem dílu a pod svým názvem. Každý titul je uložen do vlastní složky.
|
|
80
|
+
|
|
81
|
+

|
|
82
|
+
|
|
83
|
+
Není-li ještě nějaký díl seriálu dostupný, CRo-DL vás upozorní a uvede datum i čas uvedení.
|
|
84
|
+
|
|
85
|
+
## Závislosti
|
|
86
|
+
Software je napsaný v jazyce Python 🐍, proto byste v systému měli mít Python ve verzi alespoň 3.10.
|
|
87
|
+
|
|
88
|
+
Můjrozhlas.cz v zásadě používá formát mp3 pro svá díla (ČRo) a streamy HLS a DASH pro díla třetích stran. Preferovány jsou formáty mp3 a HLS pro stream. Pokud byste však chtěli z různých důvodů použít DASH, pro vytvoření a uložení finálního souboru je nutné mít v systému nainstalovaný [ffmpeg](https://www.ffmpeg.org/).
|
|
89
|
+
|
|
90
|
+
Externí balíčky v Pythonu jsou uvedeny ve specifikaci (viz `pyproject.toml`). Při instalaci se stáhnou a nainstalují automaticky.
|
|
91
|
+
|
|
92
|
+
## Instalace
|
|
93
|
+
CRo-DL lze instalovat několika způsoby:
|
|
94
|
+
|
|
95
|
+
1. PyPi / pip
|
|
96
|
+
2. Zip + uv
|
|
97
|
+
3. Git clone + uv
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
### 📦 PyPi
|
|
101
|
+
Nejčastěji z PyPi pomocí nástroje `pip`:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
pip install cro-dl
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 🚀 uv
|
|
108
|
+
Alternativou je lokální použití CRo-DL pomocí nástroje [uv](https://docs.astral.sh/uv/) poté, co si stáhnete zde zip soubor s codebase.
|
|
109
|
+
|
|
110
|
+
`uv sync`
|
|
111
|
+
|
|
112
|
+
Nebo rovnou můžete stáhnout audio soubor z webu s <url>
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
uv run cro-dl <url>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
a všechny závislosti se nainstalují automaticky.
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
Pro vývoj pak nejlepší bude klonovat zdejší repozitář:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
git clone git@github.com:klimanek/cro-dl.git
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Použití
|
|
128
|
+
Otevřete stránku mujrozhlas.cz, najděte si pořad / epizodu / seriál a z adresního řádku zkopírujte aktuální URL. Otevřte terminál a zadejte
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
cro-dl <url>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Příklad
|
|
135
|
+
[„Tuk dá každý raději než kostní dřeň.“ Endokrinolog vyvíjí novou léčbu diabetu kmenovými buňkami](https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi). Zkopírujte URL z adresního řádku a abyste si pořad stáhli, do terminálu zadejte
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
cro-dl https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
Výsledkem bude:
|
|
143
|
+
|
|
144
|
+

|
|
145
|
+
|
|
146
|
+
V tomto případě jsou dostupné tři formáty: mp3, stream HLS a stream DASH. Většinou však bývá dostupný pouze stream, anebo soubor ve formátu mp3. Ten je preferován (viz soubor `settings.py`). Není-li dostupný, použije se HLS, DASH jako poslední.
|
|
147
|
+
|
|
148
|
+
Chcete-li si pořad stáhnout ve vámi preferovaném formátu, použijte možnost `--stream-format` (`-sf`):
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
cro-dl --stream-format "hls" https://www.mujrozhlas.cz/leonardo-plus/tuk-da-kazdy-radeji-nez-kostni-dren-endokrinolog-vyviji-novou-lecbu-diabetu-kmenovymi
|
|
153
|
+
|
|
154
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
cro_dl.egg-info/PKG-INFO
|
|
4
|
+
cro_dl.egg-info/SOURCES.txt
|
|
5
|
+
cro_dl.egg-info/dependency_links.txt
|
|
6
|
+
cro_dl.egg-info/entry_points.txt
|
|
7
|
+
cro_dl.egg-info/requires.txt
|
|
8
|
+
cro_dl.egg-info/top_level.txt
|
|
9
|
+
crodl/__init__.py
|
|
10
|
+
crodl/main.py
|
|
11
|
+
crodl/run.py
|
|
12
|
+
crodl/settings.py
|
|
13
|
+
crodl/../assets/images/broadcast.png
|
|
14
|
+
crodl/../assets/images/episode.png
|
|
15
|
+
crodl/../assets/images/series.png
|
|
16
|
+
crodl/exceptions/__init__.py
|
|
17
|
+
crodl/exceptions/exc.py
|
|
18
|
+
crodl/program/__init__.py
|
|
19
|
+
crodl/program/audiowork.py
|
|
20
|
+
crodl/program/content.py
|
|
21
|
+
crodl/program/series.py
|
|
22
|
+
crodl/program/show.py
|
|
23
|
+
crodl/streams/__init__.py
|
|
24
|
+
crodl/streams/audioparts.py
|
|
25
|
+
crodl/streams/dash.py
|
|
26
|
+
crodl/streams/download.py
|
|
27
|
+
crodl/streams/hls.py
|
|
28
|
+
crodl/streams/mp3.py
|
|
29
|
+
crodl/streams/utils.py
|
|
30
|
+
crodl/tools/__init__.py
|
|
31
|
+
crodl/tools/logger.py
|
|
32
|
+
crodl/tools/scrap.py
|
|
33
|
+
crodl/tools/timer.py
|
|
34
|
+
tests/test_audioparts.py
|
|
35
|
+
tests/test_audiowork.py
|
|
36
|
+
tests/test_crodl.py
|
|
37
|
+
tests/test_dash.py
|
|
38
|
+
tests/test_download.py
|
|
39
|
+
tests/test_mp3.py
|
|
40
|
+
tests/test_scrap.py
|
|
41
|
+
tests/test_utils.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
crodl
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.1.7"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from .exc import (
|
|
2
|
+
DownloadError as DownloadError,
|
|
3
|
+
DataEntryDoesNotExist as DataEntryDoesNotExist,
|
|
4
|
+
PlayerWrapperDoesNotExist as PlayerWrapperDoesNotExist,
|
|
5
|
+
AudioUUIDDoesNotExist as AudioUUIDDoesNotExist,
|
|
6
|
+
ShowUUIDDoesNotExist as ShowUUIDDoesNotExist,
|
|
7
|
+
PageDoesNotExist as PageDoesNotExist,
|
|
8
|
+
DataNotFound as DataNotFound,
|
|
9
|
+
)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class DownloadError(Exception):
|
|
2
|
+
pass
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class DataEntryDoesNotExist(Exception):
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PlayerWrapperDoesNotExist(Exception):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AudioUUIDDoesNotExist(Exception):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ShowUUIDDoesNotExist(Exception):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PageDoesNotExist(Exception):
|
|
22
|
+
def __init__(self, message) -> None:
|
|
23
|
+
self.message = message
|
|
24
|
+
super().__init__(message)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class DataNotFound(KeyError):
|
|
28
|
+
pass
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from urllib.parse import urlparse
|
|
3
|
+
|
|
4
|
+
import asyncclick as click
|
|
5
|
+
from rich import print
|
|
6
|
+
|
|
7
|
+
from crodl.program.audiowork import AudioWork
|
|
8
|
+
from crodl.program.series import Series
|
|
9
|
+
from crodl.program.show import Show
|
|
10
|
+
from crodl.tools.scrap import cro_session, is_series, is_show
|
|
11
|
+
from crodl.tools.logger import crologger
|
|
12
|
+
from crodl.settings import SUPPORTED_DOMAINS, AudioFormat
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def is_domain_supported(url: str) -> bool:
|
|
16
|
+
domain = urlparse(url).netloc
|
|
17
|
+
|
|
18
|
+
if not domain:
|
|
19
|
+
err = "The URL is invalid!"
|
|
20
|
+
crologger.error(err)
|
|
21
|
+
print(err)
|
|
22
|
+
raise ValueError(err)
|
|
23
|
+
|
|
24
|
+
return domain in SUPPORTED_DOMAINS
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
FORMAT_OPTIONS = {
|
|
28
|
+
"mp3": AudioFormat.MP3,
|
|
29
|
+
"hls": AudioFormat.HLS,
|
|
30
|
+
"dash": AudioFormat.DASH,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@click.command()
|
|
35
|
+
@click.argument("recording_url")
|
|
36
|
+
# @click.option("-d", "--download", is_flag=True, help="Spustí stahování")
|
|
37
|
+
@click.option(
|
|
38
|
+
"--stream-format",
|
|
39
|
+
"-sf",
|
|
40
|
+
type=click.Choice(list(FORMAT_OPTIONS.keys())),
|
|
41
|
+
default="mp3",
|
|
42
|
+
help="Formát audio streamu. (mp3, hls, dash)",
|
|
43
|
+
)
|
|
44
|
+
async def main(recording_url: str, stream_format: str, download: bool = True) -> None:
|
|
45
|
+
if not is_domain_supported(recording_url):
|
|
46
|
+
raise NotImplementedError(
|
|
47
|
+
f"Unsuported domain: {urlparse(recording_url).netloc}"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
show, series = False, False
|
|
51
|
+
|
|
52
|
+
if is_show(recording_url, cro_session):
|
|
53
|
+
show = True
|
|
54
|
+
audiowork = Show(url=recording_url)
|
|
55
|
+
print(f"[bold yellow]{audiowork.title}[/bold yellow]")
|
|
56
|
+
print(f"Celkový počet dílů: {audiowork.episodes.count}")
|
|
57
|
+
|
|
58
|
+
if audiowork.are_all_parts_downloaded():
|
|
59
|
+
print("[bold yellow]Seriál byl již celý stažen.[/bold yellow]")
|
|
60
|
+
sys.exit(0)
|
|
61
|
+
|
|
62
|
+
elif is_series(recording_url, cro_session):
|
|
63
|
+
series = True
|
|
64
|
+
audiowork = Series(url=recording_url)
|
|
65
|
+
print(f"[bold yellow]{audiowork.title}[/bold yellow]")
|
|
66
|
+
print(f"Celkový počet dílů: {audiowork.parts}")
|
|
67
|
+
|
|
68
|
+
if audiowork.are_all_parts_downloaded():
|
|
69
|
+
print("[bold yellow]Seriál byl již celý stažen.[/bold yellow]")
|
|
70
|
+
sys.exit(0)
|
|
71
|
+
else:
|
|
72
|
+
audiowork = AudioWork(url=recording_url)
|
|
73
|
+
audiowork.info()
|
|
74
|
+
|
|
75
|
+
if show or series:
|
|
76
|
+
ans = input("Pokračovat ve stahování? [a/n] ")
|
|
77
|
+
if ans in ("a", "A", "y", "Y"):
|
|
78
|
+
await audiowork.download(audio_format=FORMAT_OPTIONS[stream_format])
|
|
79
|
+
else:
|
|
80
|
+
print("[bold magenta]OK, končím. :wave:[/bold magenta]")
|
|
81
|
+
sys.exit(0)
|
|
82
|
+
else:
|
|
83
|
+
if audiowork.already_exists():
|
|
84
|
+
print("[bold magenta]Soubor již existuje.[/bold magenta] :wave:")
|
|
85
|
+
sys.exit(0)
|
|
86
|
+
await audiowork.download(audio_format=FORMAT_OPTIONS[stream_format])
|