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.
- socials_daily-0.1.0/.gitignore +22 -0
- socials_daily-0.1.0/LICENSE +21 -0
- socials_daily-0.1.0/PKG-INFO +259 -0
- socials_daily-0.1.0/README.md +209 -0
- socials_daily-0.1.0/pyproject.toml +61 -0
- socials_daily-0.1.0/src/socials_daily/__init__.py +3 -0
- socials_daily-0.1.0/src/socials_daily/__main__.py +266 -0
- socials_daily-0.1.0/src/socials_daily/config.py +34 -0
- socials_daily-0.1.0/src/socials_daily/providers/__init__.py +35 -0
- socials_daily-0.1.0/src/socials_daily/providers/hikerapi.py +87 -0
- socials_daily-0.1.0/src/socials_daily/providers/xpoz.py +63 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/__init__.py +73 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/base.py +26 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/bluesky.py +130 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/instaloader.py +71 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/reddit.py +95 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/rss.py +104 -0
- socials_daily-0.1.0/src/socials_daily/scrapers/youtube.py +121 -0
|
@@ -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
|
+
]
|