Command line tool to keep track of your favorite playlists on YouTube and many other places.

Overview

ytcc

Build and test

Command line tool to keep track of your favorite playlists on YouTube and many other places.

Version 2.0.0 is out! Read the migration guide before upgrading to 2.0.0 or later! If you are looking for older versions, check the Release page and the v1 branch.

Installation

pip install ytcc

Alternative installation methods are described in the documentation.

Migrating from version 1

See the migration guide

Usage

"Subscribe" to playlists.

ytcc subscribe "Jupiter Broadcasting" "https://www.youtube.com/c/JupiterBroadcasting/videos"
ytcc subscribe "NCS: House" "https://www.youtube.com/playlist?list=PLRBp0Fe2GpgmsW46rJyudVFlY6IYjFBIK"

Import subscriptions from Google Takeout.

ytcc import ~/Downloads/Takeout/Youtube/subscriptions/subscriptions.csv

Fetch metadata of new videos.

ytcc update

List unwatched videos.

ytcc list

List playlist content in JSON format.

ytcc --output json list --playlist "NCS: House" --since 2020-07-07 --watched --unwatched

List all videos as RSS feed.

ytcc --output rss list --watched --unwatched

Start the interactive terminal interface.

ytcc tui

Mark all videos of a playlist as watched without playing them.

ytcc ls -p "Jupiter Broadcasting" | ytcc mark

Listen to some music without limitations.

ytcc ls -p "NCS: House" | ytcc play --audio-only

Alternative terminal interface with thumbnail support. Requires fzf version 0.23.1 or newer, optionally curl and either ueberzug or kitty. The script is automatically installed on most platforms during installation of ytcc. If it's not installed, you can download it from here.

ytccf.sh

# Show help and key bindings
ytccf.sh --help

Configuration

Ytcc searches for a configuration file at following locations:

  1. $XDG_CONFIG_HOME/ytcc/ytcc.conf
  2. ~/.config/ytcc/ytcc.conf
  3. ~/.ytcc.conf

If no config file is found in these three locations, a default config file is created at ~/.config/ytcc/ytcc.conf.

Example config

[ytcc]

# Directory where downloads are saved, when --path is not given
download_dir = ~/Downloads

# Parameters passed to mpv. Adjusting these might break video playback in ytcc!
mpv_flags = --ytdl --ytdl-format=bestvideo[height<=?1080]+bestaudio/best

# Defines the order of video listings.
# Possible options: id, url, title, description, publish_date, watched, duration, extractor_hash,
# playlists. Every option must be suffixed with :desc or :asc for descending or ascending sort.
order_by = playlists:asc, publish_date:desc

# Default attributes shown in video listings.
# Some ytcc commands allow overriding the default set here in the config.
video_attrs = id, title, publish_date, duration, playlists

# Default attributes shown in playlist/subscription listings.
# Some ytcc commands allow overriding the default set here in the config.
playlist_attrs = name, url, reverse, tags

# Path where the database is stored.
# Can be used to sync the database between multiple machines.
db_path = ~/.local/share/ytcc/ytcc.db

# The format of used to print dates
date_format = %Y-%m-%d

# Default failure threshold before a video is ignored.
# When a video could not be updated repeatedly, it will be ignored by ytcc after `max_update_fail`
# attempts. This setting can be overridden with the --max-fail commandline parameter.
max_update_fail = 5

# Default update backlog.
# The update command will only check the first `max_update_backlog` videos of a playlist to improve
# performance. This setting can be overridden with the --max-backlog commandline parameter.
max_update_backlog = 20

# Ignore videos that have an age limit higher than the one specified here.
age_limit = 0


# Prompt and table colors. Supports 256 colors. Hence, values between 0-255 are allowed.
# See https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit for the color codes.
[theme]
prompt_download_audio = 2
prompt_download_video = 4
prompt_play_audio = 2
prompt_play_video = 4
prompt_mark_watched = 1
table_alternate_background = 245


[tui]
# The characters to use for selecting videos in interactive mode.
alphabet = sdfervghnuiojkl

# Default action of interactive mode.
# Possible options: play_video, play_audio, mark_watched, download_audio, download_video
default_action = play_video


[youtube_dl]
# Format (see FORMAT SELECTION in youtube-dl manpage). Make sure to use a video format here, if you
# want to be able to download videos.
format = bestvideo[height<=?1080]+bestaudio/best

# Output template (see OUTPUT TEMPLATE in youtube-dl manpage).
output_template = %(title)s.%(ext)s

# If a merge is required according to format selection, merge to the given container format.
# One of mkv, mp4, ogg, webm, flv
merge_output_format = mkv

# Limit download speed to the given bytes/second. Set 0 for no limit.
# E.g. limit to one megabyte per second
#ratelimit = 1000000
ratelimit = 0

# Set number of retries before giving up on a download.
# Set 0 for no retries.
retries = 0

# Subtitles for videos.
# If enabled and available, automatic and manual subtitles for selected languages are embedded in
# the video.
#subtitles = en,de
subtitles = off

# Embed the youtube thumbnail in audio downloads.
# Transforms the resulting file to m4a, if enabled.
thumbnail = on

# Skips livestreams in download command.
skip_live_stream = true

# Don't download videos longer than 'max_duration' seconds.
# 0 disables the limit.
max_duration = 9000

# Restrict filenames to only ASCII characters and avoid "&" and spaces in filenames.
restrict_filenames = off

mpv configuration

Ytcc uses mpv to play videos. You can configure mpv to integrate nicely with ytcc. Specifics are documented here.

Reporting issues

Create a new issue on the GitHub issue tracker. Describe the issue as detailed as possible and please use the issue templates, if possible! Important: do not forget to include the output of ytcc bug-report in bug reports. It also might help a lot to run ytcc with the --loglevel debug option and include the output in your report.

Development

We recommend developing inside a virtualenv.

  1. Set up a virtualenv
  2. Install development dependencies: pip install -r devrequirements.txt

Run the following commands before every pull request and fix the warnings or errors they produce.

mypy ytcc
pytest
pylint ytcc
pydocstyle ytcc
Comments
  • Playlist updates with short max backlog

    Playlist updates with short max backlog

    Describe the bug I noticed some subscriptions I had didn't receive any update. Could it be that playlists are downloaded/processed in yt order, truncating results to max_update_backlog?

    If so, a playlist that has new videos appended in chronological order will never receive any update.

    To Reproduce This playlist is in ascending chronological order: https://www.youtube.com/playlist?list=PLm9GPtnKLH_xb_griZ4Qg4eXLFLeLEO5d

    ytcct subscribe test [url]

    only shows the oldest videos being processed.

    Expected behavior ytcc shouldn't be influenced by the playlist order. I'm not sure if there's a way to force time sorting, but if not some flag to indicate that the playlist is reversed would be needed?

    bug 
    opened by wavexx 13
  • Improve migration from v1 to v2

    Improve migration from v1 to v2

    Migrating the entire v1 database schema is probably too much effort. Instead, it might be enough to export subscriptions with v1 and import the OPML export in v2. Problems with this first alternative:

    • User must have both v1 and v2 installed (or make an export before upgrading to v2)
    • v2 database must be at different location from v1 (that's not the case in the default config)

    Second alternative: A python script (preferably without dependencies) that renames the v1 db, exports subscriptions, and re-imports them with v2. This would solve the problems of the first alternative, but is more work.

    I'd love to see everyone's thoughts on this.

    help wanted 
    opened by woefe 13
  • Remember position in some videos (aka resume)

    Remember position in some videos (aka resume)

    Is your feature request related to a problem? Please describe. Long videos can't be watched in one time. Resuming them can be useful.

    Describe the solution you'd like When exiting player in the middle of a video, it could be nice to be able to save the timestamp, and use it when relaunching the video.

    Additional context We have to see if it can be solved along with #69

    opened by Glandos 12
  • ytcc video resolution settings funtioning inconsistantly

    ytcc video resolution settings funtioning inconsistantly

    First, thank you for this awesome tool and great work on it! I truly appreciate it. If I can help debugging this issue or testing changes please let me know. (I'd be happy to do so)

    The issue I have is that I would like ytcc to only pull videos that are 1920 x 1080 or higher in resolution and it sometimes works, sometimes pulls 640x480 or lower.

    I have had my ytcc.conf file (located in /home/user/.config/ytcc.conf) set to, 1080, 1920, etc but cannot get this to function correctly or consistently.

    From ytcc.conf file... [youtube-dl] format = mkv/mp4/bestvideo[height>=1920]+bestaudio/best

    Attached is a bug-report-info file.

    ytcc-bug-report-info.txt

    I would also like to know if you would be interested in a proper man page for this utility. I would gladly assist in its creation and submission to this project.

    Thank you. Pete

    opened by pghpete 9
  • Mark as not watched

    Mark as not watched

    Is your feature request related to a problem? Please describe. When playing a video by mistake, it is mark as watched, even when exiting mpv after a few seconds.

    Describe the solution you'd like Add a feature to mark video as not watched

    Additional context In TUI, recently watched video can still be listed, with a different markup, to be able to unwatch them.

    It can be also a good thing to monitor elapsed time in player, and ask the user if the video should be marked as watched whenever there is not enough elapsed time (half? 80%?).

    opened by Glandos 8
  • Use with statements to automatically commit transactions

    Use with statements to automatically commit transactions

    Some database actions are not automatically committed. This commit uses the database connection as a context manager to commit or rollback transactions as appropriate.

    Possibly closes: #54

    opened by EmRowlands 8
  • Migration from 1.8.4 to 2.0.1 fails... (migration script)

    Migration from 1.8.4 to 2.0.1 fails... (migration script)

    While following the migration instructions to migrate using the migration script, it fails...

    The install using pip throws some errors but appears to function over all...

    Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
    Collecting git+https://github.com/woefe/ytcc.git
      Cloning https://github.com/woefe/ytcc.git to /tmp/pip-req-build-y2z0ogcc
    Requirement already satisfied: click in /usr/lib/python3/dist-packages (from ytcc==2.0.1) (7.0)
    Collecting wcwidth (from ytcc==2.0.1)
      Downloading https://files.pythonhosted.org/packages/59/7c/e39aca596badaf1b78e8f547c807b04dae603a433d3e7a7e04d67f2ef3e5/wcwidth-0.2.5-py2.py3-none-any.whl
    Requirement already satisfied: youtube_dl in /usr/local/lib/python3.7/dist-packages (from ytcc==2.0.1) (2020.12.12)
    Building wheels for collected packages: ytcc
      Running setup.py bdist_wheel for ytcc ... error
      Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-req-build-y2z0ogcc/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/pip-wheel-aioub81k --python-tag cp37:
      usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
         or: -c --help [cmd1 cmd2 ...]
         or: -c --help-commands
         or: -c cmd --help
      
      error: invalid command 'bdist_wheel'
      
      ----------------------------------------
      Failed building wheel for ytcc
      Running setup.py clean for ytcc
    Failed to build ytcc
    Installing collected packages: wcwidth, ytcc
      Found existing installation: ytcc 1.8.4
        Uninstalling ytcc-1.8.4:
          Successfully uninstalled ytcc-1.8.4
      Running setup.py install for ytcc ... done
    Successfully installed wcwidth-0.2.5 ytcc-2.0.1
    

    Version appears to have been updated properly...

    [[email protected]: src]$ ytcc --version
    ytcc, version 2.0.1
    
    Copyright (C) 2015-2020  Wolfgang Popp
    This program comes with ABSOLUTELY NO WARRANTY; This is free software, and you
    are welcome to redistribute it under certain conditions.  See the GNU General
    Public Licence for details.
    

    The migrate.py script is then run using...

    python3 migrate.py --olddb ~/.local/share/ytcc/ytcc.db.v1 --newdb ~/.local/share/ytcc/ytcc.d
    

    This also appears to complete successfully without any errors. However, when I go to run ytcc and list subscriptions... I get this...

    [[email protected]: src]$ ytcc subscriptions
    ERROR: This version of ytcc is not compatible with the older database versions. See https://github.com/woefe/ytcc/blob/master/doc/migrate.md for more details.
    

    Environment, configuration and version information

    [[email protected]: src]$ cat /etc/os-release 
    PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
    NAME="Raspbian GNU/Linux"
    VERSION_ID="10"
    VERSION="10 (buster)"
    VERSION_CODENAME=buster
    ID=raspbian
    ID_LIKE=debian
    HOME_URL="http://www.raspbian.org/"
    SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
    BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
    [[email protected]: src]$ uname -a
    Linux omv.zhome 5.4.79-v7l+ #1373 SMP Mon Nov 23 13:27:40 GMT 2020 armv7l GNU/Linux
    

    Bug report output

    ytcc bug-report
    ---ytcc version---
    2.0.1
    
    ---youtube-dl version---
    2020.12.12
    
    ---SQLite version---
    SQLite system library version: 3.27.2
    Python module version: 2.6.0
    
    ---python version---
    3.7.3 (default, Jul 25 2020, 13:03:44) 
    [GCC 8.3.0]
    
    ---mpv version---
    mpv 0.29.1 Copyright Β© 2000-2018 mpv/MPlayer/mplayer2 projects
     built on UNKNOWN
    ffmpeg library versions:
       libavutil       56.14.100 (runtime 56.22.100)
       libavcodec      58.18.100 (runtime 58.35.100)
       libavformat     58.12.100 (runtime 58.20.100)
       libswscale      5.1.100 (runtime 5.3.100)
       libavfilter     7.16.100 (runtime 7.40.101)
       libswresample   3.1.100 (runtime 3.3.100)
    ffmpeg version: 4.1.6-1~deb10u1+rpt1
    
    
    ---config dump---
    [ytcc]
    download_dir = ~/Downloads
    mpv_flags = --really-quiet --ytdl --ytdl-format=bestvideo[height<=?1080]+bestaudio/best
    order_by = playlists:asc, publish_date:desc
    video_attrs = id, title, publish_date, duration, playlists
    playlist_attrs = name, url, tags
    db_path = ~/.local/share/ytcc/ytcc.db
    date_format = %Y-%m-%d
    max_update_fail = 5
    max_update_backlog = 20
    age_limit = 0
    
    [tui]
    alphabet = sdfervghnuiojkl
    default_action = play_video
    
    [theme]
    prompt_download_audio = 2
    prompt_download_video = 4
    prompt_play_audio = 2
    prompt_play_video = 4
    prompt_mark_watched = 1
    table_alternate_background = 245
    
    [youtube_dl]
    format = bestvideo[height<=?1080]+bestaudio/best
    output_template = %(title)s.%(ext)s
    ratelimit = 0
    retries = 0
    subtitles = off
    thumbnail = true
    skip_live_stream = true
    merge_output_format = mkv
    
    bug 
    opened by pghpete 7
  • Add unmark command

    Add unmark command

    Adds unmark command and more listing options. Fixes #69

    • [x] Add unmark command
    • [x] Add --order-by option to list command
    • [x] Change behavior of --watched flag and add --unwatched flag
    • [x] Add unmark behavior to ytccf.sh
    • [x] Add database migrations
    opened by woefe 6
  • UTF-8 characters wider than 1 byte mess up tables

    UTF-8 characters wider than 1 byte mess up tables

    For 1 byte long characters, the tables look correct:

    ASCII Title          | 
    abcde                |
    

    The | is at the same position.

    But more complex UTF-8 characters mess up the space calculation:

    ASCII Title          |
    Title with 😁         |
    

    It seems, due to the emoji needing 2 bytes, but actually only displaying as one byte, the calculation for the spaces is wrong. The same applies to German umlauts and other scripts like Japanese.

    bug 
    opened by zoidby 6
  • [V2] Don’t ignore age restricted videos

    [V2] Don’t ignore age restricted videos

    Currently ytcc/V2 ignores videos "due to age limit".

    As far as i know this was implemented because youtube changed the api and youtube-dl couldn’t download these videos anymore. But, it seems to work again! I checked some of the videos ytcc/V2 ignored and was able to download them with youtube-dl or play them with mpv.

    So could you include these videos again?

    In case youtube restricts these again, youtube-dl also has options to give your login credentials. An alternative option would be to launch age restricted videos in a browser instead of mpv.

    opened by zoidby 6
  • Error preventing update

    Error preventing update

    Updating returns the following:

    $ ytcc
    Updating channels...
    multiprocessing.pool.RemoteTraceback: 
    """
    Traceback (most recent call last):
      File "/usr/lib64/python3.5/multiprocessing/pool.py", line 119, in worker
        result = (True, func(*args, **kwds))
      File "/usr/lib64/python3.5/multiprocessing/pool.py", line 44, in mapstar
        return list(map(*args))
      File "/usr/lib/python3.5/site-packages/ytcc-1.5.1-py3.5.egg/ytcc/core.py", line 205, in _update_channel
        feed = feedparser.parse("https://www.youtube.com/feeds/videos.xml?channel_id=" + yt_channel_id)
      File "/usr/lib/python3.5/site-packages/feedparser.py", line 3957, in parse
        saxparser.parse(source)
      File "/usr/lib64/python3.5/site-packages/drv_libxml2.py", line 189, in parse
        eltName = (_d(reader.NamespaceUri()),\
      File "/usr/lib64/python3.5/site-packages/drv_libxml2.py", line 70, in _d
        return _decoder(s)[0]
      File "/usr/lib64/python3.5/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    TypeError: a bytes-like object is required, not 'str'
    """
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/usr/bin/ytcc", line 4, in <module>
        __import__('pkg_resources').run_script('ytcc==1.5.1', 'ytcc')
      File "/usr/lib/python3.5/site-packages/pkg_resources/__init__.py", line 724, in run_script
        self.require(requires)[0].run_script(script_name, ns)
      File "/usr/lib/python3.5/site-packages/pkg_resources/__init__.py", line 1657, in run_script
        exec(script_code, namespace, namespace)
      File "/usr/lib/python3.5/site-packages/ytcc-1.5.1-py3.5.egg/EGG-INFO/scripts/ytcc", line 4, in <module>
        __import__('pkg_resources').run_script('ytcc==1.5.1', 'ytcc')
      File "/usr/lib/python3.5/site-packages/ytcc-1.5.1-py3.5.egg/ytcc/cli.py", line 510, in main
      File "/usr/lib/python3.5/site-packages/ytcc-1.5.1-py3.5.egg/ytcc/cli.py", line 493, in parse_args
      File "/usr/lib/python3.5/site-packages/ytcc-1.5.1-py3.5.egg/ytcc/cli.py", line 40, in update_all
      File "/usr/lib/python3.5/site-packages/ytcc-1.5.1-py3.5.egg/ytcc/core.py", line 221, in update_all
      File "/usr/lib64/python3.5/multiprocessing/pool.py", line 260, in map
        return self._map_async(func, iterable, mapstar, chunksize).get()
      File "/usr/lib64/python3.5/multiprocessing/pool.py", line 608, in get
        raise self._value
    TypeError: a bytes-like object is required, not 'str'
    
    opened by Dragnucs 6
  • Videos in a playlist uploaded on the same day are not sorted by time

    Videos in a playlist uploaded on the same day are not sorted by time

    Describe the bug If a playlist/subscription has multiple videos uploaded on the same day, they are not sorted by time when using the publish_date ordering.

    To Reproduce Subscribe to a channel that publishes multiple videos per day and update. Set the order_by value in ytcc.conf to publish_date:asc. Execute ytcc list -p <channel>

    Expected behavior Videos are listed in the strict order they were published.

    Environment, configuration and version information

    ---ytcc version---
    2.0.1
    
    ---youtube-dl version---
    2020.12.09
    
    ---SQLite version---
    SQLite system library version: 3.34.0
    Python module version: 2.6.0
    
    ---python version---
    3.9.0 (default, Dec  6 2020, 18:02:34)
    [Clang 12.0.0 (clang-1200.0.32.27)]
    
    ---mpv version---
    mpv 0.33.0 Copyright Β© 2000-2020 mpv/MPlayer/mplayer2 projects
     built on Sun Nov 22 19:54:23 GMT 2020
    FFmpeg library versions:
       libavutil       56.51.100
       libavcodec      58.91.100
       libavformat     58.45.100
       libswscale      5.7.100
       libavfilter     7.85.100
       libswresample   3.7.100
    FFmpeg version: 4.3.1
    
    
    ---config dump---
    [ytcc]
    download_dir = ~/Downloads
    mpv_flags = --really-quiet --ytdl --ytdl-format=bestvideo[height<=?1080]+bestaudio/best
    order_by = publish_date:asc
    video_attrs = id, title, publish_date, duration, playlists
    playlist_attrs = name, url, tags
    db_path = ~/.local/share/ytcc/ytcc.db
    date_format = %Y-%m-%d
    max_update_fail = 5
    max_update_backlog = 20
    age_limit = 0
    
    [tui]
    alphabet = sdfervghnuiojkl
    default_action = play_video
    
    [theme]
    prompt_download_audio = 2
    prompt_download_video = 4
    prompt_play_audio = 2
    prompt_play_video = 4
    prompt_mark_watched = 1
    table_alternate_background = 19
    
    [youtube_dl]
    format = bestvideo[height<=?1080]+bestaudio/best
    output_template = %(title)s.%(ext)s
    ratelimit = 0
    retries = 0
    subtitles = off
    thumbnail = true
    skip_live_stream = true
    merge_output_format = mkv
    

    Additional context Example output from a channel below. I used the YouTube Data API to retrieve two of the videos (Part 225 and 224). 224's publishedAt property was one hour before 225, but in the list below all the videos for each day are sorted in descending order by time even though the ordering in the config file is publish_date:asc.

     id   β”‚ title                                                             β”‚ publish_date β”‚ duration β”‚ playlists
    ──────┼───────────────────────────────────────────────────────────────────┼──────────────┼──────────┼───────────────────
     56   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 202 β”‚ 2020-11-24   β”‚   32:21  β”‚ Aavak After Hours
     57   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 201 β”‚ 2020-11-24   β”‚   34:11  β”‚ Aavak After Hours
     58   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 200 β”‚ 2020-11-24   β”‚   32:04  β”‚ Aavak After Hours
     59   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 199 β”‚ 2020-11-24   β”‚   31:35  β”‚ Aavak After Hours
     60   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 198 β”‚ 2020-11-24   β”‚   30:15  β”‚ Aavak After Hours
     49   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 209 β”‚ 2020-11-25   β”‚   29:11  β”‚ Aavak After Hours
     50   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 208 β”‚ 2020-11-25   β”‚   29:14  β”‚ Aavak After Hours
     51   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 207 β”‚ 2020-11-25   β”‚   31:01  β”‚ Aavak After Hours
     52   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 206 β”‚ 2020-11-25   β”‚   35:05  β”‚ Aavak After Hours
     53   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 205 β”‚ 2020-11-25   β”‚   28:30  β”‚ Aavak After Hours
     54   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 204 β”‚ 2020-11-25   β”‚   31:08  β”‚ Aavak After Hours
     55   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 203 β”‚ 2020-11-25   β”‚   30:21  β”‚ Aavak After Hours
     41   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 217 β”‚ 2020-12-03   β”‚   31:41  β”‚ Aavak After Hours
     42   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 216 β”‚ 2020-12-03   β”‚   36:35  β”‚ Aavak After Hours
     43   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 215 β”‚ 2020-12-03   β”‚   32:30  β”‚ Aavak After Hours
     44   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 214 β”‚ 2020-12-03   β”‚   32:47  β”‚ Aavak After Hours
     45   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 213 β”‚ 2020-12-03   β”‚   29:07  β”‚ Aavak After Hours
     46   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 212 β”‚ 2020-12-03   β”‚   31:52  β”‚ Aavak After Hours
     47   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 211 β”‚ 2020-12-03   β”‚   31:05  β”‚ Aavak After Hours
     48   β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 210 β”‚ 2020-12-03   β”‚   25:10  β”‚ Aavak After Hours
     2451 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 225 β”‚ 2020-12-09   β”‚   40:52  β”‚ Aavak After Hours
     2452 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 224 β”‚ 2020-12-09   β”‚   32:56  β”‚ Aavak After Hours
     2453 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 223 β”‚ 2020-12-09   β”‚   32:24  β”‚ Aavak After Hours
     2454 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 222 β”‚ 2020-12-09   β”‚   33:54  β”‚ Aavak After Hours
     2455 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 221 β”‚ 2020-12-09   β”‚   30:13  β”‚ Aavak After Hours
     2456 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 220 β”‚ 2020-12-09   β”‚   30:04  β”‚ Aavak After Hours
     2457 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 219 β”‚ 2020-12-09   β”‚   31:27  β”‚ Aavak After Hours
     2458 β”‚ Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 218 β”‚ 2020-12-09   β”‚   32:34  β”‚ Aavak After Hours
    

    Partial responses for each video from the API:

    {
      "kind": "youtube#videoListResponse",
      "etag": "xTwOH37rQ4erFVC3YQJ2CpE6SWw",
      "items": [
        {
          "kind": "youtube#video",
          "etag": "PXp1Up0QqBrdbhND8bSr8y6P5wc",
          "id": "OGUUo5V0CuQ",
          "snippet": {
            "publishedAt": "2020-12-10T04:00:02Z",
            "channelId": "UCk7U8vOfzutkuZ-coGdpXrw",
            "title": "Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 224",
    
    {
      "kind": "youtube#videoListResponse",
      "etag": "zD1fJud1ccfJIQQm_SUjtzzuD9I",
      "items": [
        {
          "kind": "youtube#video",
          "etag": "BEj4UbeWNkTdXVe3hnzt9N7Nsuw",
          "id": "WQj-OJ6Pwqs",
          "snippet": {
            "publishedAt": "2020-12-10T05:00:21Z",
            "channelId": "UCk7U8vOfzutkuZ-coGdpXrw",
            "title": "Oxygen Not Included: Oassise – Let’s Play Stream Archive Part 225",
    
    bug 
    opened by duckpuppy 4
Releases(v2.6.1)
  • v2.6.1(Oct 22, 2022)

  • v2.6.0(Jul 24, 2022)

  • v2.5.5(Mar 10, 2022)

  • v2.5.4(Nov 24, 2021)

    • Fix ytccf.sh layout calculation and truncation (issue #105)
    • Fix missing escaping of filter parameters in ytccf.sh
    • Switch default installation from youtub-dl to yt-dlp
    Source code(tar.gz)
    Source code(zip)
  • v2.5.3(Nov 2, 2021)

  • v2.5.2(Oct 28, 2021)

  • v2.5.1(Oct 17, 2021)

    • Improve bug-report output
    • Allow multiple playlists passed to ytcc unsubscribe
    • Keep the order of IDs passed to ytcc play and similar commands
    • Fix shell completions
    • Fix duplicated playlists when listing videos and playlists have multiple tags
    • Fix missing playlists when listing videos and filtering for certain playlists
    • Fix symlink issue on download if path has ~
    Source code(tar.gz)
    Source code(zip)
  • v2.5.0(Oct 11, 2021)

    • Add optional support for yt-dlp. If yt-dlp is installed it is preferred over youtube-dl
    • Add ytcc.download_subdirs config option to save downloads in subdirectories per playlist. This should be preferred over setting a youtube_dl.output_template with subdirectories based on %(uploader)s, because %(uploader)s is not always available and differs from the playlist name you gave in ytcc when subscribing. E.g. instead of
      [youtube_dl]
      output_template = %(uploader)s/%(title)s.%(ext)s
      

      you should use

      [ytcc]
      download_subdirs = on
      [youtube_dl]
      output_template = %(title)s.%(ext)s
      
    Source code(tar.gz)
    Source code(zip)
  • v2.4.2(Oct 2, 2021)

    • Support for more playlist types. For example, RSS feeds with embedded audio or video can now be tracked.
    • Faster ytcc update using asyncio
    • Respect XDG_CACHE_HOME in ytccf.sh
    • Fix crash when loading the config file in locale encoding
    • Fix filter parameters in ytccf.sh
    • Fix migration script
    Source code(tar.gz)
    Source code(zip)
  • v2.4.1(Sep 25, 2021)

  • v2.4.0(Sep 25, 2021)

  • v2.3.0(Jun 5, 2021)

    • Truncate long tables to terminal width
    • Add --truncate option to control the truncating behavior
    • Add unmark functionality to tui command
    • Fix empty descriptions in ytccf.sh script
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Apr 3, 2021)

    • Add reverse command, and add --reverse flag to subscribe command (#86)
    • Fix duplicated youtube-dl log messages
    • Fix crash on invalid return values from youtube-dl (#87)
    • Fix playlist attributes filter
    • Fix exit codes on error
    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Feb 14, 2021)

    • Add restrict_filenames and max_duration config options
    • Add RSS printer (--output rss) to generate a video feed
    • Add umark subcommand and key-binding to ytccf.sh
    • Add --order-by option to list subcommand
    • Changed watched status from simple yes/no flag to date
    • Changed behavior of --watched option and added --unwatched option. --watched now lists only watched videos and not all videos. To list all videos use both --watched --unwatched.
    Source code(tar.gz)
    Source code(zip)
  • v2.0.1(Nov 1, 2020)

  • v2.0.0(Oct 20, 2020)

    This release is not backwards compatible with older releases. Check the migration docs to migrate your old subscriptions.

    New features and changes:

    • New ytcc command structure. See ytcc --help to get started
    • Support for platforms other than YouTube: ytcc now is based on youtube-dl's playlist features. (#7)
    • A tagging feature has been added for easier categorization of subscriptions (#23)
    • Windows (10) support
    • The ytcc command now supports reading IDs from stdin, which makes it more reusable. See the ytccf script based on fzf for an alternative terminal user interface
    • Improved startup time
    • Video duration (#25)
    • JSON output
    • Fixed wide character support in printed tables (#62)
    • Dropped support for Python 3.6
    Source code(tar.gz)
    Source code(zip)
  • v2.0.0b2(Oct 2, 2020)

  • v2.0.0b1(Sep 26, 2020)

  • v1.8.5(Sep 9, 2020)

  • v1.8.4(Jul 21, 2020)

  • v1.8.3(Mar 18, 2020)

  • v1.8.2(Nov 24, 2019)

    • Fix: proper error message if database is locked
    • Fix: respect --no-video parameter in interactive mode
    • Allow ascending or descending sort in orderBy option
    • Made sorting case insensitive
    • Improved text formatting when video is playing
    Source code(tar.gz)
    Source code(zip)
  • v1.8.1(Mar 1, 2019)

  • v1.8.0(Feb 13, 2019)

    • New interactive mode based on previous quickselect mode
    • Remove --search option to drastically reduce database size (after --cleanup)
    • Add orderBy option to configuration file
    • Sort output of --list-channels alphabetically
    • Fix translations
    Source code(tar.gz)
    Source code(zip)
  • v1.7.4(Jan 20, 2019)

    • Add support for more YouTube domains like youtu.be and m.youtube.com
    • Channels can be added using the URL of any Video of the channel now. The URLs are not restricted to the channels homepage any more.
    • Add option to skip live streams when -d is set and enable it by default (fixes #12 )
    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Dec 6, 2018)

    • Enable stderr of mpv command
    • Fix crash in Termux due to missing support for multiprocessing.Pool
    • Whitelist characters in quickselect mode
    • Respect --no-video option in quickselect mode
    Source code(tar.gz)
    Source code(zip)
  • v1.7.1(Aug 6, 2018)

  • v1.7.0(Aug 2, 2018)

    Changelog

    • Add youtube_dl configuration options
    • Add --bug-report-info flag
    • New quickselect option for interactive mode - enabled by default. Can be disabled and configured via the configuration file.
    • Rename --yes to --disable-interactive
    • Simplify printing all columns by introducing all option to --columns
    Source code(tar.gz)
    Source code(zip)
Owner
Wolfgang Popp
Wolfgang Popp
A very simple and lightweight ToDo app using python that can be used from the command line

A very simple and lightweight ToDo app using python that can be used from the command line

Nilesh Sengupta 2 Jul 20, 2022
Un module simple pour demander l'accord de l'utilisateur dans une CLI.

Demande de confirmation utilisateur pour CLI PrΓ©sentation ask_lib est un module pour le langage Python proposant une seule fonction; ask(). Le but pri

CallMePixelMan 7 May 09, 2022
Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Website

πŸ€– rover Rover is a command line interface application that allows through browse through mission data, images, metadata from the NASA Official Websit

Saketha Ramanjam 4 Jan 19, 2022
Limit your docker image size with a simple CLI command. Perfect to be used inside your CI process.

docker-image-size-limit Limit your docker image size with a simple CLI command. Perfect to be used inside your CI process. Read the announcing post. I

wemake.services 102 Dec 14, 2022
Zero-config CLI for TypeScript package development

Despite all the recent hype, setting up a new TypeScript (x React) library can be tough. Between Rollup, Jest, tsconfig, Yarn resolutions, ESLint, and

Jared Palmer 10.5k Jan 08, 2023
🦎 A NeoVim plugin for highlighting visual selections like in a normal document editor!

🦎 HighStr.nvim A NeoVim plugin for highlighting visual selections like in a normal document editor! Demo TL;DR HighStr.nvim is a NeoVim plugin writte

Pocco81 222 Jan 03, 2023
This a simple tool to query the awesome ippsec.rocks website from your terminal

ippsec-cli This a simple tool to query the awesome ippsec.rocks website from your terminal Installation and usage cd /opt git clone https://github.com

stark0de 5 Nov 26, 2022
Cli tool to browse and play anime

browse and watch anime (scrape from gogoanime) (wip) basically ani-cli but in python cuz python good demo dependencies mpv installation from pypi pip

sheep padowo 2 Apr 20, 2022
Quo is a Python based toolkit for writing Command-Line Interface(CLI) applications.

Quo is a Python based toolkit for writing Command-Line Interface(CLI) applications. Quo is making headway towards composing speedy and orderly CLI applications while forestalling any disappointments

Secretum Inc. 16 Oct 15, 2022
flora-dev-cli (fd-cli) is command line interface software to interact with flora blockchain.

Install git clone https://github.com/Flora-Network/fd-cli.git cd fd-cli python3 -m venv venv source venv/bin/activate pip install -e . --extra-index-u

14 Sep 11, 2022
Dynamically Generate GitHub Stats as like Terminal Interface

GitHub Stats Terminal Style Dynamically Generate GitHub Stats as like Terminal Interface Usage Create a New Repository using this Template or click he

YOGESHWARAN R 63 Jan 03, 2023
WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

Aziz Fikri 15 Apr 15, 2022
A command line tool (and Python library) for archiving Twitter JSON

A command line tool (and Python library) for archiving Twitter JSON

Documenting the Now 1.3k Dec 28, 2022
🌍 Harness the power of whatsmydns from the command-line.

chkdns Harness the power of whatsmydns from the command-line. Installing with pip pip install chkdns Run chkdns --host github.com Alternatively you ca

Craig Gumbley 3 Oct 29, 2022
Create argparse subcommands with decorators.

python-argparse-subdec This is a very simple Python package that allows one to create argparse's subcommands via function decorators. Usage Create a S

Gustavo JosΓ© de Sousa 7 Oct 21, 2022
A python command line tool to calculate options max pain for a given company symbol and options expiry date.

Options-Max-Pain-Calculator A python command line tool to calculate options max pain for a given company symbol and options expiry date. Overview - Ma

13 Dec 26, 2022
As easy as /aitch-tee-tee-pie/ πŸ₯§ Modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more. https://twitter.com/httpie

HTTPie: human-friendly CLI HTTP client for the API era HTTPie (pronounced aitch-tee-tee-pie) is a command-line HTTP client. Its goal is to make CLI in

HTTPie 25.4k Dec 30, 2022
xonsh is a Python-powered, cross-platform, Unix-gazing shell language and command prompt.

xonsh xonsh is a Python-powered, cross-platform, Unix-gazing shell language and command prompt. The language is a superset of Python 3.6+ with additio

xonsh 6.7k Jan 08, 2023
A ZSH plugin that enables you to use OpenAI's powerful Codex AI in the command line.

A ZSH plugin that enables you to use OpenAI's powerful Codex AI in the command line.

Tom DΓΆrr 976 Jan 03, 2023
Euporie is a text-based user interface for running and editing Jupyter notebooks

Euporie is a text-based user interface for running and editing Jupyter notebooks

781 Jan 01, 2023