The essential
Phraseanet configuration is stored in config/configuration.yml. After any update, it must be recompiled with bin/console compile:configuration command.
Phraseanet configuration is stored in config/configuration.yml that is automatically generated during install.
This file is in YAML format. For performance reasons, and use opcode cache, confguration is compiled.
It must be recompiled after any update.
Configuration compilation is very easy and fast to execute. bin/console compile:configuration should be used.
bin/console compile:configuration
Here is a commented configuration file (/lib/conf.d/configuration.yml) :
servername: 'http://local.phrasea/'
languages:
available:
- de
- en
- fr
- nl
default: 'en'
main:
maintenance: false
key: ''
database:
host: 'sql-host'
port: 3306
user: 'sql-user'
password: 'sql-password'
dbname: ab_phraseanet
driver: pdo_mysql
charset: UTF8
database-test:
driver: pdo_sqlite
path: '/tmp/db.sqlite'
charset: UTF8
cache:
type: ArrayCache
options: {}
search-engine:
type: elasticsearch
options:
host: elasticsearch
port: 9200
index: ''
shards: 3
replicas: 0
minScore: 2
highlight: true
maxResultWindow: 500000
populate_order: MODIFICATION_DATE
populate_direction: DESC
populate_permalinks: false
activeTab: '#elastic-search'
facets:
_base:
limit: 10
_collection:
limit: 10
_doctype:
limit: 10
_camera_model:
limit: 10
_iso:
limit: 0
_aperture:
limit: 0
_shutterspeed:
limit: 0
_flashfired:
limit: 0
_framerate:
limit: 0
_audiosamplerate:
limit: 0
_videocodec:
limit: 0
_audiocodec:
limit: 0
_orientation:
limit: 0
_colorspace:
limit: 0
_mimetype:
limit: 0
task-manager:
status: started
enabled: true
options:
protocol: tcp
host: 127.0.0.1
port: 6660
linger: 500
logger:
max-files: 10
enabled: true
level: INFO
session:
type: native
options: []
ttl: 86400
binaries:
ghostscript_binary: null
php_binary: null
unoconv_binary: null
ffmpeg_binary: null
ffprobe_binary: null
mp4box_binary: null
pdftotext_binary: null
ffmpeg_timeout: 3600
ffprobe_timeout: 60
gs_timeout: 60
mp4box_timeout: 60
swftools_timeout: 60
unoconv_timeout: 60
exiftool_timeout: 60
storage:
subdefs: null
cache: null
log : null
download: null
lazaret: null
caption: null
worker_tmp_files: null
trusted-proxies: []
network-proxies:
http-proxy:
enabled: false
host:
port:
user:
password:
ftp-proxy:
enabled: false
host:
port:
user:
password:
debugger:
allowed-ips: []
border-manager:
enabled: true
extension-mapping:
otc: application/vnd.oasis.opendocument.chart-template
ttc: application/x-font-ttf
xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
docx: application/msword
pptx: application/vnd.ms-powerpoint
mxf: application/mxf
mp4: video/mp4
svg: image/svg+xml
checkers:
-
type: Checker\Sha256
enabled: true
-
type: Checker\UUID
enabled: true
-
type: Checker\Colorspace
enabled: false
options:
colorspaces: [cmyk, grayscale, rgb]
-
type: Checker\Dimension
enabled: false
options:
width: 80
height: 160
-
type: Checker\Extension
enabled: false
options:
extensions: [jpg, jpeg, bmp, tif, gif, png, heic, pdf, doc, docx, xls, xlsx, odt, mpg, mpeg, mov, avi, mp3, mp2, mp4, m4v, m4a, mkv, hevc, aac, aiff, wav]
-
type: Checker\Filename
enabled: false
options:
sensitive: true
-
type: Checker\MediaType
enabled: false
options:
mediatypes: [Audio, Document, Image, Video]
registry:
api-clients:
api-subdef_service: false
actions:
export-stamp-choice: false
stamp-subdefs: false
user_account:
deleting_policies:
email_confirmation: true
authentication:
auto-create:
templates: { }
providers:
facebook:
enabled: false
display: false
title: Facebook
type: facebook
options:
app-id: ''
secret: ''
default-graph-version: 'v2.10'
twitter:
enabled: false
display: false
title: Twitter
type: twitter
options:
consumer-key: ''
consumer-secret: ''
github:
enabled: false
display: false
title: Github
type: github
options:
client-id: ''
client-secret: ''
viadeo:
enabled: false
display: false
title: Viadeo
type: viadeo
options:
client-id: ''
client-secret: ''
linkedin:
enabled: false
display: false
title: LinkedIN
type: linkedin
options:
client-id: ''
client-secret: ''
openid-1:
enabled: false
display: false
title: 'openid 1'
type: openid
options:
client-id: ''
client-secret: ''
base-url: 'https://keycloak.phrasea.local'
realm-name: phrasea
exclusive: false
icon-uri: null
usegroups: false
birth-group: _firstlog
everyone-group: _everyone
metamodel: _metamodel
model-gpfx: _M_
model-upfx: _U_
debug: false
auto-logout: false
auto-connect-idp-name: null
groupmask: "/phraseanet_([^,]+)/i"
fieldmap:
id: sub
login: email
firstname: given_name
lastname: family_name
email: email
groups: group
registration-fields:
-
name: company
required: true
-
name: lastname
required: true
-
name: firstname
required: true
-
name: geonameid
required: true
download_async:
enabled: false
xsendfile:
enabled: false
type: nginx
mapping: []
h264-pseudo-streaming:
enabled: false
type: nginx
mapping: []
plugins: []
api_cors:
enabled: false
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
expose_headers: []
max_age: 0
hosts: []
session:
idle: 0
# 1 week
lifetime: 604800
crossdomain:
allow-access-from:
-
domain: '*.cooliris.com'
secure: 'false'
embed_bundle:
video:
player: videojs
autoplay: false
cover_subdef: poster
message_start: StartOfMessage
available_speeds:
- 1
- 1.5
- 3
audio:
player: videojs
autoplay: false
cover_subdef: thumbnail
document:
#player: flexpaper
enable_pdfjs: true
geocoding-providers:
-
map-provider: 'mapboxWebGL'
enabled: false
public-key: ''
map-layers:
-
name: Light
value: 'mapbox://styles/mapbox/light-v9'
-
name: Streets
value: 'mapbox://styles/mapbox/streets-v9'
-
name: Basic
value: 'mapbox://styles/mapbox/basic-v9'
-
name: Satellite
value: 'mapbox://styles/mapbox/satellite-v9'
-
name: Dark
value: 'mapbox://styles/mapbox/dark-v9'
transition-mapboxgl:
-
animate: true
speed: '2.2'
curve: '1.42'
default-position:
- 42.488
- 3.779
default-zoom: 2
marker-default-zoom: 11
position-fields:
#-
# name: GpsCompositePosition
# type: latlng
-
name: Latitude
type: lat
-
name: Longitude
type: lon
geonames-field-mapping: true
cityfields: 'City, Ville'
provincefields: Province
countryfields: 'Country, Pays'
latitudefields: Latitude
longitudefields: Longitude
video-editor:
ChapterVttFieldName: VideoTextTrackChapters
seekBackwardStep: 500 # in ms
seekForwardStep: 500 # in ms
playbackRates:
- 1
- '1.5'
- 3
workers:
auto-cancelingJob: 24 # period in hours, not define or null to not execute
queue:
worker-queue:
registry: alchemy_worker.queue_registry
host: localhost
port: 5672
user: ''
password: ''
ssl: false
vhost: /
heartbeat: 60
webhook:
timeout: 30
verify_ssl: true
queues:
assetsIngest:
max_retry: 3
ttl_retry: 10000
createRecord:
max_retry: 3
ttl_retry: 10000
editRecord:
max_retry: 3
ttl_retry: 10000
exportMail:
max_retry: 3
ttl_retry: 10000
downloadAsync:
max_retry: 3
ttl_retry: 10000
exposeUpload:
max_retry: 3
ttl_retry: 10000
ftp:
max_retry: 3
ttl_retry: 180000
populateIndex:
max_retry: 3
ttl_retry: 10000
pullAssets:
max_retry: 3
ttl_retry: 10000
recordsActions:
max_retry: 3
ttl_retry: 10000
shareBasket:
max_retry: 3
ttl_retry: 10000
subdefCreation:
max_retry: 3
ttl_retry: 10000
ttl_delayed: 5000
validationReminder:
max_retry: 3
ttl_retry: 7200000
webhook:
max_retry: 3
ttl_retry: 10000
writeMetadatas:
max_retry: 3
ttl_retry: 10000
ttl_delayed: 5000
writeMetadatas:
acceptedMimeType:
- image/jpeg
- image/png
- application/postscript
- application/pdf
- image/tiff
externalservice:
pusher:
auth_key: 'pusher-auth_key'
secret: 'pusher-secret'
app_id: 'pusher-app_id'
happyscribe:
token: token
organization_id: 123456
transcript_format: vtt
subdef_source: preview
Console_logger_enabled_environments: [test]
feedback-report:
enabled: false
actions:
action_unvoted:
status_bit: 8
value: '{% if vote.votes_unvoted > 0 %} 1 {% else %} 0 {% endif %}'
action_red:
status_bit: 9
value: '{% if vote.votes_no > 0 %} 1 {% else %} 0 {% endif %}'
action_green:
status_bit: 10
value: '{% if vote.votes_no == 0 %} 1 {% else %} 0 {% endif %}'
action_log:
metadata: Validations
method: prepend
delimiter: "\n"
value: 'Vote initated on {{ vote.created }} by {{ initiator ? initiator.getEmail() : "?" }} expired {{ vote.expired }} : {{ vote.voters_count }} participants, {{ vote.votes_unvoted }} unvoted, {{ vote.votes_no }} "no", {{ vote.votes_yes}} "yes".'
translator:
jobs:
#
# - translate EN keywords to FR and EN
# nb: since we clean the destination fields, we MUST (re)write EN to EN
# - add country to keywords, both FR/EN
keywords:
active: false
databox: my_databox
if_collection: to_translate
if_status: x1xxxx
actions:
KeywordsENtoFREN:
active: true
source_field: KeywordsEN
source_lng: en
destination_fields:
- fr:keywordsFR
- en:keywordsEN
cleanup_source: if_translated
# action 1 cleans the destination fields
cleanup_destination: true
CountryENtoKeywordsFREN:
active: true
source_field: CountryEN
source_lng: en
# add translated country to the keywords
destination_fields:
- fr:keywordsFR
- en:keywordsEN
cleanup_source: if_translated
# action 2 must NOT erase what action 1 did
cleanup_destination: false
# end of job : change coll status
set_status: 10xxxx
set_collection: online
Available languages with their respectives codes are:
cache and opcode-cache cache services can be configures with the following adapters:
Name | Service | Description | Options |
---|---|---|---|
RedisCache | Cache | Cache server using PHP redis extension | host, port |
ArrayCache | cache | opcode-cache | No cache |
Sessions are stored on filesystem by default. It is possible to use another handling system:
Type | Description | Options |
---|---|---|
file | Filesystem handler | |
redis | Redis server handler, use PHP redis | host, port |
Warning
Time-to-live setting (ttl) does not work with filesystem storage. In that case, use PHP gc_maxlifetime setting.
Elasticsearch is the only service that can be used with Phraseanet.
Name | Options |
---|---|
Alchemy\Phrasea\SearchEngine\Elastic\ElasticSearchEngine | host, port, index |
If Phraseanet is behind a reverse proxy, its address must be set as a trusted one so that users IP address will be correctly recognized.
trusted-proxies:
192.168.27.15
10.0.0.45
registration-fields section allows to customize registration fields and which ones of them are required.
registration-fields:
-
name: company
required: false
-
name: firstname
required: true
id | Nom |
login | Login |
gender | Gender |
firstname | First name |
lastname | Last name |
address | Address |
zipcode | Zip Code |
geonameid | City |
position | position |
company | Company |
job | Job |
tel | Telephone |
fax | Fax |
Xsendfile configuration should be handled with commanline tools. Both Nginx and Apache documentation are available.
Plugins are configured in the same file. Plugins documentation explains how to configure yours plugins.
Border Manager checkers are configurable. It is also possible to create your own checker.
Checker | Description | Options |
---|---|---|
CheckerSha256 | Checks for duplicated files based on their sha256 check sum | |
CheckerUUID | Checks for duplicated files based on their UUID | |
CheckerDimension | Checks file dimension (if applicable) | width : file width height : file height |
CheckerExtension | Checks file extension | extensions : authorized file extensions |
CheckerFilename | Checks for duplicated files based on their filename | sensitive : enable case sensitivity |
CheckerMediaType | Checks media type (Audio, Video...) | mediatypes : authorized media types |
CheckerColorspace | Checks colorspace (if applicable) | colorspaces : authorized colorspaces |
Border manager service allow to customize mime-type detection with the extension-mapping parameter. Mime type detection can be wrong on some platforms. Use this array to force a mime-type given a file extension.
It is possible to restrict the validation constraint on a set of collections by passing a list of base_id:
#services.yml
Border:
border_manager:
type: Border\BorderManager
options:
enabled: true
checkers:
-
type: Checker\Sha256
enabled: true
collections:
- 4
- 5
The same restriction can be done at databoxes level:
#services.yml
Border:
border_manager:
type: Border\BorderManager
options:
enabled: true
checkers:
-
type: Checker\Sha256
enabled: true
databoxes:
- 3
- 7
Note
It is not possible to restrict at databoxes and collections levels at the same time.
Checker’s object are declared in the Alchemy\Phrasea\Border\Checker namespace. The checker has to be in this namespace and must implement Alchemy\Phrasea\Border\Checker\Checker interface.
Example of GPS based checker:
<?php
namespace Alchemy/Phrasea/Border/Checker;
use Alchemy\Phrasea\Border\File;
use Doctrine\ORM\EntityManager;
use MediaVorus\Media\DefaultMedia as Media;
class NorthPole implements Checker
{
private $options;
public function __construct(Array $options)
{
$this->options = $options;
}
public function check(EntityManager $em, File $file)
{
$media = $file->getMedia();
if (null !== $latitude = $media->getLatitude() && null !== $ref = $media->getLatitudeRef()) {
if($latitude > 60 && $ref == Media::GPSREF_LATITUDE_NORTH) {
return true;
}
}
return false;
}
}
Enable the checker
border-manager:
enabled: true
checkers:
-
type: Checker\NorthPole
enabled: true
It is possible to customize default users settings. Available parameters are:
Name | Description | Defaut value | Available values |
---|---|---|---|
view | Results display | thumbs | thumbs (thumbnail view) list (list view) |
images_per_page | Results quantity per page | 20 | |
images_size | Result thumbnail size | 120 | |
editing_images_size | Editing thumbnail size | 134 | |
editing_top_box | Editing top block (percentage) | 30 | |
editing_right_box | Editing right block (percentage) | 48 | |
editing_left_box | Editing left block (percentage) | 33 | |
basket_sort_field | Basket sort index | name | name (by name) or date (by date) |
basket_sort_order | Basket sort index | ASC | ASC (ascending) or DESC (descending) |
warning_on_delete_story | Alert before remove a story | true | true (yes) or false (no) |
client_basket_status | Display baskets in Classic | 1 | 1 (yes) or 0 (no) |
css | Production CSS theme | 000000 | 000000 (dark) or 959595 (bright) |
advanced_search_reload | Reload previous search options on Prod loading | 1 | 1 (yes) or 0 (no) |
start_page_query | Default question | last | |
start_page | Production start page | QUERY | PUBLI (publications) or QUERY (query) ou LAST_QUERY (last query) |
rollover_thumbnail | Rollover display | caption | caption (notice) or preview (preview) |
technical_display | Display technical data | 1 | 1 (yes) or 0 (no) or group (inside the caption) |
doctype_display | Display a record type icon | 1 | 1 (yes) or 0 (no) |
basket_caption_display | Display basket records notice | 0 | 1 (yes) or 0 (no) |
basket_status_display | Display basket records status | 0 | 1 (yes) or 0 (no) |
basket_title_display | Display basket records title | 0 | 1 (yes) or 0 (no) |
Set the inactivity time (in seconds) before the user is automatically disconnected from application.
The setting “idle” has priority over “lifetime”. If “idle” is set, the option “Remember me” is not displayed on the homepage.
Checking “Remember me” on homepage allows to access the application later without authentifying again. Access is allowed for this duration (in seconds).
Boolean that triggers lazy load for thumbnails in Phraseanet production, this option is not obsolete if static file mode is enabled.
If this option is enabled, thumbnails are served as static content. Symlinks to images will be created.
static-file:
enabled: true
type: nginx
symlink-directory: ''
Phraseanet includes Videojs player for audio and video type document preview.
It can be customized in the configuration.yml file:
embed_bundle: # (array) Embed_bundle configuration
video:
player: videojs # (array) Set active player for video - videojs only
autoplay: false # (boolean) Autoplay setting for video
video_message_start: StartOfMessage # (string) The field name where the start reading value (in second) is stored
coverSubdef: previewx4 # (string) Cover sub-definition to be used in player
available-speeds: # (array) Set available speed in player
- 1
- 1.5
- 3
audio:
player: videojs # (array) Set active player for audio
autoplay: false # (boolean) Autoplay setting for audio
Note
High speed playbacks increases bandwidth consumption.
The Pdf.js viewer can be used to display previews of PDF documents instead of the default FlexPaper viewer.
Pdf.js allows a native display of PDF files in modern browsers while default FlexPaper viewer requires Adobe Flash Player plugin to be installed, enabled as well as allowed in it.
embed_bundle:
document:
player: flexpaper # (string) For Office document, use flexpaper or pdfjs
enable-pdfjs: true # (boolean) Use pdfjs as PDF viewer for PDFs documents
Note
Flexpaper or Pdfjs can be used display Office based documents previews. Please set Document Preview subdef according to your choice in each databox subdef setting.
The section allows the configuration of options in the video editing tools in Production
video-editor:
ChapterVttFieldName: VideoTextTrackChapters # (string) The name of the document field storing the chaptering data
seekBackwardStep: 500 # (integer) In milliseconds, the displacement value of the reading head back
seekForwardStep: 500 # (integer) In milliseconds, the displacement value of the reading head forward
playbackRates: # (array) Available reading speeds in the player
- 1
- '1.5'
- 3
The section allows the configuration of geolocation options in Production.
A MapBox API public-key is required to use this service. It can be get on Mapbox web site.
For using GeoNames input assistance in Phraseanet edit form, please provide a geonames-server address in Webservice section in configuration file.
geocoding-providers: # (array) Configuration of geolocation options in Production
-
map-provider: mapboxWebGL # (string) The library used for displaying maps
enabled: false # (string) Activate or deactivate the functionality in Production
public-key: '' # (string) The required MapBox API key
map-layers: # (array) An array grouping the proposed base maps
-
name: Streets
value: 'mapbox://styles/mapbox/streets-v9'
-
name: Basic
value: 'mapbox://styles/mapbox/basic-v9'
transition-mapboxgl:
-
animate: true
speed: '2.2'
curve: '1.42'
default-position: # (array) Default position on the map
- '48.879162'
- '2.335062'
default-zoom: 5
marker-default-zoom: 9
geonames-field-mapping: true # (boolean) Enable GeoNames input assistance in Phraseanet edit form
cityfields: City, Ville # (array) Mapping of Phraseanet fields for the GeoName Name property (the city)
provincefields: Province # (array) Mapping of Phraseanet fields for the GeoName Region property
countryfields: Country, Pays # (array) Mapping of Phraseanet fields for the GeoName Country property