Skip to content

Youtube-Data: YouTube's Video Data From Bash Command Line Prompt.

License

Notifications You must be signed in to change notification settings

stvar/youtube-data

Repository files navigation

                                  Youtube-Data
                                  ~~~~~~~~~~~~
                        Stefan Vargyas, stvar@yahoo.com

                                  Jan 18, 2018


Table of Contents
-----------------

0. Copyright
1. The Youtube-Data Program
2. Prerequisites of Youtube-Data
3. Use Cases of Youtube-Data
4. Appendix: Building Json-Type, 'youtube-data.so' and
     'youtube-data-litex.so'
5. Appendix: Using Shell Function 'youtube-data'
6. References


0. Copyright
============

This program is GPL-licensed free software. Its author is Stefan Vargyas. You
can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

You should have received a copy of the GNU General Public License along with
this program (look up for the file COPYING in the top directory of the source
tree). If not, see http://gnu.org/licenses/gpl.html.

Additional note: the files '*.json' in the top directory of the source tree
are subject to the same copyright and license provisions as the rest of the
Youtube-Data is.


1. The Youtube-Data Program
===========================

Youtube-Data program's vocation is that of an elaborated reader of the data
associated to video content published by YouTube web site. As is well-known,
YouTube structures its public data around the so-called *resources* -- the
most preeminent: channels, playlists and videos -- and *content* attached
to resources.

Youtube-Data is querying the Google's API [2] from the 'bash' command line
prompt for the content associated to each of the above three categories of
resources and it is displaying the resulting data as formatted UTF8 text on
standard output.

Youtube-Data is using an own timestamping cache mechanism to minimize the
number of actual calls made to the remote service. Consequently, the user
is free to process locally the data received from the remote party the way
needed, without worrying that he might exceed the quota limits allocated.

There is a feature of Youtube-Data that makes this program stand out compared
to others like it (e.g. in contrast with YouTube's own web site): through its
caching mechanism, Youtube-Data is able to produce diffs between old and new
content associated to each resource published.

For example, when one has a list of favorite channels, he may very easily
check each of these channels for to see whether new video materials have
been published until the last time queried (see below section 3, Use Cases
of Youtube-Data, for a couple of relevant 'youtube-data' command lines).

Youtube-Data consists of a quite involved 'bash' shell script 'youtube-data.sh',
which exports, upon being sourced at the command line prompt, its main function
'youtube-data' -- along with a few auxiliary ones.


2. Prerequisites of Youtube-Data
================================

The first prerequisite of using the shell script 'youtube-data.sh' is that of
obtaining a so called *YouTube Data API key* from Google [1]. Upon achieving
that, edit the shell script file 'youtube-data.sh' for to assign the obtained
string value to the environment variable '$YOUTUBE_DATA_APP_KEY'.

The second prerequisite is also about editing 'youtube-data.sh': one must set
a proper value for '$YOUTUBE_DATA_HOME'. The value assigned to this environment
variable must point to the top directory of Youtube-Data's source tree.

Note that if one does not want to touch the file 'youtube-data.sh' for to assign
own values to the two environment variables above, then he may instead do these
assignments for example in user's own '~/.bashrc' file. 

A more involved prerequisite of Youtube-Data refers to the third-party programs
required for the well-functioning of the shell functions in 'youtube-data.sh' --
specifically that of its main one, 'youtube-data'. Youtube-Data's 'bash' shell
script makes use of the following programs:

  --------------------------------------------------------------------
                          GNU/Linux Power Tools
  --------------------------------------------------------------------
   GNU awk 3.1.8
   GNU bash 3.2.51
   GNU coreutils 8.12 (cat, cut, date, mktemp, rm, sort, tee, tr,
     truncate, uniq)
   GNU diffutils 2.8.7 (diff)
   GNU grep 2.7
   GNU sed 4.1.5
   GNU wdiff 1.2.1
   GNU wget 1.14
  --------------------------------------------------------------------
                           Free Software Tools
  --------------------------------------------------------------------
   Cache-DB 0.2 (cache)
   Json-Type 0.12.1 (json 0.9.0, json.so 0.12.1, json-litex.so 0.1.1)
  --------------------------------------------------------------------

The version numbers above indicate which packages and, by case, binaries were
used developing Youtube-Data.

Any mainstream GNU/Linux installation includes all the above GNU/Linux power
tools. The last two tools listed above -- Cache-DB and Json-Type [3] -- must be
build from their sources. Cache-DB's source tree is included within the source
tree of Youtube-Data in 'tools/cache-db' directory. Building Cache-DB is easy,
as per the instructions in 'tools/cache-db/README'. Note that Cache-DB itself
needs an additional GNU/Linux tool: GDBM, the GNU Database Manager library.

For what it concerns Json-Type, the first appendix section below presents in
details how to obtain the newest Json-Type source release package and how to
make the required binaries out of that package's source tree. Note that the
version of Json-Type must be at least 0.12.1.

The last prerequisite of Youtube-Data is that of type library 'youtube-data.so'
and of path library 'youtube-data-litex.so'.

Youtube-Data uses Json-Type for parsing, validating and transforming each JSON
text is receiving from Google's remote service of *YouTube Data API* [2].

The validation of remote service's JSON response texts is done with the help of
files '*.json' to be found in the top directory of the source tree. These text
files contain JSON type definitions in the sense of Json-Type and, respectively,
JSON litex definitions in the sense of Json-Litex, each corresponding to certain
YouTube Data API endpoint accessed by 'youtube-data'. Each time the shell script
accesses a certain endpoint, it feeds into 'json' program the JSON text received
and asks 'json' to validate that according to endpoint's corresponding type and
litex definitions.

Now, instead of passing to 'json' type definitions in form of JSON text files,
'youtube-data' may function by passing to 'json' a compiled type library which
encompasses in binary form all the type definitions contained in the JSON text
files. Using the compiled type library 'youtube-data.so' will make 'json' and,
consequently, 'youtube-data' run faster. This is so because, when given type
definitions in text form, 'json.so' needs to parse and validate that text for
constructing internal data structures. When 'json.so' gets type definitions in
form of the compiled type library 'youtube-data.so', it has nothing more to do
than simply use that: the library 'youtube-data.so' has all of 'json.so's data
structures constructed beforehand.

Similarly, instead of providing to 'json' litex definitions in form of JSON text
files, 'youtube-data' may provide to 'json' the library 'youtube-data-litex.so',
which encloses all the respective litex definitions in binary form. The compiled
path library 'youtube-data-litex.so' will make 'youtube-data' run faster. (This
is so because, when getting litex definitions in form of a compiled path library,
'json-litex.so' will have all the data structures it needs already constructed.)

The first appendix section below gives all the details for one to build the type
library 'youtube-data.so' and the path library 'youtube-data-litex.so' out of the
JSON files contained in the top directory of the source tree.


3. Use Cases of Youtube-Data
============================

This section is devoted to the presentation of main use-cases of Youtube-Data.

Note that the command line examples to be seen below require the fulfillment of
all preconditions of previous section -- for to have a workable 'youtube-data'
shell function sourced in the current 'bash' environment from the shell script
'youtube-data.sh':

  $ . youtube-data.sh

First, let have the '.shortcuts' file contain two entries -- corresponding to
two very popular C++ channels, "Meeting C++" and "CppCon":

  $ cat <<EOF >.shortcuts
  meeting-cpp UCJpMLydEYA08vusDkq3FmjQ
  cppcon      UCMlGfpWw-RUdWX_JbLCukXg
  EOF

The most useful action option of 'youtube-data' is `--diff-recent[=NUM]': it
produces on stdout the 'diff' between previous and current most recent NUM 
(5 when NUM is not given) video entries of the resource specified -- either a
channel or a playlist. Below, the syntax `--id=@meet' means that the resource
in question is the channel of which shortcut is 'meeting-cpp':

  $ youtube-data --id=@meet --diff-recent
  +vDmQlIeY4z0   4  hours 55   mins ago    There is a new future - Felix Petrico...
  +WVleZqzTw2k   1    day  4  hours ago    Strong types for strong interfaces - ...
  +DxP--1yEgKQ   2   days  3  hours ago    The performance Addict's Toolbox - Pe...
   3tIE6X5FjDE   3   days  1   hour ago    Modern C++ testing with Catch2 - Phil...
   4DvSxmIadb0   4   days 23  hours ago    Improve your C++ with inspirations fr...
  -UnIc_qJ0DRc   5   days  3  hours ago    An inspiring introduction into Templa...
  -fN7nVzbRiEk   5   days 20  hours ago    Local (Arena) Allocators Part II - Jo...
  -ko6uyw0C8r0   5   days 23  hours ago    Local (Arena) Memory Allocators Part ...

Note that YouTube's Data API [2] arranges its published resources that provide
result sets on sets of pages, each page to be queried individually for content.
The command line option `--diff-recent[=NUM]' queries the named channel, or, by
case, playlist for the first page of its most recent video entries. (By default,
the number or entries retrieved per each page queried is 50.) Than produces the
'diff' with the previously cached first page selecting only the top NUM entries.

Using option `-p +NUM' on a `--diff-recent' command line will apply the 'diff'
to first 'NUM' pages instead of only the first page. Such use-case may come of
use when the resource in question gets updated very frequently and the change
set is not covered by the first page only.

Option `--no-relative-date' makes the previous command to display the video's
published date in the format received from the remote service:

  $ youtube-data --id=@meet --diff-recent --no-relative-date
  +vDmQlIeY4z0  2018-01-24T09:59:23.000Z  There is a new future - Felix Petricon...
  +WVleZqzTw2k  2018-01-23T10:42:10.000Z  Strong types for strong interfaces - J...
  +DxP--1yEgKQ  2018-01-22T10:55:10.000Z  The performance Addict's Toolbox - Pet...
   3tIE6X5FjDE  2018-01-21T13:31:19.000Z  Modern C++ testing with Catch2 - Phil ...
   4DvSxmIadb0  2018-01-19T15:31:07.000Z  Improve your C++ with inspirations fro...
  -UnIc_qJ0DRc  2018-01-19T11:28:54.000Z  An inspiring introduction into Templat...
  -fN7nVzbRiEk  2018-01-18T18:42:49.000Z  Local (Arena) Allocators Part II - Joh...
  -ko6uyw0C8r0  2018-01-18T15:00:18.000Z  Local (Arena) Memory Allocators Part 1...

When one does not want to see a diff, but the most recent video entries composed
as table, he need using options `--show-recent[=NUM]' and `--table' (the latter
option is optional for the action option `--show-recent'):

  $ youtube-data --id=@meet --show-recent
  vDmQlIeY4z0   4  hours 55   mins ago    There is a new future - Felix Petricon...
  WVleZqzTw2k   1    day  4  hours ago    Strong types for strong interfaces - J...
  DxP--1yEgKQ   2   days  4  hours ago    The performance Addict's Toolbox - Pet...
  3tIE6X5FjDE   3   days  1   hour ago    Modern C++ testing with Catch2 - Phil ...
  4DvSxmIadb0   4   days 23  hours ago    Improve your C++ with inspirations fro...

The output of action option `--show-recent' accompanied by option `--list' will
produce more information than that of option `--table'. Below can be seen that
video entries have a 'description' property attached:

  $ youtube-data --id=@meet --show-recent=2 --list
  videoId=vDmQlIeY4z0
  publishedAt=4 hours 55 mins ago
  title=There is a new future - Felix Petriconi - Meeting C++ 2017
  description=Futures were added to C++11 as high level abstractions for
  description=asynchronous operations and are planed to be enhanced with
  description=the upcoming C++17 TS. Severals think today that std::future
  description=is broken...
  
  videoId=WVleZqzTw2k
  publishedAt=1 day 4 hours ago
  title=Strong types for strong interfaces - Jonathan Boccara - Meeting
  title=C++ 2017
  description=Strong types are such a powerful tool for bringing
  description=expressiveness into code. By using them we can precisely
  description=state our intentions about our C++ objects, both to
  description=compilers and to human beings...

The 'description' text attached to channel video entries as provided by the API
may not suit user's terminal configuration. In such a case, option `--wrap=NUM'
is of help, wrapping the texts printed out at the specified number of columns.

In the case below, the added option extends a bit the wrapping column from 72nd
(the default) to 78th, allowing the title of the second item to fit in one line:

  $ youtube-data --id=@meet --show-recent=2 --list --wrap=78
  videoId=vDmQlIeY4z0
  publishedAt=4 hours 55 mins ago
  title=There is a new future - Felix Petriconi - Meeting C++ 2017
  description=Futures were added to C++11 as high level abstractions for
  description=asynchronous operations and are planed to be enhanced with the
  description=upcoming C++17 TS. Severals think today that std::future is
  description=broken...
  
  videoId=WVleZqzTw2k
  publishedAt=1 day 4 hours ago
  title=Strong types for strong interfaces - Jonathan Boccara - Meeting C++ 2017
  description=Strong types are such a powerful tool for bringing expressiveness
  description=into code. By using them we can precisely state our intentions
  description=about our C++ objects, both to compilers and to human beings...

If needed, there's the possibility to do no wrapping of text lines at all by
using option `--no-wrap':

  $ youtube-data --id=@meet --show-recent=2 --list --no-wrap
  videoId=vDmQlIeY4z0
  publishedAt=4 hours 55 mins ago
  title=There is a new future - Felix Petriconi - Meeting C++ 2017
  description=Futures were added to C++11 as high level abstractions for asynchr...
  
  videoId=WVleZqzTw2k
  publishedAt=1 day 4 hours ago
  title=Strong types for strong interfaces - Jonathan Boccara - Meeting C++ 2017
  description=Strong types are such a powerful tool for bringing expressiveness ...

Let see now a few more use-cases that produce the information attached to given
video entries. Will pick the first video ID -- 'vDmQlIeY4z0' -- seen printed out
in the tables and lists above and will issue a few more 'youtube-data' commands.

Option `--table' becomes an action option -- i.e. it determines the output of
'youtube-data' -- when not used in tandem with action options `--[w]diff-recent'
or `--show-recent':

  $ youtube-data --video=vDmQlIeY4z0 --table
  UCJpMLydEYA08vusDkq3FmjQ  2018-01-24T09:59:23.000Z   PT1H1M58S  There is a new...

  $ youtube-data --video=vDmQlIeY4z0 --table -b
  UCJpMLydEYA08vusDkq3FmjQ   5  hours  8   mins ago    PT1H1M58S  There is a new...

The same is true for option `--list': it is also an action option if not paired
with action options `--*-recent'. The command below shows that `--list' does not
wrap text lines by default:

  $ youtube-data --video=vDmQlIeY4z0 --list
  channelId=UCJpMLydEYA08vusDkq3FmjQ
  publishedAt=2018-01-24T09:59:23.000Z
  duration=PT1H1M58S
  title=There is a new future - Felix Petriconi - Meeting C++ 2017
  description=Futures were added to C++11 as high level abstractions for asynchr...
  description=
  description=Therefore Sean Parent and I have developed an alternative, open so...
  description=
  description=In the first half of my talk I want to highlight those problems an...
  description=
  description=A graph of futures and continuations is for single execution only ...
  description=
  description=In the second half of my talk I want to give a brief introduction ...

But option `-w|--wrap' do wrap text lines when specified on a `--list' command
line. The difference with respect to options `--*--recent' is due to the fact
that wrapping is default behavior for the latter options, while it is not for
the former one.

  $ youtube-data --video=vDmQlIeY4z0 --list -w
  channelId=UCJpMLydEYA08vusDkq3FmjQ
  publishedAt=2018-01-24T09:59:23.000Z
  duration=PT1H1M58S
  title=There is a new future - Felix Petriconi - Meeting C++ 2017
  description=Futures were added to C++11 as high level abstractions for
  description=asynchronous operations and are planed to be enhanced with
  description=the upcoming C++17 TS. Severals think today that std::future
  description=is broken in multiple ways.
  description=
  description=Therefore Sean Parent and I have developed an alternative,
  description=open source, concurrency library that addresses these
  ...

When one needs a particular property of a video entry to be printed out, than he
has to use a corresponding action option in the invoking command line. E.g, for
'description' property, that action option would obviously be `--description':

  $ youtube-data --video=vDmQlIeY4z0 --description
  Futures were added to C++11 as high level abstractions for asynchronous operat...
  
  Therefore Sean Parent and I have developed an alternative, open source, concur...
  
  In the first half of my talk I want to highlight those problems and illustrate...
  
  A graph of futures and continuations is for single execution only and would ha...
  
  In the second half of my talk I want to give a brief introduction into channel...

By default, the text lines produced by action option `--description' are not
wrapped. Specifying though `-w|--wrap[=NUM]' will impose the wrapping behavior:

  $ youtube-data --video=vDmQlIeY4z0 --description -w
  Futures were added to C++11 as high level abstractions for
  asynchronous operations and are planed to be enhanced with
  the upcoming C++17 TS. Severals think today that std::future
  is broken in multiple ways.
  
  Therefore Sean Parent and I have developed an alternative,
  open source, concurrency library that addresses these
  ...


4. Appendix: Building Json-Type, 'youtube-data.so' and 'youtube-data-litex.so'
==============================================================================

This section describes the procedures of obtaining Json-Type's binaries 'json',
'json.so' and 'json-litex.so' and Youtube-Data's type library 'youtube-data.so'
and path library 'youtube-data-litex.so'.

Note that 'youtube-data*.so' are not strictly necessary for the shell function
'youtube-data' in the shell script 'youtube-data.sh' to work OK. However, it's
recommended for one to actually build them, since using them will significantly
improve the responsiveness of 'youtube-data' at the 'bash' command line prompt.

Not having 'youtube-data.so' at hand, each time called by 'youtube-data', the
'json' program (to be accurate: the library 'json.so') has to parse the type
definitions in some '*.json' file for to construct internal data structures.
The library 'youtube-data.so' has all these data structures already built-up
-- thus making 'json' run faster.

Likewise, not having 'youtube-data-litex.so' present, makes the 'json' program
(i.e. the library 'json-litex.so') run slower, since it will have to construct
its internal structures from the litex definitions in some '*-litex.json' file.
The library 'youtube-data-litex.so' contains all these data structures as such.

For to obtain the Json-Type binaries 'json', 'json.so' and 'json-litex.so' one
needs to download the latest source release tarball from [4]. The releases of
Json-Type are signed with GnuPG, therefore upon downloading e.g. version 0.12.1
by means of the following two commands:

  $ wget https://download.savannah.gnu.org/releases/json-type/json-type-0.12.1.tar.bz2

  $ wget https://download.savannah.gnu.org/releases/json-type/json-type-0.12.1.tar.bz2.sig

one has to issue two instances of 'gpg' program to check the integrity of the
received tarball (GnuPG FAQ [5]):

  $ gpg --recv-keys 3D805B7A

  $ gpg --verify json-type-0.12.1.tar.bz2.sig 

Of the two commands above, the former imports into the local keyring Json-Type
author's key, while the latter verifies the package signature -- thus validating
its integrity.

After unpacking the downloaded release tarball, for building the needed binaries
one must apply the procedure described in the README file to be found in the top
directory of the source tree.

Upon a successful build, for to make accessible to Youtube-Data the binaries
obtained -- '$JSON_TYPE_HOME/src/json', '$JSON_TYPE_HOME/lib/json.so' and
'$JSON_TYPE_HOME/lib/json-litex.so' --, one should define the following shell
function wrapper:

  $ json() { local JSON_TYPE_HOME=...; env LD_LIBRARY_PATH="$JSON_TYPE_HOME"/lib "$JSON_TYPE_HOME"/src/json "$@"; }

where '$JSON_TYPE_HOME' points to the top directory of Json-Type's source tree.

Instead of defining the 'json' shell function each time using Youtube-Data, it
is more convenient to install the three binaries in the system directories, e.g.:

  $ export JSON_TYPE_HOME=...

  $ sudo install -t /usr/local/bin "$JSON_TYPE_HOME"/src/json

  $ sudo install -t /usr/local/lib "$JSON_TYPE_HOME"/lib/json.so

  $ sudo install -t /usr/local/lib "$JSON_TYPE_HOME"/lib/json-litex.so

Now that 'json', 'json.so' and 'json-litex.so' are ready to use, it's time to
show how to obtain the libraries 'youtube-data.so' and 'youtube-data-litex.so'.

For building 'youtube-data.so', will follow the steps documented by Json-Type's
README file, subsection 4.d, Make a compiled (shared object) type library. The
sole difference occurs with respect to the target name: 'youtube-data' instead
of 'jsonrpc'.

Step 1: obtain 'youtube-data.mk' and 'youtube-data.c' from Json-Type:

  $ cp "$JSON_TYPE_HOME"/lib/json-type-module.c youtube-data.c

  $ cp "$JSON_TYPE_HOME"/lib/json-type-module.mk youtube-data.mk

Step 2: generate 'youtube-data.def' out of '*.json' files using shell function
'youtube-data-json' sourced in the current 'bash' environment from shell script
'youtube-data.sh':

  $ . youtube-data.sh

  $ youtube-data-json|json -Td --sizes-lib-ptr-space-size=2M > youtube-data.def

Note that the option `--sizes-lib-ptr-space-size' is actually required, because
the type definitions produced by shell function 'youtube-data-json' have a size
that overruns the default size of one the memory pools of 'json.so':

  $ youtube-data-json|json -Td > youtube-data.def
  json.so: fatal error: ptr-space pool alloc failed

Step 3: make 'youtube-data.so' out of 'youtube-data.{c,def}':

  $ make -f youtube-data.mk

Note that '$JSON_TYPE_HOME' needs to be defined prior the call to 'make'. If it
is not defined in the current environment, then pass it in explicitly:

  $ make -f youtube-data.mk JSON_TYPE_HOME=...

If everything went OK -- one should expect to get neither warnings nor errors
out of 'make' --, the shared library 'youtube-data.so' is ready for its first
use:

  $ ./youtube-data.so 
  youtube-data.so: library version: x.y.z

As seen, the library is executable by itself, producing on output the version
numbers 'x.y.z' of the 'json.so' library that produced it in the first place.

Another immediate use of 'youtube-data.so' would be that of asking 'json.so' to
verify that it accepts the freshly built library:

  $ json -Tc ./youtube-data.so && echo OK
  OK

For building 'youtube-data-litex.so', will follow the exact steps presented in
'doc/liter-expr.txt', section 4, Json-Litex's Compiled Path Libraries. There is
only one change applied compared to the original procedure: the target name used
below is 'youtube-data-litex' instead of 'jsonrpc-litex'.

Step 1: obtain 'youtube-data-litex.mk' and 'youtube-data-litex.c' from Json-Type:

  $ cp "$JSON_TYPE_HOME"/lib/json-litex-module.mk youtube-data-litex.mk

  $ cp "$JSON_TYPE_HOME"/lib/json-litex-module.c youtube-data-litex.c

Step 2: generate 'youtube-data-litex.def' out of '*-litex.json' files using shell
function 'youtube-data-litex' (already sourced in the current 'bash' environment
from shell script 'youtube-data.sh'):

  $ youtube-data-litex|json -F -- json-litex.so -D > youtube-data-litex.def

Step 3: make 'youtube-data-litex.so' out of 'youtube-data-litex.{c,def}':

  $ make -f youtube-data-litex.mk

As above, '$JSON_TYPE_HOME' needs to be defined in the current environment prior
the call to 'make'. If it is not, then pass it in explicitly:

  $ make -f youtube-data-litex.mk JSON_TYPE_HOME=...

If everything went OK -- one should expect to get neither warnings nor errors
out of 'make' --, the shared library 'youtube-data-litex.so' is ready for its
first use:

  $ ./youtube-data-litex.so
  youtube-data-litex.so: litex library version: x.y.z

As seen, the library is executable by itself, producing on output the version
numbers 'x.y.z' of the 'json-litex.so' library that produced it.

The second immediate use of 'youtube-data-litex.so' is to ask 'json-litex.so' to
verify that it accepts the freshly built path library:

  $ json -F -- json-litex.so -V ./youtube-data-litex.so && echo OK
  OK

If the two validations above succeeded -- that of type library 'youtube-data.so'
against 'json.so' and, respectively, that of path library 'youtube-data-litex.so'
against 'json-litex.so' --, then these two newly built libraries are ready to be
used by the 'json' program within the shell function 'youtube-data'.


5. Appendix: Using Shell Function 'youtube-data'
================================================

The shell function 'youtube-data' is the main function defined by shell script
'youtube-data.sh'. (All other shell functions in 'youtube-data.sh' are auxiliary
tools for 'youtube-data' -- and are not meant to be used directly by the user.)

This function is a rich-featured tool, having quite a few command line options:

  $ funchelp -f youtube-data.sh -c youtube-data --long-wrap-join=auto --wrap=84
  actions:
    -U|--url                      produce resource's API URL
    -I|--info                     produce resource's cache age and hash file name
    -H|--hash                     produce resource's hash file names (previous and
                                    current versions) after eventually updating them
                                    according to the specifier given by `--cache=SPEC'
    -J|--json                     produce resource's JSON text
    -S|--json2                    produce resource's flattened JSON text
    -D|--diff[=FILE]              diff two resources (the other one is given by
                                    `--file=FILE' or `--id=ID'); the default FILE is
                                    '+', i.e. the one generated by action `-J'
    -P:|--list[=KEYS]             extract resource's content as list or table; KEYS
        --table[=KEYS]              are comma-separated lists of JSON key names;
        --channel-id                `-P?', `--list=?' or `--table=?' prints out the
        --playlist-id               valid names corresponding to the pair of resource
        --video-id                  type and link type given and exits (default)
        --published-at
        --description
        --duration
        --title
    -V:|--show-recent[=NUM]       extract resource's content for the most recent NUM
        --diff-recent[=NUM]         video items; the output produced is specified by
        --wdiff-recent[=NUM]        the print options `-P', `--list', `--table', etc;
        --show-uploads[=NUM]        `--[w]diff-{recent,uploads}' produce a 'diff' or
        --diff-uploads[=NUM]        'wdiff' between previous version of the
        --wdiff-uploads[=NUM]       resource's cached content and the one specified
                                    by `--cache=SPEC'; the options `--relative-date',
                                    `--wrap-text' and `--color=auto' are implied if
                                    not overridden; NUM is at most the argument of
                                    `--max-results' and it is 5 by default; the
                                    `--*-recent' options are using Google's API
                                    'search' endpoint, while the `--*-uploads'
                                    options are using the 'playlist-items' endpoint
                                    queried for channel's uploads playlist
  options:
    -a|--[user-]agent=STR         user agent to be passed to 'wget' when action is
                                    `-J' or when input type is 'id' (default: '+',
                                    i.e. $YOUTUBE_DATA_AGENT)
    -b|--relative-date[=NUM]      produce relative dates on output or otherwise do
       --no-relative-date           not; when given NUM, compute dates relative to
                                    NUM as number of seconds since the Epoch
                                    (default: do for `-I' or else do not)
    -c:|--cache=SPEC              use resource's locally cached files according to
        --no-cache                  the given specifier or, otherwise, do not use the
                                    cache at all, but query the remote party for
                                    content; SPEC is any of 'previous', 'local',
                                    'current', 'auto' (default) or 'refresh';
                                    'previous' means using resource's previous
                                    version locally cached file; 'local' means using
                                    resource's locally cached file -- in any case do
                                    not call the remote party; 'current' means using
                                    resource's current version locally cached file if
                                    that file exists already -- if not, get it from
                                    the remote party; 'auto' means using resource's
                                    locally cached file if and only if the respective
                                    file has not yet reached its aging threshold;
                                    each aged cache file is refreshed the first time
                                    its associated resource is requested; 'refresh'
                                    makes each cached file to be refreshed prior to
                                    using it further regardless of it not exceeding
                                    its aging threshold yet; the aging threshold is
                                    specified by $YOUTUBE_DATA_CACHE_THRESHOLD (which
                                    is of form '[0-9]+[dhms]?'); the short option
                                    `-c' accepts shortcut arguments too: '-', '~',
                                    '#', '=', '+' and '!' for `--no-cache', `-c
                                    previous', `-c local', `-c current', `-c auto'
                                    and `-c refresh' respectively
    -e|--output-mode=MODE         output mode if output file already exists: 'error',
                                    'append' or 'overwrite' with corresponding
                                    shortcuts '-', '+' and '=' (default: '-' i.e.
                                    'error')
    -f|--[no-]check-certif        pass `--no-check-certif' to 'wget' or otherwise do
                                    not (default not)
    -g|--debug                    pass `--debug' to 'wget'
    -h|--home=DIR                 home dir (default: '+', i.e. $YOUTUBE_DATA_HOME)
    -i:|--file[=FILE]             input type -- 'file' or 'id' -- and input name (the
        --id[=ID]                   default type is 'id')
    -k|--[header-]cookie=STR      header cookie to be passed to 'wget'; when '+' take
                                    the cookie from $YOUTUBE_DATA_COOKIE
    -l:|--itself                  linked resource's type: 'itself', 'playlists',
        --playlists                 'videos' or 'uploads' (default: 'itself')
        --videos
        --uploads
    -m|--[max-]results=NUM        max results per API query (value in [1..50],
                                    default: 50)
    -n:|--color=always|auto       colorize the output produced by `--list' and
        --no-color                  `--[w]diff-{recent,uploads}' as specified, or
                                    otherwise do not; the short option `-n' accepts
                                    shortcut arguments too: '-', '+' and '!' for
                                    `--no-color', `-n auto' and `-n always'
                                    respectively (default: do not for `-P' and 'auto'
                                    for `-V' and `-D', i.e. color only if stdout is a
                                    terminal)
    -o|--output-file=STR          output file name when action is `-J|--json'
                                    (default: '+', i.e. generate a name; '+SUFFIX'
                                    means appending '.SUFFIX' to the generated name)
    -p|--page=SPEC                resource's pages specifier: '-' means the first
                                    page only, '+NUM' means first NUM >= 1 pages
                                    only, '+' means all pages and '@TOKEN' means the
                                    page identified by TOKEN (default: '+')
    -q|--quiet                    be quiet: when action is `-J|--json' do not print
                                    out the output file name
    -r:|--channel[=INPUT]         resource's type: 'channel', 'playlist' or 'video'
        --playlist[=INPUT]          (default: 'channel'); INPUT is either a file name
        --video[=INPUT]             or an id (default), determined by `--file' or
                                    `--id'; when INPUT terminates with '.json',
                                    consider it to be file name; when INPUT ends with
                                    '{,-playlists,-videos,-uploads}.json', set the
                                    linked type accordingly
    -s|--shortcuts=FILE           channel and playlist shortcuts file name (default:
                                    '+', i.e. $YOUTUBE_DATA_SHORTCUTS)
    -t|--[no-][json-]type         do not type-check resource's JSON object, i.e. do
                                    not pass either of the options `-t $h/*.json' or
                                    `-t $h/youtube-data.so', and respectively,
                                    neither `-f -- json-litex.so $h/*-litex.json' nor
                                    `-f -- json-litex.so $h/youtube-data-litex.so' to
                                    'json', or otherwise do (default do)
    -u|--unified=NUM              pass `-u NUM' to 'diff' when action is `-D|--diff'
                                    or `-V|--diff-{recent,uploads}'
    -v|--[no-]validate            do not validate resource's parameter values or
                                    otherwise do (default do)
    -w|--wrap[-text][=NUM]        wrap 'title' and 'description' texts when output is
       --no-wrap[-text]             of type 'list' or otherwise do not (default: do
                                    not for `-P' and do for `-V'; NUM must be >= 13;
                                    its default value is 72)
    -y|--[app-]key=STR            Google API application key (default: '+', i.e.
                                    $YOUTUBE_DATA_APP_KEY)
    -z:|--hyperlinks=always|auto  produce hyperlinks on output as specified, or
        --no-hyperlinks             otherwise do not; the short option `-z' accepts
                                    shortcut arguments too: '-', '+' and '!' for
                                    `--no-hyperlinks', `-z auto' and `-z always'
                                    respectively (default: 'auto', i.e. have
                                    hyperlinks only if stdout is a terminal)

The help information seen above is pretty much self-explanatory. Have to add
that 'youtube-data' produces output on stdout or in named files, depending on
which mode of operation was chosen by the user -- equally: depending on which
action option was last specified in the invoking command line; 'youtube-data'
reads input from stdin or named files only when issued with options `--file'
or `--diff'.

Shell function 'youtube-data's most important helper is 'youtube-wget' -- also
a shell function defined in 'youtube-data.sh'. The user need not use this latter
function at all. Nevertheless, if one wants to hack around the behavior of shell
function 'youtube-data' (e.g. using option `-d'), then he inevitably will come
across function 'youtube-wget' too:

  $ youtube-data --video=vDmQlIeY4z0 -p- -d
  youtube-wget \
  --no-check-certif \
  --output-document=- \
  --user-agent="$YOUTUBE_DATA_AGENT" \
  --action=content \
  --home="$YOUTUBE_DATA_HOME" \
  --threshold="$YOUTUBE_DATA_THRESHOLD" \
  --keep-prev \
  --save-key \
  --url='...'|
  json --json2 -Vusyp -t "$YOUTUBE_DATA_HOME"/youtube-data.so:videos -f -- \
  json-litex.so -p "$YOUTUBE_DATA_HOME"/youtube-data-litex.so:videos -l|
  awk -F '\n' --re-interval '...'

The command line options of 'youtube-wget' are as shown below:

  $ funchelp -f youtube-data.sh -c youtube-wget --long-wrap-join=auto
  actions:
    -H|--action=hash            produce cache file name -- 'wget' may be implied
    -I|--action=info            produce cache age and file name -- no 'wget'
                                  implied
    -O|--action=content         produce content -- 'wget' may be implied (default)
                                  
  options:
    -a:|--hash-age[=NUM]        pass `--hash-age[=NUM]' to 'cache' when action is
        --no-hash-age             `-I' or otherwise do not (default not)
    -c|--[no-]cache-only        use only locally cached files when action is not
                                  `-I' or otherwise do not (default not)
    -e|--[no-]save-key          pass `--save-key' to 'cache' when action is not
                                  `-I' or otherwise do not (default not)
    -h|--home=DIR               home dir (default: '+', i.e. $YOUTUBE_DATA_HOME)
    -g|--[no-]log-cache         do not pass `-lvv' to 'cache' or otherwise do
                                  (default do)
    -k|--[no-]keep-prev         pass `--keep-prev' to 'cache' when action is not
                                  `-I' or otherwise do not (default not)
    -l|--[no-]log-wget          do not pass `--append-output=$h/.cache/wget.log'
                                  to 'wget' or otherwise do (default do)
    -t|--[cache-]threshold=VAL  cache threshold value ('inf' or of form
                                  '[0-9]+[dhms]?'; default: '16h')
    -w:|--debug                 options to be passed as such to 'wget'
        --quiet
        --no-check-certif
        --connect-timeout=NUM
        --header=STR
        --output-document=FILE
        --user-agent=STR
    -u|--url=STR                input URL

The shell function 'youtube-wget' has three modes of operation -- corresponding
each to one of its action options. These three action options determines the
output provided: either a hash file name or a pair consisting of cache age and
hash file name or hash file content. As mentioned by the help information above,
depending on the invoking action, 'youtube-wget' may or may not call the remote
API on the given URL. The shell function is using the programs 'cache' and 'wget'
for to achieve its duties.


6. References
=============

[1] Google Developers Console
    https://console.developers.google.com/

[2] YouTube Data API
    https://developers.google.com/youtube/v3/

[3] Json-Type: JSON Push Parsing and Type Checking
    http://nongnu.org/json-type/

[4] Json-Type's Release Tarballs
    https://download.savannah.gnu.org/releases/json-type/

[5] GnuPG FAQ: How can I use GnuPG to verify a file I've downloaded?
    https://www.gnupg.org/faq/gnupg-faq.html#how_do_i_verify_signed_packages


About

Youtube-Data: YouTube's Video Data From Bash Command Line Prompt.

Resources

License

Stars

Watchers

Forks