| Commit message (Collapse) | Author | Age | Lines |
|
|
|
|
|
| |
We really don't need to influence these dynamically, so simplify the
code a bit by hardcoding the default "list" and "add" commands in
parse_args().
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Up until now we've kept the entirety of later(1)'s functionality in one
file. Whilst this is perfectly fine for smaller scripts, the
functionality of later(1) has grown to a size where this become less
feasible. Since we expect it to grow even further, switch to a "proper"
source layout sooner rather than later. This will allow easier
extension, testing and packaging later on.
Since we want to keep installation simple for end-users still, package
later(1) as a zipapp [1] in the Makefile. When installed, this file can
be executed just like the single Python script before it. Using this way
of installation is not mandatory however, the package layout also
supports regular installation with pip and development with poetry.
[1] https://docs.python.org/3.12/library/zipapp.html
|
|
|
|
|
| |
We now do more than just list watch_later entries, so have that be
reflected in the manual as well.
|
|
|
|
| |
later(1) has become a joint effort, so make that clear in the manual.
|
|
|
|
|
|
|
| |
This commit introduces the "del" command which allows the user to delete
watch_later entries manually. Make sure to silently ignore entries that
were not found - we'll print the entire list of entries subsequently
anyway.
|
|
|
|
|
|
|
|
| |
This commit introduces the "add" command which allows the user to create
watch_later entries manually. Make sure to silently ignore entries that
already exist - we'll print the entire list of entries subsequently
anyway. Also, make explicitly specifying "add" optional if there's any
remaining arguments in argv.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Upcoming commits will want to make use of bespoke argument handling
alongside subcommands and using Python's argparse proved unable to
easily handle that kind of complexity. Therefore switch to the more
basic getopt-based parser with which we can implement our own logic.
Without argparse we're no longer bound to having an autogenerated help
listing, so stop mentioning that in the manual. Instead have later(1)
output a concise usage listing when given an unknown argument.
Since we'll be adding more commands to later(1) in the future, also
specify an explicit "list" command.
|
|
|
|
|
|
|
|
|
|
| |
This will hopefully avoid nasty surprises in the future. It's easy to
check since there is already a ruff linter [1] for it which this commit
also enables. Make sure not to complain about exit() [2] since that is
only for interactive use and shouldn't be called in programs anyway.
[1] https://docs.astral.sh/ruff/rules/builtin-attribute-shadowing/
[2] https://docs.python.org/3.12/library/constants.html#exit
|
|
|
|
|
| |
This saves us from specifying the program name every single time we want
the program to exit with an error message.
|
|
|
|
|
|
|
| |
Currently an entry in the cache is marked as live implicitly whenever it
is requested, which only happens when formatting a WatchLaterEntry.
Instead, explicitly mark the entry as live at the same time as the
WatchLaterEntry object is created in entries().
|
|
|
|
|
|
| |
WatchLaterEntry's __str__ method implicitly depends on the title_map
variable existing in the global scope. This makes the dependency on the
title_map explicit.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
This should be a reasonable selection of linters. Also make sure that
ruff picks up 'later' by default, since it is missing the .py suffix.
|
| |
|
| |
|
|
|
|
|
|
|
| |
__repr__ is supposed to compute the "official" string representation of
an object [1] and not a pretty-printed version, so use __str__ instead.
[1] https://docs.python.org/3.12/reference/datamodel.html#object.__repr__
|
| |
|
|
|
|
| |
We handle these when reading the file, so we might as well do it here.
|
|
|
|
|
|
|
|
|
|
|
|
| |
This should disentangle the logic a bit and make the entire code base
easier to work with. The watch_later entries are now kept in a
WatchLaterEntry dataclass which supports pretty-printing with __repr__.
Fetching of titles is now done through a dedicated TitleMap class which
imports yt_dlp as late as possible, speeding up printing of entries that
don't need to be updated and avoiding the import entirely if everything
can be fetched from cache. Otherwise there should not be any functional
change.
|
|
|
|
|
| |
This makes this already quite deeply nested function a bit easier to
read.
|
|
|
|
|
|
|
| |
The piece of logic that parses the name of the watch_later entry and
makes sure that no redirect entries are processed can easily be moved
into the entries() generator. This way we don't even generate items that
we end up skipping anyway.
|
| |
|
|
|
|
| |
We do the same thing here twice, so this seems worth it.
|
| |
|
|
|
|
|
| |
This will make sure that the whole directory structure will be created
if missing and saves us a try/except block with exist_ok.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Different video URLs can be easy to confuse in the output of later(1).
Look up titles for them in $XDG_CACHE_HOME/later/title.json and add an
option, --update-titles, to populate the file automatically using yt-dlp.
The title is prefixed with a hash sign (#) in order to better separate
it visually from the URLs, as well as to allow easier copypasting of
output onto an mpv command line.
|
| |
|
|
|