File: internal-api.md

package info (click to toggle)
sreview 0.12.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,504 kB
  • sloc: perl: 12,360; javascript: 509; sh: 72; makefile: 8
file content (153 lines) | stat: -rw-r--r-- 7,290 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# SReview internal APIs

SReview containers a number of internal APIs, which are useful to know
about if you want to administer the SReview system. Additionally, if you
want to contribute to SReview, it helps to be aware of them.

The APIs are documented in POD format, but it's useful to have a bit of
an overview; that's what this document attempts to provide.

## Files API

The `SReview::Files` API provides access to media files. Any component
of the system that wants to access a file *must* use this API. This
allows for abstracting away the way in which the files are accessed. As
of this writing, implementations exist to access and detect files
directly on the filesystem (locally or via NFS), via an Amazon
S3-compatible API, via plain HTTP, via HTTP with nginx JSON indexes, and
via SSH.

### Collections

The Files API places each file in a "collection". A collection is a
logical grouping of files that can be accessed in a uniform way. For
instance, the "input directory" (as configured through the `inputglob`
configuration parameter) defines one collection.

The `SReview::Files` implementation to access files is configured at the
collection level, through the `accessmethods` configuration parameter.
This parameter should be a hash where each key is the name of a
collection to configure the collection implementation for, and the value
is the name of the implementing collection class, with the
`SReview::Files::Collection::` prefix dropped.

If the `accessmethods` configuration item does not contain a key for the
relevant collection, then the collection cannot be created and SReview
will produce an error.

SReview requires at least three collections:

1. The `input` collection contains raw files as they are received from
   the camera. The location where files in this collection are found is
   configured by the `inputglob` configuration item. For backwards
   compatibility reasons, this collection looks for files by way of an
   input glob, rather than a root URL; it is the only collection which
   requires that, but this distinction may be removed at a future point.
2. The `intermediate` collection contains the files that are served to
   the public for the review webinterface. The location where files in
   this collection are found is configured by the `pubdir` configuration
   item. For the webinterface to work, it must be served on the URL
   configured by the `vid_prefix` configuration item (which may be
   host-relative if it is served on the same hostname as the SReview
   webinterface itself).
3. The `output` collection contains the finalized files that are
   produced by SReview. The location for this collection is configured
   by the `outputdir` configuration item.
   This is the location where all transcoded files (the output of
   SReview) are written to by `sreview-transcode`; the `sreview-upload`
   script, however, *reads* files from this collection. If the
   `outputdir` is somehow directly readable over the Internet, then the
   use of `sreview-upload` is not required and the `uploading` state can
   be skipped. However, this may not be desireable, as the `direct`
   implementation (for direct filesystem access) does not use temporary
   files and writes directly to this collection, which may therefore
   result in incomplete files appearing to users.

These three collections are not optional and therefore assumed to always
be present.

If the `inject` functionality is enabled, then an extra collection, the
name of which should be specified the `inject_collection` configuration
item, is required. When doing so, an entry for the collection should be
present in the `accessmethods` configuration item, and the
`extra_collections` configuration item (which should also be a hash)
should contain a key for the same collection name with as its value the
base URL of the collection.

In some cases, it may be desireable to copy the files from one
collection to another as a way to upload scripts from the
`sreview-upload` script. In that case, the `sreview-copy` script can be
used, with relevant values in the `accessmethods` and
`extra_collections` configuration items.

### Creating objects

Creating an object is done by way of the `SReview::Files::Factory::create`
method. See the POD documentation for `SReview::Files::Factory` for details.

## Configuration API

### Overview

All SReview configuration is done through two dedicated modules,
`SReview::Config` and `SReview::Config::Common`. The former provides the
API, whereas the latter provides the specific configuration variables
used by SReview.

SReview supports setting configuration in the following ways:

1. Via environment variables. When doing so, the name of the environment
   variable should be the name of the configuration variable in upper
   case, prefixed with `SREVIEW_`. For instance, the configuration item
   `input_profile` can be set through the environment variable
   `SREVIEW_INPUT_PROFILE`. Each environment variable must be encoded in
   JSON; this includes strings, which means they need to have embedded
   quotes.
2. Via a configuration file, which is found using the following
   algorithm:

    1. If an environment variable `SREVIEW_WDIR` exists, look for a file
       `config.pm` in the directory pointed to by that variable. If it
       exists, use that.
    2. If a file `config.pm` exists in the current working directory,
       use that.
    3. If a file `config.pm` exists in the directory `/etc/sreview`, use
       that.

If a value is set in an environment variable, it takes precedence over
any value in the configuration file. If a value is not set in an
environment variable, *and* no value exists in a configuration file, the
built-in defaults, if any, will be used.

If environment variables are set and a configuration file is found too,
then both take effect. However, only one configuration file will be
considered; you can't have multiple configuration files. That said, as
the configuration file is a perl script, you *can* include a different
configuration file using normal perl syntax.

### Configuration tool

A dedicated tool, `sreview-config`, exists to manage configuration
items. It will parse the configuration in exactly the same way that the
other tools do, and it will then allow you to do things with that parsed
configuration.

It can:

1. Rewrite the configuration file with the default comments and all
   configuration values that are set to non-default values explicitly
   set;
2. Dump the configuration file as it *would* be written by step 1. to
   standard output (**note**: redirecting this output to a file that is
   in the search path of the current configuration will result in
   `sreview-config` finding an empty file, which means it will set
   everything to defaults; do not do that);
3. Extract the value of one specific configuration item to standard
   output (in JSON format);
4. Allow you to override one specific value on the command line before
   doing any of the above. However, this option only works for string
   options, and does not use the JSON encoding; it is therefore not
   recommended. Instead, you should set environment variables to
   override single options if you need to do this.

For more details, see the L<sreview-config> manual page.