From 3c699c935bfa88cf08c383a5f26c0fad6d26c146 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Mon, 26 Aug 2019 13:31:06 +0200
Subject: [PATCH] Cli docs

---
 .gitlab-ci.yml            |  78 +++++-------
 docs/cli/examples.rst     |  64 ++++++++++
 docs/cli/index.rst        | 252 ++++++++++++++++++++++++++++++++++++++
 docs/users/index.rst      |   1 +
 front/src/router/index.js |   6 +
 front/vue.config.js       |   2 +-
 6 files changed, 354 insertions(+), 49 deletions(-)
 create mode 100644 docs/cli/examples.rst
 create mode 100644 docs/cli/index.rst

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 282757b4fc..b852bec686 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,91 +20,73 @@ review_front:
   image: node:11
   when: manual
   allow_failure: true
+  variables:
+    BASE_URL: /-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/front-review/
+    VUE_APP_ROUTER_BASE_URL: /-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/front-review/
+    VUE_APP_INSTANCE_URL: $REVIEW_INSTANCE_URL
   before_script:
     - curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
     - chmod +x /usr/local/bin/jq
+    - rm -rf front-review
+    - mkdir front-review
     - cd front
   script:
     - yarn install
     - yarn run i18n-compile
     # this is to ensure we don't have any errors in the output,
     # cf https://dev.funkwhale.audio/funkwhale/funkwhale/issues/169
-    - VUE_APP_INSTANCE_URL=$REVIEW_INSTANCE_URL yarn run build | tee /dev/stderr | (! grep -i 'ERROR in')
-    - mkdir -p /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-    - cp -r dist/* /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
+    - yarn run build | tee /dev/stderr | (! grep -i 'ERROR in')
+    - cp -r dist/* ../front-review
+  artifacts:
+    expire_in: 2 weeks
+    paths:
+      - front-review
   cache:
     key: "funkwhale__front_dependencies"
     paths:
       - front/node_modules
       - front/yarn.lock
-  environment:
-    name: review/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-    url: http://front-$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN
-    on_stop: stop_front_review
   only:
     - branches
   tags:
-    - funkwhale-review
-
-stop_front_review:
-  stage: review
-  script:
-    - rm -rf /static/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG/
-  variables:
-    GIT_STRATEGY: none
-  when: manual
-  only:
-    - branches
+    - docker
   environment:
-    name: review/front/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-    action: stop
-  tags:
-    - funkwhale-review
+    name: review/front/$CI_COMMIT_REF_NAME
+    url: http://$CI_PROJECT_NAMESPACE.pages.funkwhale.audio/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/front-review/index.html
+
 
 review_docs:
   stage: review
-  image: python:3.6
   when: manual
   allow_failure: true
+  image: python:3.6
   variables:
-    BUILD_PATH: "../public"
+    BUILD_PATH: "../docs-review"
   before_script:
+    - rm -rf docs-review
+    - mkdir docs-review
     - cd docs
     - apt-get update
     - apt-get install -y graphviz
     - pip install sphinx
-
+  script:
+    - ./build_docs.sh
   cache:
     key: "$CI_PROJECT_ID__sphinx"
     paths:
       - "$PIP_CACHE_DIR"
-  script:
-    - ./build_docs.sh
-    - mkdir -p /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-    - cp -r $CI_PROJECT_DIR/public/* /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-  environment:
-    name: review/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-    url: http://docs-$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG.$REVIEW_DOMAIN
-    on_stop: stop_docs_review
+  artifacts:
+    expire_in: 2 weeks
+    paths:
+      - docs-review
   only:
     - branches
   tags:
-    - funkwhale-review
-
-stop_docs_review:
-  stage: review
-  script:
-    - rm -rf /static/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG/
-  variables:
-    GIT_STRATEGY: none
-  when: manual
-  only:
-    - branches
+    - docker
   environment:
-    name: review/docs/$CI_PROJECT_PATH_SLUG-$CI_BUILD_REF_SLUG
-    action: stop
-  tags:
-    - funkwhale-review
+    name: review/docs/$CI_COMMIT_REF_NAME
+    url: http://$CI_PROJECT_NAMESPACE.pages.funkwhale.audio/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/docs-review/index.html
+
 
 black:
   image: python:3.6
diff --git a/docs/cli/examples.rst b/docs/cli/examples.rst
new file mode 100644
index 0000000000..f57f3ae550
--- /dev/null
+++ b/docs/cli/examples.rst
@@ -0,0 +1,64 @@
+Funkwhale CLI examples
+======================
+
+Uploading local files
+---------------------
+
+**Goal**: create a library and upload all MP3 files from ``~/Music`` to it
+
+**Commands**::
+
+    funkwhale libraries create --name "My awesome library" --visibility me
+    # copy the returned UUID
+    funkwhale uploads create <UUID> ~/Music/**/*.mp3
+
+
+Favorite an entire album
+------------------------
+
+**Goal**: retrieve all the tracks from an album and add these to your favorites
+
+**Commands**::
+
+    # retrieve the album ID
+    funkwhale albums ls "The Slip"
+
+    # Copy the ID, then retrieve 100 pages of tracks from that album
+    # get only the IDs and pipe those to the favorite creation command
+    funkwhale tracks ls -f "album=<ID>" --ids --limit 100 \
+        | xargs funkwhale favorites tracks create
+
+
+Mirror an artist discography locally
+------------------------------------
+
+**Goal**: Download the discography of an artist locally, in the ``~/Music`` directory, in an ``Artist/Album/Track`` folder hierarchy
+
+**Commands**::
+
+    # retrieve the artist ID
+    funkwhale artists ls "Nine Inch Nails"
+
+    # Copy the ID, then retrieve 100 pages of tracks from that artist
+    # get only the IDs and pipe those to the download command
+    funkwhale tracks ls -f "artist=<ID>" --ids --limit 100 \
+        | xargs funkwhale tracks download \
+            -f mp3 -d ~/Music -t "{artist}/{album}/{title}.{extension}"
+
+
+Open a remote album in VLC
+--------------------------
+
+**Goal**: Variation of the previous example, but instead of downloading an artist discography, we listen to an album in VLC
+
+**Commands**::
+
+    # retrieve the album ID
+    funkwhale albums ls "The Slip"
+
+    # Copy the ID, then retrieve 100 pages of tracks from that album
+    # get only the IDs, download the corresponding tracks and pipe the audio
+    # directly to VLC
+    funkwhale tracks ls -f "album=<ID>" --ids --limit 100 \
+        | xargs funkwhale tracks download \
+        | vlc -
diff --git a/docs/cli/index.rst b/docs/cli/index.rst
new file mode 100644
index 0000000000..baa3ad3374
--- /dev/null
+++ b/docs/cli/index.rst
@@ -0,0 +1,252 @@
+Funkwhale CLI
+=============
+
+`Funkwhale CLI <https://dev.funkwhale.audio/funkwhale/cli/>`_ is a command-line interface you can install on your local computer
+to interact with any Funkwhale server via the REST API. It's especially useful if you need to do repetitive operations
+or write scripts that interact with Funkwhale servers.
+
+Here is a (non-exhaustive) list of operations you can perform via the CLI:
+
+- Manage libraries
+- Upload local files
+- Retrieve and search tracks, albums and artists
+- Download tracks
+- Manage playlists
+- Manage favorites
+
+.. contents:: Table of Contents
+
+
+
+Installation
+------------
+
+We provide a prebuilt binary for Linux::
+
+    curl -L "https://dev.funkwhale.audio/funkwhale/cli/-/jobs/artifacts/master/raw/funkwhale?job=build-linux" -o /usr/local/bin/funkwhale
+    chmod +x /usr/local/bin/funkwhale
+
+You can also install from source with::
+
+    pip3 install --user git+https://dev.funkwhale.audio/funkwhale/cli
+    # the executable will be available at ~/.local/bin/funkwhale
+
+.. note::
+
+    Installing from source requires you have Python 3.6 or higher available.
+
+You can check the installation was successful by running ``funkwhale --help``. This should output
+the list of available commands and the CLI description.
+
+Basic usage
+-----------
+
+Here are a couple of commands you can try to get started:
+
+.. code-block:: shell
+
+    # Display public server info of demo.funkwhale.audio
+    funkwhale -H https://demo.funkwhale.audio server info
+
+    # List tracks from open.audio
+    funkwhale -H https://open.audio tracks ls
+
+    # Search artists matching "zebra" on open.audio
+    funkwhale -H https://open.audio artists ls "zebra"
+
+More examples
+-------------
+
+You should find enough in this reference document to start using the CLI on your own.
+
+However, we've compiled :doc:`a list of example uses of the CLI <examples>` with advice and explanations, if you want to check it out ;)
+
+Getting help
+------------
+
+The most basic way to get help is to run ``funkwhale --help``. It will list available commands, namespaces and arguments that are common to all commands.
+
+You can also append the ``--help`` flag after any command to get more information about its arguments and options, like this: ``funkwhale albums ls --help``
+
+The CLI offers nested commands. For instance, ``funkwhale albums`` isn't a valid command in itself, but a namespace for all albums-related commands.
+
+To get the help of a specific namespace and list all its available commands, simply run ``funkwhale <namespace> --help``.
+
+Authentication
+--------------
+
+The CLI uses JWT tokens to interact with the API. You can either:
+
+1. Run ``funkwhale login``, which will ask you your Funkwhale username and password and store a JWT token in your local keyring. This token will be used automatically afterwards.
+2. Explicitly pass a token to the command via the ``-t`` flag or the ``FUNKWHALE_TOKEN`` environment variable
+
+If you use ``funkwhale login``, you can delete the local token with ``funkwhale logout``.
+
+You can check that you are fully authenticated by running ``funkwhale users me``. It will display information relating to your user profile.
+
+Configuration
+-------------
+
+To work, the CLI needs to be pointed to a Funkwhale server. This can be done in various ways:
+
+- Via the ``-H https://funkwhale.domain`` flag when calling the CLI
+- Via the ``FUNKWHALE_SERVER_URL`` environment variable
+- Via an env file (see below)
+
+Env file
+^^^^^^^^
+
+The CLI will try to read configuration options from a ``.env`` file in the current directory, or from ``~/.config/funkwhale/env``.
+
+You can also give it a path to another env file via the ``-e /path/to/.envfile`` flag or the ``ENV_FILE`` environment variable.
+
+An env file simply contains a list of variables, using the same syntax as environment variables (comments starting with # are allowed). Example::
+
+    # ~/Music/.env
+    FUNKWHALE_SERVER_URL=https://my.funkwhale.server
+
+
+List of configuration options
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| CLI Flag                             | Environment variable                           | Example value                              | Description                                                   |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| ``-e``, ``--env-file``               | ``ENV_FILE``                                   | ``~/Music/.env``                           | Path to a local env file to use for configuration             |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| ``-H``, ``--url``                    | ``FUNKWHALE_SERVER_URL``                       | ``https://demo.funkwhale.audio``           | The URL of the Funkwhale server the CLI should contact        |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| ``-t``, ``--token``                  | ``FUNKWHALE_TOKEN``                            | ``eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI``        | A JWT token to use for authentication                         |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| ``--no-login``                       | ``FUNKWHALE_NO_LOGIN``                         | ``true``                                   | Completely disable authentication and keyring                 |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| ``-v``, ``--verbosity``              |                                                | One of ``CRITICAL``, ``ERROR``,            | Control the verbosity (default is INFO)                       |
+|                                      |                                                | ``WARNING``, ``INFO`` or ``DEBUG``         |                                                               |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+| ``-q``, ``--quiet``                  | ``FUNKWHALE_QUIET``                            | ``true``                                   | Completely disable logging                                    |
++--------------------------------------+------------------------------------------------+--------------------------------------------+---------------------------------------------------------------+
+
+Listing results
+---------------
+
+All commands that list results - such as ``funkwhale albums ls`` or ``funkwhale tracks ls`` - share similar behaviors and sets of arguments.
+
+Filtering
+^^^^^^^^^
+
+Results can be filtered using the ``-f`` or ``--filter`` flag. Provided values are transmitted directly in the querystring when the requests to the API is made::
+
+    # retrieve playable tracks
+    funkwhale tracks ls -f "playable=true"
+
+The flag can be provided multiple times, to add multiple filter conditions::
+
+    # retrieve playable tracks with a CC-BY-SA 4.0 license
+    funkwhale tracks ls -f "playable=true" -f "license=cc-by-sa-4.0"
+
+.. note::
+
+    The list of supported fields for filtering depends on the resource being queried, and can be found in our `API documentation`_.
+
+
+Searching
+^^^^^^^^^
+
+Any text provided after the ``ls`` command will be considered a search query and transmitted to the API::
+
+    # retrieve tracks matching the search query "Electro Swing"
+    funkwhale tracks ls Electro Swing
+
+.. note::
+
+    This is technically equivalent to filtering with a ``q`` parameter as described above::
+
+        funkwhale tracks ls -f "q=Electro Swing"
+
+
+Ordering
+^^^^^^^^
+
+You can control the ordering of the results with the `-o` or ``--ordering`` flag::
+
+    # retrieve albums by creation date, in ascending order
+    funkwhale albums ls -o creation_date
+
+.. note::
+
+    Ordering in descending order is supported by prefixing the field name with ``-``, e.g: ``-o -creation_date``
+
+.. note::
+
+    The list of supported fields for ordering depends on the resource being queried, and can be found in our `API documentation`_.
+
+
+Pagination
+^^^^^^^^^^
+
+You can retrieve a specific result page using the ``-p`` or ``--page`` flag::
+
+    # retrieve the second page of albums
+    funkwhale albums ls -p 2
+
+You can also alter the size of the pages using the ``-s`` or ``--page-size`` flag::
+
+    # retrieve five albums
+    funkwhale albums ls -s 5
+
+Sometimes, you may want to retrieve multiple pages of results at once. This is supported using the ``-l`` or ``--limit`` flag::
+
+    # retrieve the first 3 pages of albums
+    funkwhale albums ls -l 3
+
+You can, of course, combine these flags::
+
+    # retrieve 3 pages of 12 albums, starting on the 4th page
+    funkwhale albums ls --limit 3 --page-size 12 --page 4
+
+Output
+^^^^^^
+
+While the default output displays a human-readable table, you can customize it.
+
+The ``--raw`` flag will simply output the raw JSON payload returned by the API server::
+
+    funkwhale artists ls --raw
+
+The ``-h`` or ``--no-headers`` flag simply removes the table column headers.
+
+The ``-t`` or ``--format`` flag alters the rendering of result, depending on the provided value::
+
+    # list artists outputting a html table
+    funkwhale artists ls -t html
+    # output a github/markdown table
+    funkwhale artists ls -t github
+
+Available formats are: ``fancy_grid``, ``github``, ``grid``, ``html``, ``jira``, ``latex``, ``latex_booktabs``, ``latex_raw``, ``mediawiki``, ``moinmoin``, ``orgtbl``, ``pipe``, ``plain``, ``presto``, ``psql``, ``rst``, ``simple``, ``textile``, ``tsv``, ``youtrack``
+
+The ``-c`` or ``--column`` flag gives you control on the displayed columns::
+
+    # list artists, displaying only artist ID and number of tracks
+    funkwhale artists ls -c ID -c Tracks
+
+For a given resource, the list of available columns can be found by running ``funkwhale <resource> ls --help``.
+
+The ``-i`` or ``--ids`` flag displays only the IDs of results, one per line::
+
+    funkwhale artists ls --ids
+
+This is especially useful in conjunction with other commands (like deletion commands) and piping.
+Note that this is also technically equivalent to applying the ``--no-headers``, ``--format plain`` and ``--column ID`` flags.
+
+Deleting objects
+----------------
+
+Some resources support deletion, via commands such as ``funkwhale libraries rm`` or ``funkwhale playlists rm``, followed by one or more IDs::
+
+    # delete playlists 42 and 23
+    funkwhale playlists rm 42 23
+
+By default, the ``rm`` command will ask for confirmation, but you can disable this behavior by providing the ``--no-input`` flag.
+
+
+.. _API Documentation: https://docs.funkwhale.audio/swagger/
diff --git a/docs/users/index.rst b/docs/users/index.rst
index aa05555bd9..9387f281bf 100644
--- a/docs/users/index.rst
+++ b/docs/users/index.rst
@@ -28,6 +28,7 @@ Using Funkwhale
    radios
    follow
    apps
+   ../cli/index
 
 Troubleshooting Issues
 ----------------------
diff --git a/front/src/router/index.js b/front/src/router/index.js
index 182cf61b07..6a9ba6112f 100644
--- a/front/src/router/index.js
+++ b/front/src/router/index.js
@@ -3,9 +3,11 @@ import Router from 'vue-router'
 
 Vue.use(Router)
 
+console.log('PROCESS', process.env)
 export default new Router({
   mode: 'history',
   linkActiveClass: 'active',
+  base: process.env.VUE_APP_ROUTER_BASE_URL || '/',
   routes: [
     {
       path: '/',
@@ -552,6 +554,10 @@ export default new Router({
         },
       ]
     },
+    {
+      path: '*/index.html',
+      redirect: '/'
+    },
     {
       path: '*',
       component: () =>
diff --git a/front/vue.config.js b/front/vue.config.js
index c397f824a3..4b1d9f5d40 100644
--- a/front/vue.config.js
+++ b/front/vue.config.js
@@ -10,7 +10,7 @@ if (process.env.BUNDLE_ANALYZE === '1') {
   plugins.push(new BundleAnalyzerPlugin())
 }
 module.exports = {
-  baseUrl: '/front/',
+  baseUrl: process.env.BASE_URL || '/front/',
   pages: {
     embed: {
       entry: 'src/embed.js',
-- 
GitLab