youpdated 0.1.0__py3-none-any.whl

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,452 @@
1
+ Metadata-Version: 2.4
2
+ Name: youpdated
3
+ Version: 0.1.0
4
+ Summary: Simple update tracker for games, apps, and packages
5
+ Author-email: Void1-1 <161782542+Void1-1@users.noreply.github.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Void1-1/youpdated
8
+ Project-URL: Repository, https://github.com/Void1-1/youpdated
9
+ Project-URL: Issues, https://github.com/Void1-1/youpdated/issues
10
+ Project-URL: Changelog, https://github.com/Void1-1/youpdated/blob/main/CHANGELOG.md
11
+ Keywords: updates,release-tracking,scraper,rss,privacy,steam,itch,npm,github,youtube,cli
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: End Users/Desktop
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Natural Language :: English
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Programming Language :: Python :: 3 :: Only
24
+ Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
25
+ Classifier: Topic :: Utilities
26
+ Classifier: Typing :: Typed
27
+ Requires-Python: >=3.11
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Requires-Dist: httpx[socks]>=0.27
31
+ Requires-Dist: feedparser>=6.0
32
+ Requires-Dist: rich>=13.0
33
+ Requires-Dist: PyYAML>=6.0
34
+ Requires-Dist: platformdirs>=4.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest>=8.0; extra == "dev"
37
+ Requires-Dist: respx>=0.21; extra == "dev"
38
+ Provides-Extra: publish
39
+ Requires-Dist: build>=1.2; extra == "publish"
40
+ Requires-Dist: twine>=5.0; extra == "publish"
41
+ Dynamic: license-file
42
+
43
+ # Youpdated
44
+
45
+ [![tests](https://github.com/Void1-1/youpdated/actions/workflows/tests.yml/badge.svg)](https://github.com/Void1-1/youpdated/actions/workflows/tests.yml)
46
+
47
+ A dynamic scraper that collects update information about the games, apps, and packages you follow, and reports back what changed.
48
+
49
+ It is built to be **privacy-preserving, anonymous, and customizable**: no accounts, no API keys required, nothing stored anywhere non-local.
50
+
51
+ ```text
52
+ ╭─ steam ──────────────────────────────────────────────────────────╮
53
+ │ Team Fortress 2 (440) │
54
+ │ • CLTF2 Halloween Cup 7d ago │
55
+ │ https://store.steampowered.com/news/app/440/view/6728766547… │
56
+ ╰──────────────────────────────────────────────────────────────────╯
57
+ ╭─ github ─────────────────────────────────────────────────────────╮
58
+ │ python/cpython │
59
+ │ • v3.14.7 5d ago │
60
+ │ https://github.com/python/cpython/releases/tag/v3.14.7 │
61
+ ╰──────────────────────────────────────────────────────────────────╯
62
+ ```
63
+
64
+ ## Sources
65
+
66
+ | Source | What it watches | Endpoint |
67
+ | --- | --- | --- |
68
+ | `github` | Releases, tags, commits | `.atom` feeds (no auth needed) |
69
+ | `npm` | Newly published versions | the public registry |
70
+ | `steam` | Patch notes and news | the store's news feed |
71
+ | `itch` | Devlog posts and new builds | `<game>/devlog.rss` + the game page |
72
+ | `youtube` | New videos on a channel or playlist | the channel feed, with fallbacks |
73
+ | `browser` | Chrome, Brave, Firefox, Edge releases | each vendor's public version history |
74
+ | `feed` | Any RSS/Atom URL: the escape hatch for everything else | the feed itself |
75
+
76
+ ---
77
+
78
+ ## 1. Install
79
+
80
+ Requires **Python 3.11 or newer** (`python3 --version` to check). CI runs the full suite on
81
+ **Linux, macOS, and Windows** across Python 3.11–3.14.
82
+
83
+ ```sh
84
+ cd /path/to/Youpdated
85
+ python3 -m venv .venv
86
+ .venv/bin/pip install .
87
+ ```
88
+
89
+ On **Windows**, use `python` and the `Scripts` directory:
90
+
91
+ ```powershell
92
+ python -m venv .venv
93
+ .venv\Scripts\pip install .
94
+ ```
95
+
96
+ That installs a `youpdated` command inside the virtualenv, at `.venv/bin/youpdated` on
97
+ macOS/Linux and `.venv\Scripts\youpdated.exe` on Windows. Either call it by that full path, or put
98
+ it on your `PATH`:
99
+
100
+ ```sh
101
+ export PATH="$PWD/.venv/bin:$PATH" # macOS / Linux
102
+ youpdated --version # -> youpdated 0.1.0
103
+ ```
104
+
105
+ ```powershell
106
+ $env:PATH = "$PWD\.venv\Scripts;$env:PATH" # Windows
107
+ youpdated --version
108
+ ```
109
+
110
+ To make that permanent, add the `export` line to your `~/.zshrc`, or the `$env:PATH` line to your
111
+ PowerShell profile. Examples assume `youpdated` is on your `PATH`; if it isn't, substitute the full
112
+ path above.
113
+
114
+ ## 2. Create your config
115
+
116
+ ```sh
117
+ youpdated init
118
+ ```
119
+
120
+ This writes a commented starter config and **prints the path it used**, which is:
121
+
122
+ | OS | Config file | History database |
123
+ | --- | --- | --- |
124
+ | macOS | `~/Library/Application Support/youpdated/config.yaml` | `~/Library/Application Support/youpdated/state.sqlite3` |
125
+ | Linux | `~/.config/youpdated/config.yaml` | `~/.local/share/youpdated/state.sqlite3` |
126
+ | Windows | `%LOCALAPPDATA%\youpdated\config.yaml` | `%LOCALAPPDATA%\youpdated\state.sqlite3` |
127
+
128
+ Three locations are checked, (in this order) the first one found chosen:
129
+
130
+ 1. `--config PATH`, if you pass it
131
+ 2. `./youpdated.yaml` or `./youpdated.yml` in the current directory
132
+ 3. the per-user path in the table above
133
+
134
+ Use `youpdated init -c ./youpdated.yaml` if you'd rather keep the config in a project folder.
135
+ Add `--force` to overwrite an existing file.
136
+
137
+ ## 3. Edit it to watch what want
138
+
139
+ Open the file printed. Every source entry takes **a bare value** or **a mapping**. A minimal config:
140
+
141
+ ```yaml
142
+ sources:
143
+ github:
144
+ - python/cpython
145
+ npm:
146
+ - express
147
+ ```
148
+
149
+ ### Where to find identifiers
150
+
151
+ | You want to watch | Put this in the config | How to find it |
152
+ | --- | --- | --- |
153
+ | A GitHub repo | `python/cpython` | The `owner/repo` part of the repo URL. A full `https://github.com/owner/repo` URL also works. |
154
+ | An npm package | `express`, `"@types/node"` | The package name on npmjs.com. **Quote scoped names**: YAML treats a leading `@` specially. |
155
+ | A Steam game | `440` | The number in the store URL: `store.steampowered.com/app/`**`440`**`/Team_Fortress_2/`. The full store URL also works, and the game's name is looked up for you. |
156
+ | An itch.io game | `https://user.itch.io/game-name` | The game's page URL, exactly as it appears in the address bar. |
157
+ | A YouTube channel | `"@NASA"` | The `@handle` from the channel URL. A `UC…` channel id or full channel URL also works. **Quote it**: YAML treats a leading `@` specially. |
158
+ | A YouTube playlist | `playlist: PLxxxx` | The `list=` parameter in the playlist URL. A full playlist URL also works. |
159
+ | A browser | `chrome`, `brave`, `firefox`, `edge` | Just the name. Add `platform:` and `channel:` to narrow it. See the [full example](#full-example). |
160
+ | Anything else | `https://example.com/feed.xml` | Any RSS or Atom feed URL. Many apps publish one at `/feed.xml`, `/releases.atom`, or `/blog/rss`. |
161
+
162
+ ### Full example
163
+
164
+ ```yaml
165
+ privacy:
166
+ # proxy: socks5://127.0.0.1:9050 # Tor's default SOCKS port
167
+ user_agent: rotate # 'rotate', or a fixed UA string
168
+ jitter: [0.5, 3.0] # random gap between hits on one host
169
+ concurrency: 4
170
+ timeout: 20
171
+
172
+ sources:
173
+ github:
174
+ - python/cpython # easy
175
+ - repo: astral-sh/uv # advanced:
176
+ watch: [releases, commits] # releases | tags | commits
177
+ branch: main # for `commits`
178
+
179
+ npm:
180
+ - express
181
+ - "@types/node"
182
+ - package: react
183
+ tag: next # follow a dist-tag other than latest
184
+
185
+ steam:
186
+ - 440 # appid; the store name is resolved for you
187
+ - appid: 730
188
+ name: Counter-Strike 2
189
+
190
+ itch:
191
+ - https://hempuli.itch.io/baba-is-you # devlogs and builds (default)
192
+ - url: https://aak581.itch.io/engineering-marvels-from-hell
193
+ watch: [devlog, releases] # choose one if you prefer
194
+
195
+ youtube:
196
+ - "@NASA" # handle, channel id, or channel URL
197
+ - playlist: PLxxxxxxxxxxxxxxxx
198
+
199
+ browser:
200
+ - chrome
201
+ - brave
202
+ - firefox
203
+ - browser: edge
204
+ platform: windows # mac | windows | linux | android | ios
205
+ channel: beta # stable | beta | dev | canary (+ esr/nightly for firefox)
206
+
207
+ feed: # anything with an RSS/Atom feed
208
+ - https://blog.rust-lang.org/feed.xml
209
+ - url: https://github.com/obsidianmd/obsidian-releases/releases.atom
210
+ name: Obsidian
211
+ limit: 5
212
+ ```
213
+
214
+ Check your config without sending a request:
215
+
216
+ ```sh
217
+ youpdated check --test -v
218
+ ```
219
+
220
+ That validates the file and prints every URL it would fetch. Config mistakes exit `1` with a message naming the offense.
221
+
222
+ ## 4. Run
223
+
224
+ ```sh
225
+ youpdated check
226
+ ```
227
+
228
+ **The first run reports nothing** It records a baseline of what exists, so that later runs show changes rather than every item published:
229
+
230
+ ```text
231
+ ╭──────────── first run ─────────────╮
232
+ │ Baseline recorded for 15 target(s),│
233
+ │ 142 existing item(s). │
234
+ │ Future runs report only what's new.│
235
+ ╰────────────────────────────────────╯
236
+ ```
237
+
238
+ To see the current state right away, add `--all`:
239
+
240
+ ```sh
241
+ youpdated check --all
242
+ ```
243
+
244
+ From then on, `youpdated check` prints only what changed since the previous run.
245
+
246
+ ---
247
+
248
+ ## Command reference
249
+
250
+ ```sh
251
+ youpdated check # what's new since last run (the default command)
252
+ youpdated check --all # everything currently published, ignoring history
253
+ youpdated check --since 7d # only items from the last week (30m, 12h, 7d, 2w)
254
+ youpdated check -s github -s npm # limit to some sources
255
+ youpdated check --json # machine-readable output
256
+ youpdated check --rss ~/feeds/you.xml # aggregated Atom feed for a reader
257
+ youpdated check --test -v # test to show what it would request
258
+ youpdated check --no-save # report without recording anything as seen
259
+ youpdated check --fail-on-error # exit 2 if any source failed
260
+ youpdated check -v # show each request, its status, and item summaries
261
+ youpdated check --state ./test.db # use a throwaway history file
262
+ youpdated sources # list available sources
263
+ youpdated init --force # rewrite the starter config
264
+ youpdated uninstall --test # list every file the tool wrote
265
+ ```
266
+
267
+ Running `youpdated` with no arguments runs `youpdated check`.
268
+
269
+ `--json` writes **only** JSON to stdout; progress and errors go to stderr, so this is safe:
270
+
271
+ ```sh
272
+ youpdated check --json | jq '.updates[] | select(.source == "github") | .title'
273
+ ```
274
+
275
+ Exit codes: `0` success, `1` config error, `2` with `--fail-on-error` when a source failed, `130` on interrupt.
276
+
277
+ ## Running it on schedule
278
+
279
+ Once a day is plenty, most of these sources change slowly, and conditional requests make repeat runs cheap. Use absolute paths, since cron and launchd don't inherit your shell's `PATH`.
280
+
281
+ **cron** (`crontab -e`) run at 9am and append to a log:
282
+
283
+ ```cron
284
+ 0 9 * * * /path/to/Youpdated/.venv/bin/youpdated check >> ~/youpdated.log 2>&1
285
+ ```
286
+
287
+ **Keep an RSS feed fresh** for a reader to poll. Note that `--rss` writes that run's items, so a plain `check --rss` leaves almost an empty file. For a feed that always holds a rolling window, ask for it. `--no-save` keeps this from interfering with your daily incremental run:
288
+
289
+ ```cron
290
+ 0 * * * * /path/to/Youpdated/.venv/bin/youpdated check --all --since 30d --no-save --rss ~/feeds/youpdated.xml
291
+ ```
292
+
293
+ **macOS launchd**: save as `~/Library/LaunchAgents/com.youpdated.check.plist`, then `launchctl load ~/Library/LaunchAgents/com.youpdated.check.plist`:
294
+
295
+ ```xml
296
+ <?xml version="1.0" encoding="UTF-8"?>
297
+ <plist version="1.0"><dict>
298
+ <key>Label</key><string>com.youpdated.check</string>
299
+ <key>ProgramArguments</key>
300
+ <array>
301
+ <string>/path/to/Youpdated/.venv/bin/youpdated</string>
302
+ <string>check</string>
303
+ <string>--rss</string>
304
+ <string>/Users/you/feeds/youpdated.xml</string>
305
+ </array>
306
+ <key>StartCalendarInterval</key><dict><key>Hour</key><integer>9</integer></dict>
307
+ <key>StandardOutPath</key><string>/tmp/youpdated.log</string>
308
+ <key>StandardErrorPath</key><string>/tmp/youpdated.err</string>
309
+ </dict></plist>
310
+ ```
311
+
312
+ ## Troubleshooting
313
+
314
+ | Symptom | Cause and fix |
315
+ | --- | --- |
316
+ | `Config error: no config file found` | Run `youpdated init`, or pass `--config PATH`. |
317
+ | First run printed nothing | Working as intended — it recorded a baseline. Run `youpdated check --all` to see current items. |
318
+ | `--all` shows fewer items than expected | Nothing is wrong; sources cap how much history they expose (10–20 items each). |
319
+ | A source appears in the yellow `problems` panel | That one source failed; the rest of the run still completed. Re-run with `-v` to see the request and status. |
320
+ | `unknown source 'X'` | Check spelling against `youpdated sources`. |
321
+ | YouTube fails every path | Its feed throttles intermittently. Retry, or set `privacy.proxy`, or export `YOUTUBE_API_KEY`. |
322
+ | An itch game reports nothing | It has neither a devlog nor a file listing. Confirm with `youpdated check -s itch --all -v`. |
323
+ | Everything reports as new again | The history database was deleted or `--state` points somewhere new. |
324
+ | `youpdated: command not found` | The virtualenv isn't on your `PATH`. Use `.venv/bin/youpdated`. |
325
+ | `ModuleNotFoundError: youpdated` | You used `pip install -e .` on MacOS |
326
+
327
+ To start over from a clean slate, delete the history database (the path is in the table in [step 2](#2-create-your-config)); your config is untouched.
328
+
329
+ ## Uninstalling
330
+
331
+ Youpdated writes two files, but it will find and remove them for you. **Always check first:**
332
+
333
+ ```sh
334
+ youpdated uninstall --test
335
+ ```
336
+
337
+ That prints every path it would delete. When you're ready:
338
+
339
+ ```sh
340
+ youpdated uninstall
341
+ ```
342
+
343
+ It lists the files again and waits for you to confirm. Add `--yes` to skip the prompt in a script. It refuses rather than assuming consent.
344
+
345
+ ```sh
346
+ youpdated uninstall --keep-config # wipe history, keep your config
347
+ youpdated uninstall --state ./test.db # also remove a database from --state
348
+ ```
349
+
350
+ Two rules: a directory is removed only if it is named `youpdated` and is empty once the tool's own files are gone. Anything else is kept and reported.
351
+
352
+ It prints the command to remove the package itself. (which it can't do while running):
353
+
354
+ ```sh
355
+ /path/to/.venv/bin/python -m pip uninstall youpdated
356
+ ```
357
+
358
+ If you installed into a dedicated virtualenv, deleting that directory removes the package too.
359
+
360
+ ## Privacy
361
+
362
+ - **No credentials.** Every source works unauthenticated. `GITHUB_TOKEN` and `YOUTUBE_API_KEY` are read from the environment if set (only for raising rate limits) and are never written to config.
363
+ - **Local only.** Config and history live in your platform's config/data directories. Nothing is sent anywhere except the sources you list.
364
+ - **One HTTP path.** Every request goes through [youpdated/http.py](https://github.com/Void1-1/youpdated/blob/main/youpdated/http.py). `privacy.proxy` covers all traffic. To check:
365
+
366
+ ```sh
367
+ youpdated check --all --no-save # with privacy.proxy: socks5://127.0.0.1:9
368
+ ```
369
+
370
+ - **Cookies are discarded** on every request, so nothing accumulates across a run.
371
+ - **Requests are paced** per host with random jitter instead of arriving in a burst.
372
+ - **Conditional GETs** (ETag / Last-Modified) mean unchanged feeds are re-fetched cheaply, which is both faster and less fingerprintable. `--all` turns them off, since a 304 has no items.
373
+
374
+ ## Development
375
+
376
+ Install the test dependencies and run the suite from the repo root:
377
+
378
+ ```sh
379
+ .venv/bin/pip install ".[dev]"
380
+ PYTHONPATH=$PWD .venv/bin/python -m pytest
381
+ ```
382
+
383
+ `PYTHONPATH=$PWD` is what makes your working-tree changes take effect without reinstalling. Run the CLI the same way while developing:
384
+
385
+ ```sh
386
+ PYTHONPATH=$PWD .venv/bin/python -m youpdated check --test -v
387
+ ```
388
+
389
+ Tests run entirely offline: each parser is exercised against real captured payloads in [tests/fixtures/](https://github.com/Void1-1/youpdated/tree/main/tests/fixtures/) via `respx`, which fails the test rather than allowing a real request. After changing source code, reinstall with `.venv/bin/pip install .` to update the `youpdated` command itself.
390
+
391
+ ### Contributing
392
+
393
+ `main` is protected by a branch ruleset, changes arrive by pull request:
394
+
395
+ ```sh
396
+ git switch -c my-change
397
+ # ...work, commit...
398
+ git push -u origin my-change
399
+ gh pr create --fill
400
+ ```
401
+
402
+ The ruleset requires a pull request (no approvals needed), all 13 test jobs green, and the branch up to date with `main`; force-pushes and branch deletion are blocked. See [ADDING_SOURCES.md](https://github.com/Void1-1/youpdated/blob/main/ADDING_SOURCES.md) if your change is a new source.
403
+
404
+ ### Building a release
405
+
406
+ ```sh
407
+ .venv/bin/pip install ".[publish]"
408
+ rm -rf dist build *.egg-info
409
+ .venv/bin/python -m build # -> dist/*.whl and dist/*.tar.gz
410
+ .venv/bin/twine check dist/* # metadata and README render check
411
+ ```
412
+
413
+ Verify the artifact before uploading, by installing the wheel into a throwaway virtualenv rather than trusting the source tree:
414
+
415
+ ```sh
416
+ python3 -m venv /tmp/verify
417
+ /tmp/verify/bin/pip install dist/youpdated-*.whl
418
+ /tmp/verify/bin/youpdated sources
419
+ ```
420
+
421
+ Then publish. Uploading needs a PyPI account and an API token. Create one under
422
+ [Account settings --> API tokens](https://pypi.org/manage/account/token/), scoped to this project
423
+ once it exists (for a first upload the token has to be account-wide):
424
+
425
+ ```sh
426
+ .venv/bin/twine upload dist/*
427
+ # username: __token__
428
+ # password: pypi-... (the token, including the pypi- prefix)
429
+ ```
430
+
431
+ Test against [TestPyPI](https://test.pypi.org) first if you want to see the rendered project page before it's permanent:
432
+
433
+ ```sh
434
+ .venv/bin/twine upload --repository testpypi dist/*
435
+ ```
436
+
437
+ Then tag it and cut a GitHub release:
438
+
439
+ ```sh
440
+ git tag -a v0.1.0 -m "v0.1.0"
441
+ git push origin v0.1.0
442
+ gh release create v0.1.0 dist/* --notes-from-tag
443
+ ```
444
+
445
+ **A version is permanent.** PyPI refuses to replace an existing version even after a delete, so bump `version` in `pyproject.toml` before rebuilding. Add the matching `CHANGELOG.md` entry in the same commit.
446
+
447
+ ### Adding a source
448
+
449
+ **See [ADDING_SOURCES.md](https://github.com/Void1-1/youpdated/blob/main/ADDING_SOURCES.md)** for the full guide.
450
+
451
+ The short version: implement `targets()` and `fetch()` from the protocol in
452
+ [youpdated/sources/base.py](https://github.com/Void1-1/youpdated/blob/main/youpdated/sources/base.py), decorate the class with `@register`, and import it in [youpdated/sources/\_\_init\_\_.py](https://github.com/Void1-1/youpdated/blob/main/youpdated/sources/__init__.py). Reuse `entry_fields()` so your source accepts both the bare-value and mapping config shapes, and `parse_feed()` from [youpdated/sources/feed.py](https://github.com/Void1-1/youpdated/blob/main/youpdated/sources/feed.py) if the upstream is RSS/Atom. Third-party packages can register a source through a `youpdated.sources` entry point instead, without modifying this repo.
@@ -0,0 +1,31 @@
1
+ youpdated/__init__.py,sha256=IZMgOLkdtUrwe1l7-P5qx_OxkR3NiX72zqBlgkwJ-do,65
2
+ youpdated/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83
3
+ youpdated/cleanup.py,sha256=YkLZnju8NHMJP1h63KLg48HWIcDnoqIwMGgH0DkpTus,3318
4
+ youpdated/cli.py,sha256=Fp17jxqhzPkYv2I1sRMEMwDJFvTRjj_LQEEXNaWDNOw,8907
5
+ youpdated/config.py,sha256=HgqZpnk4Tm2-E3tR_epuda9NgZjNXyvGjppUOLH_Ztc,6266
6
+ youpdated/http.py,sha256=3paQ54X1xlbMtTjmkWx1t2CgSTkmvvSl8qJQtH2S6mc,7060
7
+ youpdated/models.py,sha256=_VEAwUOzf6BDZ_5Kf5hNa-7-9Q-CIrSKd1A6ukXbMJw,1433
8
+ youpdated/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ youpdated/registry.py,sha256=byDiOJVwSgJlaobWoiC17IrQrOi4ofcW7bAJYjWND6k,1291
10
+ youpdated/runner.py,sha256=YL-uyuaIEklgLWmzJXktNCSroUOqET4-DQkfkLkp7Wo,4181
11
+ youpdated/state.py,sha256=-8-Zg7PGTkWo-Sevr-0mkKdQKPcjVBlqzTpv8vzVu70,4896
12
+ youpdated/render/__init__.py,sha256=we1eIMaCruhUnELzaDb-oj4ku7YBK0Sk4j1VIGjaBL8,127
13
+ youpdated/render/json_out.py,sha256=_ixiAcbOhi12Ghx2VKymxZz02u6hSJsKBnBz5KQIXGI,927
14
+ youpdated/render/rss_out.py,sha256=JEbw_rUH13B2QIrVb3Ba9YRxDtGm-vgqTUkaMMlXvJk,2183
15
+ youpdated/render/terminal.py,sha256=d276P_bY04TY44QgTPBClJJwkYTnRZ7T8deFOash3Wc,4536
16
+ youpdated/sources/__init__.py,sha256=yafDrEZC8Wt2MFjrfCzjrHYBzxKhdPC7u6YamVU90tc,221
17
+ youpdated/sources/base.py,sha256=akdyWkwSdWz8eP5Nvc0lE9qk1pOUk_wMyxGIlzrCNuQ,1420
18
+ youpdated/sources/browser.py,sha256=zo81KHfPO6nDjfVSAflbd_ABQWuSJWoenmo8DLPWshY,14412
19
+ youpdated/sources/feed.py,sha256=51ckthWOeEse_au4QoZSIefremzOSKlaIKWHYeiIMEs,3307
20
+ youpdated/sources/generic.py,sha256=RCBqM4mN8i2o_vyNj-cAQiLvLmj13FhC_b5L4igid2o,2389
21
+ youpdated/sources/github.py,sha256=5zg_UU1L_bIscVY-0ii1wGu07dJ9reH9jtlkDMf_Rgg,5685
22
+ youpdated/sources/itch.py,sha256=QWW0vTaYgTk-q7An4N59fImh2na2UHlo5B9SiEx_lOU,7381
23
+ youpdated/sources/npm.py,sha256=CYTED3wCOnNNuyjpKqwiMX1sCDxXA-zSRvBamYlMP-g,3261
24
+ youpdated/sources/steam.py,sha256=MvzJqpMiEGHABixrW7iwQ0FqmZ7m2YJweLRxiwdTKf4,2779
25
+ youpdated/sources/youtube.py,sha256=rt3ZgnnKl3VPnCVYn3SMad6w8lTgz2JdYZYVmLa-a2o,12234
26
+ youpdated-0.1.0.dist-info/licenses/LICENSE,sha256=4fdwZsf2tFQMZPyH-5tc1imt3Vd6IzQcVIs3tT7AHdM,1064
27
+ youpdated-0.1.0.dist-info/METADATA,sha256=cbw3ROfPcDIPeBqGyHepLXazPWwrbsf8jjeAImCEb6o,19607
28
+ youpdated-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
29
+ youpdated-0.1.0.dist-info/entry_points.txt,sha256=DKOarwIfekT5-F7799xZOQP59Uab2qGrWqRlrQs7nmY,54
30
+ youpdated-0.1.0.dist-info/top_level.txt,sha256=Tz--SczX-O60SKXPK96kXeKPPfQVdeki0gei8gGiNdI,10
31
+ youpdated-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ youpdated = youpdated.__main__:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Void1-1
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 @@
1
+ youpdated