socials-daily 0.1.0__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.
@@ -0,0 +1,22 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # Output
13
+ output/
14
+
15
+ # Seen posts tracker
16
+ .seen.json
17
+
18
+ # Config with API keys
19
+ .socials_daily.config.json
20
+
21
+ # Account list (personal data)
22
+ accounts.json
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bartlomiej Cieszkowski
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,259 @@
1
+ Metadata-Version: 2.5
2
+ Name: socials-daily
3
+ Version: 0.1.0
4
+ Summary: Multi-platform social media daily digest CLI
5
+ Project-URL: Homepage, https://github.com/bartlomiejcieszkowski/socials-daily
6
+ Project-URL: Bug Tracker, https://github.com/bartlomiejcieszkowski/socials-daily/issues
7
+ Project-URL: Documentation, https://github.com/bartlomiejcieszkowski/socials-daily#readme
8
+ Author-email: Bartlomiej Cieszkowski <bartlomiej.cieszkowski@gmail.com>
9
+ License: MIT License
10
+
11
+ Copyright (c) 2026 Bartlomiej Cieszkowski
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+ License-File: LICENSE
31
+ Keywords: cli,daily,scraper,social-media,summary
32
+ Classifier: Environment :: Console
33
+ Classifier: License :: OSI Approved :: MIT License
34
+ Classifier: Operating System :: OS Independent
35
+ Classifier: Programming Language :: Python :: 3
36
+ Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Topic :: Internet :: WWW/HTTP
38
+ Requires-Python: >=3.12
39
+ Requires-Dist: atproto>=0.0.72
40
+ Requires-Dist: feedparser>=6.0.14
41
+ Requires-Dist: httpx>=0.27.0
42
+ Requires-Dist: instaloader>=4.15.3
43
+ Provides-Extra: hikerapi
44
+ Requires-Dist: hikerapi>=1.8.2; extra == 'hikerapi'
45
+ Provides-Extra: xpoz
46
+ Requires-Dist: xpoz>=0.8.0; extra == 'xpoz'
47
+ Provides-Extra: youtube
48
+ Requires-Dist: yt-dlp>=2024.0.0; extra == 'youtube'
49
+ Description-Content-Type: text/markdown
50
+
51
+ # Socials Daily
52
+
53
+ Fetch recent posts from public social media accounts and generate a daily summary.
54
+
55
+ ## Setup
56
+
57
+ ```bash
58
+ uv sync
59
+ ```
60
+
61
+ Optional backends:
62
+
63
+ ```bash
64
+ uv sync -E hikerapi -E xpoz -E youtube
65
+ ```
66
+
67
+ ## Usage
68
+
69
+ 1. Edit `accounts.json` — grouped by platform:
70
+
71
+ ```json
72
+ {
73
+ "bluesky": {
74
+ "accounts": [{"handle": "bsky.app"}]
75
+ },
76
+ "instagram": {
77
+ "accounts": [{"handle": "natgeo"}, {"handle": "nasa"}]
78
+ }
79
+ }
80
+ ```
81
+
82
+ Each account can have a custom `limit`:
83
+
84
+ ```json
85
+ {
86
+ "bluesky": {
87
+ "accounts": [
88
+ {"handle": "bsky.app"},
89
+ {"handle": "atmos.bsky.social", "limit": 20}
90
+ ]
91
+ },
92
+ "instagram": {
93
+ "accounts": [
94
+ {"handle": "natgeo"}
95
+ ]
96
+ }
97
+ }
98
+ ```
99
+
100
+ Each platform can override the scraper backend (optional):
101
+
102
+ ```json
103
+ {
104
+ "instagram": {
105
+ "backend": "hikerapi",
106
+ "accounts": [
107
+ {"handle": "natgeo"}
108
+ ]
109
+ }
110
+ }
111
+ ```
112
+
113
+ **Backend resolution** (highest to lowest priority):
114
+ 1. CLI `--backend` flag (overrides everything)
115
+ 2. Platform `backend` in `accounts.json`
116
+ 3. Default mapping (`instagram` → `instaloader`, `bluesky` → `bluesky`, etc.)
117
+
118
+ 2. Run the scraper:
119
+
120
+ ```bash
121
+ # Default: Bluesky (free, no auth needed)
122
+ uv run python -m socials_daily scrape
123
+
124
+ # Instagram (free, rate-limited)
125
+ uv run python -m socials_daily scrape --backend instaloader
126
+
127
+ # HikerAPI (pay-per-request, ~$0.0006/request)
128
+ uv run python -m socials_daily scrape --backend hikerapi --api-key YOUR_KEY
129
+
130
+ # Xpoz (pre-indexed data, free tier available)
131
+ uv run python -m socials_daily scrape --backend xpoz --api-key YOUR_KEY
132
+ ```
133
+
134
+ 3. Check the output:
135
+
136
+ ```
137
+ output/daily-summary-YYYY-MM-DD.md # Markdown summary
138
+ output/daily-summary-YYYY-MM-DD.json # JSON for programmatic use
139
+ ```
140
+
141
+ ## Add Accounts
142
+
143
+ ```bash
144
+ # Bluesky (default)
145
+ uv run python -m socials_daily add bsky.app
146
+
147
+ # Instagram
148
+ uv run python -m socials_daily add natgeo --platform instagram
149
+
150
+ # With custom limit
151
+ uv run python -m socials_daily add atmos.bsky.social --platform bluesky --limit 20
152
+
153
+ # Set platform backend
154
+ uv run python -m socials_daily add natgeo --platform instagram --backend hikerapi
155
+ ```
156
+
157
+ ## Scrapers
158
+
159
+ | Backend | Cost | Setup | Best For |
160
+ |---|---|---|---|
161
+ | `bluesky` | Free | None | Public Bluesky accounts |
162
+ | `instaloader` | Free | None | 1-5 Instagram accounts, low volume |
163
+ | `reddit` | Free | None | Subreddit posts |
164
+ | `rss` | Free | None | Any RSS/Atom feed |
165
+ | `youtube` | Free | `uv sync -E youtube` | YouTube channel videos |
166
+ | `hikerapi` | ~$0.0006/request | API key | Reliable, high volume |
167
+ | `xpoz` | Free tier available | API key | Pre-indexed data, multi-platform |
168
+
169
+ ### Bluesky (default)
170
+
171
+ Uses Bluesky's public AT Protocol API. No authentication required.
172
+
173
+ ```bash
174
+ uv run python -m socials_daily scrape --backend bluesky
175
+ ```
176
+
177
+ ### Instaloader
178
+
179
+ Free, open-source Instagram scraper. Rate-limited by Instagram.
180
+
181
+ ### HikerAPI
182
+
183
+ REST API with 100+ endpoints. No blocks, no rate limits.
184
+
185
+ ```bash
186
+ export HIKERAPI_TOKEN=your-key
187
+ uv run python -m socials_daily scrape --backend hikerapi
188
+ ```
189
+
190
+ ### Xpoz
191
+
192
+ Pre-indexed social data API. Supports Instagram, Twitter, TikTok, Reddit.
193
+
194
+ ```bash
195
+ export XPOZ_API_KEY=your-key
196
+ uv run python -m socials_daily scrape --backend xpoz
197
+ ```
198
+
199
+ ### YouTube
200
+
201
+ Fetches recent videos from YouTube channels. Requires optional `yt-dlp` dependency.
202
+
203
+ ```bash
204
+ # Install YouTube support
205
+ uv sync -E youtube
206
+
207
+ # Add a channel (handle or name)
208
+ uv run python -m socials_daily add mkbhd --platform youtube
209
+
210
+ # Scrape
211
+ uv run python -m socials_daily scrape
212
+ ```
213
+
214
+ ### Reddit
215
+
216
+ Fetches recent posts from public subreddits via Reddit's JSON API. No authentication required.
217
+
218
+ ```bash
219
+ # Add a subreddit
220
+ uv run python -m socials_daily add programming --platform reddit
221
+
222
+ # Scrape
223
+ uv run python -m socials_daily scrape
224
+ ```
225
+
226
+ ### RSS
227
+
228
+ Scrapes any RSS/Atom feed. The `handle` field holds the feed URL.
229
+
230
+ ```bash
231
+ # Add an RSS feed
232
+ uv run python -m socials_daily add https://www.reddit.com/r/programming/.rss --platform rss
233
+
234
+ # Scrape
235
+ uv run python -m socials_daily scrape
236
+ ```
237
+
238
+ ## Project Structure
239
+
240
+ ```
241
+ accounts.json # Accounts grouped by platform (with optional backend config)
242
+ src/socials_daily/ # Source code
243
+ ├── __main__.py # Entry point
244
+ └── scrapers/ # Scraper backends
245
+ ├── base.py # Abstract interface
246
+ ├── bluesky.py
247
+ ├── instaloader.py
248
+ ├── reddit.py # Reddit JSON API
249
+ ├── rss.py # RSS/Atom feeds
250
+ ├── youtube.py # YouTube channel videos
251
+ ├── hikerapi.py
252
+ └── xpoz.py
253
+ output/ # Generated daily summaries
254
+ pyproject.toml # Project config (uv)
255
+ ```
256
+
257
+ ## Architecture
258
+
259
+ See [ARCHITECTURE.md](ARCHITECTURE.md) for a detailed breakdown of the scraper layer, config resolution, deduplication system, and data flow.
@@ -0,0 +1,209 @@
1
+ # Socials Daily
2
+
3
+ Fetch recent posts from public social media accounts and generate a daily summary.
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ uv sync
9
+ ```
10
+
11
+ Optional backends:
12
+
13
+ ```bash
14
+ uv sync -E hikerapi -E xpoz -E youtube
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ 1. Edit `accounts.json` — grouped by platform:
20
+
21
+ ```json
22
+ {
23
+ "bluesky": {
24
+ "accounts": [{"handle": "bsky.app"}]
25
+ },
26
+ "instagram": {
27
+ "accounts": [{"handle": "natgeo"}, {"handle": "nasa"}]
28
+ }
29
+ }
30
+ ```
31
+
32
+ Each account can have a custom `limit`:
33
+
34
+ ```json
35
+ {
36
+ "bluesky": {
37
+ "accounts": [
38
+ {"handle": "bsky.app"},
39
+ {"handle": "atmos.bsky.social", "limit": 20}
40
+ ]
41
+ },
42
+ "instagram": {
43
+ "accounts": [
44
+ {"handle": "natgeo"}
45
+ ]
46
+ }
47
+ }
48
+ ```
49
+
50
+ Each platform can override the scraper backend (optional):
51
+
52
+ ```json
53
+ {
54
+ "instagram": {
55
+ "backend": "hikerapi",
56
+ "accounts": [
57
+ {"handle": "natgeo"}
58
+ ]
59
+ }
60
+ }
61
+ ```
62
+
63
+ **Backend resolution** (highest to lowest priority):
64
+ 1. CLI `--backend` flag (overrides everything)
65
+ 2. Platform `backend` in `accounts.json`
66
+ 3. Default mapping (`instagram` → `instaloader`, `bluesky` → `bluesky`, etc.)
67
+
68
+ 2. Run the scraper:
69
+
70
+ ```bash
71
+ # Default: Bluesky (free, no auth needed)
72
+ uv run python -m socials_daily scrape
73
+
74
+ # Instagram (free, rate-limited)
75
+ uv run python -m socials_daily scrape --backend instaloader
76
+
77
+ # HikerAPI (pay-per-request, ~$0.0006/request)
78
+ uv run python -m socials_daily scrape --backend hikerapi --api-key YOUR_KEY
79
+
80
+ # Xpoz (pre-indexed data, free tier available)
81
+ uv run python -m socials_daily scrape --backend xpoz --api-key YOUR_KEY
82
+ ```
83
+
84
+ 3. Check the output:
85
+
86
+ ```
87
+ output/daily-summary-YYYY-MM-DD.md # Markdown summary
88
+ output/daily-summary-YYYY-MM-DD.json # JSON for programmatic use
89
+ ```
90
+
91
+ ## Add Accounts
92
+
93
+ ```bash
94
+ # Bluesky (default)
95
+ uv run python -m socials_daily add bsky.app
96
+
97
+ # Instagram
98
+ uv run python -m socials_daily add natgeo --platform instagram
99
+
100
+ # With custom limit
101
+ uv run python -m socials_daily add atmos.bsky.social --platform bluesky --limit 20
102
+
103
+ # Set platform backend
104
+ uv run python -m socials_daily add natgeo --platform instagram --backend hikerapi
105
+ ```
106
+
107
+ ## Scrapers
108
+
109
+ | Backend | Cost | Setup | Best For |
110
+ |---|---|---|---|
111
+ | `bluesky` | Free | None | Public Bluesky accounts |
112
+ | `instaloader` | Free | None | 1-5 Instagram accounts, low volume |
113
+ | `reddit` | Free | None | Subreddit posts |
114
+ | `rss` | Free | None | Any RSS/Atom feed |
115
+ | `youtube` | Free | `uv sync -E youtube` | YouTube channel videos |
116
+ | `hikerapi` | ~$0.0006/request | API key | Reliable, high volume |
117
+ | `xpoz` | Free tier available | API key | Pre-indexed data, multi-platform |
118
+
119
+ ### Bluesky (default)
120
+
121
+ Uses Bluesky's public AT Protocol API. No authentication required.
122
+
123
+ ```bash
124
+ uv run python -m socials_daily scrape --backend bluesky
125
+ ```
126
+
127
+ ### Instaloader
128
+
129
+ Free, open-source Instagram scraper. Rate-limited by Instagram.
130
+
131
+ ### HikerAPI
132
+
133
+ REST API with 100+ endpoints. No blocks, no rate limits.
134
+
135
+ ```bash
136
+ export HIKERAPI_TOKEN=your-key
137
+ uv run python -m socials_daily scrape --backend hikerapi
138
+ ```
139
+
140
+ ### Xpoz
141
+
142
+ Pre-indexed social data API. Supports Instagram, Twitter, TikTok, Reddit.
143
+
144
+ ```bash
145
+ export XPOZ_API_KEY=your-key
146
+ uv run python -m socials_daily scrape --backend xpoz
147
+ ```
148
+
149
+ ### YouTube
150
+
151
+ Fetches recent videos from YouTube channels. Requires optional `yt-dlp` dependency.
152
+
153
+ ```bash
154
+ # Install YouTube support
155
+ uv sync -E youtube
156
+
157
+ # Add a channel (handle or name)
158
+ uv run python -m socials_daily add mkbhd --platform youtube
159
+
160
+ # Scrape
161
+ uv run python -m socials_daily scrape
162
+ ```
163
+
164
+ ### Reddit
165
+
166
+ Fetches recent posts from public subreddits via Reddit's JSON API. No authentication required.
167
+
168
+ ```bash
169
+ # Add a subreddit
170
+ uv run python -m socials_daily add programming --platform reddit
171
+
172
+ # Scrape
173
+ uv run python -m socials_daily scrape
174
+ ```
175
+
176
+ ### RSS
177
+
178
+ Scrapes any RSS/Atom feed. The `handle` field holds the feed URL.
179
+
180
+ ```bash
181
+ # Add an RSS feed
182
+ uv run python -m socials_daily add https://www.reddit.com/r/programming/.rss --platform rss
183
+
184
+ # Scrape
185
+ uv run python -m socials_daily scrape
186
+ ```
187
+
188
+ ## Project Structure
189
+
190
+ ```
191
+ accounts.json # Accounts grouped by platform (with optional backend config)
192
+ src/socials_daily/ # Source code
193
+ ├── __main__.py # Entry point
194
+ └── scrapers/ # Scraper backends
195
+ ├── base.py # Abstract interface
196
+ ├── bluesky.py
197
+ ├── instaloader.py
198
+ ├── reddit.py # Reddit JSON API
199
+ ├── rss.py # RSS/Atom feeds
200
+ ├── youtube.py # YouTube channel videos
201
+ ├── hikerapi.py
202
+ └── xpoz.py
203
+ output/ # Generated daily summaries
204
+ pyproject.toml # Project config (uv)
205
+ ```
206
+
207
+ ## Architecture
208
+
209
+ See [ARCHITECTURE.md](ARCHITECTURE.md) for a detailed breakdown of the scraper layer, config resolution, deduplication system, and data flow.
@@ -0,0 +1,61 @@
1
+ [project]
2
+ name = "socials-daily"
3
+ description = "Multi-platform social media daily digest CLI"
4
+ readme = "README.md"
5
+ dynamic = ["version"]
6
+ authors = [
7
+ { name = "Bartlomiej Cieszkowski", email = "bartlomiej.cieszkowski@gmail.com" }
8
+ ]
9
+ requires-python = ">=3.12"
10
+ keywords = ["social-media", "scraper", "cli", "daily", "summary"]
11
+ license = { file = "LICENSE" }
12
+ classifiers = [
13
+ "License :: OSI Approved :: MIT License",
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3.12",
16
+ "Operating System :: OS Independent",
17
+ "Environment :: Console",
18
+ "Topic :: Internet :: WWW/HTTP",
19
+ ]
20
+
21
+ dependencies = [
22
+ "atproto>=0.0.72",
23
+ "feedparser>=6.0.14",
24
+ "httpx>=0.27.0",
25
+ "instaloader>=4.15.3",
26
+ ]
27
+
28
+ [project.optional-dependencies]
29
+ hikerapi = ["hikerapi>=1.8.2"]
30
+ xpoz = ["xpoz>=0.8.0"]
31
+ youtube = ["yt-dlp>=2024.0.0"]
32
+
33
+ [project.urls]
34
+ "Homepage" = "https://github.com/bartlomiejcieszkowski/socials-daily"
35
+ "Bug Tracker" = "https://github.com/bartlomiejcieszkowski/socials-daily/issues"
36
+ "Documentation" = "https://github.com/bartlomiejcieszkowski/socials-daily#readme"
37
+
38
+ [build-system]
39
+ requires = ["hatchling"]
40
+ build-backend = "hatchling.build"
41
+
42
+ [tool.hatch.build]
43
+ only-packages = true
44
+
45
+ [tool.hatch.build.targets.wheel]
46
+ packages = ["src/socials_daily"]
47
+
48
+ [tool.hatch.version]
49
+ path = "src/socials_daily/__init__.py"
50
+
51
+ [tool.ruff]
52
+ line-length = 120
53
+
54
+ [tool.ruff.lint]
55
+ select = ["I"]
56
+
57
+ [dependency-groups]
58
+ dev = [
59
+ "pytest>=8.0",
60
+ "ruff>=0.1",
61
+ ]
@@ -0,0 +1,3 @@
1
+ """Fetch recent posts from public social media accounts and generate a daily summary."""
2
+
3
+ __version__ = "0.1.0"