ampache/ampache

View on GitHub
Update RandomAction.php #6681
lachlan authored bc7dc6c8
complete00:05:16
1
git clone
2
codeclimate validate-config
View output
codeclimate validate-config
No errors or warnings found in .codeclimate.yml.
3
codeclimate prepare
View output
codeclimate prepare
4
builder pull-engines
View output
determining required images
docker pull codeclimate/codeclimate-phan:b885
b885: Pulling from codeclimate/codeclimate-phan
8e402f1a9c57: Pulling fs layer
abc2d0fc5668: Pulling fs layer
dc541c3b1e49: Pulling fs layer
9f6ca43a9b11: Pulling fs layer
c7737daaa88e: Pulling fs layer
dacca831c5b2: Pulling fs layer
16fbe636fb42: Pulling fs layer
723d37ca9d09: Pulling fs layer
9eddffd41f08: Pulling fs layer
fb7a0bf324fd: Pulling fs layer
d45ca5424117: Pulling fs layer
16fbe636fb42: Waiting
723d37ca9d09: Waiting
9eddffd41f08: Waiting
fb7a0bf324fd: Waiting
d45ca5424117: Waiting
c7737daaa88e: Waiting
dacca831c5b2: Waiting
9f6ca43a9b11: Waiting
abc2d0fc5668: Verifying Checksum
abc2d0fc5668: Download complete
dc541c3b1e49: Verifying Checksum
dc541c3b1e49: Download complete
8e402f1a9c57: Verifying Checksum
8e402f1a9c57: Download complete
c7737daaa88e: Verifying Checksum
c7737daaa88e: Download complete
8e402f1a9c57: Pull complete
dacca831c5b2: Download complete
abc2d0fc5668: Pull complete
16fbe636fb42: Verifying Checksum
16fbe636fb42: Download complete
723d37ca9d09: Download complete
dc541c3b1e49: Pull complete
9f6ca43a9b11: Verifying Checksum
9f6ca43a9b11: Download complete
9eddffd41f08: Download complete
fb7a0bf324fd: Verifying Checksum
fb7a0bf324fd: Download complete
d45ca5424117: Verifying Checksum
d45ca5424117: Download complete
9f6ca43a9b11: Pull complete
c7737daaa88e: Pull complete
dacca831c5b2: Pull complete
16fbe636fb42: Pull complete
723d37ca9d09: Pull complete
9eddffd41f08: Pull complete
fb7a0bf324fd: Pull complete
d45ca5424117: Pull complete
Digest: sha256:80f9f90a9dc7ed88b958d04b86493d2a7bff8f1bdf1ba775c0c9ba6e254f6181
Status: Downloaded newer image for registry.prod.codeclimate.net/codeclimate/codeclimate-phan:b885
5
structure
View output
12
Parser process id: 12
codeclimate-parser socket not present
waiting 1s...
W, [2024-04-09T23:12:04.325359 #1]  WARN -- : Skipping public/lib/modules/prettyphoto/js/jquery.prettyPhoto.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:04.325423 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:04.977344 #1]  WARN -- : Skipping public/lib/modules/jplayer/jquery.jplayer.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:04.977450 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:04.979178 #1]  WARN -- : Skipping public/lib/modules/jplayer/jplayer.playlist.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:04.979218 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:04.980415 #1]  WARN -- : Skipping public/lib/modules/UberViz/minivents.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:04.980450 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.192988 #1]  WARN -- : Skipping public/lib/modules/UberViz/stats.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.193028 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.197760 #1]  WARN -- : Skipping public/lib/modules/UberViz/dat.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.197796 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.222311 #1]  WARN -- : Skipping public/lib/modules/UberViz/three.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.222366 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.334229 #1]  WARN -- : Skipping public/lib/modules/rhinoslider/js/rhinoslider-1.05.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.334270 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.493545 #1]  WARN -- : Skipping public/lib/modules/aurora.js/opus.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.493595 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.499284 #1]  WARN -- : Skipping public/lib/modules/aurora.js/ogg.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.499322 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:05.501319 #1]  WARN -- : Skipping public/lib/modules/aurora.js/vorbis.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:05.501351 #1]  WARN -- : Response status: 413
W, [2024-04-09T23:12:08.268464 #1]  WARN -- : Skipping public/lib/modules/aurora.js/libopus.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:08.268509 #1]  WARN -- : Response status: 422
6
duplication
View output
12
Parser process id: 12
codeclimate-parser socket not present
waiting 1s...
W, [2024-04-09T23:12:31.724084 #1]  WARN -- : Skipping ./public/lib/modules/prettyphoto/js/jquery.prettyPhoto.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:31.823633 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:32.861860 #1]  WARN -- : Skipping ./public/lib/modules/jplayer/jquery.jplayer.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:32.961848 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:33.425683 #1]  WARN -- : Skipping ./public/lib/modules/jplayer/jplayer.playlist.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:33.425768 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:33.427080 #1]  WARN -- : Skipping ./public/lib/modules/UberViz/minivents.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:33.427108 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:33.717687 #1]  WARN -- : Skipping ./public/lib/modules/UberViz/stats.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:33.717795 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:33.722786 #1]  WARN -- : Skipping ./public/lib/modules/UberViz/dat.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:33.723032 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:33.741694 #1]  WARN -- : Skipping ./public/lib/modules/UberViz/three.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:33.741990 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:33.891628 #1]  WARN -- : Skipping ./public/lib/modules/rhinoslider/js/rhinoslider-1.05.min.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:33.891671 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:34.098020 #1]  WARN -- : Skipping ./public/lib/modules/aurora.js/opus.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:34.198000 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:34.254528 #1]  WARN -- : Skipping ./public/lib/modules/aurora.js/vorbis.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:34.254568 #1]  WARN -- : Response status: 413
W, [2024-04-09T23:12:34.255890 #1]  WARN -- : Skipping ./public/lib/modules/aurora.js/ogg.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:34.255933 #1]  WARN -- : Response status: 422
W, [2024-04-09T23:12:40.292019 #1]  WARN -- : Skipping ./public/lib/modules/aurora.js/libopus.js due to CC::Parser::Client::HTTPError
W, [2024-04-09T23:12:40.292058 #1]  WARN -- : Response status: 422
7
fixme
fixme engine documentation
8
phan
phan engine documentation
9
phpcodesniffer
phpcodesniffer engine documentation
View output
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php on line 1438
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php on line 1438
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php on line 1438
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 115
PHP Notice:  Undefined index: scope_closer in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 116
PHP Notice:  Undefined index:  in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 117
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 196
PHP Notice:  Undefined index: scope_opener in /usr/src/app/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php on line 205
10
phpmd
phpmd engine documentation
11
sonar-php
sonar-php engine documentation
View output
INFO: Java 1.8.0_322 Amazon.com Inc. (64-bit)
INFO: Linux 4.4.0-1128-aws amd64
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/src/app/build/libs/sonarlint-core-2.17.0.899.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/src/app/build/libs/sonarlint-cli-2.1.0.566.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
INFO: Index files
INFO: Invalid character encountered in file '/code/public/upnp/images/icon120.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/upnp/images/icon48.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/upnp/images/icon48.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/upnp/images/icon120.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/upnp/images/upnp.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/upnp/images/icon32.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/upnp/images/icon32.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/favicon.ico' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/templates/jplayer.midnight.black.seeking.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/templates/fonts/dejavusanscondensed.ttf' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/templates/fonts/dejavusanscondensed.eot' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/templates/fonts/dejavusanscondensed.woff' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_add.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_stop.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_next.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_admin.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_play.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_playlist_add.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_home.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_random.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_play_add.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_edit.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_delete.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_add_user.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_disable.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_enable.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_plugin.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_feed.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_logout.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_all.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_view.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_prev.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/icons/icon_pause.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/missing.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/videoplay.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ajax-loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/blankmovie.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/blankalbum.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ajax-loader2-light.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ratings/star_rating.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ratings/star_rating.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ajax-loader2.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/blank-pixel.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ajax-loader-light.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ampache-light.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/themes/reborn/images/ampache-dark.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/sprite_next.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/sprite_y.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/sprite_prev.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/default_thumb.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/default/sprite_x.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_rounded/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_rounded/sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_square/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_square/btnNext.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/light_square/sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_square/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_square/btnNext.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/dark_square/sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/btnNext.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/1.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/high.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/wide.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/5.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/2.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/3.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/6.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/4.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/fullscreen/huge.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/t_1.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/flash-logo.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/t_4.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/t_2.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/t_5.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/t_3.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/prettyphoto/images/thumbnails/quicktime-logo.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jplayer/jquery.jplayer.swf' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/UberViz/loader.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/rhinoslider/img/slider/05.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/rhinoslider/img/slider/04.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/rhinoslider/img/slider/02.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/rhinoslider/img/slider/03.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/rhinoslider/img/slider/01.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/rhinoslider/img/rhinoslider-sprite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-jplayer-midnight-black/jplayer.midnight.black.interface.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-jplayer-midnight-black/jplayer.midnight.black.seeking.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-jplayer-midnight-black/jplayer.midnight.black.video.play.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-jplayer-midnight-black/jplayer.midnight.black.playlist.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-jplayer-midnight-black/jplayer.midnight.black.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/animated-overlay.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-icons_222222_256x240.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-icons_454545_256x240.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_glass_65_ffffff_1x400.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_highlight-soft_75_cccccc_1x100.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_flat_0_aaaaaa_40x100.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_flat_75_ffffff_40x100.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_glass_75_e6e6e6_1x400.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/animated-overlay.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-icons_cd0a0a_256x240.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_glass_95_fef1ec_1x400.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_glass_75_dadada_1x400.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-bg_glass_55_fbf9ee_1x400.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-icons_888888_256x240.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/lib/modules/jquery-ui-ampache/images/ui-icons_2e83ff_256x240.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_play_next.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/fileupload-border.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-upload.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_share_twitter.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_stop.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_server_lightning.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_lock.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_fullscreen.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_multilines.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/background.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_share.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_duckduckgo.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_link.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_flag.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_visualizer.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_next.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_admin.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-artist.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-album.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/blankuser.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_tick.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_play.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_playlist_add.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_sort.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_wikipedia.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_musicbrainz.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_stop_hover.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_wand.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_share_facebook.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_volumeup_light.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_home.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_replaygain_dark.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/background.light.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-radio.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_batch_download.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/blankalbum.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_preferences.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_download.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-logout.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_run.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/fileupload-icons.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_share_googleplus.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_cancel.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-playlist.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_info.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add2.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_volumeup.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_flag_off.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_random.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_play_add.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_replaygain.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ratings/star_rating.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ratings/x.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ratings/x_off.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_edit2.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_prev_hover.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_volumemute.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-tagcloud.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_edit.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_playlist_add_all.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_refresh.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_delete.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_money.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add_user.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ampache-reborn-dark.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_broadcast.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-home.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_disable.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_lastfm.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_image.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_play_hover.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_enable.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_album.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_clean.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_plugin.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_flow.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add_wanted.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/blank-pixel.gif' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_file_refresh.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_volumedn.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/top_bg.jpg' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_save.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-favorite.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_drag.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/topmenu-flag.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_next_hover.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_play_preview.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ampache.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_statistics.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_feed.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_pause_hover.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_ampache.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add12.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_logout.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_minimize.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_equalizer.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add_key.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_all.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_add_tag.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_mail.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_google.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_view.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_upload.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_microphone.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_comment.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ampache-light.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_prev.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/close.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ampache-dark.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_pause.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_cog.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_play_add_preview.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_world_link.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/ampache-reborn-light.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/public/images/icon_playlist_loop.png' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/he_IL/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/fr_BE/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/ru_RU/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/es_ES/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/ar_SA/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/nb_NO/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/uk_UA/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/sv_SE/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/de_CH/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/hi_IN/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/ro_RO/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/nl_NL/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/id_ID/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/ko_KR/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/en_AU/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/zh_CN/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/en_GB/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/ja_JP/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/cs_CZ/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/zh_TW/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/tr_TR/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/fa_IR/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/hu_HU/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/fi_FI/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/zh_SG/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/gl_ES/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/de_DE/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/fr_FR/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/pt_BR/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/da_DK/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/zh-Hant/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/pl_PL/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/el_GR/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/vi_VN/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/ca_ES/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/locale/it_IT/LC_MESSAGES/messages.mo' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/resources/fonts/FreeMono.ttf' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: Invalid character encountered in file '/code/docs/examples/ampache_cron.xml' at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'.
INFO: 2390 files indexed
INFO: 1914 source files to be analyzed
ERROR: Unable to parse file: /code/src/Module/Util/RequestParser.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Util;
27: 
28: use Ampache\Module\System\LegacyLogger;
29: use Psr\Log\LoggerInterface;
30: 
31: /**
32:  * Provides utility methods related to frontend request parsing
33:  */
34: final class RequestParser implements RequestParserInterface
35: {
36:     private LoggerInterface $logger;
                ^
37: 
38:     public function __construct(
39:         LoggerInterface $logger
40:     ) {
41:         $this->logger = $logger;
42:     }
43: 
44:     /**
45:      * Return a $_REQUEST variable instead of calling directly
46:      */

ERROR: Unable to parse file: /code/src/Module/Util/FileSystem/FileNameConverter.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Util\FileSystem;
27: 
28: use Ahc\Cli\IO\Interactor;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Repository\Model\Catalog;
31: use Ampache\Module\System\Core;
32: use Ampache\Module\System\Dba;
33: 
34: final class FileNameConverter implements FileNameConverterInterface
35: {
36:     private ConfigContainerInterface $configContainer;
                ^
37: 
38:     public function __construct(
39:         ConfigContainerInterface $configContainer
40:     ) {
41:         $this->configContainer = $configContainer;
42:     }
43: 
44:     public function convert(
45:         Interactor $interactor,
46:         string $source_encoding,

ERROR: Unable to parse file: /code/src/Module/Util/Ui.php
ERROR: Parse error at line 50 column 13:

40: 
41: /**
42:  * A collection of methods related to the user interface
43:  */
44: class Ui implements UiInterface
45: {
46:     private static $_ticker;
47:     private static $_icon_cache;
48:     private static $_image_cache;
49: 
50:     private ConfigContainerInterface $configContainer;
                ^
51: 
52:     public function __construct(
53:         ConfigContainerInterface $configContainer
54:     ) {
55:         $this->configContainer = $configContainer;
56:     }
57: 
58:     /**
59:      * find_template
60:      *

ERROR: Unable to parse file: /code/src/Module/Util/VaInfo.php
ERROR: Parse error at line 136 column 13:

126:     protected $_raw           = array();
127:     protected $_getID3        = null;
128:     protected $_forcedSize    = 0;
129:     protected $_file_encoding = '';
130:     protected $_file_pattern  = '';
131:     protected $_dir_pattern   = '';
132: 
133:     private $_broken = false;
134:     private $_pathinfo;
135: 
136:     private UserRepositoryInterface $userRepository;
                 ^
137: 
138:     private ConfigContainerInterface $configContainer;
139: 
140:     private LoggerInterface $logger;
141: 
142:     /**
143:      * Constructor
144:      *
145:      * This function just sets up the class, it doesn't pull the information.
146:      *

ERROR: Unable to parse file: /code/src/Module/Util/AjaxUriRetriever.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\Util;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: 
30: final class AjaxUriRetriever implements AjaxUriRetrieverInterface
31: {
32:     private ConfigContainerInterface $configContainer;
                ^
33: 
34:     public function __construct(
35:         ConfigContainerInterface $configContainer
36:     ) {
37:         $this->configContainer = $configContainer;
38:     }
39: 
40:     public function getAjaxUri(): string
41:     {
42:         return sprintf(

ERROR: Unable to parse file: /code/src/Module/Util/UtilityFactory.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Repository\UserRepositoryInterface;
30: use Curl\Curl;
31: use Psr\Log\LoggerInterface;
32: 
33: /**
34:  * Factory to create utility classes like Mailer
35:  */
36: final class UtilityFactory implements UtilityFactoryInterface
37: {
38:     private UserRepositoryInterface $userRepository;
                ^
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     private LoggerInterface $logger;
43: 
44:     public function __construct(
45:         UserRepositoryInterface $userRepository,
46:         ConfigContainerInterface $configContainer,
47:         LoggerInterface $logger
48:     ) {

ERROR: Unable to parse file: /code/src/Module/Util/WebFetcher/WebFetcher.php
ERROR: Parse error at line 44 column 13:

34: use Psr\Log\LoggerInterface;
35: 
36: /**
37:  * Provides functionality for downloading web-content
38:  */
39: final class WebFetcher implements WebFetcherInterface
40: {
41:     /** @var int Curl operation timeout in seconds */
42:     private const TIMEOUT = 300;
43: 
44:     private ConfigContainerInterface $config;
                ^
45: 
46:     private UtilityFactoryInterface $utilityFactory;
47: 
48:     private LoggerInterface $logger;
49: 
50:     public function __construct(
51:         ConfigContainerInterface $config,
52:         UtilityFactoryInterface $utilityFactory,
53:         LoggerInterface $logger
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Util/Slideshow.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Util;
27: 
28: use Ampache\Module\Statistics\Stats;
29: use Ampache\Repository\Model\ModelFactoryInterface;
30: use Ampache\Repository\Model\Plugin;
31: use Ampache\Module\System\Core;
32: use Ampache\Repository\Model\Song;
33: 
34: final class Slideshow implements SlideshowInterface
35: {
36:     private ModelFactoryInterface $modelFactory;
                ^
37: 
38:     public function __construct(
39:         ModelFactoryInterface $modelFactory
40:     ) {
41:         $this->modelFactory = $modelFactory;
42:     }
43: 
44:     public function getCurrentSlideshow(): array
45:     {
46:         $user_id = Core::get_global('user')->id ?? -1;

ERROR: Unable to parse file: /code/src/Module/Util/ZipHandler.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\System\LegacyLogger;
31: use Psr\Log\LoggerInterface;
32: use ZipStream\Exception;
33: use ZipStream\ZipStream;
34: 
35: final class ZipHandler implements ZipHandlerInterface
36: {
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private LoggerInterface $logger;
40: 
41:     public function __construct(
42:         ConfigContainerInterface $configContainer,
43:         LoggerInterface $logger
44:     ) {
45:         $this->configContainer = $configContainer;
46:         $this->logger          = $logger;
47:     }

ERROR: Unable to parse file: /code/src/Module/Util/Rss/AmpacheRss.php
ERROR: Parse error at line 51 column 13:

41: use Ampache\Repository\Model\ModelFactoryInterface;
42: use Ampache\Repository\Model\Podcast;
43: use Ampache\Repository\Model\Song;
44: use Ampache\Repository\Model\User;
45: use Ampache\Repository\Model\Video;
46: use Ampache\Repository\ShoutRepositoryInterface;
47: use Ampache\Repository\UserRepositoryInterface;
48: 
49: final class AmpacheRss implements AmpacheRssInterface
50: {
51:     private UserRepositoryInterface $userRepository;
                ^
52: 
53:     private ShoutRepositoryInterface $shoutRepository;
54: 
55:     private ShoutObjectLoaderInterface $shoutObjectLoader;
56: 
57:     private RssPodcastBuilderInterface $rssPodcastBuilder;
58: 
59:     private ModelFactoryInterface $modelFactory;
60: 
61:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Util/Rss/RssPodcastBuilder.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\User;
31: use PhpTal\PHPTAL;
32: 
33: /**
34:  * Builds ths rss-podcast xml structure
35:  *
36:  * Uses phptal and a podcast-template to build the podcast xml
37:  */
38: final class RssPodcastBuilder implements RssPodcastBuilderInterface
39: {
40:     private TalFactoryInterface $talFactory;
                ^
41: 
42:     public function __construct(
43:         TalFactoryInterface $talFactory
44:     ) {
45:         $this->talFactory   = $talFactory;
46:     }
47: 
48:     /**
49:      * Returns the rss-podcast xml
50:      */

ERROR: Unable to parse file: /code/src/Module/Util/Rss/Surrogate/PlayableItemRssItemAdapter.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Repository\Model\Podcast_Episode;
33: use Ampache\Repository\Model\Song;
34: use Ampache\Repository\Model\User;
35: use Generator;
36: 
37: /**
38:  * Abstraction layer for creating rss/podcasts from playable-items
39:  */
40: final class PlayableItemRssItemAdapter implements RssItemInterface
41: {
42:     private ModelFactoryInterface $modelFactory;
                ^
43: 
44:     private playable_item $playable;
45: 
46:     private User $user;
47: 
48:     public function __construct(
49:         ModelFactoryInterface $modelFactory,
50:         playable_item $playable,
51:         User $user
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Util/Captcha/easy_captcha.php
ERROR: Parse error at line 88 column 12:

78:     public $ajax_tries;
79:     public $created;
80:     public $expires;
81:     public $failures;
82:     public $grant;
83:     public $id;
84:     public $image;
85:     public $maxpasses;
86:     public $passed;
87:     /** @var list<string> */
88:     public array $prev = [];
               ^
89:     public $saved;
90:     public $sent;
91:     public $shortcut;
92:     public $text;
93:     public $tries;
94: 
95:     #-- init data
96:     /**
97:      * easy_captcha constructor.
98:      * @param $captcha_id

ERROR: Unable to parse file: /code/src/Module/Util/Mailer.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\AmpConfig;
29: use Ampache\Module\System\Dba;
30: use PHPMailer\PHPMailer\Exception;
31: use PHPMailer\PHPMailer\PHPMailer;
32: 
33: /**
34:  * This class handles the Mail
35:  */
36: final class Mailer implements MailerInterface
37: {
38:     private ?string $message = null;
                ^
39: 
40:     private ?string $subject = null;
41: 
42:     private ?string $recipient = null;
43: 
44:     private ?string $recipient_name = null;
45: 
46:     private ?string $sender = null;
47: 
48:     private ?string $sender_name = null;

ERROR: Unable to parse file: /code/src/Module/LastFm/LastFmQuery.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\System\Core;
30: use WpOrg\Requests\Requests;
31: use SimpleXMLElement;
32: 
33: final class LastFmQuery implements LastFmQueryInterface
34: {
35:     private const API_URL = 'http://ws.audioscrobbler.com/2.0/?method=';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     public function __construct(
40:         ConfigContainerInterface $configContainer
41:     ) {
42:         $this->configContainer = $configContainer;
43:     }
44: 
45:     /**
46:      * @throws Exception\LastFmQueryFailedException
47:      */

ERROR: Unable to parse file: /code/src/Module/Metadata/MetadataManager.php
ERROR: Parse error at line 45 column 13:

35: 
36: /**
37:  * Manages the access to metadata related data
38:  */
39: final class MetadataManager implements MetadataManagerInterface
40: {
41:     /**
42:      * Cache variable for disabled metadata field names
43:      * @var null|list<string>
44:      */
45:     private ?array $disabledMetadataFields = null;
                ^
46: 
47:     private MetadataRepositoryInterface $metadataRepository;
48: 
49:     private MetadataFieldRepositoryInterface $metadataFieldRepository;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     public function __construct(
54:         MetadataRepositoryInterface $metadataRepository,
55:         MetadataFieldRepositoryInterface $metadataFieldRepository,

ERROR: Unable to parse file: /code/src/Module/Label/Deletion/LabelDeleter.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Art\ArtCleanupInterface;
29: use Ampache\Repository\Model\Label;
30: use Ampache\Repository\Model\Rating;
31: use Ampache\Repository\Model\Userflag;
32: use Ampache\Repository\LabelRepositoryInterface;
33: use Ampache\Repository\ShoutRepositoryInterface;
34: use Ampache\Repository\UserActivityRepositoryInterface;
35: 
36: final class LabelDeleter implements LabelDeleterInterface
37: {
38:     private ShoutRepositoryInterface $shoutRepository;
                ^
39: 
40:     private LabelRepositoryInterface $labelRepository;
41: 
42:     private UserActivityRepositoryInterface $useractivityRepository;
43: 
44:     private ArtCleanupInterface $artCleanup;
45: 
46:     public function __construct(
47:         ShoutRepositoryInterface $shoutRepository,
48:         LabelRepositoryInterface $labelRepository,

ERROR: Unable to parse file: /code/src/Module/Label/LabelListUpdater.php
ERROR: Parse error at line 31 column 13:

21:  *
22:  */
23: 
24: namespace Ampache\Module\Label;
25: 
26: use Ampache\Repository\LabelRepositoryInterface;
27: use DateTime;
28: 
29: final class LabelListUpdater implements LabelListUpdaterInterface
30: {
31:     private LabelRepositoryInterface $labelRepository;
                ^
32: 
33:     public function __construct(
34:         LabelRepositoryInterface $labelRepository
35:     ) {
36:         $this->labelRepository = $labelRepository;
37:     }
38: 
39:     /**
40:      * Update the labels list based on a comma separated list (ex. label1,label2,label3,..)
41:      */

ERROR: Unable to parse file: /code/src/Module/Wanted/MissingArtistFromMusicBrainzRetriever.php
ERROR: Parse error at line 44 column 13:

34:  * Uses MusicBrainz to retrieve missing artist data
35:  *
36:  * @phpstan-type MissingArtistResult array{
37:  *  mbid: string,
38:  *  name: string,
39:  *  link: string
40:  * }
41:  */
42: final class MissingArtistFromMusicBrainzRetriever implements MissingArtistRetrieverInterface
43: {
44:     private MusicBrainz $musicBrainz;
                ^
45: 
46:     private CacheInterface $cache;
47: 
48:     private LoggerInterface $logger;
49: 
50:     public function __construct(
51:         MusicBrainz $musicBrainz,
52:         CacheInterface $cache,
53:         LoggerInterface $logger
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Wanted/MissingArtistFinder.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Wanted;
27: 
28: use MusicBrainz\Exception;
29: use MusicBrainz\Filters\ArtistFilter;
30: use MusicBrainz\MusicBrainz;
31: 
32: final class MissingArtistFinder implements MissingArtistFinderInterface
33: {
34:     private MusicBrainz $musicBrainz;
                ^
35: 
36:     public function __construct(
37:         MusicBrainz $musicBrainz
38:     ) {
39:         $this->musicBrainz = $musicBrainz;
40:     }
41: 
42:     /**
43:      * @return array<array<string, string>>
44:      *

ERROR: Unable to parse file: /code/src/Module/Wanted/WantedManager.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\System\Dba;
32: use Ampache\Repository\Model\database_object;
33: use Ampache\Repository\Model\Plugin;
34: use Ampache\Repository\Model\User;
35: use Ampache\Repository\Model\Wanted;
36: use Ampache\Repository\WantedRepositoryInterface;
37: use MusicBrainz\MusicBrainz;
38: 
39: final class WantedManager implements WantedManagerInterface
40: {
41:     private WantedRepositoryInterface $wantedRepository;
                ^
42: 
43:     private MusicBrainz $musicBrainz;
44: 
45:     public function __construct(
46:         WantedRepositoryInterface $wantedRepository,
47:         MusicBrainz $musicBrainz
48:     ) {
49:         $this->wantedRepository = $wantedRepository;
50:         $this->musicBrainz      = $musicBrainz;
51:     }

ERROR: Unable to parse file: /code/src/Module/Database/DatabaseCharsetUpdater.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Database;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\System\Dba;
30: 
31: final class DatabaseCharsetUpdater implements DatabaseCharsetUpdaterInterface
32: {
33:     private ConfigContainerInterface $configContainer;
                ^
34: 
35:     public function __construct(ConfigContainerInterface $configContainer)
36:     {
37:         $this->configContainer = $configContainer;
38:     }
39: 
40:     public function update(): void
41:     {
42:         $database           = $this->configContainer->get('database_name');
43:         $translated_charset = Dba::translate_to_mysqlcharset($this->configContainer->get('site_charset'));

ERROR: Unable to parse file: /code/src/Module/Playlist/PlaylistLoader.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Playlist;
27: 
28: use Ampache\Repository\Model\ModelFactoryInterface;
29: use Ampache\Repository\Model\Playlist;
30: 
31: final class PlaylistLoader implements PlaylistLoaderInterface
32: {
33:     private ModelFactoryInterface $modelFactory;
                ^
34: 
35:     public function __construct(
36:         ModelFactoryInterface $modelFactory
37:     ) {
38:         $this->modelFactory = $modelFactory;
39:     }
40: 
41:     public function loadByUserId(int $userId): array
42:     {
43:         $playlists = Playlist::get_playlists($userId, '', true, false);

ERROR: Unable to parse file: /code/src/Module/Catalog/Export/ItunesExporter.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Catalog\Export;
27: 
28: use Ampache\Repository\Model\Catalog;
29: use Ampache\Repository\Model\Song;
30: use Ampache\Repository\SongRepositoryInterface;
31: 
32: final class ItunesExporter implements CatalogExporterInterface
33: {
34:     private SongRepositoryInterface $songRepository;
                ^
35: 
36:     public function __construct(
37:         SongRepositoryInterface $songRepository
38:     ) {
39:         $this->songRepository = $songRepository;
40:     }
41: 
42:     /**
43:      * Exports all songs
44:      *

ERROR: Unable to parse file: /code/src/Module/Catalog/Export/CatalogExportFactory.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Catalog\Export;
27: 
28: use Ampache\Repository\Model\ModelFactoryInterface;
29: use Ampache\Repository\SongRepositoryInterface;
30: 
31: /**
32:  * Builds exporter classes
33:  */
34: final class CatalogExportFactory implements CatalogExportFactoryInterface
35: {
36:     private SongRepositoryInterface $songRepository;
                ^
37: 
38:     private ModelFactoryInterface $modelFactory;
39: 
40:     public function __construct(
41:         SongRepositoryInterface $songRepository,
42:         ModelFactoryInterface $modelFactory
43:     ) {
44:         $this->songRepository = $songRepository;
45:         $this->modelFactory   = $modelFactory;
46:     }

ERROR: Unable to parse file: /code/src/Module/Catalog/Export/CsvExporter.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Catalog\Export;
27: 
28: use Ampache\Repository\Model\Catalog;
29: use Ampache\Repository\Model\ModelFactoryInterface;
30: use Ampache\Repository\SongRepositoryInterface;
31: 
32: final class CsvExporter implements CatalogExporterInterface
33: {
34:     private SongRepositoryInterface $songRepository;
                ^
35: 
36:     private string $filePointer;
37:     private ModelFactoryInterface $modelFactory;
38: 
39:     public function __construct(
40:         SongRepositoryInterface $songRepository,
41:         ModelFactoryInterface $modelFactory,
42:         string $filePointer = 'php://output'
43:     ) {
44:         $this->songRepository = $songRepository;

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_beetsremote.php
ERROR: Parse error at line 44 column 15:

34: /**
35:  * This class handles all actual work in regards to remote Beets catalogs.
36:  */
37: class Catalog_beetsremote extends Catalog
38: {
39:     protected $version     = '000001';
40:     protected $type        = 'beetsremote';
41:     protected $description = 'Beets Remote Catalog';
42:     protected $listCommand = 'item/query';
43: 
44:     protected string $uri = '';
                  ^
45: 
46:     public int $catalog_id;
47: 
48:     /**
49:      * get_create_help
50:      * This returns hints on catalog creation
51:      */
52:     public function get_create_help(): string
53:     {
54:         return "<ul><li>Install Beets web plugin: http://beets.readthedocs.org/en/latest/plugins/web.html</li><li>Start Beets web server</li><li>Specify URI including port (like http://localhost:8337). It will be shown when starting Beets web in console.</li></ul>";

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_beets.php
ERROR: Parse error at line 46 column 15:

36: /**
37:  * This class handles all actual work in regards to local Beets catalogs.
38:  */
39: class Catalog_beets extends Catalog
40: {
41:     protected $version     = '000001';
42:     protected $type        = 'beets';
43:     protected $description = 'Beets Catalog';
44:     protected $listCommand = 'ls';
45: 
46:     protected string $beetsdb = '';
                  ^
47: 
48:     public int $catalog_id;
49: 
50:     /**
51:      * get_create_help
52:      * This returns hints on catalog creation
53:      */
54:     public function get_create_help(): string
55:     {
56:         return "<ul><li>Fetch songs from beets command over CLI.</li><li>You have to ensure that the beets command ( beet ), the music directories and the Database file are accessible by the Webserver.</li></ul>";

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_subsonic.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\System\AmpError;
34: use Ampache\Module\System\Dba;
35: use Ampache\Module\Util\Ui;
36: use Exception;
37: 
38: /**
39:  * This class handles all actual work in regards to remote Subsonic catalogs.
40:  */
41: class Catalog_subsonic extends Catalog
42: {
43:     private string $version     = '000002';
                ^
44:     private string $type        = 'subsonic';
45:     private string $description = 'Subsonic Remote Catalog';
46: 
47:     private int $catalog_id;
48: 
49:     public string $uri = '';
50:     public string $username;
51:     public string $password;
52: 
53:     /**

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_dropbox.php
ERROR: Parse error at line 50 column 13:

40: use Kunnu\Dropbox\Dropbox;
41: use Kunnu\Dropbox\DropboxFile;
42: use Kunnu\Dropbox\Exceptions\DropboxClientException;
43: use ReflectionException;
44: 
45: /**
46:  * This class handles all actual work in regards to remote Dropbox catalogs.
47:  */
48: class Catalog_dropbox extends Catalog
49: {
50:     private string $version     = '000002';
                ^
51:     private string $type        = 'dropbox';
52:     private string $description = 'Dropbox Remote Catalog';
53:     private int $count          = 0;
54: 
55:     private int $catalog_id;
56:     private string $apikey = '';
57:     private string $secret;
58:     private string $authcode;
59:     private string $authtoken;
60: 

ERROR: Unable to parse file: /code/src/Module/Catalog/GarbageCollector/CatalogGarbageCollector.php
ERROR: Parse error at line 56 column 13:

46: use Ampache\Repository\UserActivityRepositoryInterface;
47: use Ampache\Repository\UserRepositoryInterface;
48: use Ampache\Repository\WantedRepositoryInterface;
49: 
50: /**
51:  * This is a wrapper for all of the different database cleaning
52:  * functions, it runs them in an order that resembles correctness.
53:  */
54: final class CatalogGarbageCollector implements CatalogGarbageCollectorInterface
55: {
56:     private AlbumRepositoryInterface $albumRepository;
                ^
57: 
58:     private BookmarkRepositoryInterface $bookmarkRepository;
59: 
60:     private ShoutRepositoryInterface $shoutRepository;
61: 
62:     private UserActivityRepositoryInterface $useractivityRepository;
63: 
64:     private UserRepositoryInterface $userRepository;
65: 
66:     private MetadataManagerInterface $metadataManager;

ERROR: Unable to parse file: /code/src/Module/Catalog/Update/UpdateCatalog.php
ERROR: Parse error at line 38 column 13:

28: use Ahc\Cli\IO\Interactor;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Repository\Model\Album;
31: use Ampache\Repository\Model\Catalog;
32: use Ampache\Module\Catalog\GarbageCollector\CatalogGarbageCollectorInterface;
33: use Ampache\Module\System\Dba;
34: use PDOStatement;
35: 
36: final class UpdateCatalog extends AbstractCatalogUpdater implements UpdateCatalogInterface
37: {
38:     private CatalogGarbageCollectorInterface $catalogGarbageCollector;
                ^
39: 
40:     public function __construct(
41:         CatalogGarbageCollectorInterface $catalogGarbageCollector
42:     ) {
43:         $this->catalogGarbageCollector = $catalogGarbageCollector;
44:     }
45: 
46:     public function update(
47:         Interactor $interactor,
48:         bool $deactivateMemoryLimit,

ERROR: Unable to parse file: /code/src/Module/Catalog/Update/AddCatalog.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Module\Catalog\Update;
27: 
28: use Ahc\Cli\IO\Interactor;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Config\ConfigurationKeyEnum;
31: use Ampache\Repository\Model\Catalog;
32: 
33: final class AddCatalog extends AbstractCatalogUpdater implements AddCatalogInterface
34: {
35:     private ConfigContainerInterface $configContainer;
                ^
36: 
37:     public function __construct(
38:         ConfigContainerInterface $configContainer
39:     ) {
40:         $this->configContainer = $configContainer;
41:     }
42:     public function add(
43:         Interactor $interactor,
44:         string $catalogName,
45:         string $catalogPath,

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_Seafile.php
ERROR: Parse error at line 48 column 20:

38: use Ampache\Module\Util\Ui;
39: use Ampache\Module\Util\VaInfo;
40: use Exception;
41: use ReflectionException;
42: 
43: /**
44:  * This class handles all actual work in regards to remote Seafile catalogs.
45:  */
46: class Catalog_Seafile extends Catalog
47: {
48:     private static string $version     = '000001';
                       ^
49:     private static string $type        = 'seafile';
50:     private static string $description = 'Seafile Remote Catalog';
51:     private static string $table_name  = 'catalog_seafile';
52: 
53:     /** @var SeafileAdapter seafile */
54:     private $seafile = null;
55:     private int $catalog_id;
56:     private int $count = 0;
57: 
58:     private $api_key;

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_local.php
ERROR: Parse error at line 55 column 13:

45: use Ampache\Module\Util\Recommendation;
46: use Ampache\Module\Util\Ui;
47: use Ampache\Module\Util\VaInfo;
48: use Exception;
49: 
50: /**
51:  * This class handles all actual work in regards to local catalogs.
52:  */
53: class Catalog_local extends Catalog
54: {
55:     private string $version     = '000001';
                ^
56:     private string $type        = 'local';
57:     private string $description = 'Local Catalog';
58: 
59:     private int $catalog_id;
60:     private int $count              = 0;
61:     private array $songs_to_gather  = array();
62:     private array $videos_to_gather = array();
63: 
64:     public string $path = '';
65: 

ERROR: Unable to parse file: /code/src/Module/Catalog/Catalog_remote.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\System\Dba;
35: use Ampache\Module\Util\Ui;
36: use AmpacheApi;
37: use Exception;
38: 
39: /**
40:  * This class handles all actual work in regards to remote catalogs.
41:  */
42: class Catalog_remote extends Catalog
43: {
44:     private string $version     = '000001';
                ^
45:     private string $type        = 'remote';
46:     private string $description = 'Ampache Remote Catalog';
47: 
48:     private int $catalog_id;
49: 
50:     public string $uri = '';
51:     public string $username;
52:     public string $password;
53: 
54:     /**

ERROR: Unable to parse file: /code/src/Module/Cli/ExportAlbumArtCommand.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\Model\Catalog;
30: use Ampache\Module\Album\Export\AlbumArtExporterInterface;
31: use Ampache\Module\Album\Export\Exception\AlbumArtExportException;
32: use Ampache\Module\Album\Export\Writer\MetadataWriterTypeEnum;
33: use Ampache\Module\System\LegacyLogger;
34: use Psr\Container\ContainerInterface;
35: use Psr\Log\LoggerInterface;
36: 
37: final class ExportAlbumArtCommand extends Command
38: {
39:     private LoggerInterface $logger;
                ^
40: 
41:     private AlbumArtExporterInterface $albumArtExporter;
42: 
43:     private ContainerInterface $dic;
44: 
45:     public function __construct(
46:         LoggerInterface $logger,
47:         AlbumArtExporterInterface $albumArtExporter,
48:         ContainerInterface $dic
49:     ) {

ERROR: Unable to parse file: /code/src/Module/Cli/PrintTagsCommand.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\System\Dba;
30: use Ampache\Module\Util\UtilityFactoryInterface;
31: use Ampache\Module\Util\VaInfo;
32: use Ampache\Repository\Model\Catalog;
33: use Exception;
34: 
35: final class PrintTagsCommand extends Command
36: {
37:     private UtilityFactoryInterface $utilityFactory;
                ^
38: 
39:     public function __construct(
40:         UtilityFactoryInterface $utilityFactory
41:     ) {
42:         parent::__construct('print:tags', T_('Print file tags'));
43: 
44:         $this->utilityFactory = $utilityFactory;
45: 
46:         $this
47:             ->argument('<filename>', T_('File Path'))

ERROR: Unable to parse file: /code/src/Module/Cli/ComputeCacheCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Cache\ObjectCacheInterface;
30: 
31: final class ComputeCacheCommand extends Command
32: {
33:     private ObjectCacheInterface $objectCache;
                ^
34: 
35:     public function __construct(
36:         ObjectCacheInterface $objectCache
37:     ) {
38:         parent::__construct('run:computeCache', T_('Update the object cache tables'));
39: 
40:         $this->objectCache = $objectCache;
41:     }
42: 
43:     public function execute(): void

ERROR: Unable to parse file: /code/src/Module/Cli/UpdateDbCommand.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Module\Database\DatabaseCharsetUpdaterInterface;
31: use Ampache\Module\System\Dba;
32: 
33: final class UpdateDbCommand extends Command
34: {
35:     private ConfigContainerInterface $configContainer;
                ^
36: 
37:     private DatabaseCharsetUpdaterInterface $databaseCharsetUpdater;
38: 
39:     public function __construct(
40:         ConfigContainerInterface $configContainer,
41:         DatabaseCharsetUpdaterInterface $databaseCharsetUpdater
42:     ) {
43:         parent::__construct('run:updateDb', T_('Update the database collation and charset'));
44: 
45:         $this->configContainer        = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Cli/AddCatalogCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Catalog\Update\AddCatalogInterface;
30: 
31: final class AddCatalogCommand extends Command
32: {
33:     private AddCatalogInterface $addCatalog;
                ^
34: 
35:     public function __construct(
36:         AddCatalogInterface $addCatalog
37:     ) {
38:         parent::__construct('run:addCatalog', T_('Create a local media catalog'));
39: 
40:         $this->addCatalog = $addCatalog;
41: 
42:         $this
43:             ->argument('[catalogName]', T_('Catalog name'))

ERROR: Unable to parse file: /code/src/Module/Cli/HtaccessCommand.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Module\System\AmpError;
31: use Ampache\Module\System\InstallationHelperInterface;
32: 
33: final class HtaccessCommand extends Command
34: {
35:     private ConfigContainerInterface $configContainer;
                ^
36: 
37:     private InstallationHelperInterface $installationHelper;
38: 
39:     public function __construct(
40:         ConfigContainerInterface $configContainer,
41:         InstallationHelperInterface $installationHelper
42:     ) {
43:         parent::__construct('htaccess', T_('Create .htaccess files'));
44: 
45:         $this->configContainer = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Cli/BroadcastCommand.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Module\Api\Upnp_Api;
31: 
32: final class BroadcastCommand extends Command
33: {
34:     private ConfigContainerInterface $configContainer;
                ^
35: 
36:     public function __construct(
37:         ConfigContainerInterface $configContainer
38:     ) {
39:         parent::__construct('run:broadcast', T_('Run a UPnP broadcast'));
40: 
41:         $this->configContainer = $configContainer;
42:     }
43: 
44:     public function execute(): void

ERROR: Unable to parse file: /code/src/Module/Cli/UpdateCatalogCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Catalog\Update\UpdateCatalogInterface;
30: 
31: final class UpdateCatalogCommand extends Command
32: {
33:     private UpdateCatalogInterface $updateCatalog;
                ^
34: 
35:     public function __construct(
36:         UpdateCatalogInterface $updateCatalog
37:     ) {
38:         parent::__construct('run:updateCatalog', T_('Perform catalog actions for all files of a catalog. If no options are given, the defaults actions -ceag are assumed'));
39: 
40:         $this->updateCatalog = $updateCatalog;
41: 
42:         $this
43:             ->option('-c|--cleanup', T_('Removes missing files from the database'), 'boolval', false)

ERROR: Unable to parse file: /code/src/Module/Cli/ShowVersionCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: 
31: final class ShowVersionCommand extends Command
32: {
33:     private ConfigContainerInterface $configContainer;
                ^
34: 
35:     public function __construct(
36:         ConfigContainerInterface $configContainer
37:     ) {
38:         parent::__construct('show:version', T_('Version'));
39: 
40:         $this->configContainer = $configContainer;
41: 
42:         $this
43:             ->usage('<bold>  show:version</end> <comment> ## ' . T_('Version') . '<eol/>');

ERROR: Unable to parse file: /code/src/Module/Cli/ConvertFileNamesCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Util\FileSystem\FileNameConverterInterface;
30: 
31: final class ConvertFileNamesCommand extends Command
32: {
33:     private FileNameConverterInterface $fileNameCorrector;
                ^
34: 
35:     public function __construct(
36:         FileNameConverterInterface $fileNameCorrector
37:     ) {
38:         parent::__construct('run:convertFilenames', T_('Convert filenames using a charset'));
39: 
40:         $this->fileNameCorrector = $fileNameCorrector;
41: 
42:         $this
43:             ->option('-f|--fire', T_('Enables `fire-and-forget`-mode (Disables prompting on rename)'), 'boolval', false)

ERROR: Unable to parse file: /code/src/Module/Cli/UpdateCatalogFolderCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Catalog\Update\UpdateSingleCatalogFolderInterface;
30: 
31: final class UpdateCatalogFolderCommand extends Command
32: {
33:     private UpdateSingleCatalogFolderInterface $updateSingleCatalogFolder;
                ^
34: 
35:     public function __construct(
36:         UpdateSingleCatalogFolderInterface $updateSingleCatalogFolder
37:     ) {
38:         parent::__construct('run:updateCatalogFolder', T_('Perform catalog actions for a single folder'));
39: 
40:         $this->updateSingleCatalogFolder = $updateSingleCatalogFolder;
41: 
42:         $this
43:             ->option('-c|--cleanup', T_('Removes missing files from the database'), 'boolval', false)

ERROR: Unable to parse file: /code/src/Module/Cli/ExportArtCommand.php
ERROR: Parse error at line 38 column 13:

28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Art\Export\ArtExporterInterface;
30: use Ampache\Module\Art\Export\Exception\ArtExportException;
31: use Ampache\Module\Art\Export\Writer\MetadataWriter;
32: use Ampache\Module\System\LegacyLogger;
33: use Psr\Container\ContainerInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class ExportArtCommand extends Command
37: {
38:     private LoggerInterface $logger;
                ^
39: 
40:     private ArtExporterInterface $artExporter;
41: 
42:     private ContainerInterface $dic;
43: 
44:     public function __construct(
45:         LoggerInterface $logger,
46:         ArtExporterInterface $artExporter,
47:         ContainerInterface $dic
48:     ) {

ERROR: Unable to parse file: /code/src/Module/Cli/ArtCleanupCommand.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Module\Art\ArtCleanupInterface;
31: 
32: final class ArtCleanupCommand extends Command
33: {
34:     private ConfigContainerInterface $configContainer;
                ^
35: 
36:     private ArtCleanupInterface $artCleanup;
37: 
38:     public function __construct(
39:         ConfigContainerInterface $configContainer,
40:         ArtCleanupInterface $artCleanup
41:     ) {
42:         parent::__construct('cleanup:art', T_('Remove art which does not fit to the settings'));
43: 
44:         $this->configContainer = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Cli/UpdateCatalogFileCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Catalog\Update\UpdateSingleCatalogFileInterface;
30: 
31: final class UpdateCatalogFileCommand extends Command
32: {
33:     private UpdateSingleCatalogFileInterface $updateSingleCatalogFile;
                ^
34: 
35:     public function __construct(
36:         UpdateSingleCatalogFileInterface $updateSingleCatalogFile
37:     ) {
38:         parent::__construct('run:updateCatalogFile', T_('Perform catalog actions for a single file'));
39: 
40:         $this->updateSingleCatalogFile = $updateSingleCatalogFile;
41: 
42:         $this
43:             ->option('-c|--cleanup', T_('Removes missing files from the database'), 'boolval', false)

ERROR: Unable to parse file: /code/src/Module/Cli/SongCleanupCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Song\SongFilesystemCleanupInterface;
30: 
31: final class SongCleanupCommand extends Command
32: {
33:     private SongFilesystemCleanupInterface $songFilesystemCleanup;
                ^
34: 
35:     public function __construct(
36:         SongFilesystemCleanupInterface $songFilesystemCleanup
37:     ) {
38:         parent::__construct('cleanup:songs', T_('Delete disabled songs'));
39: 
40:         $this->songFilesystemCleanup = $songFilesystemCleanup;
41: 
42:         $this
43:             ->option('-d|--delete', T_('Disables dry-run'), 'boolval', false)

ERROR: Unable to parse file: /code/src/Module/Cli/ExportPlaylistCommand.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Playlist\PlaylistExporter;
30: use Ampache\Module\Playlist\PlaylistExporterInterface;
31: 
32: final class ExportPlaylistCommand extends Command
33: {
34:     private PlaylistExporterInterface $playlistExporter;
                ^
35: 
36:     public function __construct(
37:         PlaylistExporterInterface $playlistExporter
38:     ) {
39:         parent::__construct('export:playlist', T_('Export Playlists'));
40: 
41:         $this->playlistExporter = $playlistExporter;
42: 
43:         $this
44:             ->option('-u|--user', T_('User ID'), 'intval', -1)

ERROR: Unable to parse file: /code/src/Module/Cli/SortFilesCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Song\SongSorterInterface;
30: 
31: final class SortFilesCommand extends Command
32: {
33:     private SongSorterInterface $songSorter;
                ^
34: 
35:     public function __construct(
36:         SongSorterInterface $songSorter
37:     ) {
38:         parent::__construct('cleanup:sortSongs', T_('Sort songs files'));
39: 
40:         $this->songSorter = $songSorter;
41: 
42:         $this
43:             ->option('-x|--execute', T_('Disables dry-run'), 'boolval', false)

ERROR: Unable to parse file: /code/src/Module/Cli/AdminAddUserCommand.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Repository\Model\User;
31: 
32: final class AdminAddUserCommand extends Command
33: {
34:     private ConfigContainerInterface $configContainer;
                ^
35: 
36:     public function __construct(
37:         ConfigContainerInterface $configContainer
38:     ) {
39:         parent::__construct('admin:addUser', T_('Add a User'));
40: 
41:         $this->configContainer = $configContainer;
42: 
43:         $this
44:             ->option('-p|--password', T_('Password'), 'strval', bin2hex(random_bytes(20)))

ERROR: Unable to parse file: /code/src/Module/Cli/InstallerCommand.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\System\AmpError;
31: use Ampache\Module\System\InstallationHelperInterface;
32: 
33: final class InstallerCommand extends Command
34: {
35:     private InstallationHelperInterface $installationHelper;
                ^
36: 
37:     public function __construct(
38:         InstallationHelperInterface $installationHelper
39:     ) {
40:         parent::__construct('install', T_('Install the database'));
41: 
42:         $this
43:             ->option('-U|--dbuser', T_('MySQL Administrative Username'), 'strval')
44:             ->option('-P|--dbpassword', T_('MySQL Administrative Password'), 'strval')
45:             ->option('-H|--dbhost', T_('MySQL Hostname'), 'strval')

ERROR: Unable to parse file: /code/src/Module/Cli/CronProcessCommand.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\Recommendation;
36: use Ampache\Repository\BookmarkRepositoryInterface;
37: use Ampache\Repository\Model\UpdateInfoEnum;
38: use Ampache\Repository\PodcastEpisodeRepositoryInterface;
39: use Ampache\Repository\ShareRepositoryInterface;
40: use Ampache\Repository\UpdateInfoRepositoryInterface;
41: use Ampache\Repository\UserRepositoryInterface;
42: 
43: final class CronProcessCommand extends Command
44: {
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private ObjectCacheInterface $objectCache;
48: 
49:     private CatalogGarbageCollectorInterface $catalogGarbageCollector;
50: 
51:     private BookmarkRepositoryInterface $bookmarkRepository;
52: 
53:     private UserRepositoryInterface $userRepository;
54: 
55:     private UpdateInfoRepositoryInterface $updateInfoRepository;

ERROR: Unable to parse file: /code/src/Module/Cli/ArtSizeCalculationCommand.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Repository\Model\Art;
31: use Ampache\Module\System\Core;
32: use Ampache\Module\System\Dba;
33: 
34: final class ArtSizeCalculationCommand extends Command
35: {
36:     private ConfigContainerInterface $configContainer;
                ^
37: 
38:     public function __construct(
39:         ConfigContainerInterface $configContainer
40:     ) {
41:         parent::__construct('run:calculateArtSize', T_('Run art size calculation'));
42: 
43:         $this->configContainer = $configContainer;
44:     }
45: 
46:     public function execute(): void

ERROR: Unable to parse file: /code/src/Module/Cli/MoveCatalogPathCommand.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Module\Catalog\Update\UpdateCatalogInterface;
30: 
31: final class MoveCatalogPathCommand extends Command
32: {
33:     private UpdateCatalogInterface $updateCatalog;
                ^
34: 
35:     public function __construct(
36:         UpdateCatalogInterface $updateCatalog
37:     ) {
38:         parent::__construct('run:moveCatalogPath', T_('Change a Catalog path'));
39: 
40:         $this->updateCatalog = $updateCatalog;
41: 
42:         $this
43:             ->argument('[catalogName]', T_('The name of the catalog to update'))

ERROR: Unable to parse file: /code/src/Module/Cli/AdminUpdateDatabaseCommand.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\System\Dba;
31: use Ampache\Module\System\Update;
32: use Ampache\Repository\Model\UpdateInfoEnum;
33: use Ampache\Repository\UpdateInfoRepositoryInterface;
34: 
35: final class AdminUpdateDatabaseCommand extends Command
36: {
37:     private UpdateInfoRepositoryInterface $updateInfoRepository;
                ^
38: 
39:     private Update\UpdateHelperInterface $updateHelper;
40: 
41:     private Update\UpdaterInterface $updater;
42: 
43:     public function __construct(
44:         UpdateInfoRepositoryInterface $updateInfoRepository,
45:         Update\UpdateHelperInterface $updateHelper,
46:         Update\UpdaterInterface $updater
47:     ) {

ERROR: Unable to parse file: /code/src/Module/Cli/CacheProcessCommand.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Repository\Model\Catalog;
31: 
32: final class CacheProcessCommand extends Command
33: {
34:     private ConfigContainerInterface $configContainer;
                ^
35: 
36:     public function __construct(
37:         ConfigContainerInterface $configContainer
38:     ) {
39:         parent::__construct('run:cacheProcess', T_('Run the cache process'));
40: 
41:         $this->configContainer = $configContainer;
42:     }
43: 
44:     public function execute(): void

ERROR: Unable to parse file: /code/src/Module/Cli/RunWebsocketCommand.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Cli;
27: 
28: use Ahc\Cli\Input\Command;
29: use Ampache\Config\ConfigContainerInterface;
30: use Ampache\Module\Broadcast\WebSocketFactoryInterface;
31: 
32: final class RunWebsocketCommand extends Command
33: {
34:     private const DEFAULT_PORT = 8100;
35: 
36:     private ConfigContainerInterface $configContainer;
                ^
37: 
38:     private WebSocketFactoryInterface $webSocketFactory;
39: 
40:     public function __construct(
41:         ConfigContainerInterface $configContainer,
42:         WebSocketFactoryInterface $webSocketFactory
43:     ) {
44:         parent::__construct('run:websocket', T_('Run a Websocket'));
45: 
46:         $this->configContainer  = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Share/ShareCreator.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Repository\Model\Song;
35: use Ampache\Repository\Model\User;
36: use Exception;
37: use Psr\Log\LoggerInterface;
38: 
39: /**
40:  * Creates new sharing items
41:  */
42: final class ShareCreator implements ShareCreatorInterface
43: {
44:     private PluginRetrieverInterface $pluginRetriever;
                ^
45: 
46:     private LoggerInterface $logger;
47: 
48:     public function __construct(
49:         PluginRetrieverInterface $pluginRetriever,
50:         LoggerInterface $logger
51:     ) {
52:         $this->pluginRetriever = $pluginRetriever;
53:         $this->logger          = $logger;
54:     }

ERROR: Unable to parse file: /code/src/Module/Share/ShareUiLinkRenderer.php
ERROR: Parse error at line 39 column 21:

29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Repository\Model\Plugin;
31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\Check\FunctionCheckerInterface;
33: use Ampache\Module\Playback\Stream;
34: use Ampache\Module\Util\Ui;
35: use Ampache\Module\Util\ZipHandlerInterface;
36: 
37: final class ShareUiLinkRenderer implements ShareUiLinkRendererInterface
38: {
39:     private FunctionCheckerInterface $functionChecker;
                        ^
40: 
41:     private ZipHandlerInterface $zipHandler;
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         FunctionCheckerInterface $functionChecker,
47:         ZipHandlerInterface $zipHandler,
48:         ConfigContainerInterface $configContainer
49:     ) {

ERROR: Unable to parse file: /code/src/Module/Api/ApiHandler.php
ERROR: Parse error at line 57 column 13:

47: use Ampache\Repository\UserRepositoryInterface;
48: use Psr\Container\ContainerInterface;
49: use Psr\Http\Message\ResponseInterface;
50: use Psr\Http\Message\ServerRequestInterface;
51: use Psr\Http\Message\StreamFactoryInterface;
52: use Psr\Log\LoggerInterface;
53: use Throwable;
54: 
55: final class ApiHandler implements ApiHandlerInterface
56: {
57:     private RequestParserInterface $requestParser;
                ^
58: 
59:     private StreamFactoryInterface $streamFactory;
60: 
61:     private LoggerInterface $logger;
62: 
63:     private ConfigContainerInterface $configContainer;
64: 
65:     private NetworkCheckerInterface $networkChecker;
66: 
67:     private ContainerInterface $dic;

ERROR: Unable to parse file: /code/src/Module/Api/SseApiApplication.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Authorization\Access;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\System\AmpError;
31: use Ampache\Repository\Model\Catalog;
32: use Ampache\Module\System\Core;
33: use Ampache\Module\Util\UiInterface;
34: 
35: final class SseApiApplication implements ApiApplicationInterface
36: {
37:     private UiInterface $ui;
                ^
38: 
39:     public function __construct(
40:         UiInterface $ui
41:     ) {
42:         $this->ui = $ui;
43:     }
44: 
45:     public function run(): void
46:     {
47:         if (!Access::check('interface', 75)) {

ERROR: Unable to parse file: /code/src/Module/Api/Json4_Data.php
ERROR: Parse error at line 66 column 20:

56: /**
57:  * JSON_Data Class
58:  *
59:  * This class takes care of all of the JSON document stuff in Ampache these
60:  * are all static calls
61:  *
62:  */
63: class Json4_Data
64: {
65:     // This is added so that we don't pop any webservers
66:     private static ?int $limit = 5000;
                       ^
67:     private static int $offset = 0;
68: 
69:     /**
70:      * constructor
71:      *
72:      * We don't use this, as its really a static class
73:      */
74:     private function __construct()
75:     {
76:         // Rien a faire

ERROR: Unable to parse file: /code/src/Module/Api/Api.php
ERROR: Parse error at line 182 column 19:

172: 
173:     public const API_VERSIONS = array(
174:         3,
175:         4,
176:         5,
177:         6
178:     );
179: 
180:     public const DEFAULT_VERSION = 6; // AMPACHE_VERSION
181: 
182:     public static string $auth_version    = '350001';
                       ^
183:     public static string $version         = '6.3.2'; // AMPACHE_VERSION
184:     public static string $version_numeric = '632000'; // AMPACHE_VERSION
185: 
186:     /**
187:      * @var Browse $browse
188:      */
189:     public static $browse = null;
190: 
191:     public static function getBrowse(): Browse
192:     {

ERROR: Unable to parse file: /code/src/Module/Api/Json_Data.php
ERROR: Parse error at line 70 column 20:

60: /**
61:  * Json_Data Class
62:  *
63:  * This class takes care of all of the JSON document stuff in Ampache these
64:  * are all static calls
65:  *
66:  */
67: class Json_Data
68: {
69:     // This is added so that we don't pop any webservers
70:     private static ?int $limit = 5000;
                       ^
71:     private static int $offset = 0;
72: 
73:     /**
74:      * set_offset
75:      *
76:      * This takes an int and changes the offset
77:      *
78:      * @param int $offset Change the starting position of your results. (e.g 5001 when selecting in groups of 5000)
79:      */
80:     public static function set_offset($offset): void

ERROR: Unable to parse file: /code/src/Module/Api/Xml3_Data.php
ERROR: Parse error at line 56 column 20:

46: /**
47:  * Xml_Data Class
48:  *
49:  * This class takes care of all of the xml document stuff in Ampache these
50:  * are all static calls
51:  *
52:  */
53: class Xml3_Data
54: {
55:     // This is added so that we don't pop any webservers
56:     private static ?int $limit  = 5000;
                       ^
57:     private static int $offset  = 0;
58:     private static string $type = '';
59: 
60:     /**
61:      * constructor
62:      *
63:      * We don't use this, as its really a static class
64:      */
65:     private function __construct()
66:     {

ERROR: Unable to parse file: /code/src/Module/Api/Exception/ApiException.php
ERROR: Parse error at line 32 column 15:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\Api\Exception;
27: 
28: use Exception;
29: 
30: abstract class ApiException extends Exception
31: {
32:     protected string $type = '';
                  ^
33: 
34:     public function getType(): string
35:     {
36:         return $this->type;
37:     }
38: }
39: 

ERROR: Unable to parse file: /code/src/Module/Api/RefreshReordered/RefreshAlbumSongsAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\RequestParserInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class RefreshAlbumSongsAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'refresh_album_songs';
38: 
39:     private RequestParserInterface $requestParser;
                ^
40: 
41:     private ModelFactoryInterface $modelFactory;
42: 
43:     public function __construct(
44:         RequestParserInterface $requestParser,
45:         ModelFactoryInterface $modelFactory
46:     ) {
47:         $this->requestParser = $requestParser;
48:         $this->modelFactory  = $modelFactory;
49:     }

ERROR: Unable to parse file: /code/src/Module/Api/RefreshReordered/RefreshPlaylistMediasAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\RequestParserInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class RefreshPlaylistMediasAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'refresh_playlist_medias';
38: 
39:     private RequestParserInterface $requestParser;
                ^
40: 
41:     private ModelFactoryInterface $modelFactory;
42: 
43:     public function __construct(
44:         RequestParserInterface $requestParser,
45:         ModelFactoryInterface $modelFactory
46:     ) {
47:         $this->requestParser = $requestParser;
48:         $this->modelFactory  = $modelFactory;
49:     }

ERROR: Unable to parse file: /code/src/Module/Api/Api5.php
ERROR: Parse error at line 159 column 19:

149:         Method\Api5\SystemPreferences5Method::ACTION => Method\Api5\SystemPreferences5Method::class,
150:         Method\Api5\SystemPreference5Method::ACTION => Method\Api5\SystemPreference5Method::class,
151:         Method\Api5\PreferenceCreate5Method::ACTION => Method\Api5\PreferenceCreate5Method::class,
152:         Method\Api5\PreferenceEdit5Method::ACTION => Method\Api5\PreferenceEdit5Method::class,
153:         Method\Api5\PreferenceDelete5Method::ACTION => Method\Api5\PreferenceDelete5Method::class,
154:         Method\Api5\DeletedSongs5Method::ACTION => Method\Api5\DeletedSongs5Method::class,
155:         Method\Api5\DeletedVideos5Method::ACTION => Method\Api5\DeletedVideos5Method::class,
156:         Method\Api5\DeletedPodcastEpisodes5Method::ACTION => Method\Api5\DeletedPodcastEpisodes5Method::class,
157:     ];
158: 
159:     public static string $auth_version    = '350001';
                       ^
160:     public static string $version         = '5.5.6'; // AMPACHE_VERSION
161:     public static string $version_numeric = '556000'; // AMPACHE_VERSION
162: 
163:     /**
164:      * message
165:      * call the correct success message depending on format
166:      * @param string $message
167:      * @param string $format
168:      * @param array $return_data
169:      */

ERROR: Unable to parse file: /code/src/Module/Api/Method/Exception/AccessDeniedException.php
ERROR: Parse error at line 35 column 15:

25: 
26: namespace Ampache\Module\Api\Method\Exception;
27: 
28: use Ampache\Module\Api\Exception\ErrorCodeEnum;
29: 
30: final class AccessDeniedException extends ApiMethodException
31: {
32:     /** @var int */
33:     protected $code = ErrorCodeEnum::ACCESS_DENIED;
34: 
35:     protected string $type = 'system';
                  ^
36: }
37: 

ERROR: Unable to parse file: /code/src/Module/Api/Method/Exception/ResultEmptyException.php
ERROR: Parse error at line 34 column 15:

24:  */
25: 
26: namespace Ampache\Module\Api\Method\Exception;
27: 
28: use Ampache\Module\Api\Exception\ErrorCodeEnum;
29: 
30: final class ResultEmptyException extends ApiMethodException
31: {
32:     protected $code = ErrorCodeEnum::NOT_FOUND;
33: 
34:     protected string $type = 'empty';
                  ^
35: }
36: 

ERROR: Unable to parse file: /code/src/Module/Api/Method/Exception/RequestParamMissingException.php
ERROR: Parse error at line 34 column 15:

24:  */
25: 
26: namespace Ampache\Module\Api\Method\Exception;
27: 
28: use Ampache\Module\Api\Exception\ErrorCodeEnum;
29: 
30: final class RequestParamMissingException extends ApiMethodException
31: {
32:     protected $code = ErrorCodeEnum::BAD_REQUEST;
33: 
34:     protected string $type = 'system';
                  ^
35: }
36: 

ERROR: Unable to parse file: /code/src/Module/Api/Method/AlbumMethod.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\StreamFactoryInterface;
36: 
37: /**
38:  * Class AlbumMethod
39:  * @package Lib\ApiMethods
40:  */
41: final class AlbumMethod implements MethodInterface
42: {
43:     public const ACTION = 'album';
44: 
45:     private ModelFactoryInterface $modelFactory;
                ^
46: 
47:     private StreamFactoryInterface $streamFactory;
48: 
49:     public function __construct(
50:         ModelFactoryInterface $modelFactory,
51:         StreamFactoryInterface $streamFactory
52:     ) {
53:         $this->modelFactory  = $modelFactory;
54:         $this->streamFactory = $streamFactory;
55:     }

ERROR: Unable to parse file: /code/src/Module/Api/Method/PodcastEpisodesMethod.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Api\Method\Exception\ResultEmptyException;
34: use Ampache\Module\Api\Output\ApiOutputInterface;
35: use Ampache\Repository\Model\User;
36: use Ampache\Repository\PodcastRepositoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: 
39: final class PodcastEpisodesMethod implements MethodInterface
40: {
41:     public const ACTION = 'podcast_episodes';
42: 
43:     private PodcastRepositoryInterface $podcastRepository;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         PodcastRepositoryInterface $podcastRepository,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->podcastRepository = $podcastRepository;
52:         $this->configContainer   = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Api/Method/PodcastDeleteMethod.php
ERROR: Parse error at line 49 column 13:

39: use Ampache\Repository\PodcastRepositoryInterface;
40: use Psr\Http\Message\ResponseInterface;
41: 
42: /**
43:  * Deletes a podcast
44:  */
45: final class PodcastDeleteMethod implements MethodInterface
46: {
47:     public const ACTION = 'podcast_delete';
48: 
49:     private PodcastDeleterInterface $podcastDeleter;
                ^
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     private PrivilegeCheckerInterface $privilegeChecker;
54: 
55:     private PodcastRepositoryInterface $podcastRepository;
56: 
57:     public function __construct(
58:         PodcastDeleterInterface $podcastDeleter,
59:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Api/Method/AlbumsMethod.php
ERROR: Parse error at line 44 column 13:

34: use Psr\Http\Message\StreamFactoryInterface;
35: 
36: /**
37:  * Class AlbumsMethod
38:  * @package Lib\ApiMethods
39:  */
40: final class AlbumsMethod implements MethodInterface
41: {
42:     public const ACTION = 'albums';
43: 
44:     private StreamFactoryInterface $streamFactory;
                ^
45: 
46:     private ModelFactoryInterface $modelFactory;
47: 
48:     public function __construct(
49:         StreamFactoryInterface $streamFactory,
50:         ModelFactoryInterface $modelFactory
51:     ) {
52:         $this->streamFactory = $streamFactory;
53:         $this->modelFactory  = $modelFactory;
54:     }

ERROR: Unable to parse file: /code/src/Module/Api/Xml5_Data.php
ERROR: Parse error at line 70 column 20:

60: 
61: /**
62:  * XML5_Data Class
63:  *
64:  * This class takes care of all of the xml document stuff in Ampache these
65:  * are all static calls
66:  */
67: class Xml5_Data
68: {
69:     // This is added so that we don't pop any webservers
70:     private static ?int $limit  = 5000;
                       ^
71:     private static int $offset  = 0;
72:     private static string $type = '';
73: 
74:     /**
75:      * set_offset
76:      *
77:      * This takes an int and changes the offset
78:      *
79:      * @param int $offset Change the starting position of your results. (e.g 5001 when selecting in groups of 5000)
80:      */

ERROR: Unable to parse file: /code/src/Module/Api/Edit/RefreshUpdatedAction.php
ERROR: Parse error at line 56 column 13:

46: use Psr\Http\Message\ResponseFactoryInterface;
47: use Psr\Http\Message\ResponseInterface;
48: use Psr\Http\Message\ServerRequestInterface;
49: use Psr\Http\Message\StreamFactoryInterface;
50: use Psr\Log\LoggerInterface;
51: 
52: final class RefreshUpdatedAction extends AbstractEditAction
53: {
54:     public const REQUEST_KEY = 'refresh_updated';
55: 
56:     private ResponseFactoryInterface $responseFactory;
                ^
57: 
58:     private StreamFactoryInterface $streamFactory;
59: 
60:     private TalFactoryInterface $talFactory;
61: 
62:     private GuiFactoryInterface $guiFactory;
63: 
64:     private Browse $browse;
65: 
66:     private UiInterface $ui;

ERROR: Unable to parse file: /code/src/Module/Api/Edit/AbstractEditAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\InterfaceImplementationChecker;
36: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
37: use Ampache\Repository\Model\library_item;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: abstract class AbstractEditAction implements ApplicationActionInterface
43: {
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private LoggerInterface $logger;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         LoggerInterface $logger
51:     ) {
52:         $this->configContainer = $configContainer;
53:         $this->logger          = $logger;
54:     }

ERROR: Unable to parse file: /code/src/Module/Api/Edit/ShowEditObjectAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseFactoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Http\Message\StreamFactoryInterface;
37: use Psr\Log\LoggerInterface;
38: 
39: final class ShowEditObjectAction extends AbstractEditAction
40: {
41:     public const REQUEST_KEY = 'show_edit_object';
42: 
43:     private ResponseFactoryInterface $responseFactory;
                ^
44: 
45:     private StreamFactoryInterface $streamFactory;
46: 
47:     private UiInterface $ui;
48: 
49:     public function __construct(
50:         ResponseFactoryInterface $responseFactory,
51:         StreamFactoryInterface $streamFactory,
52:         ConfigContainerInterface $configContainer,
53:         LoggerInterface $logger,

ERROR: Unable to parse file: /code/src/Module/Api/Edit/EditObjectAction.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
38: use Ampache\Repository\LabelRepositoryInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: use Psr\Log\LoggerInterface;
42: 
43: final class EditObjectAction extends AbstractEditAction
44: {
45:     public const REQUEST_KEY = 'edit_object';
46: 
47:     private LabelRepositoryInterface $labelRepository;
                ^
48: 
49:     private LoggerInterface $logger;
50: 
51:     public function __construct(
52:         ConfigContainerInterface $configContainer,
53:         LabelRepositoryInterface $labelRepository,
54:         LoggerInterface $logger
55:     ) {
56:         parent::__construct($configContainer, $logger);
57:         $this->labelRepository = $labelRepository;

ERROR: Unable to parse file: /code/src/Module/Api/Edit/ShowEditPlaylistAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseFactoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Http\Message\StreamFactoryInterface;
37: use Psr\Log\LoggerInterface;
38: 
39: final class ShowEditPlaylistAction extends AbstractEditAction
40: {
41:     public const REQUEST_KEY = 'show_edit_playlist';
42: 
43:     private ResponseFactoryInterface $responseFactory;
                ^
44: 
45:     private StreamFactoryInterface $streamFactory;
46: 
47: 
48:     private TalFactoryInterface $talFactory;
49: 
50:     private GuiFactoryInterface $guiFactory;
51: 
52: 
53:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Api/Api4.php
ERROR: Parse error at line 130 column 19:

120:         'url_to_song' => Method\Api4\UrlToSong4Method::class,
121:         'user' => Method\Api4\User4Method::class,
122:         'users' => Method\Api4\Users4Method::class,
123:         'user_create' => Method\Api4\UserCreate4Method::class,
124:         'user_delete' => Method\Api4\UserDelete4Method::class,
125:         'user_update' => Method\Api4\UserUpdate4Method::class,
126:         'video' => Method\Api4\Video4Method::class,
127:         'videos' => Method\Api4\Videos4Method::class
128:     ];
129: 
130:     public static string $auth_version = '350001';
                       ^
131:     public static string $version      = '443000'; // AMPACHE_VERSION
132: 
133:     /**
134:      * constructor
135:      * This really isn't anything to do here, so it's private
136:      */
137:     private function __construct()
138:     {
139:         // Rien a faire
140:     }

ERROR: Unable to parse file: /code/src/Module/Api/Xml_Data.php
ERROR: Parse error at line 71 column 20:

61: 
62: /**
63:  * Xml_Data Class
64:  *
65:  * This class takes care of all of the xml document stuff in Ampache these
66:  * are all static calls
67:  */
68: class Xml_Data
69: {
70:     // This is added so that we don't pop any webservers
71:     private static ?int $limit  = 5000;
                       ^
72:     private static int $offset  = 0;
73:     private static string $type = '';
74: 
75:     /**
76:      * set_offset
77:      *
78:      * This takes an int and changes the offset
79:      *
80:      * @param int $offset Change the starting position of your results. (e.g 5001 when selecting in groups of 5000)
81:      */

ERROR: Unable to parse file: /code/src/Module/Api/DaapApiApplication.php
ERROR: Parse error at line 58 column 24:

48: 
49:         // Get the list of possible methods for the daap API
50:         $methods = get_class_methods(Daap_Api::class);
51:         // Define list of internal functions that should be skipped
52:         $internal_functions = array('apiOutput', 'create_dictionary', 'createError', 'output_body', 'output_header', 'follow_stream');
53: 
54:         Daap_Api::create_dictionary();
55: 
56:         $params  = array_filter(
57:             explode('/', $action),
58:             fn (string $value): bool => strlen($value) > 0
                           ^
59:         );
60:         $p_count = count($params);
61:         if ($p_count > 0) {
62:             // Recurse through them and see if we're calling one of them
63:             for ($i = $p_count; $i > 0; $i--) {
64:                 $act = strtolower(implode('_', array_slice($params, 0, $i)));
65:                 $act = str_replace("-", "_", $act);
66:                 foreach ($methods as $method) {
67:                     if (in_array($method, $internal_functions)) {
68:                         continue;

ERROR: Unable to parse file: /code/src/Module/Api/SubsonicApiApplication.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\Check\NetworkCheckerInterface;
32: use Ampache\Module\System\LegacyLogger;
33: use Ampache\Module\System\Session;
34: use Ampache\Repository\Model\Preference;
35: use Ampache\Repository\Model\User;
36: use Psr\Log\LoggerInterface;
37: 
38: final class SubsonicApiApplication implements ApiApplicationInterface
39: {
40:     private AuthenticationManagerInterface $authenticationManager;
                ^
41: 
42:     private LoggerInterface $logger;
43: 
44:     private NetworkCheckerInterface $networkChecker;
45: 
46:     public function __construct(
47:         AuthenticationManagerInterface $authenticationManager,
48:         LoggerInterface $logger,
49:         NetworkCheckerInterface $networkChecker
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Api/JsonApiApplication.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Api;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Api\Output\ApiOutputFactoryInterface;
30: use Narrowspark\HttpEmitter\AbstractSapiEmitter;
31: use Nyholm\Psr7Server\ServerRequestCreatorInterface;
32: use Psr\Http\Message\ResponseFactoryInterface;
33: 
34: final class JsonApiApplication implements ApiApplicationInterface
35: {
36:     private ApiOutputFactoryInterface $apiOutputFactory;
                ^
37: 
38:     private ApiHandlerInterface $apiHandler;
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     private ResponseFactoryInterface $responseFactory;
43: 
44:     private AbstractSapiEmitter $sapiEmitter;
45: 
46:     private ServerRequestCreatorInterface $serverRequestCreator;

ERROR: Unable to parse file: /code/src/Module/Api/Authentication/Gatekeeper.php
ERROR: Parse error at line 42 column 13:

32: use Psr\Http\Message\ServerRequestInterface;
33: use Psr\Log\LoggerInterface;
34: 
35: /**
36:  * Provides methods to access authentication related data
37:  *
38:  * There is only XUL.
39:  */
40: final class Gatekeeper implements GatekeeperInterface
41: {
42:     private UserRepositoryInterface $userRepository;
                ^
43: 
44:     private ServerRequestInterface $request;
45: 
46:     private LoggerInterface $logger;
47: 
48:     private ?string $auth = null;
49: 
50:     public function __construct(
51:         UserRepositoryInterface $userRepository,
52:         ServerRequestInterface $request,

ERROR: Unable to parse file: /code/src/Module/Api/Daap_Api.php
ERROR: Parse error at line 51 column 19:

41:  *
42:  * This class wrap Ampache to DAAP API functions. See https://github.com/andytinycat/daapdocs/blob/master/daapdocs.txt
43:  * These are all static calls.
44:  */
45: class Daap_Api
46: {
47:     public const AMPACHEID_SMARTPL = 400000000;
48:     public const BASE_LIBRARY      = 0;
49: 
50:     /** @var list<string> */
51:     public static array $metas = [
                      ^
52:         'dmap.itemid',
53:         'dmap.itemname',
54:         'dmap.itemkind',
55:         'dmap.persistentid',
56:         'daap.songalbum',
57:         'daap.songartist',
58:         'daap.songbitrate',
59:         'daap.songbeatsperminute',
60:         'daap.songcomment',
61:         'daap.songcompilation',

ERROR: Unable to parse file: /code/src/Module/Api/Api3.php
ERROR: Parse error at line 89 column 19:

79:         'tags' => Method\Api3\Tags3Method::class,
80:         'genres' => Method\Api3\Tags3Method::class,
81:         'timeline' => Method\Api3\Timeline3Method::class,
82:         'toggle_follow' => Method\Api3\ToggleFollow3Method::class,
83:         'url_to_song' => Method\Api3\UrlToSong3Method::class,
84:         'user' => Method\Api3\User3Method::class,
85:         'video' => Method\Api3\Video3Method::class,
86:         'videos' => Method\Api3\Videos3Method::class
87:     ];
88: 
89:     public static string $auth_version = '350001';
                      ^
90:     public static string $version      = '390001'; // AMPACHE_VERSION
91: 
92:     /**
93:      * constructor
94:      * This really isn't anything to do here, so it's private
95:      */
96:     private function __construct()
97:     {
98:         // Rien a faire
99:     }

ERROR: Unable to parse file: /code/src/Module/Api/Xml4_Data.php
ERROR: Parse error at line 66 column 20:

56: /**
57:  * Xml_Data Class
58:  *
59:  * This class takes care of all of the xml document stuff in Ampache these
60:  * are all static calls
61:  *
62:  */
63: class Xml4_Data
64: {
65:     // This is added so that we don't pop any webservers
66:     private static ?int $limit  = 5000;
                       ^
67:     private static int $offset  = 0;
68:     private static string $type = '';
69: 
70:     /**
71:      * constructor
72:      *
73:      * We don't use this, as its really a static class
74:      */
75:     private function __construct()
76:     {

ERROR: Unable to parse file: /code/src/Module/Api/Json5_Data.php
ERROR: Parse error at line 71 column 20:

61: /**
62:  * Json5_Data Class
63:  *
64:  * This class takes care of all of the JSON document stuff in Ampache these
65:  * are all static calls
66:  *
67:  */
68: class Json5_Data
69: {
70:     // This is added so that we don't pop any webservers
71:     private static ?int $limit = 5000;
                       ^
72:     private static int $offset = 0;
73: 
74:     /**
75:      * set_offset
76:      *
77:      * This takes an int and changes the offset
78:      *
79:      * @param int $offset Change the starting position of your results. (e.g 5001 when selecting in groups of 5000)
80:      */
81:     public static function set_offset($offset): void

ERROR: Unable to parse file: /code/src/Module/Api/XmlApiApplication.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Api;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Api\Output\ApiOutputFactoryInterface;
30: use Narrowspark\HttpEmitter\AbstractSapiEmitter;
31: use Nyholm\Psr7Server\ServerRequestCreatorInterface;
32: use Psr\Http\Message\ResponseFactoryInterface;
33: 
34: final class XmlApiApplication implements ApiApplicationInterface
35: {
36:     private ApiOutputFactoryInterface $apiOutputFactory;
                ^
37: 
38:     private ApiHandlerInterface $apiHandler;
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     private ResponseFactoryInterface $responseFactory;
43: 
44:     private AbstractSapiEmitter $sapiEmitter;
45: 
46:     private ServerRequestCreatorInterface $serverRequestCreator;

ERROR: Unable to parse file: /code/src/Module/Beets/Catalog.php
ERROR: Parse error at line 71 column 13:

61: 
62:     /**
63:      * command which provides the list of all songs
64:      * @var string $listCommand
65:      */
66:     protected $listCommand;
67: 
68:     /**
69:      * Counter used for cleaning actions
70:      */
71:     private int $cleanCounter = 0;
                ^
72: 
73:     /**
74:      * Constructor
75:      *
76:      * Catalog class constructor, pulls catalog information
77:      * @param int $catalog_id
78:      */
79:     public function __construct($catalog_id = null)
80:     {
81:         // TODO: Basic constructor should be provided from parent

ERROR: Unable to parse file: /code/src/Module/Artist/Deletion/ArtistDeleter.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Artist\Deletion\Exception\ArtistDeletionException;
35: use Ampache\Module\System\LegacyLogger;
36: use Ampache\Repository\AlbumRepositoryInterface;
37: use Ampache\Repository\ArtistRepositoryInterface;
38: use Ampache\Repository\ShoutRepositoryInterface;
39: use Ampache\Repository\UserActivityRepositoryInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class ArtistDeleter implements ArtistDeleterInterface
43: {
44:     private AlbumDeleterInterface $albumDeleter;
                ^
45: 
46:     private ArtistRepositoryInterface $artistRepository;
47: 
48:     private AlbumRepositoryInterface $albumRepository;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private LoggerInterface $logger;
53: 
54:     private ShoutRepositoryInterface $shoutRepository;

ERROR: Unable to parse file: /code/src/Module/Artist/Tag/ArtistTagUpdater.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Artist\Tag;
27: 
28: use Ampache\Repository\Model\Artist;
29: use Ampache\Repository\Model\ModelFactoryInterface;
30: use Ampache\Repository\Model\Tag;
31: use Ampache\Module\Album\Tag\AlbumTagUpdaterInterface;
32: use Ampache\Repository\AlbumRepositoryInterface;
33: 
34: final class ArtistTagUpdater implements ArtistTagUpdaterInterface
35: {
36:     private AlbumRepositoryInterface $albumRepository;
                ^
37: 
38:     private AlbumTagUpdaterInterface $albumTagUpdater;
39: 
40:     private ModelFactoryInterface $modelFactory;
41: 
42:     public function __construct(
43:         AlbumRepositoryInterface $albumRepository,
44:         AlbumTagUpdaterInterface $albumTagUpdater,
45:         ModelFactoryInterface $modelFactory
46:     ) {

ERROR: Unable to parse file: /code/src/Module/WebDav/WebDavFile.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\Model\Media;
30: use Ampache\Repository\Model\Catalog;
31: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
32: use Sabre\DAV;
33: 
34: /**
35:  * This class wrap Ampache songs to WebDAV files.
36:  */
37: class WebDavFile extends DAV\File
38: {
39:     private Media $libitem;
                ^
40: 
41:     public function __construct(Media $libitem)
42:     {
43:         $this->libitem = $libitem;
44:     }
45: 
46:     public function getName(): string
47:     {
48:         $nameinfo = pathinfo($this->libitem->file);
49: 

ERROR: Unable to parse file: /code/src/Module/WebDav/WebDavAuth.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Authentication\AuthenticationManagerInterface;
29: use Sabre\DAV;
30: 
31: /**
32:  * This class wrap Ampache albums and artist to WebDAV directories.
33:  */
34: final class WebDavAuth extends DAV\Auth\Backend\AbstractBasic
35: {
36:     protected $realm = 'Ampache';
37: 
38:     private AuthenticationManagerInterface $authenticationManager;
                ^
39: 
40:     public function __construct(
41:         AuthenticationManagerInterface $authenticationManager
42:     ) {
43:         $this->authenticationManager = $authenticationManager;
44:     }
45: 
46:     /**
47:      * @param string $username
48:      * @param string $password

ERROR: Unable to parse file: /code/src/Module/WebDav/WebDavDirectory.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
31: use Sabre\DAV;
32: use Sabre\DAV\Exception\NotFound;
33: use Sabre\DAV\Node;
34: 
35: /**
36:  * This class wrap Ampache albums and artist to WebDAV directories.
37:  */
38: class WebDavDirectory extends DAV\Collection
39: {
40:     private library_item $libitem;
                ^
41: 
42:     public function __construct(library_item $libitem)
43:     {
44:         $this->libitem = $libitem;
45:     }
46: 
47:     /**
48:      * @return list<Node>
49:      *
50:      * @throws NotFound

ERROR: Unable to parse file: /code/src/Module/WebDav/WebDavCatalog.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\Model\Catalog;
30: use Sabre\DAV;
31: 
32: /**
33:  * WebDAV Catalog Directory Class
34:  *
35:  * This class wrap Ampache catalogs to WebDAV directories.
36:  */
37: class WebDavCatalog extends DAV\Collection
38: {
39:     private int $catalog_id;
                ^
40: 
41:     public function __construct(int $catalog_id)
42:     {
43:         $this->catalog_id = $catalog_id;
44:     }
45: 
46:     /**
47:      * @return list<WebDavDirectory>
48:      */
49:     public function getChildren(): array

ERROR: Unable to parse file: /code/src/Module/WebDav/WebDavFactory.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Authentication\AuthenticationManagerInterface;
29: use Sabre\DAV\Auth\Backend\BackendInterface;
30: use Sabre\DAV\Auth\Plugin;
31: use Sabre\DAV\Exception;
32: use Sabre\DAV\ICollection;
33: use Sabre\DAV\Server;
34: 
35: final class WebDavFactory implements WebDavFactoryInterface
36: {
37:     private AuthenticationManagerInterface $authenticationManager;
                ^
38: 
39:     public function __construct(
40:         AuthenticationManagerInterface $authenticationManager
41:     ) {
42:         $this->authenticationManager = $authenticationManager;
43:     }
44: 
45:     public function createWebDavAuth(): WebDavAuth
46:     {
47:         return new WebDavAuth(

ERROR: Unable to parse file: /code/src/Module/WebDav/WebDavApplication.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\WebDav;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: 
30: final class WebDavApplication
31: {
32:     private ConfigContainerInterface $configContainer;
                ^
33: 
34:     private WebDavFactoryInterface $webDavFactory;
35: 
36:     public function __construct(
37:         ConfigContainerInterface $configContainer,
38:         WebDavFactoryInterface $webDavFactory
39:     ) {
40:         $this->configContainer = $configContainer;
41:         $this->webDavFactory   = $webDavFactory;
42:     }

ERROR: Unable to parse file: /code/src/Module/Song/Deletion/SongDeleter.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Repository\Model\Rating;
29: use Ampache\Repository\Model\Song;
30: use Ampache\Repository\Model\Userflag;
31: use Ampache\Repository\ShoutRepositoryInterface;
32: use Ampache\Repository\SongRepositoryInterface;
33: use Ampache\Repository\UserActivityRepositoryInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class SongDeleter implements SongDeleterInterface
37: {
38:     private LoggerInterface $logger;
                ^
39: 
40:     private ShoutRepositoryInterface $shoutRepository;
41: 
42:     private SongRepositoryInterface $songRepository;
43: 
44:     private UserActivityRepositoryInterface $useractivityRepository;
45: 
46:     private ArtCleanupInterface $artCleanup;
47: 
48:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Song/Tag/SongTagWriter.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Repository\Model\Rating;
32: use Ampache\Repository\Model\Song;
33: use Ampache\Repository\Model\User;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\System\LegacyLogger;
36: use Ampache\Module\Util\UtilityFactoryInterface;
37: use Psr\Log\LoggerInterface;
38: 
39: final class SongTagWriter implements SongTagWriterInterface
40: {
41:     private ConfigContainerInterface $configContainer;
                ^
42: 
43:     private UtilityFactoryInterface $utilityFactory;
44: 
45:     private LoggerInterface $logger;
46: 
47:     public function __construct(
48:         ConfigContainerInterface $configContainer,
49:         UtilityFactoryInterface $utilityFactory,
50:         LoggerInterface $logger
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Song/SongSorter.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\System\LegacyLogger;
32: use Ampache\Repository\Model\Catalog;
33: use Ampache\Module\System\Core;
34: use Ampache\Module\System\Dba;
35: use Ampache\Repository\Model\Song;
36: use Psr\Log\LoggerInterface;
37: use RuntimeException;
38: 
39: final class SongSorter implements SongSorterInterface
40: {
41:     private ConfigContainerInterface $configContainer;
                ^
42: 
43:     private LoggerInterface $logger;
44: 
45:     public function __construct(
46:         ConfigContainerInterface $configContainer,
47:         LoggerInterface $logger
48:     ) {
49:         $this->configContainer = $configContainer;
50:         $this->logger          = $logger;
51:     }

ERROR: Unable to parse file: /code/src/Module/Podcast/PodcastEpisodeDownloader.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Repository\Model\Catalog;
34: use Ampache\Repository\Model\Podcast_Episode;
35: use Ampache\Repository\PodcastRepositoryInterface;
36: use Psr\Log\LoggerInterface;
37: 
38: /**
39:  * Downloads podcast episode-files and update media information
40:  */
41: final class PodcastEpisodeDownloader implements PodcastEpisodeDownloaderInterface
42: {
43:     private PodcastFolderProviderInterface $podcastFolderProvider;
                ^
44: 
45:     private WebFetcherInterface $webFetcher;
46: 
47:     private PodcastRepositoryInterface $podcastRepository;
48: 
49:     private LoggerInterface $logger;
50: 
51:     public function __construct(
52:         PodcastFolderProviderInterface $podcastFolderProvider,
53:         WebFetcherInterface $webFetcher,

ERROR: Unable to parse file: /code/src/Module/Podcast/Exchange/PodcastOpmlImporter.php
ERROR: Parse error at line 44 column 13:

34: 
35: /**
36:  * Imports exported podcast items (from ampache or from an external service)
37:  *
38:  * Uses the OPML format to import podcasts from external sources
39:  *
40:  * @see http://opml.org/spec2.opml
41:  */
42: final class PodcastOpmlImporter implements PodcastOpmlImporterInterface
43: {
44:     private PodcastOpmlLoaderInterface $podcastOpmlLoader;
                ^
45: 
46:     private PodcastCreatorInterface $podcastCreator;
47: 
48:     private LoggerInterface $logger;
49: 
50:     public function __construct(
51:         PodcastOpmlLoaderInterface $podcastOpmlLoader,
52:         PodcastCreatorInterface $podcastCreator,
53:         LoggerInterface $logger
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Podcast/Exchange/PodcastOpmlExporter.php
ERROR: Parse error at line 40 column 13:

30: use Generator;
31: use PhpTal\PHPTAL;
32: 
33: /**
34:  * Exports the podcasts in opml format
35:  *
36:  * @see http://opml.org/spec2.opml
37:  */
38: final class PodcastOpmlExporter implements PodcastExporterInterface
39: {
40:     private TalFactoryInterface $talFactory;
                ^
41: 
42:     private PodcastRepositoryInterface $podcastRepository;
43: 
44:     public function __construct(
45:         TalFactoryInterface $talFactory,
46:         PodcastRepositoryInterface $podcastRepository
47:     ) {
48:         $this->talFactory        = $talFactory;
49:         $this->podcastRepository = $podcastRepository;
50:     }

ERROR: Unable to parse file: /code/src/Module/Podcast/Feed/FeedLoader.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Util\WebFetcher\WebFetcherInterface;
31: use DateTime;
32: use DateTimeInterface;
33: use SimpleXMLElement;
34: 
35: /**
36:  * Loads podcast feeds
37:  */
38: final class FeedLoader implements FeedLoaderInterface
39: {
40:     private WebFetcherInterface $webFetcher;
                ^
41: 
42:     public function __construct(
43:         WebFetcherInterface $webFetcher
44:     ) {
45:         $this->webFetcher = $webFetcher;
46:     }
47: 
48:     /**
49:      * Load the podcast content by its feed-url
50:      *

ERROR: Unable to parse file: /code/src/Module/Podcast/PodcastCreator.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Repository\Model\Catalog;
38: use Ampache\Repository\Model\Podcast;
39: use Ampache\Repository\PodcastRepositoryInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: /**
43:  * Handles the creation of new podcasts
44:  */
45: final class PodcastCreator implements PodcastCreatorInterface
46: {
47:     private FeedLoaderInterface $feedLoader;
                ^
48: 
49:     private PodcastRepositoryInterface $podcastRepository;
50: 
51:     private LoggerInterface $logger;
52: 
53:     private PodcastSyncerInterface $podcastSyncer;
54: 
55:     private PodcastFolderProviderInterface $podcastFolderProvider;
56: 
57:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Podcast/PodcastDeleter.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Repository\PodcastEpisodeRepositoryInterface;
37: use Ampache\Repository\PodcastRepositoryInterface;
38: use Generator;
39: use Psr\Log\LoggerInterface;
40: 
41: /**
42:  * Provides functionality to delete podcasts and -episodes
43:  */
44: final class PodcastDeleter implements PodcastDeleterInterface
45: {
46:     private PodcastRepositoryInterface $podcastRepository;
                ^
47: 
48:     private ModelFactoryInterface $modelFactory;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private PodcastEpisodeRepositoryInterface $podcastEpisodeRepository;
53: 
54:     private ConfigContainerInterface $config;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Podcast/PodcastSyncer.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Repository\PodcastRepositoryInterface;
38: use DateTime;
39: use DateTimeInterface;
40: use SimpleXMLElement;
41: 
42: /**
43:  * Provides functions for podcast-syncing
44:  */
45: final class PodcastSyncer implements PodcastSyncerInterface
46: {
47:     private PodcastRepositoryInterface $podcastRepository;
                ^
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private PodcastEpisodeDownloaderInterface $podcastEpisodeDownloader;
52: 
53:     private PodcastDeleterInterface $podcastDeleter;
54: 
55:     private PodcastEpisodeRepositoryInterface $podcastEpisodeRepository;
56: 
57:     private ConfigContainerInterface $configContainer;

ERROR: Unable to parse file: /code/src/Module/Podcast/PodcastFolderProvider.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Catalog\CatalogLoaderInterface;
29: use Ampache\Module\Catalog\Exception\CatalogLoadingException;
30: use Ampache\Module\Podcast\Exception\PodcastFolderException;
31: use Ampache\Repository\Model\Podcast;
32: 
33: /**
34:  * Provides functionality to build the podcasts root folder
35:  */
36: final class PodcastFolderProvider implements PodcastFolderProviderInterface
37: {
38:     private CatalogLoaderInterface $catalogLoader;
                ^
39: 
40:     public function __construct(
41:         CatalogLoaderInterface $catalogLoader
42:     ) {
43:         $this->catalogLoader = $catalogLoader;
44:     }
45: 
46:     /**
47:      * Returns the podcasts base folder
48:      *

ERROR: Unable to parse file: /code/src/Module/Authentication/Authenticator/OpenIdAuthenticator.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\Model\User;
30: use Ampache\Module\Authentication\Openid;
31: use Ampache\Repository\UserRepositoryInterface;
32: use Auth_OpenID;
33: use Auth_OpenID_PAPE_Request;
34: use Auth_OpenID_SRegRequest;
35: use Auth_OpenID_SRegResponse;
36: 
37: final class OpenIdAuthenticator implements AuthenticatorInterface
38: {
39:     private UserRepositoryInterface $userRepository;
                ^
40: 
41:     public function __construct(
42:         UserRepositoryInterface $userRepository
43:     ) {
44:         $this->userRepository = $userRepository;
45:     }
46: 
47:     public function auth(string $username, string $password): array
48:     {
49:         unset($password);

ERROR: Unable to parse file: /code/src/Module/Authentication/AuthenticationManager.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Authentication\Authenticator\AuthenticatorInterface;
30: use Ampache\Module\System\Dba;
31: use Ampache\Module\System\Session;
32: 
33: final class AuthenticationManager implements AuthenticationManagerInterface
34: {
35:     /**
36:      * @var AuthenticatorInterface[] $authenticatorList
37:      */
38:     private array $authenticatorList;
                ^
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     public function __construct(
43:         ConfigContainerInterface $configContainer,
44:         array $authenticatorList
45:     ) {
46:         $this->configContainer   = $configContainer;
47:         $this->authenticatorList = $authenticatorList;
48:     }

ERROR: Unable to parse file: /code/src/Module/Statistics/Stats.php
ERROR: Parse error at line 52 column 12:

42:  * Stats Class
43:  *
44:  * this class handles the object_count
45:  * stuff, before this was done in the user class
46:  * but that's not good, all done through here.
47:  *
48:  */
49: class Stats
50: {
51:     /* Base vars */
52:     public int $id = 0;
               ^
53:     public ?string $object_type;
54:     public int $object_id;
55:     public int $date;
56:     public int $user;
57:     public ?string $agent;
58: 
59:     /**
60:      * clear
61:      *
62:      * This clears all stats for _everything.

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/UninstallPluginAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\System\LegacyLogger;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class UninstallPluginAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'uninstall_plugin';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     private LoggerInterface $logger;
53: 
54:     public function __construct(
55:         RequestParserInterface $requestParser,
56:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ConfirmUninstallPluginAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ConfirmUninstallPluginAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'confirm_uninstall_plugin';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         $this->ui              = $ui;
50:         $this->configContainer = $configContainer;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/InstallPluginAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\System\LegacyLogger;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class InstallPluginAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'install_plugin';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     private LoggerInterface $logger;
53: 
54:     public function __construct(
55:         RequestParserInterface $requestParser,
56:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/InstallLocalplayAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\System\AmpError;
36: use Ampache\Module\System\Core;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class InstallLocalplayAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'install_localplay';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer
52:     ) {
53:         $this->ui              = $ui;
54:         $this->configContainer = $configContainer;
55:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/UninstallLocalplayAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class UninstallLocalplayAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'uninstall_localplay';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     public function __construct(
47:         UiInterface $ui,
48:         ConfigContainerInterface $configContainer
49:     ) {
50:         $this->ui              = $ui;
51:         $this->configContainer = $configContainer;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/InstallCatalogTypeAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\System\AmpError;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class InstallCatalogTypeAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'install_catalog_type';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/UpgradePluginAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\System\LegacyLogger;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class UpgradePluginAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'upgrade_plugin';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     private LoggerInterface $logger;
53: 
54:     public function __construct(
55:         RequestParserInterface $requestParser,
56:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/UninstallCatalogTypeAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\System\AmpError;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UninstallCatalogTypeAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'uninstall_catalog_type';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ShowPluginsAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\Ui;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowPluginsAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_plugins';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     public function __construct(
45:         UiInterface $ui
46:     ) {
47:         $this->ui = $ui;
48:     }
49: 
50:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
51:     {
52:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ConfirmUninstallLocalplayAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ConfirmUninstallLocalplayAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'confirm_uninstall_localplay';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         $this->ui              = $ui;
50:         $this->configContainer = $configContainer;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ShowLocalplayAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Playback\Localplay\LocalPlayTypeEnum;
33: use Ampache\Module\Util\Ui;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowLocalplayAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_localplay';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     public function __construct(
45:         UiInterface $ui
46:     ) {
47:         $this->ui = $ui;
48:     }
49: 
50:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
51:     {
52:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ConfirmUninstallCatalogType.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ConfirmUninstallCatalogType implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'confirm_uninstall_catalog_type';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         $this->ui              = $ui;
50:         $this->configContainer = $configContainer;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ShowCatalogTypesAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ShowCatalogTypesAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show_catalog_types';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
50:     {
51:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Modules/ShowAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     public function __construct(
43:         UiInterface $ui
44:     ) {
45:         $this->ui = $ui;
46:     }
47: 
48:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
49:     {
50:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/ShowAddAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAddAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show_add';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     public function __construct(
43:         UiInterface $ui
44:     ) {
45:         $this->ui = $ui;
46:     }
47: 
48:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
49:     {
50:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/DeleteRecordAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Deletes an ACL item by its id
40:  */
41: final class DeleteRecordAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'delete_record';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private AccessRepositoryInterface $accessRepository;
48: 
49:     private RequestParserInterface $requestParser;
50: 
51:     public function __construct(
52:         UiInterface $ui,
53:         AccessRepositoryInterface $accessRepository,
54:         RequestParserInterface $requestParser
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/ShowEditRecordAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ShowEditRecordAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show_edit_record';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ModelFactoryInterface $modelFactory;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ModelFactoryInterface $modelFactory
48:     ) {
49:         $this->ui           = $ui;
50:         $this->modelFactory = $modelFactory;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/ShowDeleteRecordAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\AccessLevelEnum;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShowDeleteRecordAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show_delete_record';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer,
52:         ModelFactoryInterface $modelFactory
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/AddHostAction.php
ERROR: Parse error at line 51 column 13:

41: use Ampache\Module\Util\RequestParserInterface;
42: use Ampache\Module\Util\UiInterface;
43: use Psr\Http\Message\ResponseInterface;
44: use Psr\Http\Message\ServerRequestInterface;
45: use Psr\Log\LoggerInterface;
46: 
47: final class AddHostAction implements ApplicationActionInterface
48: {
49:     public const REQUEST_KEY = 'add_host';
50: 
51:     private UiInterface $ui;
                ^
52: 
53:     private ConfigContainerInterface $configContainer;
54: 
55:     private AccessListManagerInterface $accessListManager;
56: 
57:     private RequestParserInterface $requestParser;
58: 
59:     private LoggerInterface $logger;
60: 
61:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/UpdateRecordAction.php
ERROR: Parse error at line 48 column 13:

38: use Ampache\Module\Authorization\GuiGatekeeperInterface;
39: use Ampache\Module\System\AmpError;
40: use Ampache\Module\Util\UiInterface;
41: use Psr\Http\Message\ResponseInterface;
42: use Psr\Http\Message\ServerRequestInterface;
43: 
44: final class UpdateRecordAction implements ApplicationActionInterface
45: {
46:     public const REQUEST_KEY = 'update_record';
47: 
48:     private UiInterface $ui;
                ^
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     private ModelFactoryInterface $modelFactory;
53: 
54:     private AccessListManagerInterface $accessListManager;
55: 
56:     private RequestParserInterface $requestParser;
57: 
58:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/Lib/AccessListItem.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\Application\Admin\Access\Lib;
27: 
28: use Ampache\Repository\Model\ModelFactoryInterface;
29: use Ampache\Module\Authorization\Access;
30: 
31: final class AccessListItem implements AccessListItemInterface
32: {
33:     private Access $access;
                ^
34: 
35:     private ModelFactoryInterface $modelFactory;
36: 
37:     public function __construct(
38:         ModelFactoryInterface $modelFactory,
39:         Access $access
40:     ) {
41:         $this->modelFactory = $modelFactory;
42:         $this->access       = $access;
43:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/ShowAddAdvancedAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAddAdvancedAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show_add_advanced';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     public function __construct(
43:         UiInterface $ui
44:     ) {
45:         $this->ui = $ui;
46:     }
47: 
48:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
49:     {
50:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Access/ShowAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Ampache\Repository\AccessRepositoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private AccessRepositoryInterface $accessRepository;
45: 
46:     private ModelFactoryInterface $modelFactory;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         AccessRepositoryInterface $accessRepository,
51:         ModelFactoryInterface $modelFactory
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Export/ShowAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Renders the catalog export view
40:  */
41: final class ShowAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private CatalogLoaderInterface $catalogLoader;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         CatalogLoaderInterface $catalogLoader
52:     ) {
53:         $this->ui            = $ui;
54:         $this->catalogLoader = $catalogLoader;
55:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Export/ExportAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Exports a catalog according to the submitted configuration
41:  */
42: final class ExportAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'export';
45: 
46:     private CatalogExportFactoryInterface $catalogExportFactory;
                ^
47: 
48:     private CatalogLoaderInterface $catalogLoader;
49: 
50:     public function __construct(
51:         CatalogExportFactoryInterface $catalogExportFactory,
52:         CatalogLoaderInterface $catalogLoader
53:     ) {
54:         $this->catalogExportFactory = $catalogExportFactory;
55:         $this->catalogLoader        = $catalogLoader;
56:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ClearNowPlayingAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Playback\Stream;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ClearNowPlayingAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'clear_now_playing';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/UpdateFileTagsAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class UpdateFileTagsAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'update_file_tags';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/UpdateFromAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class UpdateFromAction extends AbstractCatalogAction
35: {
36:     public const REQUEST_KEY = 'update_from';
37: 
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private UiInterface $ui;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         parent::__construct($ui);
47:         $this->configContainer = $configContainer;
48:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ShowDeleteCatalogAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ShowDeleteCatalogAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show_delete_catalog';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         $this->ui              = $ui;
50:         $this->configContainer = $configContainer;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/GatherMediaArtAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class GatherMediaArtAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'gather_media_art';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ShowCustomizeCatalogAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowCustomizeCatalogAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_customize_catalog';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         RequestParserInterface $requestParser,
48:         UiInterface $ui
49:     ) {
50:         $this->requestParser = $requestParser;
51:         $this->ui            = $ui;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/AddToAllCatalogsAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class AddToAllCatalogsAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'add_to_all_catalogs';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/AddToCatalogAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class AddToCatalogAction extends AbstractCatalogAction
35: {
36:     public const REQUEST_KEY = 'add_to_catalog';
37: 
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private UiInterface $ui;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         parent::__construct($ui);
47:         $this->configContainer = $configContainer;
48:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ShowAddCatalogAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Authorization\AccessLevelEnum;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowAddCatalogAction implements ApplicationActionInterface
35: {
36:     public const REQUEST_KEY = 'show_add_catalog';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     public function __construct(
41:         UiInterface $ui
42:     ) {
43:         $this->ui = $ui;
44:     }
45: 
46:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
47:     {
48:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_MANAGER) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ShowDisabledAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\AccessLevelEnum;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShowDisabledAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show_disabled';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ClearStatsAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ClearStatsAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'clear_stats';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/GarbageCollectAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class GarbageCollectAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'garbage_collect';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/CleanAllCatalogsAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class CleanAllCatalogsAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'clean_all_catalogs';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/FullServiceAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class FullServiceAction extends AbstractCatalogAction
35: {
36:     public const REQUEST_KEY = 'full_service';
37: 
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private UiInterface $ui;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         parent::__construct($ui);
47:         $this->configContainer = $configContainer;
48:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/UpdateAllCatalogsAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class UpdateAllCatalogsAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'update_all_catalogs';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/UpdateCatalogAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class UpdateCatalogAction extends AbstractCatalogAction
35: {
36:     public const REQUEST_KEY = 'update_catalog';
37: 
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private UiInterface $ui;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         parent::__construct($ui);
47:         $this->configContainer = $configContainer;
48:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/UpdateAllFileTagsActions.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class UpdateAllFileTagsActions extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'update_all_file_tags';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/AbstractCatalogAction.php
ERROR: Parse error at line 37 column 13:

27: use Ampache\Module\Application\ApplicationActionInterface;
28: use Ampache\Module\Application\Exception\AccessDeniedException;
29: use Ampache\Module\Authorization\AccessLevelEnum;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: abstract class AbstractCatalogAction implements ApplicationActionInterface
36: {
37:     private UiInterface $ui;
                ^
38: 
39:     public function __construct(
40:         UiInterface $ui
41:     ) {
42:         $this->ui = $ui;
43:     }
44: 
45:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
46:     {
47:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_MANAGER) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/EnableDisabledAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Repository\Model\Song;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class EnableDisabledAction extends AbstractCatalogAction
36: {
37:     public const REQUEST_KEY = 'enable_disabled';
38: 
39:     private ConfigContainerInterface $configContainer;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         UiInterface $ui,
45:         ConfigContainerInterface $configContainer
46:     ) {
47:         parent::__construct($ui);
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/UpdateCatalogSettingsAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Repository\Model\Catalog;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class UpdateCatalogSettingsAction extends AbstractCatalogAction
36: {
37:     public const REQUEST_KEY = 'update_catalog_settings';
38: 
39:     private ConfigContainerInterface $configContainer;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         UiInterface $ui,
45:         ConfigContainerInterface $configContainer
46:     ) {
47:         parent::__construct($ui);
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/CleanCatalogAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class CleanCatalogAction extends AbstractCatalogAction
34: {
35:     public const REQUEST_KEY = 'clean_catalog';
36: 
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private UiInterface $ui;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ConfigContainerInterface $configContainer
44:     ) {
45:         parent::__construct($ui);
46:         $this->configContainer = $configContainer;
47:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ShowCatalogsAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\UiInterface;
33: use Ampache\Repository\Model\Browse;
34: use Ampache\Repository\Model\Catalog;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowCatalogsAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_catalogs';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     public function __construct(
45:         UiInterface $ui
46:     ) {
47:         $this->ui = $ui;
48:     }
49: 
50:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
51:     {
52:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_MANAGER) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/ImportToCatalogAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ImportToCatalogAction extends AbstractCatalogAction
35: {
36:     public const REQUEST_KEY = 'import_to_catalog';
37: 
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private UiInterface $ui;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         parent::__construct($ui);
47:         $this->configContainer = $configContainer;
48:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/DeleteCatalogAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class DeleteCatalogAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'delete_catalog';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private RequestParserInterface $requestParser;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer,
51:         RequestParserInterface $requestParser
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Catalog/AddCatalogAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Ampache\Repository\Model\Catalog;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class AddCatalogAction extends AbstractCatalogAction
39: {
40:     public const REQUEST_KEY = 'add_catalog';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private RequestParserInterface $requestParser;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer,
51:         RequestParserInterface $requestParser
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/AddFilterAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Ampache\Repository\Model\Catalog;
37: 
38: final class AddFilterAction extends AbstractFilterAction
39: {
40:     public const REQUEST_KEY = 'add_filter';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private RequestParserInterface $requestParser;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer,
51:         RequestParserInterface $requestParser
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/DeleteAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class DeleteAction extends AbstractFilterAction
35: {
36:     public const REQUEST_KEY = 'delete';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         $this->ui              = $ui;
47:         $this->configContainer = $configContainer;
48:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/UpdateFilterAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Ampache\Repository\Model\Catalog;
37: 
38: final class UpdateFilterAction extends AbstractFilterAction
39: {
40:     public const REQUEST_KEY = 'update_filter';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private RequestParserInterface $requestParser;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer,
51:         RequestParserInterface $requestParser
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/ShowAddFilterAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowAddFilterAction extends AbstractFilterAction
35: {
36:     public const REQUEST_KEY = 'show_add_filter';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         $this->ui              = $ui;
47:         $this->configContainer = $configContainer;
48:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/ShowAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: /**
37:  * Renders the catalog-filters list
38:  */
39: final class ShowAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     public function __construct(
46:         UiInterface $ui
47:     ) {
48:         $this->ui = $ui;
49:     }
50: 
51:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
52:     {
53:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_MANAGER) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/ConfirmDeleteAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Ampache\Repository\Model\Catalog;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class ConfirmDeleteAction extends AbstractFilterAction
36: {
37:     public const REQUEST_KEY = 'confirm_delete';
38: 
39:     private UiInterface $ui;
                ^
40: 
41:     private ConfigContainerInterface $configContainer;
42: 
43:     public function __construct(
44:         UiInterface $ui,
45:         ConfigContainerInterface $configContainer
46:     ) {
47:         $this->ui              = $ui;
48:         $this->configContainer = $configContainer;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Filter/ShowEditAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowEditAction extends AbstractFilterAction
35: {
36:     public const REQUEST_KEY = 'show_edit';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     public function __construct(
43:         UiInterface $ui,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         $this->ui              = $ui;
47:         $this->configContainer = $configContainer;
48:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/License/EditAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Actually updates or creates a license
41:  */
42: final class EditAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'edit';
45: 
46:     private UiInterface $ui;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private LicenseRepositoryInterface $licenseRepository;
51: 
52:     public function __construct(
53:         UiInterface $ui,
54:         ConfigContainerInterface $configContainer,
55:         LicenseRepositoryInterface $licenseRepository
56:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/License/DeleteAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Deletes a single license
41:  */
42: final class DeleteAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'delete';
45: 
46:     private UiInterface $ui;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private LicenseRepositoryInterface $licenseRepository;
51: 
52:     public function __construct(
53:         UiInterface $ui,
54:         ConfigContainerInterface $configContainer,
55:         LicenseRepositoryInterface $licenseRepository
56:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/License/ShowCreateAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Ampache\Repository\LicenseRepositoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowCreateAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_create';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private LicenseRepositoryInterface $licenseRepository;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         LicenseRepositoryInterface $licenseRepository,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/License/ShowAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45:     private LicenseRepositoryInterface $licenseRepository;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ModelFactoryInterface $modelFactory,
50:         LicenseRepositoryInterface $licenseRepository
51:     ) {
52:         $this->ui                = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Admin/License/ShowEditAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Shows the license edit-page
41:  */
42: final class ShowEditAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'show_edit';
45: 
46:     private UiInterface $ui;
                ^
47: 
48:     private LicenseRepositoryInterface $licenseRepository;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     public function __construct(
53:         UiInterface $ui,
54:         LicenseRepositoryInterface $licenseRepository,
55:         ConfigContainerInterface $configContainer
56:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Mail/SendMailAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\Mailer;
36: use Ampache\Module\Util\RequestParserInterface;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class SendMailAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'send_mail';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     public function __construct(
52:         RequestParserInterface $requestParser,
53:         UiInterface $ui,
54:         ConfigContainerInterface $configContainer
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Mail/ShowAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     public function __construct(
43:         UiInterface $ui
44:     ) {
45:         $this->ui = $ui;
46:     }
47: 
48:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
49:     {
50:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_MANAGER) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Index/ShowAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     public function __construct(
47:         UiInterface $ui,
48:         ModelFactoryInterface $modelFactory
49:     ) {
50:         $this->ui           = $ui;
51:         $this->modelFactory = $modelFactory;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Upload/ShowAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\Catalog;
31: use Ampache\Repository\Model\ModelFactoryInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAction extends AbstractUploadAction
37: {
38:     public const REQUEST_KEY = 'show';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     private ModelFactoryInterface $modelFactory;
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     public function __construct(
47:         UiInterface $ui,
48:         ModelFactoryInterface $modelFactory,
49:         ConfigContainerInterface $configContainer
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Shout/DeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\ShoutRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class DeleteAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'delete';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     private ShoutRepositoryInterface $shoutRepository;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer,
52:         ShoutRepositoryInterface $shoutRepository
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Shout/EditShoutAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Edits a ShoutBox item
40:  */
41: final class EditShoutAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'edit_shout';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private ShoutRepositoryInterface $shoutRepository;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ShoutRepositoryInterface $shoutRepository
52:     ) {
53:         $this->ui              = $ui;
54:         $this->shoutRepository = $shoutRepository;
55:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Shout/ShowAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ShowAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ModelFactoryInterface $modelFactory;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ModelFactoryInterface $modelFactory
48:     ) {
49:         $this->ui           = $ui;
50:         $this->modelFactory = $modelFactory;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/Shout/ShowEditAction.php
ERROR: Parse error at line 47 column 13:

37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: /**
41:  * Displays the shouts edit-view
42:  */
43: final class ShowEditAction implements ApplicationActionInterface
44: {
45:     public const REQUEST_KEY = 'show_edit';
46: 
47:     private UiInterface $ui;
                ^
48: 
49:     private ShoutRepositoryInterface $shoutRepository;
50: 
51:     private ModelFactoryInterface $modelFactory;
52: 
53:     private ShoutObjectLoaderInterface $shoutObjectLoader;
54: 
55:     public function __construct(
56:         UiInterface $ui,
57:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/System/GenerateConfigAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\Horde_Browser;
36: use Psr\Http\Message\ResponseFactoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Psr\Http\Message\StreamFactoryInterface;
40: 
41: final class GenerateConfigAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'generate_config';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private Horde_Browser $browser;
48: 
49:     private InstallationHelperInterface $installationHelper;
50: 
51:     private ResponseFactoryInterface $responseFactory;
52: 
53:     private StreamFactoryInterface $streamFactory;
54: 
55:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/System/ResetDbCharsetAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Database\DatabaseCharsetUpdaterInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ResetDbCharsetAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'reset_db_charset';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private DatabaseCharsetUpdaterInterface $databaseCharsetUpdater;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         UiInterface $ui,
51:         DatabaseCharsetUpdaterInterface $databaseCharsetUpdater
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/System/WriteConfigAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\System\InstallationHelperInterface;
35: use Psr\Http\Message\ResponseFactoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: use Teapot\StatusCode;
39: 
40: final class WriteConfigAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'write_config';
43: 
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private InstallationHelperInterface $installationHelper;
47: 
48:     private ResponseFactoryInterface $responseFactory;
49: 
50:     public function __construct(
51:         ConfigContainerInterface $configContainer,
52:         InstallationHelperInterface $installationHelper,
53:         ResponseFactoryInterface $responseFactory
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/System/ShowDebugAction.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Module\Util\UiInterface;
38: use Ampache\Repository\Model\UpdateInfoEnum;
39: use Ampache\Repository\UpdateInfoRepositoryInterface;
40: use Psr\Http\Message\ResponseInterface;
41: use Psr\Http\Message\ServerRequestInterface;
42: 
43: final class ShowDebugAction implements ApplicationActionInterface
44: {
45:     public const REQUEST_KEY = 'show_debug';
46: 
47:     private RequestParserInterface $requestParser;
                ^
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private UiInterface $ui;
52: 
53:     private UpdateInfoRepositoryInterface $updateInfoRepository;
54: 
55:     public function __construct(
56:         RequestParserInterface $requestParser,
57:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/System/ClearCacheAction.php
ERROR: Parse error at line 51 column 13:

41: 
42: /**
43:  * @todo Check if those `clear cache` calls are really necessary
44:  * Those caches exist just for the lifetime of a request (or a cli process).
45:  * It makes no sense to explicitly clear them within a gui request
46:  */
47: final class ClearCacheAction implements ApplicationActionInterface
48: {
49:     public const REQUEST_KEY = 'clear_cache';
50: 
51:     private ConfigContainerInterface $configContainer;
                ^
52: 
53:     private UiInterface $ui;
54: 
55:     public function __construct(
56:         ConfigContainerInterface $configContainer,
57:         UiInterface $ui
58:     ) {
59:         $this->configContainer = $configContainer;
60:         $this->ui              = $ui;
61:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/DeleteAvatarAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Deletes a user avatar
40:  */
41: final class DeleteAvatarAction extends AbstractUserAction
42: {
43:     public const REQUEST_KEY = 'delete_avatar';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/UpdateUserAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Util\Ui;
37: use Ampache\Module\Util\UiInterface;
38: use Ampache\Repository\UserRepositoryInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: 
42: final class UpdateUserAction extends AbstractUserAction
43: {
44:     public const REQUEST_KEY = 'update_user';
45: 
46:     private UiInterface $ui;
                ^
47: 
48:     private ModelFactoryInterface $modelFactory;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     private UserRepositoryInterface $userRepository;
53:     private RequestParserInterface $requestParser;
54: 
55:     public function __construct(
56:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowAddUserAction.php
ERROR: Parse error at line 41 column 13:

31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: /**
35:  * Shows the add-user form
36:  */
37: final class ShowAddUserAction extends AbstractUserAction
38: {
39:     public const REQUEST_KEY = 'show_add_user';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         $this->ui              = $ui;
50:         $this->configContainer = $configContainer;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ConfirmEnableAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Activates a user
41:  */
42: final class ConfirmEnableAction extends AbstractUserAction
43: {
44:     public const REQUEST_KEY = 'confirm_enable';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private ConfigContainerInterface $configContainer;
53: 
54:     private UserStateTogglerInterface $userStateToggler;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/EnableAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: /**
37:  * Renders the user-enable confirmation
38:  */
39: final class EnableAction extends AbstractUserAction
40: {
41:     public const REQUEST_KEY = 'enable';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowGenerateStreamTokenAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation dialogue for stream-token deletion
34:  */
35: final class ShowGenerateStreamTokenAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_generate_streamtoken';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowDeleteApiKeyAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation-dialogue for api-key deletion
34:  */
35: final class ShowDeleteApiKeyAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_delete_apikey';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/DeleteStreamTokenAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Deletes the users stream-token
40:  */
41: final class DeleteStreamTokenAction extends AbstractUserAction
42: {
43:     public const REQUEST_KEY = 'delete_streamtoken';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowDeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: /**
37:  * Renders the user-delete confirmation
38:  */
39: final class ShowDeleteAction extends AbstractUserAction
40: {
41:     public const REQUEST_KEY = 'delete';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowDeleteRssTokenAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation dialogue for rss-token deletion
34:  */
35: final class ShowDeleteRssTokenAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_delete_rsstoken';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/DeleteRssTokenAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Deletes the users rss-token
40:  */
41: final class DeleteRssTokenAction extends AbstractUserAction
42: {
43:     public const REQUEST_KEY = 'delete_rsstoken';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/GenerateStreamTokenAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Generates a stream token for a user
41:  */
42: final class GenerateStreamTokenAction extends AbstractUserAction
43: {
44:     public const REQUEST_KEY = 'generate_streamtoken';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private ConfigContainerInterface $configContainer;
53: 
54:     private UserKeyGeneratorInterface $userKeyGenerator;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowDeleteStreamTokenAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation dialogue for stream-token deletion
34:  */
35: final class ShowDeleteStreamTokenAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_delete_streamtoken';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowIpHistoryAction.php
ERROR: Parse error at line 44 column 13:

34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: /**
37:  * Renders a users ip history
38:  */
39: final class ShowIpHistoryAction extends AbstractUserAction
40: {
41:     /** @var string */
42:     public const REQUEST_KEY = 'show_ip_history';
43: 
44:     private UiInterface $ui;
                ^
45: 
46:     private ModelFactoryInterface $modelFactory;
47: 
48:     private IpHistoryRepositoryInterface $ipHistoryRepository;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     public function __construct(
53:         UiInterface $ui,
54:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowDeleteAvatarAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation dialogue for avatar deletion
34:  */
35: final class ShowDeleteAvatarAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_delete_avatar';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/GenerateRssTokenAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Generates a rss-token for a user
41:  */
42: final class GenerateRssTokenAction extends AbstractUserAction
43: {
44:     public const REQUEST_KEY = 'generate_rsstoken';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private ConfigContainerInterface $configContainer;
53: 
54:     private UserKeyGeneratorInterface $userKeyGenerator;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowGenerateApiKeyAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation dialogue for api-key generation
34:  */
35: final class ShowGenerateApiKeyAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_generate_apikey';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowPreferencesAction.php
ERROR: Parse error at line 42 column 13:

32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: /**
36:  * Renders the users preferences
37:  */
38: final class ShowPreferencesAction extends AbstractUserAction
39: {
40:     public const REQUEST_KEY = 'show_preferences';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private PreferenceRepositoryInterface $preferenceRepository;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         PreferenceRepositoryInterface $preferenceRepository
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/DisableAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: /**
37:  * Renders the user disable confirmation
38:  */
39: final class DisableAction extends AbstractUserAction
40: {
41:     public const REQUEST_KEY = 'disable';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowGenerateRssTokenAction.php
ERROR: Parse error at line 41 column 13:

31: 
32: /**
33:  * Renders the confirmation dialogue for rss-token generation
34:  */
35: final class ShowGenerateRssTokenAction extends AbstractUserAction
36: {
37:     use UserAdminApplicationTrait;
38: 
39:     public const REQUEST_KEY = 'show_generate_rsstoken';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     public function __construct(
44:         UiInterface $ui
45:     ) {
46:         $this->ui = $ui;
47:     }
48: 
49:     protected function handle(ServerRequestInterface $request): ?ResponseInterface
50:     {
51:         return $this->showGenericUserConfirmation(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ConfirmDisableAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Disables a user
41:  */
42: final class ConfirmDisableAction extends AbstractUserAction
43: {
44:     public const REQUEST_KEY = 'confirm_disable';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private ConfigContainerInterface $configContainer;
53: 
54:     private UserStateTogglerInterface $userStateToggler;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/AddUserAction.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Module\Util\Ui;
38: use Ampache\Module\Util\UiInterface;
39: use Ampache\Repository\UserRepositoryInterface;
40: use Psr\Http\Message\ResponseInterface;
41: use Psr\Http\Message\ServerRequestInterface;
42: 
43: final class AddUserAction extends AbstractUserAction
44: {
45:     public const REQUEST_KEY = 'add_user';
46: 
47:     private UiInterface $ui;
                ^
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     private UserRepositoryInterface $userRepository;
54: 
55:     private RequestParserInterface $requestParser;
56: 
57:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Repository\Model\ModelFactoryInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class ShowAction extends AbstractUserAction
34: {
35:     public const REQUEST_KEY = 'show';
36: 
37:     private UiInterface $ui;
                ^
38: 
39:     private ModelFactoryInterface $modelFactory;
40: 
41:     public function __construct(
42:         UiInterface $ui,
43:         ModelFactoryInterface $modelFactory
44:     ) {
45:         $this->ui           = $ui;
46:         $this->modelFactory = $modelFactory;
47:     }

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ConfirmDeleteAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Deletes a user
40:  */
41: final class ConfirmDeleteAction extends AbstractUserAction
42: {
43:     public const REQUEST_KEY = 'confirm_delete';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/GenerateApiKeyAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Generates an api-key for a user
41:  */
42: final class GenerateApiKeyAction extends AbstractUserAction
43: {
44:     public const REQUEST_KEY = 'generate_apikey';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private ConfigContainerInterface $configContainer;
53: 
54:     private UserKeyGeneratorInterface $userKeyGenerator;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/DeleteApiKeyAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Deletes an api-key from a user
40:  */
41: final class DeleteApiKeyAction extends AbstractUserAction
42: {
43:     public const REQUEST_KEY = 'delete_apikey';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Admin/User/ShowEditAction.php
ERROR: Parse error at line 43 column 13:

33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: /**
37:  * Renders the users edit view
38:  */
39: final class ShowEditAction extends AbstractUserAction
40: {
41:     public const REQUEST_KEY = 'show_edit';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Register/ShowAddUserAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\User\Registration\RegistrationAgreementRendererInterface;
34: use Ampache\Module\Util\Mailer;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShowAddUserAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show_add_user';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private RegistrationAgreementRendererInterface $registrationAgreementRenderer;
46: 
47:     private UiInterface $ui;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         RegistrationAgreementRendererInterface $registrationAgreementRenderer,
52:         UiInterface $ui
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Register/ValidateAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\System\Core;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\UserRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ValidateAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'validate';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private UserRepositoryInterface $userRepository;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui,
52:         UserRepositoryInterface $userRepository
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Register/AddUserAction.php
ERROR: Parse error at line 50 column 13:

40: use Ampache\Module\Util\Mailer;
41: use Ampache\Module\Util\Ui;
42: use Ampache\Repository\UserRepositoryInterface;
43: use Psr\Http\Message\ResponseInterface;
44: use Psr\Http\Message\ServerRequestInterface;
45: 
46: final class AddUserAction implements ApplicationActionInterface
47: {
48:     public const REQUEST_KEY = 'add_user';
49: 
50:     private ConfigContainerInterface $configContainer;
                ^
51: 
52:     private ModelFactoryInterface $modelFactory;
53: 
54:     private UserRepositoryInterface $userRepository;
55: 
56:     private Registration\RegistrationAgreementRendererInterface $registrationAgreementRenderer;
57: 
58:     private UiInterface $ui;
59: 
60:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Random/GetAdvancedAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\System\Core;
33: use Ampache\Repository\Model\User;
34: use Ampache\Repository\VideoRepositoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class GetAdvancedAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'get_advanced';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private VideoRepositoryInterface $videoRepository;
45: 
46:     public function __construct(
47:         UiInterface $ui,
48:         VideoRepositoryInterface $videoRepository
49:     ) {
50:         $this->ui              = $ui;
51:         $this->videoRepository = $videoRepository;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Random/AdvancedAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Ampache\Repository\VideoRepositoryInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class AdvancedAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'advanced';
38: 
39:     private UiInterface $ui;
                ^
40: 
41:     private VideoRepositoryInterface $videoRepository;
42: 
43:     public function __construct(
44:         UiInterface $ui,
45:         VideoRepositoryInterface $videoRepository
46:     ) {
47:         $this->ui              = $ui;
48:         $this->videoRepository = $videoRepository;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Label/AddLabelAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Authorization\AccessLevelEnum;
35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class AddLabelAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'add_label';
43: 
44:     private UiInterface $ui;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     private RequestParserInterface $requestParser;
49: 
50:     public function __construct(
51:         UiInterface $ui,
52:         ConfigContainerInterface $configContainer,
53:         RequestParserInterface $requestParser
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Label/DeleteAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class DeleteAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'delete';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         UiInterface $ui
47:     ) {
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Label/ShowAddLabelAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ShowAddLabelAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show_add_label';
40: 
41:     private ConfigContainerInterface $configContainer;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     public function __construct(
46:         ConfigContainerInterface $configContainer,
47:         UiInterface $ui
48:     ) {
49:         $this->configContainer = $configContainer;
50:         $this->ui              = $ui;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Label/ShowAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Util\UiInterface;
37: use Ampache\Repository\LabelRepositoryInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class ShowAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'show';
45: 
46:     private ConfigContainerInterface $configContainer;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private PrivilegeCheckerInterface $privilegeChecker;
53: 
54:     private LabelRepositoryInterface $labelRepository;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Label/ConfirmDeleteAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Label\Deletion\LabelDeleterInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class ConfirmDeleteAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'confirm_delete';
43: 
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private UiInterface $ui;
47: 
48:     private LabelDeleterInterface $labelDeleter;
49: 
50:     private LabelRepositoryInterface $labelRepository;
51: 
52:     public function __construct(
53:         ConfigContainerInterface $configContainer,
54:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Login/DefaultAction.php
ERROR: Parse error at line 55 column 13:

45: use Psr\Http\Message\ResponseFactoryInterface;
46: use Psr\Http\Message\ResponseInterface;
47: use Psr\Http\Message\ServerRequestInterface;
48: use Psr\Log\LoggerInterface;
49: use Teapot\StatusCode;
50: 
51: final class DefaultAction implements ApplicationActionInterface
52: {
53:     public const REQUEST_KEY = 'default';
54: 
55:     private RequestParserInterface $requestParser;
                ^
56: 
57:     private ConfigContainerInterface $configContainer;
58: 
59:     private AuthenticationManagerInterface $authenticationManager;
60: 
61:     private ResponseFactoryInterface $responseFactory;
62: 
63:     private LoggerInterface $logger;
64: 
65:     private NetworkCheckerInterface $networkChecker;

ERROR: Unable to parse file: /code/src/Module/Application/Image/ShowAction.php
ERROR: Parse error at line 57 column 13:

47: use Psr\Http\Message\ResponseFactoryInterface;
48: use Psr\Http\Message\ResponseInterface;
49: use Psr\Http\Message\ServerRequestInterface;
50: use Psr\Http\Message\StreamFactoryInterface;
51: use Psr\Log\LoggerInterface;
52: 
53: final class ShowAction implements ApplicationActionInterface
54: {
55:     public const REQUEST_ACTION = 'show';
56: 
57:     private RequestParserInterface $requestParser;
                ^
58: 
59:     private AuthenticationManagerInterface $authenticationManager;
60: 
61:     private ConfigContainerInterface $configContainer;
62: 
63:     private Horde_Browser $horde_browser;
64: 
65:     private ResponseFactoryInterface $responseFactory;
66: 
67:     private StreamFactoryInterface $streamFactory;

ERROR: Unable to parse file: /code/src/Module/Application/Browse/SmartPlaylistAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class SmartPlaylistAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'smartplaylist';
38: 
39:     private ModelFactoryInterface $modelFactory;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ModelFactoryInterface $modelFactory,
45:         UiInterface $ui
46:     ) {
47:         $this->modelFactory = $modelFactory;
48:         $this->ui           = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Browse/PlaylistAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class PlaylistAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'playlist';
38: 
39:     private ModelFactoryInterface $modelFactory;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ModelFactoryInterface $modelFactory,
45:         UiInterface $ui
46:     ) {
47:         $this->modelFactory = $modelFactory;
48:         $this->ui           = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Browse/FileAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class FileAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'file';
38: 
39:     private ModelFactoryInterface $modelFactory;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ModelFactoryInterface $modelFactory,
45:         UiInterface $ui
46:     ) {
47:         $this->modelFactory = $modelFactory;
48:         $this->ui           = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Browse/AlbumDiskAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class AlbumDiskAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'album_disk';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/PodcastAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class PodcastAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'podcast';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/TagAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\Ui;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class TagAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'tag';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private UiInterface $ui;
47: 
48:     public function __construct(
49:         RequestParserInterface $requestParser,
50:         ModelFactoryInterface $modelFactory,
51:         UiInterface $ui
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/VideoAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class VideoAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'video';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/LabelAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class LabelAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'label';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/ArtistAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ArtistAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'artist';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/AlbumArtistAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class AlbumArtistAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'album_artist';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/CatalogAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class CatalogAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'catalog';
38: 
39:     private ModelFactoryInterface $modelFactory;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ModelFactoryInterface $modelFactory,
45:         UiInterface $ui
46:     ) {
47:         $this->modelFactory = $modelFactory;
48:         $this->ui           = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Browse/BroadcastAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class BroadcastAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'broadcast';
38: 
39:     private ModelFactoryInterface $modelFactory;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ModelFactoryInterface $modelFactory,
45:         UiInterface $ui
46:     ) {
47:         $this->modelFactory = $modelFactory;
48:         $this->ui           = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Browse/LiveStreamAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class LiveStreamAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'live_stream';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/PersonalVideoAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class PersonalVideoAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'personal_video';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/TvShowEpisodeAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class TvShowEpisodeAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'tvshow_episode';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/PodcastEpisodeAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class PodcastEpisodeAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'podcast_episode';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/ClipAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ClipAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'clip';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/MovieAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class MovieAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'movie';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/TvShowSeasonAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class TvShowSeasonAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'tvshow_season';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/PrivateMessageAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\System\Core;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class PrivateMessageAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'pvmsg';
39: 
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ModelFactoryInterface $modelFactory,
46:         UiInterface $ui
47:     ) {
48:         $this->modelFactory = $modelFactory;
49:         $this->ui           = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Browse/TvShowAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class TvShowAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'tvshow';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/SongAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class SongAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'song';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Browse/AlbumAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class AlbumAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'album';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Installation/DefaultAction.php
ERROR: Parse error at line 47 column 13:

37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: /**
41:  * @todo This action has to be split up. Too complicated atm
42:  */
43: final class DefaultAction implements ApplicationActionInterface
44: {
45:     public const REQUEST_KEY = 'default';
46: 
47:     private InstallationHelperInterface $installationHelper;
                ^
48: 
49:     private EnvironmentInterface $environment;
50: 
51:     public function __construct(
52:         InstallationHelperInterface $installationHelper,
53:         EnvironmentInterface $environment
54:     ) {
55:         $this->installationHelper = $installationHelper;
56:         $this->environment        = $environment;
57:     }

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/DeletePlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Psr\Http\Message\ResponseFactoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Teapot\StatusCode;
37: 
38: final class DeletePlaylistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'delete_playlist';
41: 
42:     private ModelFactoryInterface $modelFactory;
                ^
43: 
44:     private ResponseFactoryInterface $responseFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         ModelFactoryInterface $modelFactory,
50:         ResponseFactoryInterface $responseFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/ShowImportPlaylistAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Application\ApplicationActionInterface;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowImportPlaylistAction implements ApplicationActionInterface
35: {
36:     public const REQUEST_KEY = 'show_import_playlist';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     public function __construct(
41:         UiInterface $ui
42:     ) {
43:         $this->ui = $ui;
44:     }
45: 
46:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
47:     {
48:         $this->ui->showHeader();

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/ImportPlaylistAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\ApplicationActionInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ImportPlaylistAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'import_playlist';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         UiInterface $ui,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         $this->ui              = $ui;
50:         $this->configContainer = $configContainer;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/SetTrackNumbersAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\Exception\AccessDeniedException;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class SetTrackNumbersAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'set_track_numbers';
40: 
41:     private RequestParserInterface $requestParser;
                ^
42: 
43:     private ModelFactoryInterface $modelFactory;
44: 
45:     private UiInterface $ui;
46: 
47:     public function __construct(
48:         RequestParserInterface $requestParser,
49:         ModelFactoryInterface $modelFactory,
50:         UiInterface $ui
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/RefreshPlaylistAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Psr\Http\Message\ResponseFactoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: use Teapot\StatusCode;
36: 
37: final class RefreshPlaylistAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'refresh_playlist';
40: 
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private ResponseFactoryInterface $responseFactory;
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ModelFactoryInterface $modelFactory,
49:         ResponseFactoryInterface $responseFactory,
50:         ConfigContainerInterface $configContainer
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/RemoveDuplicatesAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\Exception\AccessDeniedException;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class RemoveDuplicatesAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'remove_duplicates';
40: 
41:     private RequestParserInterface $requestParser;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     public function __construct(
48:         RequestParserInterface $requestParser,
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/SortTrackAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\Exception\AccessDeniedException;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class SortTrackAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'sort_tracks';
40: 
41:     private RequestParserInterface $requestParser;
                ^
42: 
43:     private ModelFactoryInterface $modelFactory;
44: 
45:     private UiInterface $ui;
46: 
47:     public function __construct(
48:         RequestParserInterface $requestParser,
49:         ModelFactoryInterface $modelFactory,
50:         UiInterface $ui
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/CreatePlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class CreatePlaylistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'create_playlist';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     public function __construct(
45:         UiInterface $ui
46:     ) {
47:         $this->ui = $ui;
48:     }
49: 
50:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
51:     {
52:         /* Check rights */

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/ShowAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Util\UiInterface;
32: use Ampache\Repository\Model\ModelFactoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: use Psr\Log\LoggerInterface;
36: 
37: final class ShowAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private LoggerInterface $logger;
44: 
45:     private ModelFactoryInterface $modelFactory;
46:     public function __construct(
47:         UiInterface $ui,
48:         LoggerInterface $logger,
49:         ModelFactoryInterface $modelFactory
50:     ) {
51:         $this->ui           = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/Playlist/AddSongAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Application\Exception\AccessDeniedException;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class AddSongAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'add_song';
40: 
41:     private RequestParserInterface $requestParser;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     public function __construct(
48:         RequestParserInterface $requestParser,
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Logout/LogoutAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\System\LegacyLogger;
31: use Ampache\Module\System\Session;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class LogoutAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'logout';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private AuthenticationManagerInterface $authenticationManager;
43: 
44:     private LoggerInterface $logger;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         AuthenticationManagerInterface $authenticationManager,
49:         LoggerInterface $logger
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/StatisticGraph/ShowAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\InterfaceImplementationChecker;
36: use Ampache\Module\Util\RequestParserInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Psr\Log\LoggerInterface;
40: 
41: final class ShowAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     private LoggerInterface $logger;
50: 
51:     public function __construct(
52:         RequestParserInterface $requestParser,
53:         ConfigContainerInterface $configContainer,
54:         LoggerInterface $logger
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Mashup/WrappedAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\RequestParserInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class WrappedAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'wrapped';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private RequestParserInterface $requestParser;
46: 
47:     private UiInterface $ui;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         RequestParserInterface $requestParser,
52:         UiInterface $ui
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Mashup/ShowAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Util\InterfaceImplementationChecker;
32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class ShowAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show';
40: 
41:     private RequestParserInterface $requestParser;
                ^
42: 
43:     private UiInterface $ui;
44: 
45:     public function __construct(
46:         RequestParserInterface $requestParser,
47:         UiInterface $ui
48:     ) {
49:         $this->requestParser = $requestParser;
50:         $this->ui            = $ui;
51:     }

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/AdminUpdatePreferencesAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\RequestParserInterface;
36: use Psr\Http\Message\ResponseFactoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Teapot\StatusCode;
40: 
41: final class AdminUpdatePreferencesAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'admin_update_preferences';
44: 
45:     private PreferencesFromRequestUpdaterInterface $preferencesFromRequestUpdater;
                ^
46: 
47:     private ResponseFactoryInterface $responseFactory;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private RequestParserInterface $requestParser;
52: 
53:     public function __construct(
54:         PreferencesFromRequestUpdaterInterface $preferencesFromRequestUpdater,
55:         ResponseFactoryInterface $responseFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/GrantAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\AccessLevelEnum;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class GrantAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'grant';
42: 
43:     private RequestParserInterface $requestParser;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         RequestParserInterface $requestParser,
51:         UiInterface $ui,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/UpdatePreferencesAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\System\Core;
35: use Ampache\Module\System\PreferencesFromRequestUpdaterInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class UpdatePreferencesAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'update_preferences';
43: 
44:     private PreferencesFromRequestUpdaterInterface $preferencesFromRequestUpdater;
                ^
45: 
46:     private UiInterface $ui;
47: 
48:     private RequestParserInterface $requestParser;
49: 
50:     public function __construct(
51:         PreferencesFromRequestUpdaterInterface $preferencesFromRequestUpdater,
52:         UiInterface $ui,
53:         RequestParserInterface $requestParser
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/UpdateUserAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\System\Core;
37: use Ampache\Module\Util\RequestParserInterface;
38: use Ampache\Module\Util\UiInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: 
42: final class UpdateUserAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'update_user';
45: 
46:     private UiInterface $ui;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private RequestParserInterface $requestParser;
51: 
52:     public function __construct(
53:         UiInterface $ui,
54:         ConfigContainerInterface $configContainer,
55:         RequestParserInterface $requestParser
56:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/UserAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class UserAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'user';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     public function __construct(
43:         UiInterface $ui
44:     ) {
45:         $this->ui = $ui;
46:     }
47: 
48:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
49:     {
50:         if ($gatekeeper->mayAccess(AccessLevelEnum::TYPE_INTERFACE, AccessLevelEnum::LEVEL_ADMIN) === false) {

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/AdminAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class AdminAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'admin';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     public function __construct(
43:         UiInterface $ui
44:     ) {
45:         $this->ui = $ui;
46:     }
47: 
48:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
49:     {
50:         // Make sure only admins here

ERROR: Unable to parse file: /code/src/Module/Application/Preferences/ShowAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Application\ApplicationActionInterface;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowAction implements ApplicationActionInterface
35: {
36:     public const REQUEST_KEY = 'show';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     public function __construct(
41:         UiInterface $ui
42:     ) {
43:         $this->ui = $ui;
44:     }
45: 
46:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
47:     {
48:         $user = $gatekeeper->getUser();

ERROR: Unable to parse file: /code/src/Module/Application/Stream/TmpPlaylistAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\ModelFactoryInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class TmpPlaylistAction extends AbstractStreamAction
37: {
38:     public const REQUEST_KEY = 'tmp_playlist';
39: 
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private ConfigContainerInterface $configContainer;
43: 
44:     public function __construct(
45:         ModelFactoryInterface $modelFactory,
46:         LoggerInterface $logger,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         parent::__construct($logger, $configContainer);
50:         $this->modelFactory    = $modelFactory;

ERROR: Unable to parse file: /code/src/Module/Application/Stream/RandomAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Repository\Model\Random;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class RandomAction extends AbstractStreamAction
37: {
38:     public const REQUEST_KEY = 'random';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     public function __construct(
43:         LoggerInterface $logger,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         $this->configContainer = $configContainer;
47: 
48:         parent::__construct($logger, $configContainer);
49:     }
50: 

ERROR: Unable to parse file: /code/src/Module/Application/Stream/ArtistRandomAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Repository\SongRepositoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Log\LoggerInterface;
37: 
38: final class ArtistRandomAction extends AbstractStreamAction
39: {
40:     public const REQUEST_KEY = 'artist_random';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     private SongRepositoryInterface $songRepository;
49: 
50:     public function __construct(
51:         RequestParserInterface $requestParser,
52:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stream/PlaylistRandomAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\Model\ModelFactoryInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: use Psr\Log\LoggerInterface;
34: 
35: final class PlaylistRandomAction extends AbstractStreamAction
36: {
37:     public const REQUEST_KEY = 'playlist_random';
38: 
39:     private RequestParserInterface $requestParser;
                ^
40: 
41:     private ModelFactoryInterface $modelFactory;
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         RequestParserInterface $requestParser,
47:         ModelFactoryInterface $modelFactory,
48:         LoggerInterface $logger,
49:         ConfigContainerInterface $configContainer

ERROR: Unable to parse file: /code/src/Module/Application/Stream/AbstractStreamAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Playback\Stream;
37: use Ampache\Module\Playback\Stream_Playlist;
38: use Ampache\Module\System\Core;
39: use Ampache\Module\System\LegacyLogger;
40: use Ampache\Module\System\Session;
41: use Psr\Http\Message\ResponseInterface;
42: use Psr\Log\LoggerInterface;
43: 
44: abstract class AbstractStreamAction implements ApplicationActionInterface
45: {
46:     private LoggerInterface $logger;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     protected function __construct(
51:         LoggerInterface $logger,
52:         ConfigContainerInterface $configContainer
53:     ) {
54:         $this->logger          = $logger;
55:         $this->configContainer = $configContainer;
56:     }

ERROR: Unable to parse file: /code/src/Module/Application/Stream/AlbumRandomAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Repository\AlbumRepositoryInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class AlbumRandomAction extends AbstractStreamAction
37: {
38:     public const REQUEST_KEY = 'album_random';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private AlbumRepositoryInterface $albumRepository;
43: 
44:     public function __construct(
45:         LoggerInterface $logger,
46:         ConfigContainerInterface $configContainer,
47:         AlbumRepositoryInterface $albumRepository
48:     ) {
49:         parent::__construct($logger, $configContainer);
50:         $this->configContainer = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Application/Stream/SearchRandomAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Repository\Model\ModelFactoryInterface;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: use Psr\Log\LoggerInterface;
33: 
34: final class SearchRandomAction extends AbstractStreamAction
35: {
36:     public const REQUEST_KEY = 'search_random';
37: 
38:     private ModelFactoryInterface $modelFactory;
                ^
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     public function __construct(
43:         ModelFactoryInterface $modelFactory,
44:         LoggerInterface $logger,
45:         ConfigContainerInterface $configContainer
46:     ) {
47:         parent::__construct($logger, $configContainer);
48:         $this->modelFactory    = $modelFactory;

ERROR: Unable to parse file: /code/src/Module/Application/Stream/DemocraticAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Repository\Model\ModelFactoryInterface;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: use Psr\Log\LoggerInterface;
36: 
37: final class DemocraticAction extends AbstractStreamAction
38: {
39:     public const REQUEST_KEY = 'democratic';
40: 
41:     private RequestParserInterface $requestParser;
                ^
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     public function __construct(
48:         RequestParserInterface $requestParser,
49:         LoggerInterface $logger,
50:         ConfigContainerInterface $configContainer,
51:         ModelFactoryInterface $modelFactory

ERROR: Unable to parse file: /code/src/Module/Application/Stream/BasketAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\System\Core;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class BasketAction extends AbstractStreamAction
37: {
38:     public const REQUEST_KEY = 'basket';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     public function __construct(
43:         LoggerInterface $logger,
44:         ConfigContainerInterface $configContainer
45:     ) {
46:         parent::__construct($logger, $configContainer);
47:         $this->configContainer = $configContainer;
48:     }
49: 
50:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface

ERROR: Unable to parse file: /code/src/Module/Application/Stream/PlayFavoriteAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Repository\Model\User;
33: use Ampache\Repository\SongRepositoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Log\LoggerInterface;
37: 
38: final class PlayFavoriteAction extends AbstractStreamAction
39: {
40:     public const REQUEST_KEY = 'play_favorite';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private SongRepositoryInterface $songRepository;
45: 
46:     public function __construct(
47:         LoggerInterface $logger,
48:         ConfigContainerInterface $configContainer,
49:         SongRepositoryInterface $songRepository
50:     ) {
51:         parent::__construct($logger, $configContainer);
52:         $this->configContainer = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Application/Stream/PlayItemAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Util\InterfaceImplementationChecker;
34: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Psr\Log\LoggerInterface;
38: 
39: final class PlayItemAction extends AbstractStreamAction
40: {
41:     public const REQUEST_KEY = 'play_item';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     public function __construct(
46:         LoggerInterface $logger,
47:         ConfigContainerInterface $configContainer
48:     ) {
49:         parent::__construct($logger, $configContainer);
50:         $this->configContainer = $configContainer;
51:     }
52: 
53:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface

ERROR: Unable to parse file: /code/src/Module/Application/Waveform/ShowAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Repository\Model\Song;
36: use Psr\Http\Message\ResponseFactoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Psr\Http\Message\StreamFactoryInterface;
40: 
41: final class ShowAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private ResponseFactoryInterface $responseFactory;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private StreamFactoryInterface $streamFactory;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         ResponseFactoryInterface $responseFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Share/ConsumeAction.php
ERROR: Parse error at line 50 column 13:

40: use Ampache\Repository\ShareRepositoryInterface;
41: use DateTime;
42: use Psr\Container\ContainerInterface;
43: use Psr\Http\Message\ResponseInterface;
44: use Psr\Http\Message\ServerRequestInterface;
45: 
46: final class ConsumeAction implements ApplicationActionInterface
47: {
48:     public const REQUEST_KEY = 'consume';
49: 
50:     private RequestParserInterface $requestParser;
                ^
51: 
52:     private ConfigContainerInterface $configContainer;
53: 
54:     private NetworkCheckerInterface $networkChecker;
55: 
56:     private ContainerInterface $dic;
57: 
58:     private UiInterface $ui;
59: 
60:     private ShareRepositoryInterface $shareRepository;

ERROR: Unable to parse file: /code/src/Module/Application/Share/DeleteAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: /**
40:  * Deletes a share-item
41:  */
42: final class DeleteAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'delete';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private UiInterface $ui;
51: 
52:     private ShareRepositoryInterface $shareRepository;
53: 
54:     public function __construct(
55:         RequestParserInterface $requestParser,
56:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Application/Share/ShowDeleteAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\RequestParserInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowDeleteAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_delete';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private UiInterface $ui;
47: 
48: 
49:     public function __construct(
50:         RequestParserInterface $requestParser,
51:         ConfigContainerInterface $configContainer,
52:         UiInterface $ui

ERROR: Unable to parse file: /code/src/Module/Application/Share/CleanAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Cleans up expired share items
40:  */
41: final class CleanAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'clean';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ShareRepositoryInterface $shareRepository;
50: 
51:     public function __construct(
52:         ConfigContainerInterface $configContainer,
53:         UiInterface $ui,
54:         ShareRepositoryInterface $shareRepository
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Share/ExternalShareAction.php
ERROR: Parse error at line 51 column 13:

41: use Ampache\Module\User\PasswordGeneratorInterface;
42: use Psr\Http\Message\ResponseFactoryInterface;
43: use Psr\Http\Message\ResponseInterface;
44: use Psr\Http\Message\ServerRequestInterface;
45: use Teapot\StatusCode;
46: 
47: final class ExternalShareAction implements ApplicationActionInterface
48: {
49:     public const REQUEST_KEY = 'external_share';
50: 
51:     private RequestParserInterface $requestParser;
                ^
52: 
53:     private ConfigContainerInterface $configContainer;
54: 
55:     private PasswordGeneratorInterface $passwordGenerator;
56: 
57:     private ResponseFactoryInterface $responseFactory;
58: 
59:     private FunctionCheckerInterface $functionChecker;
60: 
61:     private ShareCreatorInterface $shareCreator;

ERROR: Unable to parse file: /code/src/Module/Application/Share/CreateAction.php
ERROR: Parse error at line 55 column 13:

45: use Ampache\Repository\Model\Song;
46: use Ampache\Repository\Model\Video;
47: use Psr\Http\Message\ResponseInterface;
48: use Psr\Http\Message\ServerRequestInterface;
49: use Psr\Log\LoggerInterface;
50: 
51: final class CreateAction implements ApplicationActionInterface
52: {
53:     public const REQUEST_KEY = 'create';
54: 
55:     private ConfigContainerInterface $configContainer;
                ^
56: 
57:     private UiInterface $ui;
58: 
59:     private LoggerInterface $logger;
60: 
61:     private PasswordGeneratorInterface $passwordGenerator;
62: 
63:     private ZipHandlerInterface $zipHandler;
64: 
65:     private RequestParserInterface $requestParser;

ERROR: Unable to parse file: /code/src/Module/Application/Share/ShowCreateAction.php
ERROR: Parse error at line 51 column 13:

41: use Ampache\Module\Util\UiInterface;
42: use Ampache\Repository\Model\Song;
43: use Ampache\Repository\Model\Video;
44: use Psr\Http\Message\ResponseInterface;
45: use Psr\Http\Message\ServerRequestInterface;
46: 
47: final class ShowCreateAction implements ApplicationActionInterface
48: {
49:     public const REQUEST_KEY = 'show_create';
50: 
51:     private RequestParserInterface $requestParser;
                ^
52: 
53:     private ConfigContainerInterface $configContainer;
54: 
55:     private UiInterface $ui;
56: 
57:     private PasswordGeneratorInterface $passwordGenerator;
58: 
59:     private ZipHandlerInterface $zipHandler;
60: 
61:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Test/ConfigAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Exception;
34: use Psr\Http\Message\ResponseFactoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ConfigAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'config';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private ResponseFactoryInterface $responseFactory;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         ResponseFactoryInterface $responseFactory
49:     ) {
50:         $this->configContainer = $configContainer;
51:         $this->responseFactory = $responseFactory;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Test/ShowAction.php
ERROR: Parse error at line 43 column 13:

33: use Exception;
34: use Psr\Http\Message\ResponseFactoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Teapot\StatusCode;
38: 
39: final class ShowAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private ResponseFactoryInterface $responseFactory;
46: 
47:     public function __construct(
48:         ConfigContainerInterface $configContainer,
49:         ResponseFactoryInterface $responseFactory
50:     ) {
51:         $this->configContainer = $configContainer;
52:         $this->responseFactory = $responseFactory;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/TvShow/DeleteAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class DeleteAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'delete';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         UiInterface $ui
47:     ) {
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/TvShow/ShowAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show';
39: 
40:     private RequestParserInterface $requestParser;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     public function __construct(
47:         RequestParserInterface $requestParser,
48:         UiInterface $ui,
49:         ModelFactoryInterface $modelFactory
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/TvShow/ConfirmDeleteAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Application\Exception\AccessDeniedException;
35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class ConfirmDeleteAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'confirm_delete';
43: 
44:     private RequestParserInterface $requestParser;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     private UiInterface $ui;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     public function __construct(
53:         RequestParserInterface $requestParser,
54:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentPodcastEpisodeAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentPodcastEpisodeAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_podcast_episode';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UploadAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UploadAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'upload';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentAlbumArtistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentAlbumArtistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_album_artist';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestAlbumArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestAlbumArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_album_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestAlbumAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestAlbumAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_album';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentVideoAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Ampache\Repository\VideoRepositoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class RecentVideoAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'recent_video';
43: 
44:     private UiInterface $ui;
                ^
45: 
46:     private ModelFactoryInterface $modelFactory;
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private VideoRepositoryInterface $videoRepository;
51: 
52:     public function __construct(
53:         UiInterface $ui,
54:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularSongAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularSongAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_song';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagVideoAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Ampache\Repository\VideoRepositoryInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class UserflagVideoAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'userflag_video';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private VideoRepositoryInterface $videoRepository;
52: 
53:     public function __construct(
54:         UiInterface $ui,
55:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestAlbumDiskAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestAlbumDiskAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_album_disk';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularAlbumArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularAlbumArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_album_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagSongAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagSongAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_song';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49: 
50:     public function __construct(
51:         UiInterface $ui,
52:         ModelFactoryInterface $modelFactory,
53:         ConfigContainerInterface $configContainer

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestVideoAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Ampache\Repository\VideoRepositoryInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class HighestVideoAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'highest_video';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private VideoRepositoryInterface $videoRepository;
52: 
53:     public function __construct(
54:         UiInterface $ui,
55:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/GraphAction.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Authorization\GuiGatekeeperInterface;
29: use Ampache\Module\Util\UiInterface;
30: use Psr\Http\Message\ResponseInterface;
31: use Psr\Http\Message\ServerRequestInterface;
32: 
33: final class GraphAction extends AbstractGraphRendererAction
34: {
35:     public const REQUEST_KEY = 'graph';
36: 
37:     private UiInterface $ui;
                ^
38: 
39:     public function __construct(
40:         UiInterface $ui
41:     ) {
42:         $this->ui = $ui;
43:     }
44: 
45:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
46:     {
47:         $this->ui->showHeader();

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagPodcastEpisodeAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagPodcastEpisodeAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_podcast_episode';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49: 
50:     public function __construct(
51:         UiInterface $ui,
52:         ModelFactoryInterface $modelFactory,
53:         ConfigContainerInterface $configContainer

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentAlbumDiskAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentAlbumDiskAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_album_disk';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestPodcastEpisodeAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestPodcastEpisodeAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_podcast_episode';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentPlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentPlaylistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_playlist';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagAlbumArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagAlbumArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_album_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/ShareAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Util\Ui;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\ShareRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShareAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'share';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     private ShareRepositoryInterface $shareRepository;
50: 
51:     public function __construct(
52:         UiInterface $ui,
53:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularAlbumAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularAlbumAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_album';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestSongAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestSongAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_song';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/WantedAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Ampache\Repository\WantedRepositoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: final class WantedAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'wanted';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private ModelFactoryInterface $modelFactory;
44: 
45:     private WantedRepositoryInterface $wantedRepository;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ModelFactoryInterface $modelFactory,
50:         WantedRepositoryInterface $wantedRepository
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestPlaylistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestPlaylistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_playlist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagAlbumAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagAlbumAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_album';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentAlbumAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentAlbumAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_album';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentSongAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentSongAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_song';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestSongAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestSongAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_song';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/ShowUserAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Repository\UserActivityRepositoryInterface;
36: use Ampache\Repository\UserFollowerRepositoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Psr\Log\LoggerInterface;
40: 
41: final class ShowUserAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show_user';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private LoggerInterface $logger;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private UserActivityRepositoryInterface $useractivityRepository;
52: 
53:     private UserActivityRendererInterface $userActivityRenderer;
54: 
55:     private UserFollowerRepositoryInterface $userFollowerRepository;

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestPlaylistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestPlaylistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_playlist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestAlbumAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestAlbumAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_album';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestPodcastEpisodeAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestPodcastEpisodeAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_podcast_episode';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularAlbumDiskAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularAlbumDiskAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_album_disk';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestVideoAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\UiInterface;
36: use Ampache\Repository\Model\Video;
37: use Ampache\Repository\VideoRepositoryInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class NewestVideoAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'newest_video';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private VideoRepositoryInterface $videoRepository;
52: 
53:     public function __construct(
54:         UiInterface $ui,
55:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagPlaylistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagPlaylistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_playlist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularVideoAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\System\Core;
36: use Ampache\Module\Util\UiInterface;
37: use Ampache\Repository\VideoRepositoryInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class PopularVideoAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'popular_video';
44: 
45:     private UiInterface $ui;
                ^
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private VideoRepositoryInterface $videoRepository;
52: 
53:     public function __construct(
54:         UiInterface $ui,
55:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularPodcastEpisodeAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularPodcastEpisodeAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_podcast_episode';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/PopularPlaylistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\System\Core;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class PopularPlaylistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'popular_playlist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/RecentArtistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Statistics\Stats;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class RecentArtistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'recent_artist';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ModelFactoryInterface $modelFactory,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/HighestAlbumDiskAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class HighestAlbumDiskAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'highest_album_disk';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/ShowAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowAction extends AbstractGraphRendererAction
39: {
40:     public const REQUEST_KEY = 'show';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private GuiFactoryInterface $guiFactory;
47: 
48:     private TalFactoryInterface $talFactory;
49: 
50:     public function __construct(
51:         UiInterface $ui,
52:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Application/Stats/NewestAlbumArtistAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class NewestAlbumArtistAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'newest_album_artist';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Stats/UserflagAlbumDiskAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\ApplicationActionInterface;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class UserflagAlbumDiskAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'userflag_album_disk';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ModelFactoryInterface $modelFactory,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/ApplicationRunner.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\UiInterface;
33: use Narrowspark\HttpEmitter\SapiEmitter;
34: use Psr\Container\ContainerExceptionInterface;
35: use Psr\Container\ContainerInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Psr\Log\LoggerInterface;
38: use Throwable;
39: 
40: final class ApplicationRunner
41: {
42:     private ContainerInterface $dic;
                ^
43: 
44:     private LoggerInterface $logger;
45: 
46:     private GatekeeperFactoryInterface $gatekeeperFactory;
47: 
48:     private UiInterface $ui;
49: 
50:     public function __construct(
51:         ContainerInterface $dic,
52:         LoggerInterface $logger,

ERROR: Unable to parse file: /code/src/Module/Application/DemocraticPlayback/DeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\AccessLevelEnum;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class DeleteAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'delete';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/DemocraticPlayback/ManagePlaylistsAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\Ui;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class ManagePlaylistsAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'manage_playlists';
43: 
44:     private UiInterface $ui;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {
52:         $this->ui              = $ui;
53:         $this->configContainer = $configContainer;
54:     }

ERROR: Unable to parse file: /code/src/Module/Application/DemocraticPlayback/ManageAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\Ui;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class ManageAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'manage';
43: 
44:     private UiInterface $ui;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer
51:     ) {
52:         $this->ui              = $ui;
53:         $this->configContainer = $configContainer;
54:     }

ERROR: Unable to parse file: /code/src/Module/Application/DemocraticPlayback/ShowPlaylistAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Authorization\GuiGatekeeperInterface;
37: use Ampache\Module\Util\Ui;
38: use Ampache\Module\Util\UiInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: 
42: final class ShowPlaylistAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'show_playlist';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private ConfigContainerInterface $configContainer;
51: 
52:     private ModelFactoryInterface $modelFactory;
53: 
54:     public function __construct(
55:         RequestParserInterface $requestParser,
56:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/DemocraticPlayback/CreateAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Psr\Http\Message\ResponseFactoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Teapot\StatusCode;
40: 
41: final class CreateAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'create';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private ResponseFactoryInterface $responseFactory;
48: 
49:     private RequestParserInterface $requestParser;
50: 
51:     public function __construct(
52:         ConfigContainerInterface $configContainer,
53:         ResponseFactoryInterface $responseFactory,
54:         RequestParserInterface $requestParser
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/DemocraticPlayback/ShowCreateAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\Ui;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShowCreateAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show_create';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/PrivateMessage/DeleteAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class DeleteAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'delete';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         $this->configContainer = $configContainer;
51:         $this->ui              = $ui;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/PrivateMessage/AddMessageAction.php
ERROR: Parse error at line 48 column 13:

38: use Ampache\Module\User\PrivateMessage\PrivateMessageCreatorInterface;
39: use Ampache\Module\Util\UiInterface;
40: use PHPMailer\PHPMailer\Exception;
41: use Psr\Http\Message\ResponseInterface;
42: use Psr\Http\Message\ServerRequestInterface;
43: 
44: final class AddMessageAction implements ApplicationActionInterface
45: {
46:     public const REQUEST_KEY = 'add_message';
47: 
48:     private ConfigContainerInterface $configContainer;
                ^
49: 
50:     private UiInterface $ui;
51: 
52:     private PrivateMessageCreatorInterface $privateMessageCreator;
53: 
54:     private ModelFactoryInterface $modelFactory;
55: 
56:     public function __construct(
57:         ConfigContainerInterface $configContainer,
58:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/PrivateMessage/ShowAddMessageAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Ampache\Repository\PrivateMessageRepositoryInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class ShowAddMessageAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'show_add_message';
43: 
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private UiInterface $ui;
47: 
48:     private ModelFactoryInterface $modelFactory;
49: 
50:     private PrivateMessageRepositoryInterface $privateMessageRepository;
51: 
52:     public function __construct(
53:         ConfigContainerInterface $configContainer,
54:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/PrivateMessage/SetIsReadAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\PrivateMessageRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class SetIsReadAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'set_is_read';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private PrivateMessageRepositoryInterface $privateMessageRepository;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui,
52:         PrivateMessageRepositoryInterface $privateMessageRepository
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/PrivateMessage/ShowAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\PrivateMessageRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShowAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     private PrivateMessageRepositoryInterface $privateMessageRepository;
48: 
49:     public function __construct(
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer,
52:         PrivateMessageRepositoryInterface $privateMessageRepository
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/PrivateMessage/ConfirmDeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\PrivateMessageRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ConfirmDeleteAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'confirm_delete';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private PrivateMessageRepositoryInterface $privateMessageRepository;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui,
52:         PrivateMessageRepositoryInterface $privateMessageRepository
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/LostPassword/SendAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\User\NewPasswordSenderInterface;
35: use Ampache\Module\Util\Mailer;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class SendAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'send';
43: 
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private NewPasswordSenderInterface $newPasswordSender;
47: 
48:     private UiInterface $ui;
49: 
50:     public function __construct(
51:         ConfigContainerInterface $configContainer,
52:         NewPasswordSenderInterface $newPasswordSender,
53:         UiInterface $ui
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/LostPassword/ShowAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\Mailer;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         $this->configContainer   = $configContainer;
51:         $this->ui                = $ui;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Update/UpdateAction.php
ERROR: Parse error at line 49 column 13:

39: use Psr\Http\Message\ResponseFactoryInterface;
40: use Psr\Http\Message\ResponseInterface;
41: use Psr\Http\Message\ServerRequestInterface;
42: use Psr\Http\Message\StreamFactoryInterface;
43: use Teapot\StatusCode;
44: 
45: final class UpdateAction implements ApplicationActionInterface
46: {
47:     public const REQUEST_KEY = 'update';
48: 
49:     private TalFactoryInterface $talFactory;
                ^
50: 
51:     private GuiFactoryInterface $guiFactory;
52: 
53:     private ResponseFactoryInterface $responseFactory;
54: 
55:     private ConfigContainerInterface $configContainer;
56: 
57:     private StreamFactoryInterface $streamFactory;
58: 
59:     private Update\UpdaterInterface $updater;

ERROR: Unable to parse file: /code/src/Module/Application/Update/UpdatePluginsAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Repository\Model\Plugin;
34: use Psr\Http\Message\ResponseFactoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Teapot\StatusCode;
38: 
39: final class UpdatePluginsAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'update_plugins';
42: 
43:     private ResponseFactoryInterface $responseFactory;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         ResponseFactoryInterface $responseFactory,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->responseFactory = $responseFactory;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Update/ShowAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Psr\Http\Message\ResponseFactoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: use Psr\Http\Message\StreamFactoryInterface;
36: 
37: final class ShowAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show';
40: 
41:     private TalFactoryInterface $talFactory;
                ^
42: 
43:     private GuiFactoryInterface $guiFactory;
44: 
45:     private ResponseFactoryInterface $responseFactory;
46: 
47:     private StreamFactoryInterface $streamFactory;
48: 
49:     public function __construct(
50:         TalFactoryInterface $talFactory,
51:         GuiFactoryInterface $guiFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Artist/DeleteAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class DeleteAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'delete';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         UiInterface $ui
47:     ) {
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Artist/ShowAllSongsAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Ampache\Repository\SongRepositoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowAllSongsAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show_all_songs';
39: 
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     private SongRepositoryInterface $songRepository;
45: 
46:     public function __construct(
47:         ModelFactoryInterface $modelFactory,
48:         UiInterface $ui,
49:         SongRepositoryInterface $songRepository
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Artist/ShowSongsAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Ampache\Repository\SongRepositoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowSongsAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show_songs';
39: 
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     private SongRepositoryInterface $songRepository;
45: 
46:     public function __construct(
47:         ModelFactoryInterface $modelFactory,
48:         UiInterface $ui,
49:         SongRepositoryInterface $songRepository
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Artist/ShowMissingAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowMissingAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show_missing';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     private MissingArtistRetrieverInterface $missingArtistRetriever;
43: 
44:     public function __construct(
45:         UiInterface $ui,
46:         MissingArtistRetrieverInterface $missingArtistRetriever
47:     ) {
48:         $this->ui                     = $ui;
49:         $this->missingArtistRetriever = $missingArtistRetriever;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Artist/UpdateFromTagsAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class UpdateFromTagsAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'update_from_tags';
38: 
39:     private ConfigContainerInterface $configContainer;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ConfigContainerInterface $configContainer,
45:         UiInterface $ui
46:     ) {
47:         $this->configContainer = $configContainer;
48:         $this->ui              = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Artist/UpdateFromMusicBrainzAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\Model\Plugin;
36: use Ampache\Repository\Model\User;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: 
40: final class UpdateFromMusicBrainzAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'update_from_musicbrainz';
43: 
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private UiInterface $ui;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         UiInterface $ui
51:     ) {
52:         $this->configContainer = $configContainer;
53:         $this->ui              = $ui;
54:     }

ERROR: Unable to parse file: /code/src/Module/Application/Artist/ShowAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Repository\AlbumRepositoryInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: use Psr\Log\LoggerInterface;
39: 
40: final class ShowAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'show';
43: 
44:     private ModelFactoryInterface $modelFactory;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     private UiInterface $ui;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private AlbumRepositoryInterface $albumRepository;
53: 
54:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Artist/ConfirmDeleteAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Artist\Deletion\Exception\ArtistDeletionException;
37: use Ampache\Module\Authorization\GuiGatekeeperInterface;
38: use Ampache\Module\Util\UiInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: 
42: final class ConfirmDeleteAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'confirm_delete';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private UiInterface $ui;
51: 
52:     private ModelFactoryInterface $modelFactory;
53: 
54:     private ArtistDeleterInterface $artistDeleter;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Song/DeleteAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class DeleteAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'delete';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         UiInterface $ui
47:     ) {
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Song/ShowSongAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\System\LegacyLogger;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Psr\Log\LoggerInterface;
38: 
39: final class ShowSongAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show_song';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private GuiFactoryInterface $guiFactory;
48: 
49:     private TalFactoryInterface $talFactory;
50: 
51:     private LoggerInterface $logger;
52: 
53:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Song/ShowLyricsAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ShowLyricsAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'show_lyrics';
39: 
40:     private RequestParserInterface $requestParser;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     public function __construct(
47:         RequestParserInterface $requestParser,
48:         UiInterface $ui,
49:         ModelFactoryInterface $modelFactory
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Song/UpdateFromTagsAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class UpdateFromTagsAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'update_from_tags';
41: 
42:     private ModelFactoryInterface $modelFactory;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         ModelFactoryInterface $modelFactory,
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Song/ConfirmDeleteAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\Song\Deletion\SongDeleterInterface;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class ConfirmDeleteAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'confirm_delete';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     private UiInterface $ui;
50: 
51:     private ModelFactoryInterface $modelFactory;
52: 
53:     private SongDeleterInterface $songDeleter;
54: 
55:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/UpdateInstanceAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Psr\Http\Message\ResponseFactoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Teapot\StatusCode;
38: 
39: final class UpdateInstanceAction extends AbstractLocalPlayAction
40: {
41:     public const REQUEST_KEY = 'update_instance';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private ResponseFactoryInterface $responseFactory;
46: 
47:     public function __construct(
48:         ConfigContainerInterface $configContainer,
49:         ResponseFactoryInterface $responseFactory
50:     ) {
51:         parent::__construct($configContainer);
52:         $this->configContainer = $configContainer;
53:         $this->responseFactory = $responseFactory;

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/AddInstanceAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Psr\Http\Message\ResponseFactoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Teapot\StatusCode;
38: 
39: final class AddInstanceAction extends AbstractLocalPlayAction
40: {
41:     public const REQUEST_KEY = 'add_instance';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private ResponseFactoryInterface $responseFactory;
46: 
47:     public function __construct(
48:         ConfigContainerInterface $configContainer,
49:         ResponseFactoryInterface $responseFactory
50:     ) {
51:         parent::__construct($configContainer);
52:         $this->configContainer = $configContainer;
53:         $this->responseFactory = $responseFactory;

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/ShowAddInstanceAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowAddInstanceAction extends AbstractLocalPlayAction
39: {
40:     public const REQUEST_KEY = 'show_add_instance';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         parent::__construct($configContainer);
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/ShowPlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowPlaylistAction extends AbstractLocalPlayAction
39: {
40:     public const REQUEST_KEY = 'show_playlist';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         parent::__construct($configContainer);
51:         $this->configContainer = $configContainer;
52:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/EditInstanceAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class EditInstanceAction extends AbstractLocalPlayAction
39: {
40:     public const REQUEST_KEY = 'edit_instance';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         parent::__construct($configContainer);
51:         $this->configContainer = $configContainer;
52:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/AbstractLocalPlayAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\Exception\AccessDeniedException;
30: use Ampache\Module\Application\Exception\ApplicationException;
31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\Ui;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: abstract class AbstractLocalPlayAction implements ApplicationActionInterface
38: {
39:     private ConfigContainerInterface $configContainer;
                ^
40: 
41:     protected function __construct(
42:         ConfigContainerInterface $configContainer
43:     ) {
44:         $this->configContainer = $configContainer;
45:     }
46: 
47:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
48:     {
49:         if (

ERROR: Unable to parse file: /code/src/Module/Application/LocalPlay/ShowInstancesAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowInstancesAction extends AbstractLocalPlayAction
39: {
40:     public const REQUEST_KEY = 'show_instances';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         parent::__construct($configContainer);
51:         $this->configContainer = $configContainer;
52:         $this->ui              = $ui;

ERROR: Unable to parse file: /code/src/Module/Application/SmartPlaylist/DeletePlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Psr\Http\Message\ResponseFactoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Teapot\StatusCode;
37: 
38: final class DeletePlaylistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'delete_playlist';
41: 
42:     private ResponseFactoryInterface $responseFactory;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private ModelFactoryInterface $modelFactory;
47: 
48:     public function __construct(
49:         ResponseFactoryInterface $responseFactory,
50:         ConfigContainerInterface $configContainer,
51:         ModelFactoryInterface $modelFactory
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/SmartPlaylist/RefreshPlaylistAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Ampache\Repository\Model\ModelFactoryInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class RefreshPlaylistAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'refresh_playlist';
38: 
39:     private UiInterface $ui;
                ^
40: 
41:     private ModelFactoryInterface $modelFactory;
42: 
43:     public function __construct(
44:         UiInterface $ui,
45:         ModelFactoryInterface $modelFactory
46:     ) {
47:         $this->ui           = $ui;
48:         $this->modelFactory = $modelFactory;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/SmartPlaylist/CreatePlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\System\Dba;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class CreatePlaylistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'create_playlist';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     public function __construct(
47:         UiInterface $ui,
48:         ModelFactoryInterface $modelFactory
49:     ) {
50:         $this->ui           = $ui;
51:         $this->modelFactory = $modelFactory;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/SmartPlaylist/ShowAction.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: use Psr\Log\LoggerInterface;
36: 
37: final class ShowAction implements ApplicationActionInterface
38: {
39:     public const REQUEST_KEY = 'show';
40: 
41:     private UiInterface $ui;
                ^
42: 
43:     private LoggerInterface $logger;
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         LoggerInterface $logger,
50:         ModelFactoryInterface $modelFactory
51:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/SmartPlaylist/UpdatePlaylistAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Ampache\Repository\Model\ModelFactoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class UpdatePlaylistAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'update_playlist';
39: 
40:     private UiInterface $ui;
                ^
41: 
42:     private ModelFactoryInterface $modelFactory;
43: 
44:     public function __construct(
45:         UiInterface $ui,
46:         ModelFactoryInterface $modelFactory
47:     ) {
48:         $this->ui           = $ui;
49:         $this->modelFactory = $modelFactory;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Index/ShowAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Util\RequestParserInterface;
34: use Ampache\Module\Util\Ui;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ShowAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show';
42: 
43:     private RequestParserInterface $requestParser;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     public function __construct(
50:         RequestParserInterface $requestParser,
51:         UiInterface $ui,
52:         ConfigContainerInterface $configContainer
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/ImportPodcastsAction.php
ERROR: Parse error at line 59 column 13:

49: final class ImportPodcastsAction implements ApplicationActionInterface
50: {
51:     /** @var list<string> */
52:     private const EXPECTED_MIME_TYPES = [
53:         'text/x-opml+xml',
54:         'text/xml'
55:     ];
56: 
57:     public const REQUEST_KEY = 'import_podcasts';
58: 
59:     private ConfigContainerInterface $configContainer;
                ^
60: 
61:     private UiInterface $ui;
62: 
63:     private RequestParserInterface $requestParser;
64: 
65:     private CatalogLoaderInterface $catalogLoader;
66: 
67:     private PodcastOpmlImporterInterface $podcastOpmlImporter;
68: 
69:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/ShowImportPodcastsAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Renders the podcast import dialogue
40:  */
41: final class ShowImportPodcastsAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show_import_podcasts';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui
52:     ) {
53:         $this->configContainer = $configContainer;
54:         $this->ui              = $ui;
55:     }

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/DeleteAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Renders confirmation-dialogue for podcast-deletion
40:  */
41: final class DeleteAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'delete';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui
52:     ) {
53:         $this->configContainer = $configContainer;
54:         $this->ui              = $ui;
55:     }

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/ExportPodcastsAction.php
ERROR: Parse error at line 44 column 13:

34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: 
37: /**
38:  * Exports all podcast subscriptions
39:  */
40: final class ExportPodcastsAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'export_podcasts';
43: 
44:     private ConfigContainerInterface $configContainer;
                ^
45: 
46:     private PodcastExporterInterface $podcastExporter;
47: 
48:     private ResponseFactoryInterface $responseFactory;
49: 
50:     public function __construct(
51:         ConfigContainerInterface $configContainer,
52:         PodcastExporterInterface $podcastExporter,
53:         ResponseFactoryInterface $responseFactory
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/CreateAction.php
ERROR: Parse error at line 49 column 13:

39: use Ampache\Module\Util\RequestParserInterface;
40: use Ampache\Module\Util\UiInterface;
41: use Ampache\Repository\Model\Catalog;
42: use Psr\Http\Message\ResponseInterface;
43: use Psr\Http\Message\ServerRequestInterface;
44: 
45: final class CreateAction implements ApplicationActionInterface
46: {
47:     public const REQUEST_KEY = 'create';
48: 
49:     private ConfigContainerInterface $configContainer;
                ^
50: 
51:     private UiInterface $ui;
52: 
53:     private PodcastCreatorInterface $podcastCreator;
54: 
55:     private RequestParserInterface $requestParser;
56: 
57:     public function __construct(
58:         ConfigContainerInterface $configContainer,
59:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/ShowCreateAction.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: /**
39:  * Renders the podcast creation dialogue
40:  */
41: final class ShowCreateAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show_create';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui
52:     ) {
53:         $this->configContainer = $configContainer;
54:         $this->ui              = $ui;
55:     }

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/ShowAction.php
ERROR: Parse error at line 46 column 13:

36: use Psr\Http\Message\ServerRequestInterface;
37: use Psr\Log\LoggerInterface;
38: 
39: /**
40:  * Renders the podcast overview
41:  */
42: final class ShowAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'show';
45: 
46:     private ConfigContainerInterface $configContainer;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private PodcastRepositoryInterface $podcastRepository;
53: 
54:     public function __construct(
55:         ConfigContainerInterface $configContainer,
56:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Podcast/ConfirmDeleteAction.php
ERROR: Parse error at line 48 column 13:

38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: /**
42:  * Actually deletes a podcast object
43:  */
44: final class ConfirmDeleteAction implements ApplicationActionInterface
45: {
46:     public const REQUEST_KEY = 'confirm_delete';
47: 
48:     private ConfigContainerInterface $configContainer;
                ^
49: 
50:     private UiInterface $ui;
51: 
52:     private PodcastRepositoryInterface $podcastRepository;
53: 
54:     private PodcastDeleterInterface $podcastDeleter;
55: 
56:     public function __construct(
57:         ConfigContainerInterface $configContainer,
58:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Rss/ShowAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Util\Rss\AmpacheRssInterface;
34: use Psr\Http\Message\ResponseFactoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Psr\Http\Message\StreamFactoryInterface;
38: 
39: final class ShowAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show';
42: 
43:     private RequestParserInterface $requestParser;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     private ResponseFactoryInterface $responseFactory;
48: 
49:     private StreamFactoryInterface $streamFactory;
50:     private AmpacheRssInterface $ampacheRss;
51: 
52:     public function __construct(
53:         RequestParserInterface $requestParser,

ERROR: Unable to parse file: /code/src/Module/Application/ShowGet/ShowAction.php
ERROR: Parse error at line 44 column 13:

34: use Psr\Http\Message\StreamFactoryInterface;
35: 
36: /**
37:  * Looks like some kind of debugging tool?
38:  * @deprecated maybe obsolete
39:  */
40: final class ShowAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'show';
43: 
44:     private RequestParserInterface $requestParser;
                ^
45: 
46:     private ResponseFactoryInterface $responseFactory;
47: 
48:     private StreamFactoryInterface $streamFactory;
49: 
50:     public function __construct(
51:         RequestParserInterface $requestParser,
52:         ResponseFactoryInterface $responseFactory,
53:         StreamFactoryInterface $streamFactory
54:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Search/SaveAsPlaylistAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\System\Core;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class SaveAsPlaylistAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'save_as_playlist';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private ModelFactoryInterface $modelFactory;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Search/SaveAsSmartPlaylistAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class SaveAsSmartPlaylistAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'save_as_smartplaylist';
41: 
42:     private UiInterface $ui;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private ModelFactoryInterface $modelFactory;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         ConfigContainerInterface $configContainer,
51:         ModelFactoryInterface $modelFactory
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Search/ShowAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Application\ApplicationActionInterface;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowAction implements ApplicationActionInterface
35: {
36:     public const REQUEST_KEY = 'show';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     public function __construct(
41:         UiInterface $ui
42:     ) {
43:         $this->ui = $ui;
44:     }
45: 
46:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
47:     {
48:         $this->ui->showHeader();

ERROR: Unable to parse file: /code/src/Module/Application/Search/SearchAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Util\Ui;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Module\Wanted\MissingArtistFinderInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class SearchAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'search';
42: 
43:     private RequestParserInterface $requestParser;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     private MissingArtistFinderInterface $missingArtistFinder;
50: 
51:     public function __construct(
52:         RequestParserInterface $requestParser,
53:         UiInterface $ui,

ERROR: Unable to parse file: /code/src/Module/Application/Batch/DefaultAction.php
ERROR: Parse error at line 51 column 13:

41: use Ampache\Module\Util\ZipHandlerInterface;
42: use Ampache\Repository\SongRepositoryInterface;
43: use Psr\Http\Message\ResponseInterface;
44: use Psr\Http\Message\ServerRequestInterface;
45: use Psr\Log\LoggerInterface;
46: 
47: final class DefaultAction implements ApplicationActionInterface
48: {
49:     public const REQUEST_KEY = 'default';
50: 
51:     private RequestParserInterface $requestParser;
                ^
52: 
53:     private ModelFactoryInterface $modelFactory;
54: 
55:     private LoggerInterface $logger;
56: 
57:     private ZipHandlerInterface $zipHandler;
58: 
59:     private FunctionCheckerInterface $functionChecker;
60: 
61:     private SongRepositoryInterface $songRepository;

ERROR: Unable to parse file: /code/src/Module/Application/Art/ShowArtDlgAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class ShowArtDlgAction extends AbstractArtAction
36: {
37:     public const REQUEST_KEY = 'show_art_dlg';
38: 
39:     private UiInterface $ui;
                ^
40: 
41:     public function __construct(
42:         UiInterface $ui
43:     ) {
44:         $this->ui = $ui;
45:     }
46: 
47:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
48:     {
49:         $object_type = filter_input(INPUT_GET, 'object_type', FILTER_SANITIZE_SPECIAL_CHARS);

ERROR: Unable to parse file: /code/src/Module/Application/Art/FindArtAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\System\Core;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class FindArtAction extends AbstractArtAction
39: {
40:     public const REQUEST_KEY = 'find_art';
41: 
42:     private ArtCollectorInterface $artCollector;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private UiInterface $ui;
47: 
48:     public function __construct(
49:         ArtCollectorInterface $artCollector,
50:         ModelFactoryInterface $modelFactory,
51:         UiInterface $ui
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Art/UploadArtAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class UploadArtAction extends AbstractArtAction
36: {
37:     public const REQUEST_KEY = 'upload_art';
38: 
39:     private ModelFactoryInterface $modelFactory;
                ^
40: 
41:     private UiInterface $ui;
42: 
43:     public function __construct(
44:         ModelFactoryInterface $modelFactory,
45:         UiInterface $ui
46:     ) {
47:         $this->modelFactory = $modelFactory;
48:         $this->ui           = $ui;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/Art/ClearArtAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\UiInterface;
32: use Ampache\Repository\Model\ModelFactoryInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class ClearArtAction extends AbstractArtAction
37: {
38:     public const REQUEST_KEY = 'clear_art';
39: 
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ModelFactoryInterface $modelFactory,
46:         UiInterface $ui
47:     ) {
48:         $this->modelFactory = $modelFactory;
49:         $this->ui           = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/Art/SelectArtAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseFactoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Teapot\StatusCode;
37: 
38: final class SelectArtAction extends AbstractArtAction
39: {
40:     public const REQUEST_KEY = 'select_art';
41: 
42:     private ModelFactoryInterface $modelFactory;
                ^
43: 
44:     private ResponseFactoryInterface $responseFactory;
45: 
46:     private UiInterface $ui;
47: 
48:     public function __construct(
49:         ModelFactoryInterface $modelFactory,
50:         ResponseFactoryInterface $responseFactory,
51:         UiInterface $ui
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Upload/DefaultAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Util\AjaxUriRetrieverInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Ampache\Module\Util\Upload;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class DefaultAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'show';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     private AjaxUriRetrieverInterface $ajaxUriRetriever;
48: 
49: 
50:     public function __construct(
51:         ConfigContainerInterface $configContainer,
52:         UiInterface $ui,
53:         AjaxUriRetrieverInterface $ajaxUriRetriever

ERROR: Unable to parse file: /code/src/Module/Application/Broadcast/DeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\Exception\AccessDeniedException;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class DeleteAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'delete';
42: 
43:     private RequestParserInterface $requestParser;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     private UiInterface $ui;
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     public function __construct(
52:         RequestParserInterface $requestParser,
53:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Application/Broadcast/ShowDeleteAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\GuiGatekeeperInterface;
33: use Ampache\Module\Util\RequestParserInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowDeleteAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_delete';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private UiInterface $ui;
47: 
48:     public function __construct(
49:         RequestParserInterface $requestParser,
50:         ConfigContainerInterface $configContainer,
51:         UiInterface $ui
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/TvShowSeason/DeleteAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\System\LegacyLogger;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: use Psr\Log\LoggerInterface;
35: 
36: final class DeleteAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'delete';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     private LoggerInterface $logger;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui,
49:         LoggerInterface $logger
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/TvShowSeason/ShowAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class ShowAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'show';
38: 
39:     private UiInterface $ui;
                ^
40: 
41:     public function __construct(
42:         UiInterface $ui
43:     ) {
44:         $this->ui = $ui;
45:     }
46: 
47:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
48:     {
49:         $this->ui->showHeader();

ERROR: Unable to parse file: /code/src/Module/Application/TvShowSeason/ConfirmDeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: use Symfony\Component\Finder\Exception\AccessDeniedException;
38: 
39: final class ConfirmDeleteAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'confirm_delete';
42: 
43:     private UiInterface $ui;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         UiInterface $ui,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->ui              = $ui;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Shout/AddShoutAction.php
ERROR: Parse error at line 49 column 13:

39: use Psr\Http\Message\ServerRequestInterface;
40: use Teapot\StatusCode;
41: 
42: /**
43:  * Creates a new shout for an item
44:  */
45: final class AddShoutAction implements ApplicationActionInterface
46: {
47:     public const REQUEST_KEY = 'add_shout';
48: 
49:     private ResponseFactoryInterface $responseFactory;
                ^
50: 
51:     private ConfigContainerInterface $configContainer;
52: 
53:     private ShoutCreatorInterface $shoutCreator;
54: 
55:     private RequestParserInterface $requestParser;
56:     private ShoutObjectLoaderInterface $shoutObjectLoader;
57: 
58:     public function __construct(
59:         ResponseFactoryInterface $responseFactory,

ERROR: Unable to parse file: /code/src/Module/Application/Shout/ShowAddShoutAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
36: use Ampache\Module\Util\UiInterface;
37: use Ampache\Repository\ShoutRepositoryInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class ShowAddShoutAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show_add_shout';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private ShoutRepositoryInterface $shoutRepository;
50: 
51:     private ShoutRendererInterface $shoutRenderer;
52:     private ShoutObjectLoaderInterface $shoutObjectLoader;
53: 
54:     public function __construct(
55:         RequestParserInterface $requestParser,

ERROR: Unable to parse file: /code/src/Module/Application/Shout/ShowAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Psr\Http\Message\ResponseFactoryInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class ShowAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'show';
38: 
39:     private ResponseFactoryInterface $responseFactory;
                ^
40: 
41:     private ConfigContainerInterface $configContainer;
42: 
43:     public function __construct(
44:         ResponseFactoryInterface $responseFactory,
45:         ConfigContainerInterface $configContainer
46:     ) {
47:         $this->responseFactory = $responseFactory;
48:         $this->configContainer = $configContainer;
49:     }

ERROR: Unable to parse file: /code/src/Module/Application/SearchData/ShowAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\Ui;
33: use Psr\Http\Message\ResponseFactoryInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Http\Message\StreamFactoryInterface;
37: 
38: final class ShowAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private ResponseFactoryInterface $responseFactory;
45: 
46:     private StreamFactoryInterface $streamFactory;
47: 
48:     private ModelFactoryInterface $modelFactory;
49: 
50:     public function __construct(
51:         RequestParserInterface $requestParser,
52:         ResponseFactoryInterface $responseFactory,

ERROR: Unable to parse file: /code/src/Module/Application/CookieDisclaimer/ShowAction.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Application\ApplicationActionInterface;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Psr\Http\Message\ResponseInterface;
32: use Psr\Http\Message\ServerRequestInterface;
33: 
34: final class ShowAction implements ApplicationActionInterface
35: {
36:     public const REQUEST_KEY = 'show';
37: 
38:     private UiInterface $ui;
                ^
39: 
40:     public function __construct(
41:         UiInterface $ui
42:     ) {
43:         $this->ui = $ui;
44:     }
45: 
46:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
47:     {
48:         $this->ui->showHeader();

ERROR: Unable to parse file: /code/src/Module/Application/NowPlaying/ShowAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Util\RequestParserInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: use Psr\Log\LoggerInterface;
39: 
40: final class ShowAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'show';
43: 
44:     private RequestParserInterface $requestParser;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     private LoggerInterface $logger;
49: 
50:     private UiInterface $ui;
51: 
52:     public function __construct(
53:         RequestParserInterface $requestParser,
54:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/Application/Playback/PlayAction.php
ERROR: Parse error at line 65 column 13:

55: use Ampache\Repository\Model\Video;
56: use Ampache\Repository\UserRepositoryInterface;
57: use Psr\Http\Message\ResponseInterface;
58: use Psr\Http\Message\ServerRequestInterface;
59: use Psr\Log\LoggerInterface;
60: 
61: final class PlayAction implements ApplicationActionInterface
62: {
63:     public const REQUEST_KEY = 'play';
64: 
65:     private RequestParserInterface $requestParser;
                ^
66: 
67:     private Horde_Browser $browser;
68: 
69:     private AuthenticationManagerInterface $authenticationManager;
70: 
71:     private NetworkCheckerInterface $networkChecker;
72: 
73:     private UserRepositoryInterface $userRepository;
74: 
75:     private LoggerInterface $logger;

ERROR: Unable to parse file: /code/src/Module/Application/Playback/Play2Action.php
ERROR: Parse error at line 65 column 13:

55: use Ampache\Repository\Model\Video;
56: use Ampache\Repository\UserRepositoryInterface;
57: use Psr\Http\Message\ResponseInterface;
58: use Psr\Http\Message\ServerRequestInterface;
59: use Psr\Log\LoggerInterface;
60: 
61: final class Play2Action implements ApplicationActionInterface
62: {
63:     public const REQUEST_KEY = 'play2';
64: 
65:     private RequestParserInterface $requestParser;
                ^
66: 
67:     private Horde_Browser $browser;
68: 
69:     private AuthenticationManagerInterface $authenticationManager;
70: 
71:     private NetworkCheckerInterface $networkChecker;
72: 
73:     private UserRepositoryInterface $userRepository;
74: 
75:     private LoggerInterface $logger;

ERROR: Unable to parse file: /code/src/Module/Application/Utility/ShowAction.php
ERROR: Parse error at line 44 column 13:

34: 
35: /**
36:  * This is a little bit of a special file, it takes the
37:  * content of $_SESSION['iframe']['target'] and does a header
38:  * redirect to that spot!
39:  */
40: final class ShowAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'show';
43: 
44:     private ResponseFactoryInterface $responseFactory;
                ^
45: 
46:     public function __construct(
47:         ResponseFactoryInterface $responseFactory
48:     ) {
49:         $this->responseFactory = $responseFactory;
50:     }
51: 
52:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
53:     {
54:         $response = $this->responseFactory

ERROR: Unable to parse file: /code/src/Module/Application/Album/UpdateDiskFromTagsAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class UpdateDiskFromTagsAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'update_disk_from_tags';
41: 
42:     private ModelFactoryInterface $modelFactory;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         ModelFactoryInterface $modelFactory,
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Album/DeleteAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\System\LegacyLogger;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Log\LoggerInterface;
37: 
38: final class DeleteAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'delete';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private LoggerInterface $logger;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         UiInterface $ui,
51:         LoggerInterface $logger
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Album/ShowDiskAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\System\LegacyLogger;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class ShowDiskAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'show_disk';
45: 
46:     private ModelFactoryInterface $modelFactory;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private PrivilegeCheckerInterface $privilegeChecker;
53: 
54:     private ConfigContainerInterface $configContainer;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Album/SetTrackNumbersAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\System\LegacyLogger;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: use Psr\Log\LoggerInterface;
39: 
40: final class SetTrackNumbersAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'set_track_numbers';
43: 
44:     private UiInterface $ui;
                ^
45: 
46:     private LoggerInterface $logger;
47: 
48:     public function __construct(
49:         UiInterface $ui,
50:         LoggerInterface $logger
51:     ) {
52:         $this->ui     = $ui;
53:         $this->logger = $logger;
54:     }

ERROR: Unable to parse file: /code/src/Module/Application/Album/ShowMissingAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Art\Collector\ArtCollectorInterface;
33: use Ampache\Module\Util\UiInterface;
34: use Ampache\Repository\WantedRepositoryInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowMissingAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_missing';
41: 
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private ModelFactoryInterface $modelFactory;
45: 
46:     private UiInterface $ui;
47: 
48:     private ArtCollectorInterface $artCollector;
49: 
50:     private WantedRepositoryInterface $wantedRepository;
51: 
52:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Album/UpdateFromTagsAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class UpdateFromTagsAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'update_from_tags';
41: 
42:     private ModelFactoryInterface $modelFactory;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         ModelFactoryInterface $modelFactory,
50:         UiInterface $ui,
51:         ConfigContainerInterface $configContainer
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Album/ShowAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\System\LegacyLogger;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: final class ShowAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'show';
45: 
46:     private ModelFactoryInterface $modelFactory;
                ^
47: 
48:     private UiInterface $ui;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private PrivilegeCheckerInterface $privilegeChecker;
53: 
54:     private ConfigContainerInterface $configContainer;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/Album/ConfirmDeleteAction.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Application\Exception\AccessDeniedException;
37: use Ampache\Module\Authorization\GuiGatekeeperInterface;
38: use Ampache\Module\Util\UiInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: 
42: final class ConfirmDeleteAction implements ApplicationActionInterface
43: {
44:     public const REQUEST_KEY = 'confirm_delete';
45: 
46:     private RequestParserInterface $requestParser;
                ^
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     private ModelFactoryInterface $modelFactory;
51: 
52:     private UiInterface $ui;
53: 
54:     private AlbumDeleterInterface $albumDeleter;
55: 
56:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/PodcastEpisode/DeleteAction.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\ApplicationActionInterface;
31: use Ampache\Module\Authorization\GuiGatekeeperInterface;
32: use Ampache\Module\Util\UiInterface;
33: use Psr\Http\Message\ResponseInterface;
34: use Psr\Http\Message\ServerRequestInterface;
35: 
36: final class DeleteAction implements ApplicationActionInterface
37: {
38:     public const REQUEST_KEY = 'delete';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UiInterface $ui;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         UiInterface $ui
47:     ) {
48:         $this->configContainer = $configContainer;
49:         $this->ui              = $ui;
50:     }

ERROR: Unable to parse file: /code/src/Module/Application/PodcastEpisode/ShowAction.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: use Psr\Log\LoggerInterface;
39: 
40: final class ShowAction implements ApplicationActionInterface
41: {
42:     public const REQUEST_KEY = 'show';
43: 
44:     private RequestParserInterface $requestParser;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     private UiInterface $ui;
49: 
50:     private LoggerInterface $logger;
51: 
52:     private ModelFactoryInterface $modelFactory;
53: 
54:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Application/PodcastEpisode/ConfirmDeleteAction.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Module\System\LegacyLogger;
38: use Ampache\Module\Util\UiInterface;
39: use Psr\Http\Message\ResponseInterface;
40: use Psr\Http\Message\ServerRequestInterface;
41: use Psr\Log\LoggerInterface;
42: 
43: final class ConfirmDeleteAction implements ApplicationActionInterface
44: {
45:     public const REQUEST_KEY = 'confirm_delete';
46: 
47:     private RequestParserInterface $requestParser;
                ^
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private UiInterface $ui;
52: 
53:     private ModelFactoryInterface $modelFactory;
54: 
55:     private PodcastDeleterInterface $podcastDeleter;
56: 
57:     private LoggerInterface $logger;

ERROR: Unable to parse file: /code/src/Module/Application/Video/DeleteAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\System\LegacyLogger;
33: use Ampache\Module\Util\UiInterface;
34: use Psr\Http\Message\ResponseInterface;
35: use Psr\Http\Message\ServerRequestInterface;
36: use Psr\Log\LoggerInterface;
37: 
38: final class DeleteAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'delete';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     private LoggerInterface $logger;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         UiInterface $ui,
51:         LoggerInterface $logger
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Video/ShowVideoAction.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Application\ApplicationActionInterface;
30: use Ampache\Module\Authorization\GuiGatekeeperInterface;
31: use Ampache\Module\Util\UiInterface;
32: use Psr\Http\Message\ResponseInterface;
33: use Psr\Http\Message\ServerRequestInterface;
34: 
35: final class ShowVideoAction implements ApplicationActionInterface
36: {
37:     public const REQUEST_KEY = 'show_video';
38: 
39:     private UiInterface $ui;
                ^
40: 
41:     public function __construct(
42:         UiInterface $ui
43:     ) {
44:         $this->ui = $ui;
45:     }
46: 
47:     public function run(ServerRequestInterface $request, GuiGatekeeperInterface $gatekeeper): ?ResponseInterface
48:     {
49:         $this->ui->showHeader();

ERROR: Unable to parse file: /code/src/Module/Application/Video/ConfirmDeleteAction.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Module\Application\Exception\AccessDeniedException;
34: use Ampache\Module\Authorization\GuiGatekeeperInterface;
35: use Ampache\Module\Util\UiInterface;
36: use Psr\Http\Message\ResponseInterface;
37: use Psr\Http\Message\ServerRequestInterface;
38: 
39: final class ConfirmDeleteAction implements ApplicationActionInterface
40: {
41:     public const REQUEST_KEY = 'confirm_delete';
42: 
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private UiInterface $ui;
46: 
47:     public function __construct(
48:         ConfigContainerInterface $configContainer,
49:         UiInterface $ui
50:     ) {
51:         $this->configContainer = $configContainer;
52:         $this->ui              = $ui;
53:     }

ERROR: Unable to parse file: /code/src/Module/Application/Radio/CreateAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\AccessLevelEnum;
36: use Ampache\Module\Authorization\GuiGatekeeperInterface;
37: use Ampache\Module\Util\UiInterface;
38: use Psr\Http\Message\ResponseInterface;
39: use Psr\Http\Message\ServerRequestInterface;
40: 
41: final class CreateAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'create';
44: 
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private UiInterface $ui;
48: 
49:     private RequestParserInterface $requestParser;
50: 
51:     public function __construct(
52:         ConfigContainerInterface $configContainer,
53:         UiInterface $ui,
54:         RequestParserInterface $requestParser
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Application/Radio/ShowCreateAction.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Authorization\AccessLevelEnum;
33: use Ampache\Module\Authorization\GuiGatekeeperInterface;
34: use Ampache\Module\Util\UiInterface;
35: use Psr\Http\Message\ResponseInterface;
36: use Psr\Http\Message\ServerRequestInterface;
37: 
38: final class ShowCreateAction implements ApplicationActionInterface
39: {
40:     public const REQUEST_KEY = 'show_create';
41: 
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private UiInterface $ui;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         UiInterface $ui
49:     ) {
50:         $this->configContainer = $configContainer;
51:         $this->ui              = $ui;
52:     }

ERROR: Unable to parse file: /code/src/Module/Application/Radio/ShowAction.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Authorization\GuiGatekeeperInterface;
36: use Ampache\Module\Util\UiInterface;
37: use Psr\Http\Message\ResponseInterface;
38: use Psr\Http\Message\ServerRequestInterface;
39: use Psr\Log\LoggerInterface;
40: 
41: final class ShowAction implements ApplicationActionInterface
42: {
43:     public const REQUEST_KEY = 'show';
44: 
45:     private RequestParserInterface $requestParser;
                ^
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     private UiInterface $ui;
50: 
51:     private LoggerInterface $logger;
52: 
53:     private ModelFactoryInterface $modelFactory;
54: 
55:     public function __construct(

ERROR: Unable to parse file: /code/src/Module/Art/ArtCleanup.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\System\Dba;
31: use Ampache\Repository\Model\Art;
32: 
33: /**
34:  * Provides methods for the cleanup/deletion of art-items
35:  */
36: final class ArtCleanup implements ArtCleanupInterface
37: {
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     public function __construct(
41:         ConfigContainerInterface $configContainer
42:     ) {
43:         $this->configContainer = $configContainer;
44:     }
45: 
46:     /**
47:      * look for art in the image table that doesn't fit min or max dimensions and delete it
48:      */

ERROR: Unable to parse file: /code/src/Module/Art/Export/ArtExporter.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Art\Export;
33: use Ampache\Module\System\LegacyLogger;
34: use Psr\Log\LoggerInterface;
35: 
36: /**
37:  * This runs through all of the images and tries to
38:  * export all database art to local_metadata_dir
39:  */
40: final class ArtExporter implements ArtExporterInterface
41: {
42:     private LoggerInterface $logger;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private ImageRepositoryInterface $imageRepository;
47: 
48:     public function __construct(
49:         LoggerInterface $logger,
50:         ConfigContainerInterface $configContainer,
51:         ImageRepositoryInterface $imageRepository
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Art/Collector/GoogleCollectorModule.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Repository\Model\Art;
29: use Ampache\Module\System\Core;
30: use Ampache\Module\System\LegacyLogger;
31: use Exception;
32: use Psr\Log\LoggerInterface;
33: use WpOrg\Requests\Requests;
34: 
35: final class GoogleCollectorModule implements CollectorModuleInterface
36: {
37:     private LoggerInterface $logger;
                ^
38: 
39:     public function __construct(
40:         LoggerInterface $logger
41:     ) {
42:         $this->logger = $logger;
43:     }
44: 
45:     /**
46:      * Raw google search to retrieve the art, not very reliable
47:      *

ERROR: Unable to parse file: /code/src/Module/Art/Collector/MetaTagCollectorModule.php
ERROR: Parse error at line 56 column 13:

46:     private const TAG_ARTIST_ART_PRIORITY = array(
47:         'ID3 Artist',
48:         'ID3 Lead Artist',
49:         'ID3 Band',
50:         'ID3 Conductor',
51:         'ID3 Composer',
52:         'ID3 Lyricist',
53:         'ID3 Other'
54:     );
55: 
56:     private LoggerInterface $logger;
                ^
57: 
58:     private getID3 $getID3;
59: 
60:     private SongRepositoryInterface $songRepository;
61: 
62:     public function __construct(
63:         LoggerInterface $logger,
64:         getID3 $getID3,
65:         SongRepositoryInterface $songRepository
66:     ) {

ERROR: Unable to parse file: /code/src/Module/Art/Collector/FolderCollectorModule.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Repository\Model\Song;
33: use Ampache\Repository\Model\Video;
34: use Ampache\Module\System\AmpError;
35: use Ampache\Module\System\Core;
36: use Ampache\Module\System\LegacyLogger;
37: use Ampache\Repository\SongRepositoryInterface;
38: use Psr\Log\LoggerInterface;
39: 
40: final class FolderCollectorModule implements CollectorModuleInterface
41: {
42:     private ConfigContainerInterface $configContainer;
                ^
43: 
44:     private LoggerInterface $logger;
45: 
46:     private SongRepositoryInterface $songRepository;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         LoggerInterface $logger,
51:         SongRepositoryInterface $songRepository
52:     ) {

ERROR: Unable to parse file: /code/src/Module/Art/Collector/ArtCollector.php
ERROR: Parse error at line 45 column 13:

35: use Psr\Container\ContainerInterface;
36: use Psr\Log\LoggerInterface;
37: 
38: final class ArtCollector implements ArtCollectorInterface
39: {
40:     /**
41:      * @const ART_SEARCH_LIMIT
42:      */
43:     public const ART_SEARCH_LIMIT = 15;
44: 
45:     private ContainerInterface $dic;
                ^
46: 
47:     private LoggerInterface $logger;
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     public function __construct(
52:         ContainerInterface $dic,
53:         LoggerInterface $logger,
54:         ConfigContainerInterface $configContainer
55:     ) {

ERROR: Unable to parse file: /code/src/Module/Art/Collector/MusicbrainzCollectorModule.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Repository\Model\Art;
29: use Ampache\Module\System\Core;
30: use Ampache\Module\System\LegacyLogger;
31: use Exception;
32: use MusicBrainz\MusicBrainz;
33: use Psr\Log\LoggerInterface;
34: use WpOrg\Requests\Requests;
35: 
36: final class MusicbrainzCollectorModule implements CollectorModuleInterface
37: {
38:     private MusicBrainz $musicBrainz;
                ^
39: 
40:     private LoggerInterface $logger;
41: 
42:     public function __construct(
43:         MusicBrainz $musicBrainz,
44:         LoggerInterface $logger
45:     ) {
46:         $this->musicBrainz = $musicBrainz;
47:         $this->logger      = $logger;
48:     }

ERROR: Unable to parse file: /code/src/Module/Art/Collector/SpotifyCollectorModule.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Repository\Model\Art;
30: use Ampache\Module\System\LegacyLogger;
31: use Psr\Log\LoggerInterface;
32: use SpotifyWebAPI\Session as SpotifySession;
33: use SpotifyWebAPI\SpotifyWebAPI;
34: use SpotifyWebAPI\SpotifyWebAPIException;
35: 
36: final class SpotifyCollectorModule implements CollectorModuleInterface
37: {
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private SpotifyWebAPI $spotifyWebAPI;
41: 
42:     private LoggerInterface $logger;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         SpotifyWebAPI $spotifyWebAPI,
47:         LoggerInterface $logger
48:     ) {

ERROR: Unable to parse file: /code/src/Module/Art/Collector/LastFmCollectorModule.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\Art;
31: use Ampache\Module\LastFm\LastFmQueryInterface;
32: use Ampache\Module\System\LegacyLogger;
33: use Exception;
34: use Psr\Log\LoggerInterface;
35: 
36: final class LastFmCollectorModule implements CollectorModuleInterface
37: {
38:     private const API_URL = 'http://ws.audioscrobbler.com/2.0/';
39: 
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private LastFmQueryInterface $lastFmQuery;
43: 
44:     private LoggerInterface $logger;
45: 
46:     public function __construct(
47:         ConfigContainerInterface $configContainer,
48:         LastFmQueryInterface $lastFmQuery,
49:         LoggerInterface $logger
50:     ) {

ERROR: Unable to parse file: /code/src/Module/Shout/ShoutRenderer.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\Util\Ui;
33: use Ampache\Repository\Model\Art;
34: use Ampache\Repository\Model\ModelFactoryInterface;
35: use Ampache\Repository\Model\Shoutbox;
36: 
37: /**
38:  * Renders a shout within the ui
39:  */
40: final class ShoutRenderer implements ShoutRendererInterface
41: {
42:     private PrivilegeCheckerInterface $privilegeChecker;
                ^
43: 
44:     private ConfigContainerInterface $configContainer;
45: 
46:     private ModelFactoryInterface $modelFactory;
47:     private ShoutObjectLoaderInterface $shoutObjectLoader;
48: 
49:     public function __construct(
50:         PrivilegeCheckerInterface $privilegeChecker,
51:         ConfigContainerInterface $configContainer,
52:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Module/Shout/ShoutCreator.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Repository\Model\User;
36: use Ampache\Repository\ShoutRepositoryInterface;
37: use DateTime;
38: use PHPMailer\PHPMailer\Exception;
39: 
40: /**
41:  * Creates a new shout item
42:  */
43: final class ShoutCreator implements ShoutCreatorInterface
44: {
45:     private UserActivityPosterInterface $userActivityPoster;
                ^
46: 
47:     private ConfigContainerInterface $configContainer;
48: 
49:     private ShoutRepositoryInterface $shoutRepository;
50:     private UtilityFactoryInterface $utilityFactory;
51:     private ModelFactoryInterface $modelFactory;
52: 
53:     public function __construct(
54:         UserActivityPosterInterface $userActivityPoster,
55:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Module/System/Dba.php
ERROR: Parse error at line 46 column 20:

36:  * with a few exceptions, the row and assoc will always
37:  * return an array, simplifying checking on the far end
38:  * it will also auto-connect as needed, and has a default
39:  * database simplifying queries in most cases.
40:  */
41: class Dba
42: {
43:     public static $stats = array('query' => 0);
44: 
45:     private static $_sql;
46:     private static string $_error;
                       ^
47: 
48:     /**
49:      * query
50:      * @param string $sql
51:      * @param array $params
52:      * @return PDOStatement|false
53:      */
54:     public static function query($sql, $params = array())
55:     {
56:         // json_encode throws errors about UTF-8 cleanliness, which we don't care about here.

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/AbstractMigration.php
ERROR: Parse error at line 35 column 13:

25: namespace Ampache\Module\System\Update\Migration;
26: 
27: use Ahc\Cli\IO\Interactor;
28: use Ampache\Module\Database\DatabaseConnectionInterface;
29: use Ampache\Repository\Model\Preference;
30: use ArrayIterator;
31: use Traversable;
32: 
33: abstract class AbstractMigration implements MigrationInterface
34: {
35:     private DatabaseConnectionInterface $connection;
                ^
36: 
37:     private ?Interactor $interactor = null;
38: 
39:     /** @var list<non-empty-string> */
40:     protected array $changelog = [];
41: 
42:     /**
43:      * If the migration should trigger a warning, set to `true`
44:      */
45:     protected bool $warning = false;

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400002.php
ERROR: Parse error at line 37 column 15:

27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Update disk to allow 1 instead of making it 0 by default
32:  * Add barcode catalog_number and original_year
33:  * Drop catalog_number from song_data
34:  */
35: final class Migration400002 extends AbstractMigration
36: {
37:     protected array $changelog = [
                  ^
38:         'IMPORTANT UPDATE NOTES: This is part of a major update to how Ampache handles Albums, Artists and data migration during tag updates',
39:         'Update album disk support to allow 1 instead of 0 by default',
40:         'Add barcode catalog_number and original_year to albums',
41:         'Drop catalog_number from song_data and use album instead'
42:     ];
43: 
44:     public function migrate(): void
45:     {
46:         Dba::write("UPDATE `album` SET `album`.`disk` = 1 WHERE `album`.`disk` = 0;");
47: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400016.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend album and make artist even bigger. This should cover everyone.
31:  */
32: final class Migration400016 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend album and make artist even bigger. This should cover everyone'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `album` MODIFY COLUMN `time` bigint(20) unsigned DEFAULT NULL NULL;");
39: 
40:         $this->updateDatabase("ALTER TABLE `artist` MODIFY COLUMN `time` int(11) unsigned DEFAULT NULL NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400021.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add r128 gain columns to song_data
32:  */
33: final class Migration400021 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add r128 gain columns to song_data'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `song_data` DROP COLUMN `r128_track_gain`;");
40:         $this->updateDatabase("ALTER TABLE `song_data` ADD COLUMN `r128_track_gain` smallint(5) DEFAULT NULL;");
41:         Dba::write("ALTER TABLE `song_data` DROP COLUMN `r128_album_gain`;");
42:         $this->updateDatabase("ALTER TABLE `song_data` ADD COLUMN `r128_album_gain` smallint(5) DEFAULT NULL;");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400004.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * delete upload_user_artist database settings
31:  */
32: final class Migration400004 extends AbstractMigration
33: {
34:     protected array $changelog = ['Delete upload_user_artist database settings'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DELETE FROM `user_preference` WHERE `user_preference`.`preference` IN (SELECT `preference`.`id` FROM `preference` WHERE `preference`.`name` = 'upload_user_artist');");
39: 
40:         $this->updateDatabase("DELETE FROM `preference` WHERE `preference`.`name` = 'upload_user_artist';");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400015.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend artist time. smallint was too small
31:  */
32: final class Migration400015 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend artist time. smallint was too small'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `artist` MODIFY COLUMN `time` int(11) unsigned DEFAULT NULL NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400020.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Customizable login background image
31:  */
32: final class Migration400020 extends AbstractMigration
33: {
34:     protected array $changelog = ['Customizable login page background'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('custom_login_background', 'Custom URL - Login page background', '', 75, 'string', 'interface', 'custom');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400013.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend Democratic cooldown beyond 255.
31:  */
32: final class Migration400013 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend Democratic cooldown beyond 255'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `democratic` MODIFY COLUMN `cooldown` int(11) unsigned DEFAULT NULL NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400007.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option for skip_count display
31:  * Add ui option for displaying dates in a custom format
32:  */
33: final class Migration400007 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add ui option for skip_count display',
37:         'Add ui option for displaying dates in a custom format'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updatePreferences('show_skipped_times', 'Show # skipped', '0', 25, 'boolean', 'interface', 'library');
43:         $this->updatePreferences('custom_datetime', 'Custom datetime', '', 25, 'string', 'interface', 'custom');
44:     }
45: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400010.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add a last_duration to searches to speed up access requests
32:  */
33: final class Migration400010 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add a last_duration to search table to speed up access requests'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `search` DROP COLUMN `last_duration`;");
40:         $this->updateDatabase("ALTER TABLE `search` ADD COLUMN `last_duration` INT(11) NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400012.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add a rss token to use an RSS unauthenticated feed.
32:  */
33: final class Migration400012 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add a rss token to allow the use of RSS unauthenticated feeds'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `user` DROP COLUMN `rsstoken`;");
40:         $this->updateDatabase("ALTER TABLE `user` ADD COLUMN `rsstoken` varchar(255) NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400009.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option for forcing unique items to playlists
31:  */
32: final class Migration400009 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option for forcing unique items to playlists'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('unique_playlist', 'Only add unique items to playlists', '0', 25, 'boolean', 'playlist');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400005.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add a last_count to searches to speed up access requests
32:  */
33: final class Migration400005 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add a last_count to search table to speed up access requests'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `search` DROP COLUMN `last_count`;");
40:         $this->updateDatabase("ALTER TABLE `search` ADD COLUMN `last_count` INT(11) NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400006.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * drop shoutcast_active preferences and localplay_shoutcast table
31:  */
32: final class Migration400006 extends AbstractMigration
33: {
34:     protected array $changelog = [
                  ^
35:         'Drop shoutcast_active preferences. (Feature has not existed for years)',
36:         'Drop localplay_shoutcast table if present'
37:     ];
38: 
39:     public function migrate(): void
40:     {
41:         $this->updateDatabase("DELETE FROM `user_preference` WHERE `user_preference`.`preference` IN (SELECT `preference`.`id` FROM `preference` WHERE `preference`.`name` = 'shoutcast_active');");
42: 
43:         $this->updateDatabase("DELETE FROM `preference` WHERE `preference`.`name` = 'shoutcast_active';");
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400024.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add song_count, album_count and album_group_count to artist
32:  */
33: final class Migration400024 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'IMPORTANT UPDATE NOTES: These columns will fill dynamically in the web UI but you should do a catalog \'add\' as soon as possible to fill them. It will take a while for large libraries but will help API and SubSonic clients',
37:         'Add \'song_count\', \'album_count\' and \'album_group_count\' to artist.'
38:     ];
39: 
40:     protected bool $warning = true;
41: 
42:     public function migrate(): void
43:     {
44:         Dba::write("ALTER TABLE `artist` DROP COLUMN `song_count`;");
45:         $this->updateDatabase("ALTER TABLE `artist` ADD COLUMN `song_count` smallint(5) unsigned DEFAULT 0 NULL;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400000.php
ERROR: Parse error at line 49 column 15:

39:  *   plex_uniqid
40:  *   plex_servername
41:  *   plex_public_address
42:  *   plex_public_port
43:  *   plex_local_auth
44:  *   plex_match_email
45:  * Add preference for master/develop branch selection
46:  */
47: final class Migration400000 extends AbstractMigration
48: {
49:     protected array $changelog = [
                  ^
50:         'Enable better podcast defaults',
51:         'Increase copyright column size to fix issue #1861',
52:         'Add name_track, name_artist, name_album to user_activity',
53:         'Add mbid_track, mbid_artist, mbid_album to user_activity',
54:         'Insert some decent SmartLists for a better default experience',
55:         'Delete plex preferences from the server'
56:     ];
57: 
58:     public function migrate(): void
59:     {

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400014.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add last_duration to playlist
32:  * Add time to artist and album
33:  */
34: final class Migration400014 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Add last_duration to playlist',
38:         'Add time to artist and album'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         Dba::write("ALTER TABLE `playlist` DROP COLUMN `last_duration`;");
44:         $this->updateDatabase("ALTER TABLE `playlist` ADD COLUMN `last_duration` int(11) unsigned NOT NULL DEFAULT '0'");
45: 
46:         Dba::write("ALTER TABLE `album` DROP COLUMN `time`;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400011.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Allow negative track numbers for albums
31:  * Truncate database tracks to 0 when greater than 32767
32:  */
33: final class Migration400011 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'IMPORTANT UPDATE NOTES: To allow negatives the maximum value of `song`.`track` has been reduced. This shouldn\'t affect anyone due to the large size allowed',
37:         'Allow negative track numbers for albums. (-32,767 -> 32,767)',
38:         'Truncate database tracks to 0 when greater than 32,767'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         $this->updateDatabase("UPDATE `song` SET `track` = 0 WHERE `track` > 32767;");
44: 
45:         $this->updateDatabase("ALTER TABLE `song` MODIFY COLUMN `track` SMALLINT DEFAULT NULL NULL;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400022.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend allowed time for podcast_episodes
31:  */
32: final class Migration400022 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend allowed time for podcast_episodes.'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `podcast_episode` MODIFY COLUMN `time` int(11) unsigned DEFAULT 0 NOT NULL; ");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400023.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * delete concerts_limit_past and concerts_limit_future database settings
31:  */
32: final class Migration400023 extends AbstractMigration
33: {
34:     protected array $changelog = ['Delete \'concerts_limit_past\' and \'concerts_limit_future\' database settings.'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DELETE FROM `user_preference` WHERE `user_preference`.`preference` IN (SELECT `preference`.`id` FROM `preference` WHERE `preference`.`name` IN ('concerts_limit_past', 'concerts_limit_future'));");
39: 
40:         $this->updateDatabase("DELETE FROM `preference` WHERE `preference`.`name` IN ('concerts_limit_past', 'concerts_limit_future');");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400019.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Put of_the_moment into a per user preference
31:  */
32: final class Migration400019 extends AbstractMigration
33: {
34:     protected array $changelog = ['Put \'of_the_moment\' into a per user preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('of_the_moment', 'Set the amount of items Album/Video of the Moment will display', '6', 25, 'integer', 'interface', 'home');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400008.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add system option for cron based cache and create related tables
33:  */
34: final class Migration400008 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add system option for cron based cache and create related tables'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $this->updatePreferences('cron_cache', 'Cache computed SQL data (eg. media hits stats) using a cron', '0', 100, 'boolean', 'system', 'catalog');
41: 
42:         $tables    = ['cache_object_count', 'cache_object_count_run'];
43:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
44:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
45:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
46:         foreach ($tables as $table) {

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400001.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Make sure people on older databases have the same preference categories
31:  */
32: final class Migration400001 extends AbstractMigration
33: {
34:     protected array $changelog = [
                  ^
35:         'Update preferences for older users to match current subcategory items',
36:         '(~3.6 introduced subcategories but didn\'t include updates for existing users',
37:         'This is a cosmetic update and does not affect any operation)'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $sql_array = array(
43:             "UPDATE `preference` SET `preference`.`subcatagory` = 'library' WHERE `preference`.`name` in ('album_sort', 'show_played_times', 'album_group', 'album_release_type', 'album_release_type_sort', 'libitem_contextmenu', 'browse_filter', 'libitem_browse_alpha') AND `preference`.`subcatagory` IS NULL;",
44:             "UPDATE `preference` SET `preference`.`subcatagory` = 'backend' WHERE `preference`.`name` in ('subsonic_backend', 'daap_backend', 'daap_pass', 'upnp_backend', 'webdav_backend') AND `preference`.`subcatagory` IS NULL;",

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400003.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Make sure preference names are updated to current strings
31:  */
32: final class Migration400003 extends AbstractMigration
33: {
34:     protected array $changelog = ['Make sure preference names are updated to current strings'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $sql_array = array(
39:             "UPDATE `preference` SET `preference`.`description` = 'Force HTTP playback regardless of port' WHERE `preference`.`name` = 'force_http_play';",
40:             "UPDATE `preference` SET `preference`.`description` = 'Playback Type' WHERE `preference`.`name` = 'play_type';",
41:             "UPDATE `preference` SET `preference`.`description` = 'httpQ Active Instance' WHERE `preference`.`name` = 'httpq_active';",
42:             "UPDATE `preference` SET `preference`.`description` = 'Now Playing filtered per user' WHERE `preference`.`name` = 'now_playing_per_user';",
43:             "UPDATE `preference` SET `preference`.`description` = 'Use Subsonic backend' WHERE `preference`.`name` = 'subsonic_backend';",
44:             "UPDATE `preference` SET `preference`.`description` = 'Share Now Playing information' WHERE `preference`.`name` = 'allow_personal_info_now';",

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V4/Migration400018.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V4;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend video bitrate to unsigned. There's no reason for a negative bitrate.
31:  */
32: final class Migration400018 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend video bitrate to unsigned. There\'s no reason for a negative bitrate'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("UPDATE `video` SET `video_bitrate` = 0 WHERE `video_bitrate` < 0;");
39: 
40:         $this->updateDatabase("ALTER TABLE `video` MODIFY COLUMN `video_bitrate` int(11) unsigned DEFAULT NULL NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600002.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Drop channel table
31:  */
32: final class Migration600002 extends AbstractMigration
33: {
34:     protected array $changelog = ['Drop channel table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DROP TABLE IF EXISTS `channel`");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600062.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600062 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the player_control table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `player_control` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600038.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Update `access_list` in case you have a bad `user` column
31:  */
32: final class Migration600038 extends AbstractMigration
33: {
34:     protected array $changelog = ['Update `access_list` in case you have a bad `user` column'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('UPDATE `access_list` SET `user` = -1 WHERE `user` = 0');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600043.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Set correct preference type for `use_play2`
31:  * Add user preference `jp_volume`, Default webplayer volume
32:  */
33: final class Migration600043 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Set correct preference type for `use_play2`',
37:         'Add user preference `jp_volume`, Default webplayer volume'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updateDatabase('UPDATE `preference` SET `type` = \'boolean\' WHERE `name` = \'use_play2\'');
43: 
44:         $this->updatePreferences('jp_volume', 'Default webplayer volume', 0.80, 25, 'special', 'streaming', 'player');
45:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600045.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add column `last_update` and `date`to search table
32:  */
33: final class Migration600045 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add column `last_update` and `date`to search table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write('ALTER TABLE `search` DROP COLUMN `last_update`');
40:         $this->updateDatabase('ALTER TABLE `search` ADD COLUMN `last_update` int(11) unsigned NOT NULL DEFAULT 0 AFTER `type`');
41:         Dba::write('ALTER TABLE `search` DROP COLUMN `date`');
42:         $this->updateDatabase('ALTER TABLE `search` ADD COLUMN `date` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `type`');
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600063.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600063 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the session_stream table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `session_stream` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600024.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('show_subtitle') Show Album subtitle on links (if available)
31:  * Add ui option ('show_original_year') Show Album original year on links (if available)
32:  */
33: final class Migration600024 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add ui option (\'show_subtitle\') Show Album subtitle on links (if available)',
37:         'Add ui option (\'show_original_year\') Show Album original year on links (if available)'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updatePreferences('show_subtitle', 'Show Album subtitle on links (if available)', '1', 25, 'boolean', 'interface', 'browse');
43:         $this->updatePreferences('show_original_year', 'Show Album original year on links (if available)', '1', 25, 'boolean', 'interface', 'browse');
44:     }
45: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600021.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the song table
31:  */
32: final class Migration600021 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend `time` column for the song table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('ALTER TABLE `song` MODIFY COLUMN `time` int(11) unsigned NOT NULL DEFAULT 0');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600068.php
ERROR: Parse error at line 32 column 15:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: final class Migration600068 extends AbstractMigration
31: {
32:     protected array $changelog = ['Drop unique constraint `playlist_track_UN` on `playlist_data` table'];
                  ^
33: 
34:     public function migrate(): void
35:     {
36:         Dba::write("ALTER TABLE `playlist_data` DROP KEY `playlist_track_UN`;");
37:     }
38: }
39: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600028.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `bitrate`, `rate`, `mode` and `channels` to the `podcast_episode` table
32:  */
33: final class Migration600028 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `bitrate`, `rate`, `mode` and `channels` to the `podcast_episode` table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `podcast_episode` DROP COLUMN `channels`;");
40:         $this->updateDatabase('ALTER TABLE `podcast_episode` ADD COLUMN `channels` mediumint(9) DEFAULT NULL AFTER `catalog`');
41:         Dba::write("ALTER TABLE `podcast_episode` DROP COLUMN `mode`;");
42:         $this->updateDatabase('ALTER TABLE `podcast_episode` ADD COLUMN `mode` enum(\'abr\',\'vbr\',\'cbr\') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL AFTER `catalog`');
43:         Dba::write("ALTER TABLE `podcast_episode` DROP COLUMN `rate`;");
44:         $this->updateDatabase('ALTER TABLE `podcast_episode` ADD COLUMN `rate` mediumint(8) UNSIGNED NOT NULL DEFAULT 0 AFTER `catalog`');
45:         Dba::write("ALTER TABLE `podcast_episode` DROP COLUMN `bitrate`;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600052.php
ERROR: Parse error at line 33 column 15:

23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Ampache\Repository\Model\Playlist;
30: 
31: final class Migration600052 extends AbstractMigration
32: {
33:     protected array $changelog = ['Add unique constraint `playlist_track_UN` on `playlist_data` table'];
                  ^
34: 
35:     public function migrate(): void
36:     {
37:         // fix up duplicate playlist track numbers
38:         $sql        = 'SELECT DISTINCT `playlist` from `playlist_data` GROUP BY `playlist`, `track` having COUNT(`playlist`) > 1;';
39:         $db_results = Dba::read($sql);
40:         // get the base album you will migrate into
41:         while ($row = Dba::fetch_assoc($db_results)) {
42:             $playlist = new Playlist($row['playlist']);
43:             if ($playlist->isNew()) {

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600047.php
ERROR: Parse error at line 31 column 15:

21:  * You should have received a copy of the GNU Affero General Public License
22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: final class Migration600047 extends AbstractMigration
30: {
31:     protected array $changelog = ['Add user preference `show_wrapped`, Enable access to your personal "Spotify Wrapped" from your user page'];
                  ^
32: 
33:     /**
34:      * Add user preference `show_wrapped`, Enable access to your personal "Spotify Wrapped" from your user page
35:      */
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('show_wrapped', 'Enable access to your personal "Spotify Wrapped" from your user page', '0', 25, 'bool', 'interface', 'privacy');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600048.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `date` column to rating table
32:  */
33: final class Migration600048 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `date` column to rating table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write('ALTER TABLE `rating` DROP COLUMN `date`');
40:         $this->updateDatabase('ALTER TABLE `rating` ADD COLUMN `date` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `rating`');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600053.php
ERROR: Parse error at line 32 column 15:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: use Ampache\Repository\Model\Preference;
29: 
30: final class Migration600053 extends AbstractMigration
31: {
32:     protected array $changelog = [
                  ^
33:         'Remove Flattr plugin (Service has been discontinued)'
34:     ];
35: 
36:     public function migrate(): void
37:     {
38:         Preference::delete('flattr_user_id');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600044.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add system preference `perpetual_api_session`, API sessions do not expire
31:  */
32: final class Migration600044 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add system preference `perpetual_api_session`, API sessions do not expire'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('perpetual_api_session', 'API sessions do not expire', '0', 100, 'boolean', 'system', 'backend');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600022.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600022 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend `time` column for the stream_playlist table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `stream_playlist` MODIFY COLUMN `time` int(11) NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600011.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add `album_disk` to enum types for `object_count`, `rating` and `cache_object_count` tables
31:  */
32: final class Migration600011 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add `album_disk` to enum types for `object_count`, `rating` and `cache_object_count` tables'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `object_count` MODIFY COLUMN `object_type` enum('album','album_disk','artist','catalog','genre','live_stream','playlist','podcast','podcast_episode','song','stream','tvshow','tvshow_season','video') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL");
39: 
40:         $this->updateDatabase("ALTER TABLE `rating` MODIFY COLUMN `object_type` enum('album','album_disk','artist','catalog','genre','live_stream','playlist','podcast','podcast_episode','song','stream','tvshow','tvshow_season','video') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600041.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Index `label` column on the `label_asso` table
32:  */
33: final class Migration600041 extends AbstractMigration
34: {
35:     protected array $changelog = ['Index `label` column on the `label_asso` table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write('ALTER TABLE `label_asso` DROP KEY `label_asso_label_IDX`');
40:         $this->updateDatabase('CREATE INDEX `label_asso_label_IDX` USING BTREE ON `label_asso` (`label`)');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600055.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600055 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `rating` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `rating` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `rating` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600065.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600065 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the user_activity table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `user_activity` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600006.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `disk_count` to album table
32:  */
33: final class Migration600006 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `disk_count` to album table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `album` DROP COLUMN `disk_count`;");
40:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `disk_count` int(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `disk`");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600046.php
ERROR: Parse error at line 31 column 15:

21:  * You should have received a copy of the GNU Affero General Public License
22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: final class Migration600046 extends AbstractMigration
30: {
31:     protected array $changelog = ['Add user preference `home_recently_played_all`, Show all media types in Recently Played'];
                  ^
32: 
33:     /**
34:      * Add user preference `home_recently_played_all`, Show all media types in Recently Played
35:      */
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('home_recently_played_all', 'Show all media types in Recently Played', '0', 25, 'bool', 'interface', 'home');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600035.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `enabled` to `podcast_episode` table
32:  */
33: final class Migration600035 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `enabled` to `podcast_episode` table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write('ALTER TABLE `podcast_episode` DROP COLUMN `enabled`');
40:         $this->updateDatabase('ALTER TABLE `podcast_episode` ADD COLUMN `enabled` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `played`');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600008.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Rename `artist`.`album_group_count` => `album_disk_count`
31:  */
32: final class Migration600008 extends AbstractMigration
33: {
34:     protected array $changelog = ['Rename `artist`.`album_group_count` => `album_disk_count`'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `artist` CHANGE COLUMN `album_group_count` `album_disk_count` smallint(5) unsigned DEFAULT 0 NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600018.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Drop `user_playlist` table and recreate it
33:  */
34: final class Migration600018 extends AbstractMigration
35: {
36:     protected array $changelog = ['Drop `user_playlist` table and recreate it'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
41:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
42:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
43: 
44:         $this->updateDatabase('DROP TABLE IF EXISTS `user_playlist`');
45: 
46:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_playlist` (`playqueue_time` int(11) UNSIGNED NOT NULL, `playqueue_client` varchar(255) CHARACTER SET $charset COLLATE $collation, user int(11) DEFAULT 0, `object_type` enum('song','live_stream','video','podcast_episode') CHARACTER SET utf8 COLLATE utf8_unicode_ci, `object_id` int(11) UNSIGNED NOT NULL DEFAULT 0, `track` smallint(6) UNSIGNED NOT NULL DEFAULT 0, `current_track` tinyint(1) UNSIGNED NOT NULL DEFAULT 0, `current_time` smallint(5) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`playqueue_time`, `playqueue_client`, `user`, `track`), KEY `user` (`user`), KEY `object_type` (`object_type`), KEY `object_id` (`object_id`)) ENGINE=$engine DEFAULT CHARSET=$charset COLLATE=$collation");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600001.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add user preference `webplayer_removeplayed`, Remove tracks before the current playlist item in the webplayer when played
31:  */
32: final class Migration600001 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add user preference `webplayer_removeplayed`, Remove tracks before the current playlist item in the webplayer when played'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('webplayer_removeplayed', 'Remove tracks before the current playlist item in the webplayer when played', '0', 25, 'special', 'streaming', 'player');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600012.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: use Ampache\Repository\Model\Catalog;
29: 
30: /**
31:  * Add `song_artist` and `album_artist` maps to catalog_map
32:  * This is a duplicate of `update_550004` But may have been skipped depending on your site's version history
33:  */
34: final class Migration600012 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Add `song_artist` and `album_artist` maps to catalog_map',
38:         'This is a duplicate of `update_550004` But may have been skipped depending on your site\'s version history'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         // delete bad maps if they exist
44:         $tables = ['song', 'album', 'video', 'podcast', 'podcast_episode', 'live_stream'];
45:         foreach ($tables as $type) {
46:             $this->updateDatabase("DELETE FROM `catalog_map` USING `catalog_map` LEFT JOIN (SELECT DISTINCT `$type`.`catalog` AS `catalog_id`, '$type' AS `map_type`, `$type`.`id` AS `object_id` FROM `$type` GROUP BY `$type`.`catalog`, `map_type`, `$type`.`id`) AS `valid_maps` ON `valid_maps`.`catalog_id` = `catalog_map`.`catalog_id` AND `valid_maps`.`object_id` = `catalog_map`.`object_id` AND `valid_maps`.`map_type` = `catalog_map`.`object_type` WHERE `catalog_map`.`object_type` = '$type' AND `valid_maps`.`object_id` IS NULL;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600020.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Set system preferences to 100.
31:  * These options are only available to Admin users anyway
32:  */
33: final class Migration600020 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Set system preferences to Admin (100)',
37:         'These options are only available to Admin users anyway'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updateDatabase('UPDATE `preference` SET `level` = 100 WHERE `catagory` = \'system\'');
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600066.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600066 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the user_follower table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `user_follower` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600034.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600034 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `image` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `image` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `image` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600023.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add upload_access_level to restrict uploads to certain users
31:  */
32: final class Migration600023 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add upload_access_level to restrict uploads to certain user groups'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('upload_access_level', 'Upload Access Level', '25', 100, 'special', 'system', 'upload');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600016.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `object_type_IDX` to artist_map table
32:  * Add `object_type_IDX` to catalog_map table
33:  */
34: final class Migration600016 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Add `object_type_IDX` to artist_map table',
38:         'Add `object_type_IDX` to catalog_map table'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         Dba::write('ALTER TABLE `album_map` DROP KEY `object_type_IDX`');
44:         $this->updateDatabase('CREATE INDEX `object_type_IDX` USING BTREE ON `album_map` (`object_type`)');
45:         Dba::write('ALTER TABLE `catalog_map` DROP KEY `object_type_IDX`');
46:         $this->updateDatabase('CREATE INDEX `object_type_IDX` USING BTREE ON `catalog_map` (`object_type`)');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600060.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600060 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `share` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `share` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `share` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600059.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600059 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `cache_object_count` and `cache_object_count_run` tables'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         // cache_object_count
39:         $this->updateDatabase('DELETE FROM `cache_object_count` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
40:         $this->updateDatabase('ALTER TABLE `cache_object_count` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
41:         // cache_object_count_run
42:         $this->updateDatabase('DELETE FROM `cache_object_count_run` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
43:         $this->updateDatabase('ALTER TABLE `cache_object_count_run` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
44:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600037.php
ERROR: Parse error at line 38 column 15:

28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: use Ampache\Repository\Model\Catalog;
31: use Ampache\Repository\Model\User;
32: 
33: /**
34:  * Update user server and user counts now that the scaling has changed
35:  */
36: final class Migration600037 extends AbstractMigration
37: {
38:     protected array $changelog = ['Update user server and user counts now that the scaling has changed'];
                  ^
39: 
40:     public function migrate(): void
41:     {
42:         // update server total counts
43:         $catalog_disable = AmpConfig::get('catalog_disable');
44:         // tables with media items to count, song-related tables and the rest
45:         $media_tables = array('song', 'video', 'podcast_episode');
46:         $items        = 0;
47:         $time         = 0;
48:         $size         = 0;

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600033.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `user_flag` table
31:  */
32: final class Migration600033 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `user_flag` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `user_flag` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39: 
40:         $this->updateDatabase('ALTER TABLE `user_flag` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600061.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600061 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the broadcast table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `broadcast` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600007.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: use Ampache\Repository\Model\Album;
29: use Ampache\Repository\Model\Artist;
30: 
31: /**
32:  * Fill album_disk table update count tables
33:  */
34: final class Migration600007 extends AbstractMigration
35: {
36:     protected array $changelog = ['Fill album_disk table update count tables'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $this->updateDatabase("UPDATE `album`, (SELECT COUNT(DISTINCT `album_disk`.`disk`) AS `disk_count`, `album_id` FROM `album_disk` GROUP BY `album_disk`.`album_id`) AS `album_disk` SET `album`.`disk_count` = `album_disk`.`disk_count` WHERE `album`.`disk_count` != `album_disk`.`disk_count` AND `album`.`id` = `album_disk`.`album_id`");
41:         $this->updateDatabase("UPDATE `album_disk`, (SELECT COUNT(DISTINCT `album_disk`.`disk`) AS `disk_count`, `album_id` FROM `album_disk` GROUP BY `album_disk`.`album_id`) AS `disk_count` SET `album_disk`.`disk_count` = `disk_count`.`disk_count` WHERE `album_disk`.`disk_count` != `disk_count`.`disk_count` AND `album_disk`.`album_id` = `disk_count`.`album_id`");
42:         $this->updateDatabase("UPDATE `album_disk`, (SELECT SUM(`time`) AS `time`, `album`, `disk` FROM `song` GROUP BY `album`, `disk`) AS `song` SET `album_disk`.`time` = `song`.`time` WHERE (`album_disk`.`time` != `song`.`time` OR `album_disk`.`time` IS NULL) AND `album_disk`.`album_id` = `song`.`album` AND `album_disk`.`disk` = `song`.`disk`");
43:         $this->updateDatabase("UPDATE `album_disk`, (SELECT COUNT(DISTINCT `id`) AS `song_count`, `album`, `disk` FROM `song` GROUP BY `album`, `disk`) AS `song` SET `album_disk`.`song_count` = `song`.`song_count` WHERE `album_disk`.`song_count` != `song`.`song_count` AND `album_disk`.`album_id` = `song`.`album` AND `album_disk`.`disk` = `song`.`disk`");
44:         $this->updateDatabase("UPDATE `album_disk`, (SELECT SUM(`song`.`total_count`) AS `total_count`, `album_disk`.`id` AS `object_id` FROM `song` LEFT JOIN `album_disk` ON `album_disk`.`album_id` = `song`.`album` AND `album_disk`.`disk` = `song`.`disk` GROUP BY `album_disk`.`id`) AS `object_count` SET `album_disk`.`total_count` = `object_count`.`total_count` WHERE `album_disk`.`total_count` != `object_count`.`total_count` AND `album_disk`.`id` = `object_count`.`object_id`");
45: 
46:         // now that the data is in it can update counts

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600015.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `streamtoken` to user table allowing permalink music stream access
32:  */
33: final class Migration600015 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `streamtoken` to user table allowing permalink music stream access'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `user` DROP COLUMN `streamtoken`;");
40:         $this->updateDatabase('ALTER TABLE `user` ADD COLUMN `streamtoken` varchar(255) NULL AFTER `rsstoken`');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600004.php
ERROR: Parse error at line 41 column 15:

31: use Ampache\Repository\Model\Artist;
32: use Ampache\Repository\Model\Song;
33: use Generator;
34: 
35: /**
36:  * Add `disk` to song table
37:  * Create album_disk table and migrate user ratings & flags
38:  */
39: final class Migration600004 extends AbstractMigration
40: {
41:     protected array $changelog = [
                  ^
42:         'Add `disk` to song table',
43:         'Create album_disk table and migrate user ratings & flags'
44:     ];
45: 
46:     public function migrate(): void
47:     {
48:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
49:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
50:         $engine    = 'MyISAM';
51:         // add disk to song table

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600003.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `total_skip` to podcast table
32:  */
33: final class Migration600003 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `total_skip` to podcast table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `podcast` DROP COLUMN `total_skip`;");
40:         $this->updateDatabase("ALTER TABLE `podcast` ADD COLUMN `total_skip` int(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `total_count`;");
41:         $this->updateDatabase("UPDATE `podcast`, (SELECT SUM(`podcast_episode`.`total_skip`) AS `total_skip`, `podcast` FROM `podcast_episode` GROUP BY `podcast_episode`.`podcast`) AS `object_count` SET `podcast`.`total_skip` = `object_count`.`total_skip` WHERE `podcast`.`total_skip` != `object_count`.`total_skip` AND `podcast`.`id` = `object_count`.`podcast`;");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600027.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Rename `subtitle` to `version` in the `album` table
32:  */
33: final class Migration600027 extends AbstractMigration
34: {
35:     protected array $changelog = ['Rename `subtitle` to `version` in the `album` table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
40: 
41:         $this->updateDatabase(
42:             sprintf('ALTER TABLE `album` CHANGE COLUMN `subtitle` `version` varchar(64) COLLATE %s DEFAULT NULL', $collation)
43:         );
44:     }
45: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600039.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add user preference `custom_timezone`, Custom timezone (Override PHP date.timezone)
31:  */
32: final class Migration600039 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add user preference `custom_timezone`, Display dates using a different timezone to the server timezone'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('custom_timezone', 'Custom timezone (Override PHP date.timezone)', '', 25, 'string', 'interface', 'custom');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600049.php
ERROR: Parse error at line 31 column 15:

21:  * You should have received a copy of the GNU Affero General Public License
22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: final class Migration600049 extends AbstractMigration
30: {
31:     protected array $changelog = ['Update link for `FMPL` license'];
                  ^
32: 
33:     public function migrate(): void
34:     {
35:         $sql = 'UPDATE `license` SET `external_link` = \'http://www.ram.org/ramblings/philosophy/fmp/fmpl/fmpl.html\' WHERE `name` = \'FMPL\'';
36: 
37:         $this->updateDatabase($sql);
38:     }
39: }
40: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600014.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `subtitle` to the album table
32:  */
33: final class Migration600014 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `subtitle` to the album table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
40: 
41:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `subtitle` varchar(64) COLLATE $collation DEFAULT NULL AFTER `catalog_number`");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600042.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add user preference `bookmark_latest`, Only keep the latest media bookmark
31:  */
32: final class Migration600042 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add user preference `bookmark_latest`, Only keep the latest media bookmark'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('bookmark_latest', 'Only keep the latest media bookmark', '0', 25, 'boolean', 'options');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600056.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600056 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `user_flag` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `user_flag` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `user_flag` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600032.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `object_type` enum list on `rating` table
31:  */
32: final class Migration600032 extends AbstractMigration
33: {
34:     protected array $changelog = ['Extend `object_type` enum list on `rating` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `rating` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39: 
40:         $this->updateDatabase('ALTER TABLE `rating` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600050.php
ERROR: Parse error at line 32 column 15:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: final class Migration600050 extends AbstractMigration
31: {
32:     protected array $changelog = ['Update Last.FM plugin preferences that could be incorrect'];
                  ^
33: 
34:     public function migrate(): void
35:     {
36:         $sql = 'UPDATE `preference` SET `catagory` = \'plugins\' WHERE `name` = \'lastfm_grant_link\'';
37:         Dba::write($sql);
38:         $sql = 'UPDATE `preference` SET `catagory` = \'internal\' WHERE `name` = \'lastfm_challenge\'';
39:         Dba::write($sql);
40:         $sql = 'UPDATE `preference` SET `subcatagory` = \'last.fm\' WHERE `name` IN (\'lastfm_challenge\', \'lastfm_grant_link\')';
41:         Dba::write($sql);
42:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600067.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600067 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the user_vote table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `user_vote` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600057.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600057 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `user_activity` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `user_activity` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `user_activity` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600013.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option 'api_enable_6' to enable/disable API6
31:  */
32: final class Migration600013 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option \'api_enable_6\' to enable/disable API6'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('api_enable_6', 'Enable API6 responses', '1', 25, 'boolean', 'options');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600051.php
ERROR: Parse error at line 32 column 15:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: final class Migration600051 extends AbstractMigration
31: {
32:     protected array $changelog = ['Update `preference` table to spell category and subcategory correctly'];
                  ^
33: 
34:     public function migrate(): void
35:     {
36:         if (!Dba::read('SELECT `category` FROM `preference` LIMIT 1;')) {
37:             $sql = 'ALTER TABLE `preference` CHANGE COLUMN `catagory` `category` varchar(128) DEFAULT NULL;';
38:             $this->updateDatabase($sql);
39:         }
40:         if (!Dba::read('SELECT `subcategory` FROM `preference` LIMIT 1;')) {
41:             $sql = 'ALTER TABLE `preference` CHANGE COLUMN `subcatagory` `subcategory` varchar(128) DEFAULT NULL;';
42:             $this->updateDatabase($sql);

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600058.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600058 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `object_count` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `object_count` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `object_count` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600026.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add user preference `use_play2`, Use an alternative playback action for streaming if you have issues with playing music
31:  */
32: final class Migration600026 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add user preference `use_play2`, Use an alternative playback action for streaming if you have issues with playing music'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('use_play2', 'Use an alternative playback action for streaming if you have issues with playing music', '0', 25, 'special', 'streaming', 'player');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600054.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert `object_type` to an enum on `image` table
31:  */
32: final class Migration600054 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert `object_type` to an enum on `image` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('DELETE FROM `image` WHERE `object_type` IS NULL OR `object_type` NOT IN (\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\')');
39:         $this->updateDatabase('ALTER TABLE `image` MODIFY COLUMN `object_type` enum(\'album\', \'album_disk\', \'artist\', \'catalog\', \'tag\', \'label\', \'live_stream\', \'playlist\', \'podcast\', \'podcast_episode\', \'search\', \'song\', \'tvshow\', \'tvshow_season\', \'user\', \'video\') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600009.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Drop `disk` from the `album` table
31:  */
32: final class Migration600009 extends AbstractMigration
33: {
34:     protected array $changelog = ['Drop `disk` from the `album` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `album` DROP COLUMN `disk`");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600040.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `disksubtitle` to `song_data` and `album_disk` table
32:  */
33: final class Migration600040 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `disksubtitle` to `song_data` and `album_disk` table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write('ALTER TABLE `song_data` DROP COLUMN `disksubtitle`');
40:         $this->updateDatabase('ALTER TABLE `song_data` ADD COLUMN `disksubtitle` varchar(255) NULL DEFAULT NULL');
41:         Dba::write('ALTER TABLE `album_disk` DROP COLUMN `disksubtitle`');
42:         $this->updateDatabase('ALTER TABLE `album_disk` ADD COLUMN `disksubtitle` varchar(255) NULL DEFAULT NULL');
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600010.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Rename `user_data` album keys
31:  */
32: final class Migration600010 extends AbstractMigration
33: {
34:     protected array $changelog = ['Rename `user_data` album keys'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         // album was the ungrouped disks so rename those first
39:         $this->updateDatabase("UPDATE IGNORE `user_data` SET `key` = 'album_disk' WHERE `key` = 'album'");
40: 
41:         // album_group is now the default state
42:         $this->updateDatabase("UPDATE IGNORE `user_data` SET `key` = 'album' WHERE `key` = 'album_group'");
43: 
44:         $this->updateDatabase("DELETE FROM `user_data` WHERE `key` = 'album_group'");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600019.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * During migration some album_disk data may be missing it's object type
31:  */
32: final class Migration600019 extends AbstractMigration
33: {
34:     protected array $changelog = ['During migration some album_disk data may be missing it\'s object type'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase('UPDATE IGNORE `rating` SET `object_type` = \'album_disk\' WHERE `object_type` = \'\'');
39:         $this->updateDatabase('DELETE FROM `rating` WHERE `object_type` = \'\';');
40:         $this->updateDatabase('UPDATE IGNORE `object_count` SET `object_type` = \'album_disk\' WHERE `object_type` = \'\'');
41:         $this->updateDatabase('DELETE FROM `object_count` WHERE `object_type` = \'\'');
42: 
43:         // rating (id, `user`, object_type, object_id, rating)
44:         $this->updateDatabase('INSERT IGNORE INTO `rating` (`object_type`, `object_id`, `user`, `rating`) SELECT DISTINCT \'album_disk\', `album_disk`.`id`, `rating`.`user`, `rating`.`rating` FROM `rating` LEFT JOIN `album` ON `rating`.`object_type` = \'album\' AND `rating`.`object_id` = `album`.`id` LEFT JOIN `album_disk` ON `album`.`id` = `album_disk`.`album_id` LEFT JOIN `rating` AS `album_rating` ON `album_rating`.`object_type` = \'album\' AND `rating`.`rating` = `album_rating`.`rating` AND `rating`.`user` = `album_rating`.`user` WHERE `rating`.`object_type` = \'album\' AND `album_disk`.`id` IS NOT NULL');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600005.php
ERROR: Parse error at line 42 column 15:

32: use Ampache\Repository\Model\Artist;
33: use Ampache\Repository\Model\Catalog;
34: use Ampache\Repository\Model\Song;
35: use Psr\Log\LoggerInterface;
36: 
37: /**
38:  * Migrate multi-disk albums to single album id's
39:  */
40: final class Migration600005 extends AbstractMigration
41: {
42:     protected array $changelog = ['Migrate multi-disk albums to single album id\'s'];
                  ^
43: 
44:     protected bool $warning = true;
45: 
46:     private LoggerInterface $logger;
47: 
48:     public function __construct(
49:         LoggerInterface $logger,
50:         DatabaseConnectionInterface $connection
51:     ) {
52:         parent::__construct(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600064.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Extend `time` column for the stream_playlist table
31:  */
32: final class Migration600064 extends AbstractMigration
33: {
34:     protected array $changelog = ['Allow signed `user` column for the share table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `share` MODIFY COLUMN `user` int(11) NOT NULL");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600025.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V6;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('show_header_login') Show the login / registration links in the site header
31:  */
32: final class Migration600025 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'show_header_login\') Show the login / registration links in the site header'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('show_header_login', 'Show the login / registration links in the site header', '1', 100, 'boolean', 'system', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V6/Migration600036.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Ampache\Repository\Model\User;
30: 
31: /**
32:  * Update user `play_size` and catalog `size` fields to megabytes (Stop large catalogs overflowing 32bit ints)
33:  */
34: final class Migration600036 extends AbstractMigration
35: {
36:     protected array $changelog = ['Update user `play_size` and catalog `size` fields to megabytes (Stop large catalogs overflowing 32bit ints)'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $sql       = "SELECT `id` FROM `user`";
41:         $db_users  = Dba::read($sql);
42:         $user_list = array();
43:         while ($results = Dba::fetch_assoc($db_users)) {
44:             $user_list[] = (int)$results['id'];
45:         }
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500009.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('use_original_year') Browse by Original Year for albums (falls back to Year)
31:  */
32: final class Migration500009 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'use_original_year\') Browse by Original Year for albums (falls back to Year)'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('use_original_year', 'Browse by Original Year for albums (falls back to Year)', '0', 25, 'boolean', 'interface', 'browse');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500000.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Delete duplicate files in the song table
31:  */
32: final class Migration500000 extends AbstractMigration
33: {
34:     protected array $changelog = ['Delete duplicate files in the song table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DELETE `dupe` FROM `song` AS `dupe`, `song` AS `orig` WHERE `dupe`.`id` > `orig`.`id` AND `dupe`.`file` <=> `orig`.`file`;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530015.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add `show_album_artist` and `show_artist` preferences to show/hide Sidebar Browse menu links. (Fallback to Album Artist if both disabled)
31:  */
32: final class Migration530015 extends AbstractMigration
33: {
34:     protected array $changelog = [
                  ^
35:         'Add `show_album_artist` and `show_artist` preferences to show/hide Sidebar Browse menu links',
36:         'Fallback to Album Artist if both disabled'
37:     ];
38: 
39:     public function migrate(): void
40:     {
41:         $this->updatePreferences('show_album_artist', 'Show \'Album Artists\' link in the main sidebar', '1', 25, 'boolean', 'interface', 'theme');
42:         $this->updatePreferences('show_artist', 'Show \'Artists\' link in the main sidebar', '0', 25, 'boolean', 'interface', 'theme');
43:     }
44: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration520000.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui options ('api_enable_3', 'api_enable_4', 'api_enable_5') to enable/disable specific API versions
31:  * Add ui option ('api_force_version') to force a specific API response (even if that version is disabled)
32:  */
33: final class Migration520000 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add ui options (\'api_enable_3\', \'api_enable_4\', \'api_enable_5\') to enable/disable specific API versions',
37:         'Add ui option (\'api_force_version\') to force a specific API response (even if that version is disabled)'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updatePreferences('api_enable_3', 'Enable API3 responses', '1', 25, 'boolean', 'options');
43:         $this->updatePreferences('api_enable_4', 'Enable API4 responses', '1', 25, 'boolean', 'options');
44:         $this->updatePreferences('api_enable_5', 'Enable API5 responses', '1', 25, 'boolean', 'options');
45:         $this->updatePreferences('api_force_version', 'Force a specific API response (even if that version is disabled)', '0', 25, 'special', 'options');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration510001.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add podcast to the cache_object_count tables
31:  */
32: final class Migration510001 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add podcast to the cache_object_count tables'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `cache_object_count_run` MODIFY COLUMN `object_type` enum('album','artist','song','playlist','genre','catalog','live_stream','video','podcast','podcast_episode');");
39:         $this->updateDatabase("ALTER TABLE `cache_object_count` MODIFY COLUMN `object_type` enum('album','artist','song','playlist','genre','catalog','live_stream','video','podcast','podcast_episode');");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration510005.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('subsonic_always_download') Force Subsonic streams to download. (Enable scrobble in your client to record stats)
31:  */
32: final class Migration510005 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'subsonic_always_download\') Force Subsonic streams to download. (Enable scrobble in your client to record stats)'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('subsonic_always_download', 'Force Subsonic streams to download. (Enable scrobble in your client to record stats)', '0', 25, 'boolean', 'options', 'subsonic');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500012.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Move user bandwidth calculations out of the user format function into the user_data table
32:  */
33: final class Migration500012 extends AbstractMigration
34: {
35:     protected array $changelog = ['Move user bandwidth calculations out of the user format function into the user_data table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $sql       = "SELECT `id` FROM `user`";
40:         $db_users  = Dba::read($sql);
41:         $user_list = array();
42:         while ($results = Dba::fetch_assoc($db_users)) {
43:             $user_list[] = (int)$results['id'];
44:         }
45:         // Calculate their total Bandwidth Usage

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530006.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Make sure the object_count table has all the correct primary artist/album rows
31:  */
32: final class Migration530006 extends AbstractMigration
33: {
34:     protected array $changelog = ['Make sure `object_count` table has all the correct primary artist/album rows'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("INSERT INTO `object_count` (object_type, object_id, `date`, `user`, agent, geo_latitude, geo_longitude, geo_name, count_type) SELECT 'album', `song`.`album`, `object_count`.`date`, `object_count`.`user`, `object_count`.`agent`, `object_count`.`geo_latitude`, `object_count`.`geo_longitude`, `object_count`.`geo_name`, `object_count`.`count_type` FROM `object_count` LEFT JOIN `song` ON `object_count`.`object_type` = 'song' AND `object_count`.`count_type` = 'stream' AND `object_count`.`object_id` = `song`.`id` LEFT JOIN `object_count` AS `album_count` ON `album_count`.`object_type` = 'album' AND `object_count`.`date` = `album_count`.`date` AND `object_count`.`user` = `album_count`.`user` AND `object_count`.`agent` = `album_count`.`agent` AND `object_count`.`count_type` = `album_count`.`count_type` WHERE `object_count`.`object_type` = 'song' AND `object_count`.`count_type` = 'stream' AND `album_count`.`id` IS NULL AND `song`.`album` IS NOT NULL;");
39:         $this->updateDatabase("INSERT INTO `object_count` (object_type, object_id, `date`, `user`, agent, geo_latitude, geo_longitude, geo_name, count_type) SELECT 'artist', `song`.`artist`, `object_count`.`date`, `object_count`.`user`, `object_count`.`agent`, `object_count`.`geo_latitude`, `object_count`.`geo_longitude`, `object_count`.`geo_name`, `object_count`.`count_type` FROM `object_count` LEFT JOIN `song` ON `object_count`.`object_type` = 'song' AND `object_count`.`count_type` = 'stream' AND `object_count`.`object_id` = `song`.`id` LEFT JOIN `object_count` AS `artist_count` ON `artist_count`.`object_type` = 'artist' AND `object_count`.`date` = `artist_count`.`date` AND `object_count`.`user` = `artist_count`.`user` AND `object_count`.`agent` = `artist_count`.`agent` AND `object_count`.`count_type` = `artist_count`.`count_type` WHERE `object_count`.`object_type` = 'song' AND `object_count`.`count_type` = 'stream' AND `artist_count`.`id` IS NULL AND `song`.`artist` IS NOT NULL;");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530007.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Convert basic text columns into utf8/utf8_unicode_ci
31:  */
32: final class Migration530007 extends AbstractMigration
33: {
34:     protected array $changelog = ['Convert basic text columns into utf8 to reduce index sizes'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("UPDATE `album` SET `mbid` = NULL WHERE CHAR_LENGTH(`mbid`) > 36;");
39:         $this->updateDatabase("UPDATE `album` SET `mbid_group` = NULL WHERE CHAR_LENGTH(`mbid`) > 36;");
40: 
41:         $this->updateDatabase("ALTER TABLE `album` MODIFY COLUMN `mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL;");
42:         $this->updateDatabase("ALTER TABLE `album` MODIFY COLUMN `mbid_group` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL;");
43:         $this->updateDatabase("ALTER TABLE `object_count` MODIFY COLUMN `object_type` enum('album','artist','song','playlist','genre','catalog','live_stream','video','podcast','podcast_episode') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL;");
44:         $this->updateDatabase("ALTER TABLE `rating` MODIFY COLUMN `object_type` enum('album','artist','song','stream','video','playlist','tvshow','tvshow_season','podcast','podcast_episode') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration550002.php
ERROR: Parse error at line 38 column 15:

28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Migrate catalog `filter_user` settings to catalog_filter groups
32:  * Assign all public catalogs to the DEFAULT group
33:  * Drop table `user_catalog`
34:  * Remove `filter_user` from the `catalog` table
35:  */
36: final class Migration550002 extends AbstractMigration
37: {
38:     protected array $changelog = [
                  ^
39:         '**IMPORTANT UPDATE NOTES** Any user that has a private catalog will have their own filter group created which includes all public catalogs',
40:         'Migrate catalog `filter_user` settings to the `catalog_filter_group` table',
41:         'Assign all public catalogs to the DEFAULT group',
42:         'Drop table `user_catalog`',
43:         'Remove `filter_user` from the `catalog` table',
44:     ];
45: 
46:     public function migrate(): void
47:     {
48:         // Copy existing filters into individual groups for each user. (if a user only has access to public catalogs they are given the default list)

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530013.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Compact `cache_object_count`, `cache_object_count_run` columns
31:  */
32: final class Migration530013 extends AbstractMigration
33: {
34:     protected array $changelog = ['Compact `cache_object_count`, `cache_object_count_run` columns'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `cache_object_count` MODIFY COLUMN `count_type` enum('download','stream','skip') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;");
39: 
40:         $this->updateDatabase("ALTER TABLE `cache_object_count_run` MODIFY COLUMN `count_type` enum('download','stream','skip') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration540000.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Index `title` with `enabled` on `song` table to speed up searching
32:  */
33: final class Migration540000 extends AbstractMigration
34: {
35:     protected array $changelog = ['Index `title` with `enabled` on `song` table to speed up searching'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `song` DROP KEY `title_enabled_IDX`;");
40:         $this->updateDatabase("CREATE INDEX `title_enabled_IDX` USING BTREE ON `song` (`title`, `enabled`);");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500004.php
ERROR: Parse error at line 38 column 15:

28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: use Ampache\Repository\Model\Catalog;
31: use Generator;
32: 
33: /**
34:  * Create catalog_map table and fill it with data
35:  */
36: final class Migration500004 extends AbstractMigration
37: {
38:     protected array $changelog = ['Create catalog_map table and fill it with data'];
                  ^
39: 
40:     protected bool $warning = true;
41: 
42:     public function migrate(): void
43:     {
44:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
45:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
46:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
47:         $tables    = ['song', 'album', 'video', 'podcast_episode'];
48:         $catalogs  = Catalog::get_catalogs();

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration510004.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add waveform column to podcast_episode table
32:  */
33: final class Migration510004 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add waveform column to podcast_episode table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `podcast_episode` DROP COLUMN `waveform`;");
40:         $this->updateDatabase("ALTER TABLE `podcast_episode` ADD COLUMN `waveform` mediumblob DEFAULT NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration550003.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add system preference `demo_use_search`, Use smartlists for base playlist in Democratic play
31:  */
32: final class Migration550003 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add system preference `demo_use_search`, Use smartlists for base playlist in Democratic play'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('demo_use_search', 'Democratic - Use smartlists for base playlist', '0', 25, 'boolean', 'playlist');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530010.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Compact mbid columns back to 36 characters
31:  */
32: final class Migration530010 extends AbstractMigration
33: {
34:     protected array $changelog = ['Compact mbid columns back to 36 characters'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("UPDATE `artist` SET `mbid` = NULL WHERE CHAR_LENGTH(`mbid`) > 36;");
39:         $this->updateDatabase("UPDATE `recommendation_item` SET `mbid` = NULL WHERE CHAR_LENGTH(`mbid`) > 36;");
40:         $this->updateDatabase("ALTER TABLE `artist` MODIFY COLUMN `mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
41: 
42:         $this->updateDatabase("ALTER TABLE `recommendation_item` MODIFY COLUMN `mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
43: 
44:         $this->updateDatabase("ALTER TABLE `song_preview` MODIFY COLUMN `artist_mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500003.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * add `catalog` to podcast_episode table
32:  */
33: final class Migration500003 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `catalog` to podcast_episode table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `podcast_episode` DROP COLUMN `catalog`;");
40:         $this->updateDatabase("ALTER TABLE `podcast_episode` ADD COLUMN `catalog` int(11) UNSIGNED NOT NULL DEFAULT '0';");
41: 
42:         $this->updateDatabase("UPDATE `podcast_episode`, (SELECT min(`podcast`.`catalog`) AS `catalog`, `podcast`.`id` FROM `podcast` GROUP BY `podcast`.`id`) AS `podcast` SET `podcast_episode`.`catalog` = `podcast`.`catalog` WHERE `podcast_episode`.`catalog` != `podcast`.`catalog` AND `podcast_episode`.`podcast` = `podcast`.`id`;");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration520001.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Make sure preference names are always unique
32:  */
33: final class Migration520001 extends AbstractMigration
34: {
35:     protected array $changelog = ['Make sure preference names are always unique'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $sql        = "SELECT `id` FROM `preference` WHERE `name` IN (SELECT `name` FROM `preference` GROUP BY `name` HAVING count(`name`) >1) AND `id` NOT IN (SELECT MIN(`id`) FROM `preference` GROUP by `name`);";
40:         $dupe_prefs = Dba::read($sql);
41:         $pref_list  = array();
42:         while ($results = Dba::fetch_assoc($dupe_prefs)) {
43:             $pref_list[] = (int)$results['id'];
44:         }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530003.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Drop id column from catalog_map
32:  * Alter `catalog_map` object_type charset and collation
33:  */
34: final class Migration530003 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Drop id column from catalog_map table',
38:         'Alter `catalog_map` object_type charset and collation'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         Dba::write("ALTER TABLE `catalog_map` DROP COLUMN `id`;");
44:         $this->updateDatabase("ALTER TABLE `catalog_map` MODIFY COLUMN object_type varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
45:     }
46: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530004.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Alter `album_map` charset and engine to MyISAM if engine set
31:  */
32: final class Migration530004 extends AbstractMigration
33: {
34:     protected array $changelog = ['Alter `album_map` table charset and engine to MyISAM if engine set'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `album_map` ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;");
39:         $this->updateDatabase("ALTER TABLE `album_map` MODIFY COLUMN `object_type` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530000.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Create artist_map table and fill it with data
33:  */
34: final class Migration530000 extends AbstractMigration
35: {
36:     protected array $changelog = ['Create artist_map table and fill it with data'];
                  ^
37: 
38:     protected bool $warning = true;
39: 
40:     public function migrate(): void
41:     {
42:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
43:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
44:         $engine    = 'MyISAM';
45: 
46:         // create the table

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500011.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `total_count` to podcast table and fill counts into the column
32:  */
33: final class Migration500011 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `total_count` to podcast table and fill counts into the column'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `podcast` DROP COLUMN `total_count`;");
40:         $this->updateDatabase("ALTER TABLE `podcast` ADD COLUMN `total_count` int(11) UNSIGNED NOT NULL DEFAULT '0';");
41:         $this->updateDatabase("UPDATE `podcast`, (SELECT SUM(`podcast_episode`.`total_count`) AS `total_count`, `podcast` FROM `podcast_episode` GROUP BY `podcast_episode`.`podcast`) AS `object_count` SET `podcast`.`total_count` = `object_count`.`total_count` WHERE `podcast`.`total_count` != `object_count`.`total_count` AND `podcast`.`id` = `object_count`.`podcast`;");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500006.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add user_playlist table
33:  */
34: final class Migration500006 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add user_playlist and user_data table'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
41:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
42:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
43: 
44:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_playlist` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `user` int(11) DEFAULT NULL, `object_type` enum('song','live_stream','video','podcast_episode') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `object_id` int(11) UNSIGNED NOT NULL DEFAULT '0', `track` smallint(6) DEFAULT NULL, `current_track` tinyint(1) UNSIGNED NOT NULL DEFAULT 0, `current_time` smallint(5) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`),KEY `user` (`user`)) ENGINE=$engine DEFAULT CHARSET=$charset COLLATE=$collation;");
45:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_data` (`user` int(11) DEFAULT NULL, `key` varchar(128) CHARACTER SET $charset COLLATE $collation DEFAULT NULL, `value` varchar(255) CHARACTER SET $charset COLLATE $collation DEFAULT NULL, KEY `user` (`user`), KEY `key` (`key`)) ENGINE=$engine DEFAULT CHARSET=$charset COLLATE=$collation;");
46:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530005.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Alter `artist_map` charset and engine to MyISAM if engine set
31:  */
32: final class Migration530005 extends AbstractMigration
33: {
34:     protected array $changelog = ['Alter `artist_map` table charset and engine to MyISAM if engine set'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `artist_map` ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;");
39:         $this->updateDatabase("ALTER TABLE `artist_map` MODIFY COLUMN `object_type` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500002.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Create `total_count` and `total_skip` to album, artist, song, video and podcast_episode tables
32:  * Fill counts into the columns
33:  */
34: final class Migration500002 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Create `total_count` and `total_skip` to album, artist, song, video and podcast_episode tables',
38:         'Fill counts into the columns'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         // tables which usually calculate a count
44:         $tables = ['album', 'artist', 'song', 'video', 'podcast_episode'];
45:         foreach ($tables as $type) {
46:             Dba::write("ALTER TABLE `$type` DROP COLUMN `total_count`;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration520002.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('show_playlist_username') Show playlist owner username in titles
31:  */
32: final class Migration520002 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'show_playlist_username\') Show playlist owner username in titles'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('show_playlist_username', 'Show playlist owner username in titles', '1', 25, 'boolean', 'interface', 'browse');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500008.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add filter_user to catalog table, set unique on user_data
32:  */
33: final class Migration500008 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add filter_user to catalog table',
37:         'Set a unique key on user_data'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         Dba::write("ALTER TABLE `catalog` DROP COLUMN `filter_user`;");
43:         $this->updateDatabase("ALTER TABLE `catalog` ADD COLUMN `filter_user` int(11) unsigned DEFAULT 0 NOT NULL;");
44: 
45:         $tables = ['podcast', 'live_stream'];

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500015.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('hide_genres') Hide the Genre column in browse table rows
31:  */
32: final class Migration500015 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'hide_genres\') Hide the Genre column in browse table rows'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('hide_genres', 'Hide the Genre column in browse table rows', '0', 25, 'boolean', 'interface', 'browse');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530009.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Compact `object_count` columns
31:  */
32: final class Migration530009 extends AbstractMigration
33: {
34:     protected array $changelog = ['Compact `object_count` columns'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `object_count` MODIFY COLUMN `count_type` enum('download','stream','skip') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
39:         $this->updateDatabase("ALTER TABLE `object_count` MODIFY COLUMN `agent` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
40:         $this->updateDatabase("ALTER TABLE `object_count` MODIFY COLUMN `geo_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530011.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: 
31: /**
32:  * Compact `user` columns and enum `object_count`.`count_type`
33:  */
34: final class Migration530011 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Compact some `user` columns',
38:         'enum `object_count`.`count_type`'
39:     ];
40: 
41:     public function migrate(): void
42:     {
43:         $collation  = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
44:         $charset    = (AmpConfig::get('database_charset', 'utf8mb4'));
45:         $rsstoken   = false;
46:         $sql        = "DESCRIBE `user`";

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500007.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add a 'Browse' category to interface preferences
31:  * Add ui option ('show_license') for hiding license column in song rows
32:  */
33: final class Migration500007 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add a \'Browse\' category to interface preferences',
37:         'Add option (\'show_license\') for hiding license column in song rows'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updateDatabase("UPDATE `preference` SET `preference`.`subcatagory` = 'browse' WHERE `preference`.`name` IN ('show_played_times', 'browse_filter', 'libitem_browse_alpha', 'show_skipped_times')");
43: 
44:         $this->updatePreferences('show_license', 'Show License', '1', 25, 'boolean', 'interface', 'browse');
45:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500001.php
ERROR: Parse error at line 38 column 15:

28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `release_status`, `addition_time`, `catalog` to album table
32:  * Add `mbid`, `country`, `active` to label table
33:  * Fill the album `catalog` and `time` values using the song table
34:  * Fill the artist `album_count`, `album_group_count` and `song_count` values
35:  */
36: final class Migration500001 extends AbstractMigration
37: {
38:     protected array $changelog = [
                  ^
39:         'Add `release_status`, `addition_time`, `catalog` to album table',
40:         'Add `mbid`, `country` and `active` to label table',
41:         'Fill the album `catalog` value using the song table',
42:         'Fill the artist `album_count`, `album_group_count` and `song_count` values'
43:     ];
44: 
45:     public function migrate(): void
46:     {
47:         Dba::write("ALTER TABLE `album` DROP COLUMN `release_status`;");
48:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `release_status` varchar(32) DEFAULT NULL;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530001.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Create album_map table and fill it with data
33:  */
34: final class Migration530001 extends AbstractMigration
35: {
36:     protected array $changelog = ['Create album_map table and fill it with data'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
41:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
42:         $engine    = 'MyISAM';
43: 
44:         // create the table
45:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `album_map` (`album_id` int(11) UNSIGNED NOT NULL, `object_id` int(11) UNSIGNED NOT NULL, `object_type` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, UNIQUE KEY `unique_album_map` (`object_id`, `object_type`, `album_id`), INDEX `object_id_index` (`object_id`), INDEX `album_id_type_index` (`album_id`, `object_type`), INDEX `object_id_type_index` (`object_id`, `object_type`)) ENGINE=$engine DEFAULT CHARSET=$charset COLLATE=$collation;");
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530014.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Use a smaller unique index on `object_count`
32:  */
33: final class Migration530014 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Delete `object_count` duplicates',
37:         'Use a smaller unique index on `object_count`'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         Dba::write("ALTER TABLE `object_count` DROP KEY `object_count_UNIQUE_IDX`;");
43: 
44:         // delete duplicates and make sure they're gone
45:         $this->updateDatabase("DELETE FROM `object_count` WHERE `id` IN (SELECT `id` FROM (SELECT `id` FROM `object_count` WHERE `object_id` IN (SELECT `object_id` FROM `object_count` GROUP BY `object_type`, `object_id`, `date`, `user`, `agent`, `count_type` HAVING COUNT(`object_id`) > 1) AND `id` NOT IN (SELECT MIN(`id`) FROM `object_count` GROUP BY `object_type`, `object_id`, `date`, `user`, `agent`, `count_type`)) AS `count`);");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration540002.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Index `object_type` with `date` in `object_count` table
32:  */
33: final class Migration540002 extends AbstractMigration
34: {
35:     protected array $changelog = ['Index `object_type` with `date` in `object_count` table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `object_count` DROP KEY `object_type_date_IDX`;");
40:         $this->updateDatabase("CREATE INDEX `object_type_date_IDX` USING BTREE ON `object_count` (`object_type`, `date`);");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500005.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add song_count, artist_count to album
32:  */
33: final class Migration500005 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add song_count, artist_count to album'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `album` DROP COLUMN `song_count`;");
40:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `song_count` smallint(5) unsigned DEFAULT 0 NULL;");
41:         Dba::write("ALTER TABLE `album` DROP COLUMN `artist_count`;");
42:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `artist_count` smallint(5) unsigned DEFAULT 0 NULL;");
43:         $this->updateDatabase("REPLACE INTO `update_info` SET `key`= 'album_group', `value`= (SELECT COUNT(DISTINCT(`album`.`id`)) AS `count` FROM `album` WHERE `id` in (SELECT MIN(`id`) FROM `album` GROUP BY `album`.`prefix`, `album`.`name`, `album`.`album_artist`, `album`.`release_type`, `album`.`release_status`, `album`.`mbid`, `album`.`year`, `album`.`original_year`, `album`.`mbid_group`));");
44:         $this->updateDatabase("UPDATE `album`, (SELECT COUNT(`song`.`id`) AS `song_count`, `album` FROM `song` LEFT JOIN `catalog` ON `catalog`.`id` = `song`.`catalog` WHERE `catalog`.`enabled` = '1' GROUP BY `album`) AS `song` SET `album`.`song_count` = `song`.`song_count` WHERE `album`.`song_count` != `song`.`song_count` AND `album`.`id` = `song`.`album`;");
45:         $this->updateDatabase("UPDATE `album`, (SELECT COUNT(DISTINCT(`song`.`artist`)) AS `artist_count`, `album` FROM `song` LEFT JOIN `catalog` ON `catalog`.`id` = `song`.`catalog` WHERE `catalog`.`enabled` = '1' GROUP BY `album`) AS `song` SET `album`.`artist_count` = `song`.`artist_count` WHERE `album`.`artist_count` != `song`.`artist_count` AND `album`.`id` = `song`.`album`;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration520005.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('api_hide_dupe_searches') Hide smartlists that match playlist names in Subsonic and API clients
31:  */
32: final class Migration520005 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'api_hide_dupe_searches\') Hide smartlists that match playlist names in Subsonic and API clients'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('api_hide_dupe_searches', 'Hide smartlists that match playlist names in Subsonic and API clients', '0', 25, 'boolean', 'options');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500010.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('hide_single_artist') Hide the Song Artist column for Albums with one Artist
31:  */
32: final class Migration500010 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'hide_single_artist\') Hide the Song Artist column for Albums with one Artist'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('hide_single_artist', 'Hide the Song Artist column for Albums with one Artist', '0', 25, 'boolean', 'interface', 'browse');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration540001.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Index album tables. `catalog`, `album_artist`, `original_year`, `release_type`, `release_status`, `mbid`, `mbid_group`
32:  */
33: final class Migration540001 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Index `album` table columns',
37:         '`catalog`, `album_artist`, `original_year`, `release_type`, `release_status`, `mbid`, `mbid_group`'
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         Dba::write("ALTER TABLE `album` DROP KEY `catalog_IDX`;");
43:         $this->updateDatabase("CREATE INDEX `catalog_IDX` USING BTREE ON `album` (`catalog`);");
44: 
45:         Dba::write("ALTER TABLE `album` DROP KEY `album_artist_IDX`;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration550001.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: use Generator;
31: 
32: final class Migration550001 extends AbstractMigration
33: {
34:     protected array $changelog = [
                  ^
35:         'Add tables `catalog_filter_group` and `catalog_filter_group_map` for catalog filtering by groups',
36:         'Add column `catalog_filter_group` to `user` table to assign a filter group'
37:     ];
38: 
39:     /**
40:      * Add tables `catalog_filter_group` and `catalog_filter_group_map` for catalog filtering by groups
41:      * Add column `catalog_filter_group` to `user` table to assign a filter group
42:      * Create a DEFAULT group
43:      */
44:     public function migrate(): void

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500014.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add `episodes` to podcast table to track episode count
32:  */
33: final class Migration500014 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add `episodes` to podcast table to track episode count'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `podcast` DROP COLUMN `episodes`;");
40:         $this->updateDatabase("ALTER TABLE `podcast` ADD COLUMN `episodes` int(11) UNSIGNED NOT NULL DEFAULT '0';");
41: 
42:         $this->updateDatabase("UPDATE `podcast`, (SELECT COUNT(`podcast_episode`.`id`) AS `episodes`, `podcast` FROM `podcast_episode` GROUP BY `podcast_episode`.`podcast`) AS `episode_count` SET `podcast`.`episodes` = `episode_count`.`episodes` WHERE `podcast`.`episodes` != `episode_count`.`episodes` AND `podcast`.`id` = `episode_count`.`podcast`;");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530002.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Use song_count & artist_count with album_map
32:  */
33: final class Migration530002 extends AbstractMigration
34: {
35:     protected array $changelog = ['Use song_count & artist_count with album_map'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `album` DROP COLUMN `song_artist_count`;");
40:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `song_artist_count` smallint(5) unsigned DEFAULT 0 NULL;");
41:         $this->updateDatabase("UPDATE `album`, (SELECT COUNT(`song`.`id`) AS `song_count`, `album` FROM `song` LEFT JOIN `catalog` ON `catalog`.`id` = `song`.`catalog` WHERE `catalog`.`enabled` = '1' GROUP BY `album`) AS `song` SET `album`.`song_count` = `song`.`song_count` WHERE `album`.`song_count` != `song`.`song_count` AND `album`.`id` = `song`.`album`;");
42:         $this->updateDatabase("UPDATE `album`, (SELECT COUNT(DISTINCT(`album_map`.`object_id`)) AS `artist_count`, `album_id` FROM `album_map` LEFT JOIN `album` ON `album`.`id` = `album_map`.`album_id` LEFT JOIN `catalog` ON `catalog`.`id` = `album`.`catalog` WHERE `album_map`.`object_type` = 'song' AND `catalog`.`enabled` = '1' GROUP BY `album_id`) AS `album_map` SET `album`.`song_artist_count` = `album_map`.`artist_count` WHERE `album`.`id` = `album_map`.`album_id`;");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration520003.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add ui option ('api_hidden_playlists') Hide playlists in Subsonic and API clients that start with this string
31:  */
32: final class Migration520003 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add ui option (\'api_hidden_playlists\') Hide playlists in Subsonic and API clients that start with this string'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('api_hidden_playlists', 'Hide playlists in Subsonic and API clients that start with this string', '', 25, 'string', 'options');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration550004.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Make `demo_use_search`a system preference correctly
31:  */
32: final class Migration550004 extends AbstractMigration
33: {
34:     protected array $changelog = ['Make `demo_use_search`a system preference correctly'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("UPDATE `preference` SET `catagory`='system' WHERE `name`='demo_use_search'");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration520004.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Set 'plugins' category to lastfm_challenge preference
31:  */
32: final class Migration520004 extends AbstractMigration
33: {
34:     protected array $changelog = ['Set \'plugins\' category to lastfm_challenge preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("UPDATE `preference` SET `preference`.`catagory` = 'plugins' WHERE `preference`.`name` = 'lastfm_challenge'");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration550005.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add `song_artist` and `album_artist` maps to catalog_map
31:  */
32: final class Migration550005 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add `song_artist` and `album_artist` maps to catalog_map'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         // delete bad maps if they exist
39:         $tables = ['song', 'album', 'album_disk', 'video', 'podcast', 'podcast_episode', 'live_stream'];
40:         foreach ($tables as $type) {
41:             $this->updateDatabase("DELETE FROM `catalog_map` USING `catalog_map` LEFT JOIN (SELECT DISTINCT `$type`.`catalog` AS `catalog_id`, '$type' AS `map_type`, `$type`.`id` AS `object_id` FROM `$type` GROUP BY `$type`.`catalog`, `map_type`, `$type`.`id`) AS `valid_maps` ON `valid_maps`.`catalog_id` = `catalog_map`.`catalog_id` AND `valid_maps`.`object_id` = `catalog_map`.`object_id` AND `valid_maps`.`map_type` = `catalog_map`.`object_type` WHERE `catalog_map`.`object_type` = '$type' AND `valid_maps`.`object_id` IS NULL;");
42:         }
43: 
44:         // delete catalog_map artists

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration510003.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add live_stream to the rating table
31:  */
32: final class Migration510003 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add live_stream to the rating table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `rating` MODIFY COLUMN `object_type` enum('album','artist','song','stream','live_stream','video','playlist','tvshow','tvshow_season','podcast','podcast_episode');");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530012.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Index data on object_count
32:  */
33: final class Migration530012 extends AbstractMigration
34: {
35:     protected array $changelog = ['Index data on object_count'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `object_count` DROP KEY `object_count_full_index`;");
40:         $this->updateDatabase("CREATE INDEX `object_count_full_index` USING BTREE ON `object_count` (`object_type`, `object_id`, `date`, `user`, `agent`, `count_type`);");
41: 
42:         Dba::write("ALTER TABLE `object_count` DROP KEY `object_count_type_IDX`;");
43:         $this->updateDatabase("CREATE INDEX `object_count_type_IDX` USING BTREE ON `object_count` (`object_type`, `object_id`);");
44: 
45:         Dba::write("ALTER TABLE `object_count` DROP KEY `object_count_date_IDX`;");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530008.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Remove `user_activity` columns that are useless
31:  */
32: final class Migration530008 extends AbstractMigration
33: {
34:     protected array $changelog = ['Remove `user_activity` columns that are useless'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `user_activity` DROP COLUMN `name_track`;");
39:         $this->updateDatabase("ALTER TABLE `user_activity` DROP COLUMN `name_artist`;");
40:         $this->updateDatabase("ALTER TABLE `user_activity` DROP COLUMN `name_album`;");
41:         $this->updateDatabase("ALTER TABLE `user_activity` DROP COLUMN `mbid_track`;");
42:         $this->updateDatabase("ALTER TABLE `user_activity` DROP COLUMN `mbid_artist`;");
43:         $this->updateDatabase("ALTER TABLE `user_activity` DROP COLUMN `mbid_album`;");
44:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration510000.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add podcast to the object_count table
31:  */
32: final class Migration510000 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add podcast to the object_count table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `object_count` MODIFY COLUMN `object_type` enum('album','artist','song','playlist','genre','catalog','live_stream','video','podcast','podcast_episode') CHARACTER SET utf8 COLLATE utf8_unicode_ci;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration500013.php
ERROR: Parse error at line 38 column 15:

28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: use Generator;
31: 
32: /**
33:  * Add tables for tracking deleted files. (deleted_song, deleted_video, deleted_podcast_episode)
34:  * Add username to the playlist table to stop pulling user all the time
35:  */
36: final class Migration500013 extends AbstractMigration
37: {
38:     protected array $changelog = [
                  ^
39:         'Add tables for tracking deleted files. (deleted_song, deleted_video, deleted_podcast_episode)',
40:         'Add username to the playlist table to stop pulling user all the time'
41:     ];
42: 
43:     public function migrate(): void
44:     {
45:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
46:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
47:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
48:         // deleted_song (id, addition_time, delete_time, title, file, catalog, total_count, total_skip, album, artist)

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V5/Migration530016.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V5;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Missing type compared to previous version
31:  */
32: final class Migration530016 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add missing rating item back in the type enum'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `rating` MODIFY COLUMN `object_type` enum('album','artist','song','stream','live_stream','video','playlist','tvshow','tvshow_season','podcast','podcast_episode') CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370017.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add home display settings
31:  */
32: final class Migration370017 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add home display settings'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('home_moment_albums', 'Show Albums of the moment at home page', '1', 25, 'integer', 'interface');
39:         $this->updatePreferences('home_moment_videos', 'Show Videos of the moment at home page', '1', 25, 'integer', 'interface');
40:         $this->updatePreferences('home_now_playing', 'Show Now Playing at home page', '1', 25, 'integer', 'interface');
41:         $this->updatePreferences('custom_logo', 'Custom logo url', '', 25, 'string', 'interface');
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370033.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add Label tables.
33:  */
34: final class Migration370033 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add Label tables'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `label` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(80) NOT NULL, `category` varchar(40) NULL, `summary` TEXT CHARACTER SET $charset NULL, `address` varchar(256) NULL, `email` varchar(128) NULL, `website` varchar(256) NULL, `user` int(11) unsigned NULL, `creation_date` int(11) unsigned NULL, PRIMARY KEY (`id`)) ENGINE=$engine");
44:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `label_asso` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `label` int(11) unsigned NOT NULL, `artist` int(11) unsigned NOT NULL, `creation_date` int(11) unsigned NULL, PRIMARY KEY (`id`)) ENGINE=$engine");
45:     }
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370010.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add MusicBrainz Album Release Group identifier
32:  */
33: final class Migration370010 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add MusicBrainz Album Release Group identifier'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `mbid_group` varchar(36) CHARACTER SET $charset NULL;");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370032.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add WebDAV backend preference.
31:  */
32: final class Migration370032 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add WebDAV backend preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('webdav_backend', 'Use WebDAV backend', '0', 100, 'boolean', 'system');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360003.php
ERROR: Parse error at line 37 column 15:

27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: use Generator;
31: 
32: /**
33:  * This update moves the image data to its own table.
34:  */
35: final class Migration360003 extends AbstractMigration
36: {
37:     protected array $changelog = [
                  ^
38:         'Add image table to store images',
39:         'Drop album_data and artist_data'
40:     ];
41: 
42:     public function migrate(): void
43:     {
44:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
45:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
46:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
47: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360005.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: use Generator;
29: 
30: /**
31:  * This changes the tmp_browse table around.
32:  */
33: final class Migration360005 extends AbstractMigration
34: {
35:     protected array $changelog = ['Modify tmp_browse to allow caching of multiple browses per session'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $this->updateDatabase("DROP TABLE IF EXISTS `tmp_browse`");
40:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `tmp_browse` (`id` int(13) NOT NULL auto_increment, `sid` varchar(128) CHARACTER SET utf8 NOT NULL, `data` longtext NOT NULL, `object_data` longtext, PRIMARY KEY (`sid`, `id`)) ENGINE=MYISAM DEFAULT CHARSET=utf8;");
41:     }
42: 
43:     public function getTableMigrations(
44:         string $collation,
45:         string $charset,

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360025.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add options to enable HTML5 / Flash on web players
31:  */
32: final class Migration360025 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add options to enable HTML5 / Flash on web players'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('webplayer_flash', 'Authorize Flash Web Player(s)', '1', 25, 'boolean', 'streaming');
39:         $this->updatePreferences('webplayer_html5', 'Authorize HTML5 Web Player(s)', '1', 25, 'boolean', 'streaming');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370039.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Renamed false named sample_rate option name in preference table
31:  */
32: final class Migration370039 extends AbstractMigration
33: {
34:     protected array $changelog = ['Renamed false named sample_rate option name in preference table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("UPDATE `preference` SET `name` = 'transcode_bitrate' WHERE `preference`.`name` = 'sample_rate';");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380010.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add custom blank album/video default image and alphabet browsing options
31:  */
32: final class Migration380010 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add custom blank album/video default image and alphabet browsing options'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('custom_blankalbum', 'Custom blank album default image', '', 75, 'string', 'interface', 'custom');
39:         $this->updatePreferences('custom_blankmovie', 'Custom blank video default image', '', 75, 'string', 'interface', 'custom');
40:         $this->updatePreferences('libitem_browse_alpha', 'Alphabet browsing by default for following library items (album,artist,...)', '', 75, 'string', 'interface', 'library');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360035.php
ERROR: Parse error at line 39 column 15:

29: /**
30:  * Add beautiful stream url setting
31:  * Reverted https://github.com/ampache/ampache/commit/0c26c336269624d75985e46d324e2bc8108576ee
32:  * with adding update_380012.
33:  * Because it was changed after many systems have already performed this update.
34:  * Fix for this is update_380012 that actually reads the preference string.
35:  * So all users have a consistent database.
36:  */
37: final class Migration360035 extends AbstractMigration
38: {
39:     protected array $changelog = ['Add beautiful stream url setting'];
                  ^
40: 
41:     public function migrate(): void
42:     {
43:         $this->updatePreferences('stream_beautiful_url', 'Use beautiful stream url', '0', 100, 'boolean', 'streaming');
44:     }
45: }
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370022.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add users geolocation
31:  */
32: final class Migration370022 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add users geolocation'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `session` ADD COLUMN `geo_latitude` DECIMAL(10,6) NULL, ADD COLUMN `geo_longitude` DECIMAL(10,6) NULL, ADD COLUMN `geo_name` varchar(255) NULL");
39:         $this->updateDatabase("ALTER TABLE `object_count` ADD COLUMN `geo_latitude` DECIMAL(10,6) NULL, ADD COLUMN `geo_longitude` DECIMAL(10,6) NULL, ADD COLUMN `geo_name` varchar(255) NULL");
40: 
41:         $this->updatePreferences('geolocation', 'Allow geolocation', '0', 25, 'integer', 'options');
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370005.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add new column album_artist into table album
31:  */
32: final class Migration370005 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add new column album_artist into table song'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `song` ADD COLUMN `album_artist` int(11) unsigned DEFAULT NULL AFTER `artist`;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360026.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add agent field in `object_count` table
31:  */
32: final class Migration360026 extends AbstractMigration
33: {
34:     protected array $changelog = ['Added agent to `object_count` table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `object_count` ADD COLUMN `agent` varchar(255) NULL AFTER `user`;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370012.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add metadata information to albums / songs / videos
32:  */
33: final class Migration370012 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add metadata information to albums / songs / videos'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `release_type` varchar(32) CHARACTER SET $charset NULL");
42: 
43:         $this->updateDatabase("ALTER TABLE `song` ADD COLUMN `composer` varchar(256) CHARACTER SET $charset NULL, ADD COLUMN `channels` MEDIUMINT NULL");
44: 
45:         $this->updateDatabase("ALTER TABLE `video` ADD COLUMN `channels` MEDIUMINT NULL, ADD COLUMN `bitrate` MEDIUMINT(8) NULL, ADD COLUMN `video_bitrate` MEDIUMINT(8) NULL, ADD COLUMN `display_x` MEDIUMINT(8) NULL, ADD COLUMN `display_y` MEDIUMINT(8) NULL, ADD COLUMN `frame_rate` FLOAT NULL, ADD COLUMN `mode` enum('abr','vbr','cbr') NULL DEFAULT 'cbr'");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370020.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add webplayer browser notification settings
31:  */
32: final class Migration370020 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add webplayer browser notification settings'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('browser_notify', 'WebPlayer browser notifications', '1', 25, 'integer', 'interface');
39:         $this->updatePreferences('browser_notify_timeout', 'WebPlayer browser notifications timeout (seconds)', '10', 25, 'integer', 'interface');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370002.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add tag persistent merge reference
31:  */
32: final class Migration370002 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add tag persistent merge reference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `tag` ADD COLUMN `merged_to` int(11) NULL AFTER `name`;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360001.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * This adds the MB UUIDs to the different tables as well as some additional cleanup.
32:  */
33: final class Migration360001 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add MBID (MusicBrainz ID) fields',
37:         'Remove useless preferences',
38:     ];
39: 
40:     public function migrate(): void
41:     {
42:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `mbid` CHAR (36) AFTER `prefix`");
43:         $this->updateDatabase("ALTER TABLE `artist` ADD COLUMN `mbid` CHAR (36) AFTER `prefix`");
44:         $this->updateDatabase("ALTER TABLE `song` ADD COLUMN `mbid` CHAR (36) AFTER `track`");
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370001.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Drop unused dynamic_playlist tables and add session id to votes
32:  */
33: final class Migration370001 extends AbstractMigration
34: {
35:     protected array $changelog = ['Drop unused dynamic_playlist tables and add session id to votes'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("DROP TABLE IF EXISTS `dynamic_playlist`");
42:         $this->updateDatabase("DROP TABLE IF EXISTS `dynamic_playlist_data`");
43:         $this->updateDatabase("ALTER TABLE `user_vote` ADD COLUMN `sid` varchar(256) CHARACTER SET $charset NULL AFTER `date`");
44: 
45:         $this->updatePreferences('demo_clear_sessions', 'Clear democratic votes of expired user sessions', '0', 25, 'boolean', 'playlist');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380002.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add bookmarks
33:  */
34: final class Migration380002 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add bookmarks'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `bookmark` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `user` int(11) UNSIGNED NOT NULL, `position` int(11) UNSIGNED DEFAULT '0' NOT NULL, `comment` varchar(255) CHARACTER SET $charset NOT NULL, `object_type` varchar(64) NOT NULL, `object_id` int(11) UNSIGNED NOT NULL, `creation_date` int(11) UNSIGNED DEFAULT '0' NOT NULL, `update_date` int(11) UNSIGNED DEFAULT '0' NOT NULL) ENGINE=$engine;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380011.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Fix username max size to be the same one across all tables.
31:  */
32: final class Migration380011 extends AbstractMigration
33: {
34:     protected array $changelog = ['Fix username max size to be the same one across all tables'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE session MODIFY username varchar(255)");
39: 
40:         $this->updateDatabase("ALTER TABLE session_remember MODIFY username varchar(255)");
41: 
42:         $this->updateDatabase("ALTER TABLE user MODIFY username varchar(255)");
43: 
44:         $this->updateDatabase("ALTER TABLE user MODIFY fullname varchar(255)");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370030.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add an option to allow users to remove uploaded songs.
31:  */
32: final class Migration370030 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add an option to allow users to remove uploaded songs'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('upload_allow_remove', 'Upload: allow users to remove uploaded songs', '1', 100, 'boolean', 'system');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360012.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Drop the enum on session.type
31:  */
32: final class Migration360012 extends AbstractMigration
33: {
34:     protected array $changelog = ['Drop enum for the type field in session'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `session` CHANGE COLUMN `type` `type` varchar(16) DEFAULT NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370014.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Modified release_date of table video to signed int(11)
31:  */
32: final class Migration370014 extends AbstractMigration
33: {
34:     protected array $changelog = ['Modified release_date in video table to signed int'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `video` CHANGE COLUMN `release_date` `release_date` INT NULL DEFAULT NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370004.php
ERROR: Parse error at line 37 column 15:

27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add system upload preferences
33:  * Add license information and user's artist association
34:  */
35: final class Migration370004 extends AbstractMigration
36: {
37:     protected array $changelog = ['Add license information and user\'s artist association'];
                  ^
38: 
39:     public function migrate(): void
40:     {
41:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
42:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
43: 
44:         $this->updatePreferences('upload_catalog', 'Uploads catalog destination', '-1', 100, 'integer', 'system');
45:         $this->updatePreferences('allow_upload', 'Allow users to upload media', '0', 75, 'boolean', 'options');
46:         $this->updatePreferences('upload_subdir', 'Upload: create a subdirectory per user (recommended)', '1', 100, 'boolean', 'system');
47:         $this->updatePreferences('upload_user_artist', 'Upload: consider the user sender as the track\'s artist', '0', 100, 'boolean', 'system');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360024.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Drop unused flagged table
31:  */
32: final class Migration360024 extends AbstractMigration
33: {
34:     protected array $changelog = ['Drop flagged table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DROP TABLE IF EXISTS `flagged`;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370024.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add count_type column to object_count table
31:  */
32: final class Migration370024 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add count_type column to object_count table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `object_count` ADD COLUMN `count_type` varchar(16) NOT NULL DEFAULT 'stream';");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360036.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Remove some unused parameters
31:  */
32: final class Migration360036 extends AbstractMigration
33: {
34:     protected array $changelog = ['Remove unused parameters'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` LIKE 'ellipse_threshold_%'");
39:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` = 'min_object_count'");
40:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` = 'bandwidth'");
41:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` = 'features'");
42:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` = 'tags_userlist'");
43:     }
44: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370006.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add random and limit options to smart playlists
31:  */
32: final class Migration370006 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add random and limit options to smart playlists'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `search` ADD COLUMN `random` tinyint(1) unsigned NOT NULL DEFAULT '0' AFTER `logic_operator`, ADD COLUMN `limit` int(11) unsigned NOT NULL DEFAULT '0' AFTER `random`;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360029.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * New table to store wanted releases
33:  */
34: final class Migration360029 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add new table to store wanted releases'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `wanted` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) NOT NULL, `artist` int(11) NOT NULL, `mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL, `name` varchar(255) CHARACTER SET $charset NOT NULL, `year` int(4) NULL, `date` int(11) unsigned NOT NULL DEFAULT '0', `accepted` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `unique_wanted` (`user`, `artist`, `mbid`)) ENGINE=$engine;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360006.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * This adds the table for newsearch/dynamic playlists
33:  */
34: final class Migration360006 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add table for dynamic playlists'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `search` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) NOT NULL, `type` enum('private','public') CHARACTER SET utf8 DEFAULT NULL, `rules` mediumtext NOT NULL, `name` varchar(255) CHARACTER SET $charset DEFAULT NULL, `logic_operator` varchar(3) CHARACTER SET $charset DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=$engine AUTO_INCREMENT=4 DEFAULT CHARSET=$charset;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360016.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add Now Playing filtered per user preference option
31:  */
32: final class Migration360016 extends AbstractMigration
33: {
34:     protected array $changelog = ['Optionally filter Now Playing to return only the last song per user'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('now_playing_per_user', 'Now playing filtered per user', '1', 50, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370027.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Move column album_artist from table song to table album
31:  */
32: final class Migration370027 extends AbstractMigration
33: {
34:     protected array $changelog = ['Move column album_artist from table song to table album'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `album` ADD COLUMN `album_artist` int(11) unsigned DEFAULT NULL AFTER `release_type`");
39:         $this->updateDatabase("UPDATE `album` INNER JOIN `song` ON `album`.`id` = `song`.`album` SET `album`.`album_artist` = `song`.`album_artist`");
40:         $this->updateDatabase("ALTER TABLE `song` DROP COLUMN `album_artist`");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360023.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Enable/Disable SubSonic and Plex backend
31:  */
32: final class Migration360023 extends AbstractMigration
33: {
34:     protected array $changelog = ['Enable/Disable SubSonic and Plex backend'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('subsonic_backend', 'Use SubSonic backend', '1', 100, 'boolean', 'system');
39:         $this->updatePreferences('plex_backend', 'Use Plex backend', '0', 100, 'boolean', 'system');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380005.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add manual update flag on artist
31:  */
32: final class Migration380005 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add manual update flag on artist'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `artist` ADD COLUMN `manual_update` SMALLINT(1) DEFAULT '0';");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380003.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add unique constraint on tag_map table
31:  */
32: final class Migration380003 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add unique constraint on tag_map table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER IGNORE TABLE `tag_map` ADD UNIQUE INDEX `UNIQUE_TAG_MAP` (`object_id`, `object_type`, `user`, `tag_id`);");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380012.php
ERROR: Parse error at line 38 column 15:

28: 
29: /**
30:  * Fix change in https://github.com/ampache/ampache/commit/0c26c336269624d75985e46d324e2bc8108576ee
31:  * That left the user base with an inconsistent database.
32:  * For more information, please look at 360035.
33:  *
34:  * @see Migration360035
35:  */
36: final class Migration380012 extends AbstractMigration
37: {
38:     protected array $changelog = ['Fix change in https://github.com/ampache/ampache/commit/0c26c336269624d75985e46d324e2bc8108576ee that left the userbase with an inconsistent database, if users updated or installed Ampache before 28 Apr 2015'];
                  ^
39: 
40:     public function migrate(): void
41:     {
42:         $this->updateDatabase("UPDATE `preference` SET `description`='Enable url rewriting' WHERE `preference`.`name`='stream_beautiful_url'");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360050.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add top menu setting
31:  */
32: final class Migration360050 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add top menu setting'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('topmenu', 'Top menu', '0', 25, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360047.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add apikey field on users
32:  */
33: final class Migration360047 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add apikey field on users'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("ALTER TABLE `user` ADD COLUMN `apikey` varchar(255) CHARACTER SET $charset NULL AFTER `website`;");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370040.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add user_activity table
33:  */
34: final class Migration370040 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add user_activity table'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_activity` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `user` INT(11) NOT NULL, `action` varchar(20) NOT NULL, `object_id` INT(11) UNSIGNED NOT NULL, `object_type` varchar(32) NOT NULL, `activity_date` INT(11) UNSIGNED NOT NULL) ENGINE=$engine;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360038.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add missing albums browse on missing artists
31:  */
32: final class Migration360038 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add missing albums browse on missing artists'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `wanted` ADD COLUMN `artist_mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL AFTER `artist`");
39:         $this->updateDatabase("ALTER TABLE `wanted` MODIFY `artist` int(11) NULL");
40:         $this->updateDatabase("ALTER TABLE `song_preview` ADD COLUMN `artist_mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL AFTER `artist`");
41:         $this->updateDatabase("ALTER TABLE `song_preview` MODIFY `artist` int(11) NULL");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380008.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add browse filter and light sidebar options
31:  */
32: final class Migration380008 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add browse filter and light sidebar options'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('browse_filter', 'Show filter box on browse', '0', 25, 'boolean', 'interface', 'library');
39:         $this->updatePreferences('sidebar_light', 'Light sidebar by default', '0', 25, 'boolean', 'interface', 'theme');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370035.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add option on user fullname to show/hide it publicly
31:  */
32: final class Migration370035 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add option on user fullname to show/hide it publicly'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `user` ADD COLUMN `fullname_public` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0';");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360017.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * New table to store user flags.
33:  */
34: final class Migration360017 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add user flags on objects'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_flag` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) NOT NULL, `object_id` int(11) unsigned NOT NULL, `object_type` varchar(32) CHARACTER SET $charset DEFAULT NULL, `date` int(11) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `unique_userflag` (`user`, `object_type`, `object_id`), KEY `object_id` (`object_id`)) ENGINE=$engine;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360010.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * MBz NGS means collaborations have more than one MBID
31:  * (the ones belonging to the underlying artists).  We need a bigger column.
32:  */
33: final class Migration360010 extends AbstractMigration
34: {
35:     protected array $changelog = ['Allow compound MBIDs in the artist table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $this->updateDatabase("ALTER TABLE `artist` CHANGE COLUMN `mbid` `mbid` varchar(36);");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370025.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add state and city fields to user table
31:  */
32: final class Migration370025 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add state and city fields to user table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `user` ADD COLUMN `state` varchar(64) NULL, ADD COLUMN `city` varchar(64) NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380004.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add preference subcategory
32:  */
33: final class Migration380004 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add preference subcategory'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("ALTER TABLE `preference` ADD COLUMN `subcatagory` varchar(128) CHARACTER SET $charset DEFAULT NULL AFTER `catagory`;");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370038.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add theme color option
31:  */
32: final class Migration370038 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add theme color option'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('theme_color', 'Theme color', 'dark', 0, 'special', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370015.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add session_remember table to store remember tokens
33:  */
34: final class Migration370015 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add session_remember table to store remember tokens'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `session_remember` (`username` varchar(16) NOT NULL, `token` varchar(32) NOT NULL, `expire` int(11) NULL, PRIMARY KEY (`username`, `token`)) ENGINE=$engine;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360021.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add insertion date on Now Playing and option to show the current song in page title for Web player
31:  */
32: final class Migration360021 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add insertion date on Now Playing and option to show the current song in page title for Web player'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `now_playing` ADD COLUMN `insertion` INT (11) AFTER `expire`");
39: 
40:         $this->updatePreferences('song_page_title', 'Show current song in Web player page title', '1', 25, 'boolean', 'interface');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360020.php
ERROR: Parse error at line 37 column 15:

27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Dba;
29: use Ampache\Module\System\Update\Migration\AbstractMigration;
30: use Generator;
31: 
32: /**
33:  * Catalog types are plugins now
34:  */
35: final class Migration360020 extends AbstractMigration
36: {
37:     protected array $changelog = ['Catalog types are plugins now'];
                  ^
38: 
39:     public function migrate(): void
40:     {
41:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
42:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
43:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
44: 
45:         $sql = "CREATE TABLE IF NOT EXISTS `catalog_local` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `path` varchar(255) COLLATE $collation NOT NULL, `catalog_id` INT(11) NOT NULL) ENGINE=$engine DEFAULT CHARSET=$charset COLLATE=$collation;";
46:         Dba::write($sql);
47:         $sql = "CREATE TABLE IF NOT EXISTS `catalog_remote` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `uri` varchar(255) COLLATE $collation NOT NULL, `username` varchar(255) COLLATE $collation NOT NULL, `password` varchar(255) COLLATE $collation NOT NULL, `catalog_id` INT(11) NOT NULL) ENGINE=$engine DEFAULT CHARSET=$charset COLLATE=$collation;";

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370007.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add DAAP backend preference
33:  */
34: final class Migration370007 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add DAAP backend preference'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updatePreferences('daap_backend', 'Use DAAP backend', '0', 100, 'boolean', 'system');
44:         $this->updatePreferences('daap_pass', 'DAAP backend password', '', 100, 'string', 'system');
45: 
46:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `daap_session` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `creationdate` int(11) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=$engine");

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370041.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add Metadata tables and preferences
33:  */
34: final class Migration370041 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add basic metadata tables'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $collation = (AmpConfig::get('database_collation', 'utf8mb4_unicode_ci'));
41:         $charset   = (AmpConfig::get('database_charset', 'utf8mb4'));
42:         $engine    = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
43: 
44:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `metadata_field` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL, `public` tinyint(1) NOT NULL, UNIQUE KEY `name` (`name`) ) ENGINE=$engine");
45:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `metadata` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `object_id` INT(11) UNSIGNED NOT NULL, `field` INT(11) UNSIGNED NOT NULL, `data` text COLLATE $collation NOT NULL, `type` varchar(50) CHARACTER SET $charset DEFAULT NULL, KEY `field` (`field`), KEY `object_id` (`object_id`), KEY `type` (`type`), KEY `objecttype` (`object_id`, `type`), KEY `objectfield` (`object_id`, `field`, `type`) ) ENGINE=$engine");
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370021.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add rating to playlists, tvshows and tvshows seasons
31:  */
32: final class Migration370021 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add rating to playlists, tvshows and tvshows seasons'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `rating` CHANGE COLUMN `object_type` `object_type` enum('artist','album','song','stream','video','playlist','tvshow','tvshow_season') NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360042.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add broadcasts and player control
33:  */
34: final class Migration360042 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add broadcasts and player control'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `broadcast` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) unsigned NOT NULL, `name` varchar(64) CHARACTER SET $charset NULL, `description` varchar(256) CHARACTER SET $charset NULL, `is_private` tinyint(1) unsigned NOT NULL DEFAULT '0', `song` int(11) unsigned NOT NULL DEFAULT '0', `started` tinyint(1) unsigned NOT NULL DEFAULT '0', `listeners` int(11) unsigned NOT NULL DEFAULT '0', `key` varchar(32) CHARACTER SET $charset NULL, PRIMARY KEY (`id`)) ENGINE=$engine");
44: 
45:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `player_control` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) unsigned NOT NULL, `cmd` varchar(32) CHARACTER SET $charset NOT NULL, `value` varchar(256) CHARACTER SET $charset NULL, `object_type` varchar(32) NOT NULL, `object_id` int(11) unsigned NOT NULL, `send_date` int(11) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=$engine");
46:     }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370019.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add album group order setting
31:  */
32: final class Migration370019 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add album group order setting'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('album_release_type_sort', 'Album - Group per release type Sort', 'album,ep,live,single', 25, 'string', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360045.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Set user field on playlists as optional
31:  */
32: final class Migration360045 extends AbstractMigration
33: {
34:     protected array $changelog = ['Set user field on playlists as optional'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `playlist` MODIFY `user` int(11) NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360009.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * The main session table was already updated to use varchar(64) for the ID,
31:  * tmp_playlist needs the same change
32:  */
33: final class Migration360009 extends AbstractMigration
34: {
35:     protected array $changelog = ['Allow long sessionids in tmp_playlist table'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $this->updateDatabase("ALTER TABLE `tmp_playlist` CHANGE COLUMN `session` `session` varchar(64);");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360014.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * PHP session IDs are an ever-growing beast.
31:  */
32: final class Migration360014 extends AbstractMigration
33: {
34:     protected array $changelog = ['Increase the length of sessionids again'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `stream_playlist` CHANGE COLUMN `sid` `sid` varchar(256);");
39:         $this->updateDatabase("ALTER TABLE `tmp_playlist` CHANGE COLUMN `session` `session` varchar(256);");
40:         $this->updateDatabase("ALTER TABLE `session` CHANGE COLUMN `id` `id` varchar(256) NOT NULL;");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380007.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add upload rename pattern and ignore duplicate options
31:  */
32: final class Migration380007 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add upload rename pattern and ignore duplicate options'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('upload_catalog_pattern', 'Rename uploaded file according to catalog pattern', '0', 100, 'boolean', 'system', 'upload');
39:         $this->updatePreferences('catalog_check_duplicate', 'Check library item at import time and disable duplicates', '0', 100, 'boolean', 'system', 'catalog');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360034.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add settings for confirmation when closing window and auto-pause between tabs
31:  */
32: final class Migration360034 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add settings for confirmation when closing window and auto-pause between tabs'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('webplayer_confirmclose', 'Confirmation when closing current playing window', '0', 25, 'boolean', 'interface');
39: 
40:         $this->updatePreferences('webplayer_pausetabs', 'Auto-pause betweens tabs', '1', 25, 'boolean', 'interface');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360049.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add album group multiple disks setting
31:  */
32: final class Migration360049 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add album group multiple disks setting'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('album_group', 'Album - Group multiple disks', '0', 25, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360041.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add channels
32:  */
33: final class Migration360041 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add channels'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
41: 
42:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `channel` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) CHARACTER SET $charset NULL, `description` varchar(256) CHARACTER SET $charset NULL, `url` varchar(256) CHARACTER SET $charset NULL, `interface` varchar(64) CHARACTER SET $charset NULL, `port` int(11) unsigned NOT NULL DEFAULT '0', `fixed_endpoint` tinyint(1) unsigned NOT NULL DEFAULT '0', `object_type` varchar(32) NOT NULL, `object_id` int(11) unsigned NOT NULL, `is_private` tinyint(1) unsigned NOT NULL DEFAULT '0', `random` tinyint(1) unsigned NOT NULL DEFAULT '0', `loop` tinyint(1) unsigned NOT NULL DEFAULT '0', `admin_password` varchar(20) CHARACTER SET $charset NULL, `start_date` int(11) unsigned NOT NULL DEFAULT '0', `max_listeners` int(11) unsigned NOT NULL DEFAULT '0', `peak_listeners` int(11) unsigned NOT NULL DEFAULT '0', `listeners` int(11) unsigned NOT NULL DEFAULT '0', `connections` int(11) unsigned NOT NULL DEFAULT '0', `stream_type` varchar(8) CHARACTER SET $charset NOT NULL DEFAULT 'mp3', `bitrate` int(11) unsigned NOT NULL DEFAULT '128', `pid` int(11) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=$engine;");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360033.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add song waveform as song data
31:  */
32: final class Migration360033 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add song waveform as song data'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `song_data` ADD COLUMN `waveform` MEDIUMBLOB NULL AFTER `language`");
39: 
40:         $this->updateDatabase("ALTER TABLE `user_shout` ADD COLUMN `data` varchar(256) NULL AFTER `object_type`");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360019.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add Show number of times a song was played preference
31:  */
32: final class Migration360019 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add option to show number of times a song was played'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('show_played_times', 'Show # played', '0', 25, 'string', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360031.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add option to fix header/sidebars position on compatible themes
31:  */
32: final class Migration360031 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add option to fix header position on compatible themes'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('ui_fixed', 'Fix header position on compatible themes', '0', 25, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360039.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add website field on users
32:  */
33: final class Migration360039 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add website field on users'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("ALTER TABLE `user` ADD COLUMN `website` varchar(255) CHARACTER SET $charset NULL AFTER `email`;");
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360046.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add broadcast web player by default preference
31:  */
32: final class Migration360046 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add broadcast web player by default preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('broadcast_by_default', 'Broadcast web player by default', '0', 25, 'boolean', 'streaming');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360018.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add Album default sort preference...
31:  */
32: final class Migration360018 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add album default sort value to preferences'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('album_sort', 'Album Default Sort', '0', 25, 'string', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370011.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add Prefix to TVShows and Movies
32:  */
33: final class Migration370011 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add Prefix to TVShows and Movies'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40: 
41:         $this->updateDatabase("ALTER TABLE `tvshow` ADD COLUMN `prefix` varchar(32) CHARACTER SET $charset NULL");
42: 
43:         $this->updateDatabase("ALTER TABLE `movie` ADD COLUMN `prefix` varchar(32) CHARACTER SET $charset NULL");
44:     }
45: }

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370029.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Set image column from image table as nullable.
31:  */
32: final class Migration370029 extends AbstractMigration
33: {
34:     protected array $changelog = ['Set image column from image table as nullable'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `image` CHANGE COLUMN `image` `image` MEDIUMBLOB NULL DEFAULT NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370034.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add User messages and user follow tables.
33:  */
34: final class Migration370034 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add User messages and user follow tables'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_pvmsg` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `subject` varchar(80) NOT NULL, `message` TEXT CHARACTER SET $charset NULL, `from_user` int(11) unsigned NOT NULL, `to_user` int(11) unsigned NOT NULL, `is_read` tinyint(1) unsigned NOT NULL DEFAULT '0', `creation_date` int(11) unsigned NULL, PRIMARY KEY (`id`)) ENGINE=$engine");
44:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `user_follower` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) unsigned NOT NULL, `follow_user` int(11) unsigned NOT NULL, `follow_date` int(11) unsigned NULL, PRIMARY KEY (`id`)) ENGINE=$engine");
45: 
46:         $this->updatePreferences('notify_email', 'Receive notifications by email (shouts, private messages, ...)', '0', 25, 'boolean', 'options');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370013.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Replace iframe with ajax page load
31:  */
32: final class Migration370013 extends AbstractMigration
33: {
34:     protected array $changelog = ['Replace iframe with ajax page load'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` = 'iframes'");
39: 
40:         $this->updatePreferences('ajax_load', 'Ajax page load', '1', 25, 'boolean', 'interface');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360043.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add slideshow on currently played artist preference
31:  */
32: final class Migration360043 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add slideshow on currently played artist preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('slideshow_time', 'Artist slideshow inactivity time', '0', 25, 'integer', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370016.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add limit of media count for direct play preference
31:  */
32: final class Migration370016 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add limit of media count for direct play preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('direct_play_limit', 'Limit direct play to maximum media count', '0', 25, 'integer', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370026.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add replay gain fields to song_data table
31:  */
32: final class Migration370026 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add replay gain fields to song_data table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `song_data` ADD COLUMN `replaygain_track_gain` DECIMAL(10,6) NULL, ADD COLUMN `replaygain_track_peak` DECIMAL(10,6) NULL, ADD COLUMN `replaygain_album_gain` DECIMAL(10,6) NULL, ADD COLUMN `replaygain_album_peak` DECIMAL(10,6) NULL;");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370031.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add an option to customize login art, favicon and text footer.
31:  */
32: final class Migration370031 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add an option to customize login art, favicon and text footer'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('custom_login_logo', 'Custom login page logo url', '', 75, 'string', 'interface');
39:         $this->updatePreferences('custom_favicon', 'Custom favicon url', '', 75, 'string', 'interface');
40:         $this->updatePreferences('custom_text_footer', 'Custom text footer', '', 75, 'string', 'interface');
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360002.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * This update makes changes to the cataloging to accomodate the new method
31:  * for syncing between Ampache instances.
32:  */
33: final class Migration360002 extends AbstractMigration
34: {
35:     protected array $changelog = [
                  ^
36:         'Add Bandwidth and Feature preferences to simplify how interface is presented',
37:         'Change Tables to FULLTEXT() for improved searching',
38:         'Increase Filename lengths to 4096',
39:         'Remove useless KEY reference from ACL and Catalog tables',
40:         'Add new Remote User / Remote Password fields to Catalog'
41:     ];
42: 
43:     public function migrate(): void
44:     {
45:         // Drop the key from catalog and ACL

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380009.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add update date to playlist
32:  */
33: final class Migration380009 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add update date to playlist'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         Dba::write("ALTER TABLE `playlist` DROP COLUMN `last_update`;");
40:         $this->updateDatabase("ALTER TABLE `playlist` ADD COLUMN `last_update` int(11) unsigned NOT NULL DEFAULT '0';");
41:     }
42: }
43: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380001.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add podcasts
33:  */
34: final class Migration380001 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add podcasts'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `podcast` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `feed` varchar(4096) NOT NULL, `catalog` int(11) NOT NULL, `title` varchar(255) CHARACTER SET $charset NOT NULL, `website` varchar(255) NULL, `description` varchar(4096) CHARACTER SET $charset NULL, `language` varchar(5) NULL, `copyright` varchar(64) NULL, `generator` varchar(64) NULL, `lastbuilddate` int(11) UNSIGNED DEFAULT '0' NOT NULL, `lastsync` int(11) UNSIGNED DEFAULT '0' NOT NULL) ENGINE=$engine");
44:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `podcast_episode` (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `title` varchar(255) CHARACTER SET $charset NOT NULL, `guid` varchar(255) NOT NULL, `podcast` int(11) NOT NULL, `state` varchar(32) NOT NULL, `file` varchar(4096) CHARACTER SET $charset NULL, `source` varchar(4096) NULL, `size` bigint(20) UNSIGNED DEFAULT '0' NOT NULL, `time` smallint(5) UNSIGNED DEFAULT '0' NOT NULL, `website` varchar(255) NULL, `description` varchar(4096) CHARACTER SET $charset NULL, `author` varchar(64) NULL, `category` varchar(64) NULL, `played` tinyint(1) UNSIGNED DEFAULT '0' NOT NULL, `pubdate` int(11) UNSIGNED NOT NULL, `addition_time` int(11) UNSIGNED NOT NULL) ENGINE=$engine");
45: 
46:         $this->updatePreferences('podcast_keep', 'Podcast: # latest episodes to keep', '10', 100, 'integer', 'system');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360022.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Remove unused live_stream fields and add codec field
31:  */
32: final class Migration360022 extends AbstractMigration
33: {
34:     protected array $changelog = ['Remove unused live_stream fields and add codec field'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `live_stream` ADD COLUMN `codec` varchar(32) NULL AFTER `catalog`, DROP `frequency`, DROP `call_sign`");
39:         $this->updateDatabase("ALTER TABLE `stream_playlist` ADD COLUMN `codec` varchar(32) NULL AFTER `time`");
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360015.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * This inserts the Iframes preference...
31:  */
32: final class Migration360015 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add iframes parameter to preferences'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('iframes', 'Iframes', '1', 25, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360032.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add check update automatically option
31:  */
32: final class Migration360032 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add check update automatically option'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('autoupdate', 'Check for Ampache updates automatically', '1', 100, 'boolean', 'system');
39:         $this->updatePreferences('autoupdate_lastcheck', 'AutoUpdate last check time', '', 25, 'string', 'internal');
40:         $this->updatePreferences('autoupdate_lastversion', 'AutoUpdate last version from last check', '', 25, 'string', 'internal');
41:         $this->updatePreferences('autoupdate_lastversion_new', 'AutoUpdate last version from last check is newer', '', 25, 'boolean', 'internal');
42:     }
43: }
44: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360013.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * MyISAM works better out of the box for the stream_playlist table
32:  */
33: final class Migration360013 extends AbstractMigration
34: {
35:     protected array $changelog = ['Update stream_playlist table to address performance issues'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
40:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
41: 
42:         $this->updateDatabase("ALTER TABLE `stream_playlist` ENGINE=$engine;");
43:     }
44: }
45: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360008.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Fix bug that caused the remote_username/password fields to not be created.
32:  * FIXME: Huh?
33:  */
34: final class Migration360008 extends AbstractMigration
35: {
36:     protected array $changelog = ['Verify remote_username and remote_password were added correctly to catalog table'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $remote_username = false;
41:         $remote_password = false;
42: 
43:         $sql        = "DESCRIBE `catalog`";
44:         $db_results = Dba::read($sql);
45:         while ($row = Dba::fetch_assoc($db_results)) {
46:             if ($row['Field'] == 'remote_username') {

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370028.php
ERROR: Parse error at line 35 column 15:

25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: 
30: /**
31:  * Add width and height in table image
32:  */
33: final class Migration370028 extends AbstractMigration
34: {
35:     protected array $changelog = ['Add width and height in table image'];
                  ^
36: 
37:     public function migrate(): void
38:     {
39:         $sql        = "SELECT `width` FROM `image`";
40:         $db_results = Dba::read($sql);
41:         if (!$db_results) {
42:             $this->updateDatabase("ALTER TABLE `image` ADD COLUMN `width` int(4) unsigned DEFAULT 0 AFTER `image`");
43:         }
44:         $sql        = "SELECT `height` FROM `image`";
45:         $db_results = Dba::read($sql);

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360004.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * This update creates an index on the rating table.
31:  */
32: final class Migration360004 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add uniqueness constraint to ratings'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("CREATE UNIQUE INDEX `unique_rating` ON `rating` (`user`, `object_type`, `object_id`);");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360027.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Personal information: allow/disallow to show my personal information into now playing and recently played lists.
31:  */
32: final class Migration360027 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add option to allow/disallow to show personnal information to other users (now playing and recently played)'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('allow_personal_info', 'Allow to show my personal info to other users (now playing, recently played)', '1', 25, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360011.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: use Generator;
29: 
30: /**
31:  * We need a place to store actual playlist data for downloadable
32:  * playlist files.
33:  */
34: final class Migration360011 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add table to store stream session playlist'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `stream_playlist` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `sid` varchar(64) NOT NULL, `url` text NOT NULL, `info_url` text DEFAULT NULL, `image_url` text DEFAULT NULL, `title` varchar(255) DEFAULT NULL, `author` varchar(255) DEFAULT NULL, `album` varchar(255) DEFAULT NULL, `type` varchar(255) DEFAULT NULL, `time` smallint(5) DEFAULT NULL, PRIMARY KEY (`id`), KEY `sid` (`sid`));");
41:     }
42:     public function getTableMigrations(
43:         string $collation,
44:         string $charset,
45:         string $engine
46:     ): Generator {

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360037.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add sharing features
33:  */
34: final class Migration360037 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add sharing features'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `share` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user` int(11) unsigned NOT NULL, `object_type` varchar(32) NOT NULL, `object_id` int(11) unsigned NOT NULL, `allow_stream` tinyint(1) unsigned NOT NULL DEFAULT '0', `allow_download` tinyint(1) unsigned NOT NULL DEFAULT '0', `expire_days` int(4) unsigned NOT NULL DEFAULT '0', `max_counter` int(4) unsigned NOT NULL DEFAULT '0', `secret` varchar(20) CHARACTER SET $charset NULL, `counter` int(4) unsigned NOT NULL DEFAULT '0', `creation_date` int(11) unsigned NOT NULL DEFAULT '0', `lastvisit_date` int(11) unsigned NOT NULL DEFAULT '0', `public_url` varchar(255) CHARACTER SET $charset NULL, `description` varchar(255) CHARACTER SET $charset NULL, PRIMARY KEY (`id`)) ENGINE=$engine");
44: 
45:         $this->updatePreferences('share', 'Allow Share', '0', 100, 'boolean', 'options');
46:         $this->updatePreferences('share_expire', 'Share links default expiration days (0=never)', '7', 100, 'integer', 'system');

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360048.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add concerts options
31:  */
32: final class Migration360048 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add concerts options'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('concerts_limit_future', 'Limit number of future events', '0', 25, 'integer', 'interface');
39:         $this->updatePreferences('concerts_limit_past', 'Limit number of past events', '0', 25, 'integer', 'interface');
40:     }
41: }
42: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370008.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add UPnP backend preference
31:  */
32: final class Migration370008 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add UPnP backend preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('upnp_backend', 'Use UPnP backend', '0', 100, 'boolean', 'system');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360030.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * New table to store song previews
33:  */
34: final class Migration360030 extends AbstractMigration
35: {
36:     protected array $changelog = ['New table to store song previews'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `song_preview` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `session` varchar(256) CHARACTER SET $charset NOT NULL, `artist` int(11) NOT NULL, `title` varchar(255) CHARACTER SET $charset NOT NULL, `album_mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL, `mbid` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL, `disk` int(11) NULL, `track` int(11) NULL, `file` varchar(255) CHARACTER SET $charset NULL, PRIMARY KEY (`id`)) ENGINE=$engine;");
44:     }
45: 
46:     public function getTableMigrations(

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370018.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Dba;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Enhance tag persistent merge reference.
33:  */
34: final class Migration370018 extends AbstractMigration
35: {
36:     protected array $changelog = ['Enhance tag persistent merge reference'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $this->updateDatabase("DROP TABLE IF EXISTS `tag_merge`;");
41:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `tag_merge` (`tag_id` int(11) NOT NULL, `merged_to` int(11) NOT NULL, PRIMARY KEY (`tag_id`,`merged_to`), KEY `merged_to` (`merged_to`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;");
42: 
43:         $sql        = "DESCRIBE `tag`";
44:         $db_results = Dba::read($sql);
45:         $is_hidden  = false;
46:         while ($row = Dba::fetch_assoc($db_results)) {

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370037.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Delete http_port preference (use ampache.cfg.php configuration instead)
31:  */
32: final class Migration370037 extends AbstractMigration
33: {
34:     protected array $changelog = ['Delete http_port preference (use ampache.cfg.php configuration instead)'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("DELETE FROM `preference` WHERE `name` = 'http_port';");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370036.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add field for track number when generating streaming playlists
31:  */
32: final class Migration370036 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add track number field to stream_playlist table'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updateDatabase("ALTER TABLE `stream_playlist` ADD COLUMN `track_num` SMALLINT(5) DEFAULT '0';");
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370009.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Enhance video support with TVShows and Movies
33:  */
34: final class Migration370009 extends AbstractMigration
35: {
36:     protected array $changelog = ['Enhance video support with TVShows and Movies'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $sql_array = array(
44:             "ALTER TABLE `video` ADD COLUMN `release_date` date NULL AFTER `enabled`, ADD COLUMN `played` tinyint(1) unsigned DEFAULT '0' NOT NULL AFTER `enabled`",
45:             "CREATE TABLE IF NOT EXISTS `tvshow` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(80) NOT NULL, `summary` varchar(256) NULL, `year` int(11) unsigned NULL, PRIMARY KEY (`id`)) ENGINE=$engine",
46:             "CREATE TABLE IF NOT EXISTS `tvshow_season` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `season_number` int(11) unsigned NOT NULL, `tvshow` int(11) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=$engine",

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370003.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add show/hide donate button preference
31:  */
32: final class Migration370003 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add show/hide donate button preference'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('show_donate', 'Show donate button in footer', '1', 25, 'boolean', 'interface');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration380006.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add library item context menu option
31:  */
32: final class Migration380006 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add library item context menu option'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('libitem_contextmenu', 'Library item context menu', '1', 0, 'boolean', 'interface', 'library');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration370023.php
ERROR: Parse error at line 34 column 15:

24: 
25: namespace Ampache\Module\System\Update\Migration\V3;
26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Add Aurora.js webplayer option
31:  */
32: final class Migration370023 extends AbstractMigration
33: {
34:     protected array $changelog = ['Add Aurora.js webplayer option'];
                  ^
35: 
36:     public function migrate(): void
37:     {
38:         $this->updatePreferences('webplayer_aurora', 'Authorize JavaScript decoder (Aurora.js) in Web Player(s)', '1', 25, 'boolean', 'streaming');
39:     }
40: }
41: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360028.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Module\System\Update\Migration\AbstractMigration;
28: 
29: /**
30:  * Personal information: allow/disallow to show in now playing.
31:  * Personal information: allow/disallow to show in recently played.
32:  * Personal information: allow/disallow to show time and/or agent in recently played.
33:  */
34: final class Migration360028 extends AbstractMigration
35: {
36:     protected array $changelog = [
                  ^
37:         'Personal information: allow/disallow to show in now playing',
38:         'Personal information: allow/disallow to show in recently played',
39:         'Personal information: allow/disallow to show time and/or agent in recently played'
40:     ];
41: 
42:     public function migrate(): void
43:     {
44:         // Update previous update preference
45:         $this->updateDatabase("UPDATE `preference` SET `name`='allow_personal_info_now', `description`='Personal information visibility - Now playing' WHERE `name`='allow_personal_info'");
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/Migration/V3/Migration360044.php
ERROR: Parse error at line 36 column 15:

26: 
27: use Ampache\Config\AmpConfig;
28: use Ampache\Module\System\Update\Migration\AbstractMigration;
29: use Generator;
30: 
31: /**
32:  * Add artist description/recommendation external service data cache
33:  */
34: final class Migration360044 extends AbstractMigration
35: {
36:     protected array $changelog = ['Add artist description/recommendation external service data cache'];
                  ^
37: 
38:     public function migrate(): void
39:     {
40:         $charset = (AmpConfig::get('database_charset', 'utf8mb4'));
41:         $engine  = ($charset == 'utf8mb4') ? 'InnoDB' : 'MYISAM';
42: 
43:         $this->updateDatabase("ALTER TABLE `artist` ADD COLUMN `summary` TEXT CHARACTER SET $charset NULL, ADD COLUMN `placeformed` varchar(64) NULL, ADD COLUMN `yearformed` int(4) NULL, ADD COLUMN `last_update` int(11) unsigned NOT NULL DEFAULT '0'");
44: 
45:         $this->updateDatabase("CREATE TABLE IF NOT EXISTS `recommendation` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, `object_type` varchar(32) NOT NULL, `object_id` int(11) unsigned NOT NULL, `last_update` int(11) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=$engine");
46: 

ERROR: Unable to parse file: /code/src/Module/System/Update/UpdateRunner.php
ERROR: Parse error at line 48 column 13:

38: use Generator;
39: use Psr\Log\LoggerInterface;
40: use Throwable;
41: use Traversable;
42: 
43: /**
44:  * Performs the actual update process
45:  */
46: final class UpdateRunner implements UpdateRunnerInterface
47: {
48:     private DatabaseConnectionInterface $connection;
                ^
49: 
50:     private LoggerInterface $logger;
51: 
52:     private UpdateInfoRepositoryInterface $updateInfoRepository;
53: 
54:     private ConfigContainerInterface $configContainer;
55: 
56:     public function __construct(
57:         DatabaseConnectionInterface $connection,
58:         LoggerInterface $logger,

ERROR: Unable to parse file: /code/src/Module/System/Update/Updater.php
ERROR: Parse error at line 44 column 13:

34: use Generator;
35: use Psr\Container\ContainerInterface;
36: 
37: /**
38:  * Provides several utility methods to perform updates
39:  */
40: final class Updater implements UpdaterInterface
41: {
42:     private const MINIMUM_UPDATABLE_VERSION = 350008;
43: 
44:     private UpdateHelperInterface $updateHelper;
                ^
45: 
46:     private UpdateInfoRepositoryInterface $updateInfoRepository;
47: 
48:     private ContainerInterface $dic;
49: 
50:     private UpdateRunnerInterface $updateRunner;
51: 
52:     public function __construct(
53:         UpdateHelperInterface $updateHelper,
54:         UpdateInfoRepositoryInterface $updateInfoRepository,

ERROR: Unable to parse file: /code/src/Module/System/Update/Versions.php
ERROR: Parse error at line 36 column 20:

26: 
27: use Ampache\Module\System\Update\Migration\MigrationInterface;
28: use Generator;
29: 
30: /**
31:  * Defines all available versions
32:  */
33: final class Versions
34: {
35:     /** @var array<int, class-string<MigrationInterface>> List of available migrations */
36:     private static array $versions = [
                       ^
37:         360001 => Migration\V3\Migration360001::class,
38:         360002 => Migration\V3\Migration360002::class,
39:         360003 => Migration\V3\Migration360003::class,
40:         360004 => Migration\V3\Migration360004::class,
41:         360005 => Migration\V3\Migration360005::class,
42:         360006 => Migration\V3\Migration360006::class,
43:         360008 => Migration\V3\Migration360008::class,
44:         360009 => Migration\V3\Migration360009::class,
45:         360010 => Migration\V3\Migration360010::class,
46:         360011 => Migration\V3\Migration360011::class,

ERROR: Unable to parse file: /code/src/Module/System/Session.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Repository\UserRepositoryInterface;
38: use PDOStatement;
39: use Ampache\Repository\Model\Song_Preview;
40: use Ampache\Repository\Model\Tmp_Playlist;
41: 
42: /**
43:  * This class handles all of the session related stuff in Ampache
44:  */
45: final class Session implements SessionInterface
46: {
47:     private ConfigContainerInterface $configContainer;
                ^
48: 
49:     private AuthenticationManagerInterface $authenticationManager;
50: 
51:     private UserRepositoryInterface $userRepository;
52: 
53:     public function __construct(
54:         ConfigContainerInterface $configContainer,
55:         AuthenticationManagerInterface $authenticationManager,
56:         UserRepositoryInterface $userRepository
57:     ) {

ERROR: Unable to parse file: /code/src/Module/System/LegacyLogger.php
ERROR: Parse error at line 50 column 13:

40:     public const LOG_LEVEL_ERROR    = 2;
41:     public const LOG_LEVEL_WARNING  = 3;
42:     public const LOG_LEVEL_NOTICE   = 4;
43:     public const LOG_LEVEL_DEBUG    = 5;
44: 
45:     public const CONTEXT_TYPE = 'event_type';
46: 
47:     private const FALLBACK_USERNAME = 'ampache';
48:     private const LOG_NAME          = 'ampache';
49: 
50:     private ConfigContainerInterface $configContainer;
                ^
51: 
52:     public function __construct(
53:         ConfigContainerInterface $configContainer
54:     ) {
55:         $this->configContainer = $configContainer;
56:     }
57: 
58:     /**
59:      * @see LegacyLogger::critical (Required function to implement LoggerInterface)
60:      */

ERROR: Unable to parse file: /code/src/Module/System/Cache/ArrayCacheDriver.php
ERROR: Parse error at line 38 column 13:

28: use Psr\SimpleCache\CacheInterface;
29: 
30: /**
31:  * Simple array-cache implementation
32:  *
33:  * @see CacheInterface
34:  */
35: final class ArrayCacheDriver implements CacheInterface
36: {
37:     /** @var array<string, scalar> */
38:     private array $cache = [];
                ^
39: 
40:     public function get($key, $default = null): mixed
41:     {
42:         return $this->cache[$key] ?? $default;
43:     }
44: 
45:     public function set($key, $value, $ttl = null): bool
46:     {
47:         $this->cache[$key] = $value;
48: 

ERROR: Unable to parse file: /code/src/Module/System/PreferencesFromRequestUpdater.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\System;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Module\Authorization\AccessLevelEnum;
30: use Ampache\Module\Authorization\Check\PrivilegeCheckerInterface;
31: use Ampache\Module\Playback\Stream;
32: use DateTimeZone;
33: 
34: final class PreferencesFromRequestUpdater implements PreferencesFromRequestUpdaterInterface
35: {
36:     private PrivilegeCheckerInterface $privilegeChecker;
                ^
37: 
38:     public function __construct(
39:         PrivilegeCheckerInterface $privilegeChecker
40:     ) {
41:         $this->privilegeChecker = $privilegeChecker;
42:     }
43: 
44:     /**
45:      * grabs the current keys that should be added and then runs
46:      * through $_REQUEST looking for those values and updates them for this user

ERROR: Unable to parse file: /code/src/Module/Playback/Stream_Playlist.php
ERROR: Parse error at line 59 column 12:

49:  *
50:  * This class is used to generate the Playlists and pass them on
51:  * For Localplay this actually just sends the commands to the Localplay
52:  * module in question.
53:  */
54: class Stream_Playlist
55: {
56:     public $id;
57: 
58:     /** @var list<Stream_Url> */
59:     public array $urls = [];
               ^
60:     public int $user;
61:     private ?string $streamtoken;
62:     public $title;
63: 
64:     /**
65:      * Stream_Playlist constructor
66:      * If an ID is passed, it should be a stream session ID.
67:      * @param int|string $session_id
68:      */
69:     public function __construct($session_id = null)

ERROR: Unable to parse file: /code/src/Module/Album/Export/AlbumArtExporter.php
ERROR: Parse error at line 43 column 13:

33: use Ampache\Repository\Model\ModelFactoryInterface;
34: use Ampache\Module\Album\Export;
35: use Ampache\Repository\SongRepositoryInterface;
36: 
37: /**
38:  * This runs through all of the albums and tries to dump the
39:  * art for them into the 'folder.jpg' file in the appropriate dir.
40:  */
41: final class AlbumArtExporter implements AlbumArtExporterInterface
42: {
43:     private ConfigContainerInterface $configContainer;
                ^
44: 
45:     private ModelFactoryInterface $modelFactory;
46: 
47:     private SongRepositoryInterface $songRepository;
48: 
49:     public function __construct(
50:         ConfigContainerInterface $configContainer,
51:         ModelFactoryInterface $modelFactory,
52:         SongRepositoryInterface $songRepository
53:     ) {

ERROR: Unable to parse file: /code/src/Module/Album/Deletion/AlbumDeleter.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Repository\ShoutRepositoryInterface;
38: use Ampache\Repository\SongRepositoryInterface;
39: use Ampache\Repository\UserActivityRepositoryInterface;
40: use Psr\Log\LoggerInterface;
41: 
42: /**
43:  * Deletes an album including all songs
44:  */
45: final class AlbumDeleter implements AlbumDeleterInterface
46: {
47:     private AlbumRepositoryInterface $albumRepository;
                ^
48: 
49:     private ModelFactoryInterface $modelFactory;
50: 
51:     private LoggerInterface $logger;
52: 
53:     private SongRepositoryInterface $songRepository;
54: 
55:     private ShoutRepositoryInterface $shoutRepository;
56: 
57:     private SongDeleterInterface $songDeleter;

ERROR: Unable to parse file: /code/src/Module/Album/Tag/AlbumTagUpdater.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\Album\Tag;
27: 
28: use Ampache\Repository\Model\Album;
29: use Ampache\Repository\Model\Tag;
30: use Ampache\Repository\SongRepositoryInterface;
31: 
32: final class AlbumTagUpdater implements AlbumTagUpdaterInterface
33: {
34:     private SongRepositoryInterface $songRepository;
                ^
35: 
36:     public function __construct(
37:         SongRepositoryInterface $songRepository
38:     ) {
39:         $this->songRepository = $songRepository;
40:     }
41: 
42:     /**
43:      * Update tags of albums and/or songs
44:      */

ERROR: Unable to parse file: /code/src/Module/Authorization/GuiGatekeeper.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Authorization\Check\PrivilegeCheckerInterface;
29: use Ampache\Module\System\Core;
30: use Ampache\Repository\Model\User;
31: 
32: /**
33:  * Routes access checks and other authorization related calls to its static versions
34:  */
35: final class GuiGatekeeper implements GuiGatekeeperInterface
36: {
37:     private PrivilegeCheckerInterface $privilegeChecker;
                ^
38: 
39:     public function __construct(
40:         PrivilegeCheckerInterface $privilegeChecker
41:     ) {
42:         $this->privilegeChecker = $privilegeChecker;
43:     }
44: 
45:     public function mayAccess(
46:         string $access_type,
47:         int $access_level

ERROR: Unable to parse file: /code/src/Module/Authorization/GatekeeperFactory.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\Authorization;
27: 
28: use Ampache\Module\Authorization\Check\PrivilegeCheckerInterface;
29: 
30: final class GatekeeperFactory implements GatekeeperFactoryInterface
31: {
32:     private PrivilegeCheckerInterface $privilegeChecker;
                ^
33: 
34:     public function __construct(
35:         PrivilegeCheckerInterface $privilegeChecker
36:     ) {
37:         $this->privilegeChecker = $privilegeChecker;
38:     }
39: 
40:     public function createGuiGatekeeper(): GuiGatekeeperInterface
41:     {
42:         return new GuiGatekeeper(

ERROR: Unable to parse file: /code/src/Module/Authorization/Check/NetworkChecker.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\Authorization\Check;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\Authorization\AccessLevelEnum;
31: use Ampache\Module\System\Core;
32: use Ampache\Repository\AccessRepositoryInterface;
33: 
34: final class NetworkChecker implements NetworkCheckerInterface
35: {
36:     private ConfigContainerInterface $configContainer;
                ^
37: 
38:     private AccessRepositoryInterface $accessRepository;
39: 
40:     public function __construct(
41:         ConfigContainerInterface $configContainer,
42:         AccessRepositoryInterface $accessRepository
43:     ) {
44:         $this->configContainer  = $configContainer;
45:         $this->accessRepository = $accessRepository;
46:     }

ERROR: Unable to parse file: /code/src/Module/Authorization/Check/PrivilegeChecker.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Repository\Model\ModelFactoryInterface;
31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\System\Core;
33: use Ampache\Repository\Model\User;
34: 
35: final class PrivilegeChecker implements PrivilegeCheckerInterface
36: {
37:     private ConfigContainerInterface $configContainer;
                ^
38: 
39:     private ModelFactoryInterface $modelFactory;
40: 
41:     public function __construct(
42:         ConfigContainerInterface $configContainer,
43:         ModelFactoryInterface $modelFactory
44:     ) {
45:         $this->configContainer = $configContainer;
46:         $this->modelFactory    = $modelFactory;
47:     }

ERROR: Unable to parse file: /code/src/Module/Authorization/Check/FunctionChecker.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Authorization\AccessLevelEnum;
32: use Ampache\Module\System\Core;
33: use Ampache\Module\System\LegacyLogger;
34: use Psr\Log\LoggerInterface;
35: 
36: final class FunctionChecker implements FunctionCheckerInterface
37: {
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private LoggerInterface $logger;
41: 
42:     public function __construct(
43:         ConfigContainerInterface $configContainer,
44:         LoggerInterface $logger
45:     ) {
46:         $this->configContainer = $configContainer;
47:         $this->logger          = $logger;
48:     }

ERROR: Unable to parse file: /code/src/Module/Authorization/AccessListManager.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Authorization\Exception\InvalidEndIpException;
30: use Ampache\Module\Authorization\Exception\InvalidIpRangeException;
31: use Ampache\Module\Authorization\Exception\InvalidStartIpException;
32: use Ampache\Repository\AccessRepositoryInterface;
33: 
34: /**
35:  * Manages the creation and update of acl items
36:  */
37: final class AccessListManager implements AccessListManagerInterface
38: {
39:     private AccessRepositoryInterface $accessRepository;
                ^
40: 
41:     public function __construct(
42:         AccessRepositoryInterface $accessRepository
43:     ) {
44:         $this->accessRepository = $accessRepository;
45:     }
46: 
47:     /**
48:      * Updates an existing acl item
49:      *

ERROR: Unable to parse file: /code/src/Module/User/NewPasswordSender.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Module\User;
27: 
28: use Ampache\Module\Util\Mailer;
29: use Ampache\Repository\Model\User;
30: use Ampache\Repository\UserRepositoryInterface;
31: use PHPMailer\PHPMailer\Exception;
32: 
33: final class NewPasswordSender implements NewPasswordSenderInterface
34: {
35:     private PasswordGeneratorInterface $passwordGenerator;
                ^
36: 
37:     private UserRepositoryInterface $userRepository;
38: 
39:     public function __construct(
40:         PasswordGeneratorInterface $passwordGenerator,
41:         UserRepositoryInterface $userRepository
42:     ) {
43:         $this->passwordGenerator = $passwordGenerator;
44:         $this->userRepository    = $userRepository;
45:     }

ERROR: Unable to parse file: /code/src/Module/User/Activity/TypeHandler/AlbumActivityTypeHandler.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\User\Activity\TypeHandler;
27: 
28: use Ampache\Repository\UserActivityRepositoryInterface;
29: 
30: final class AlbumActivityTypeHandler extends GenericActivityTypeHandler
31: {
32:     private UserActivityRepositoryInterface $userActivityRepository;
                ^
33: 
34:     public function __construct(
35:         UserActivityRepositoryInterface $userActivityRepository
36:     ) {
37:         parent::__construct($userActivityRepository);
38: 
39:         $this->userActivityRepository = $userActivityRepository;
40:     }
41: 
42:     public function registerActivity(

ERROR: Unable to parse file: /code/src/Module/User/Activity/TypeHandler/ArtistActivityTypeHandler.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\User\Activity\TypeHandler;
27: 
28: use Ampache\Repository\UserActivityRepositoryInterface;
29: 
30: final class ArtistActivityTypeHandler extends GenericActivityTypeHandler
31: {
32:     private UserActivityRepositoryInterface $userActivityRepository;
                ^
33: 
34:     public function __construct(
35:         UserActivityRepositoryInterface $userActivityRepository
36:     ) {
37:         parent::__construct($userActivityRepository);
38: 
39:         $this->userActivityRepository = $userActivityRepository;
40:     }
41: 
42:     public function registerActivity(

ERROR: Unable to parse file: /code/src/Module/User/Activity/TypeHandler/ActivityTypeHandlerMapper.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Repository\UserActivityRepositoryInterface;
29: 
30: final class ActivityTypeHandlerMapper implements ActivityTypeHandlerMapperInterface
31: {
32:     private const MAP = [
33:         ActivityTypeEnum::TYPE_SONG => SongActivityTypeHandler::class,
34:         ActivityTypeEnum::TYPE_ALBUM => AlbumActivityTypeHandler::class,
35:         ActivityTypeEnum::TYPE_ARTIST => ArtistActivityTypeHandler::class,
36:     ];
37: 
38:     private UserActivityRepositoryInterface $userActivityRepository;
                ^
39: 
40:     public function __construct(
41:         UserActivityRepositoryInterface $userActivityRepository
42:     ) {
43:         $this->userActivityRepository = $userActivityRepository;
44:     }
45: 
46:     /**
47:      * Maps a certain object type to a type handler class. Returns a generic handler if
48:      * no specific one is available for the type

ERROR: Unable to parse file: /code/src/Module/User/Activity/TypeHandler/SongActivityTypeHandler.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\User\Activity\TypeHandler;
27: 
28: use Ampache\Repository\UserActivityRepositoryInterface;
29: 
30: final class SongActivityTypeHandler extends GenericActivityTypeHandler
31: {
32:     private UserActivityRepositoryInterface $userActivityRepository;
                ^
33: 
34:     public function __construct(
35:         UserActivityRepositoryInterface $userActivityRepository
36:     ) {
37:         parent::__construct($userActivityRepository);
38: 
39:         $this->userActivityRepository = $userActivityRepository;
40:     }
41: 
42:     public function registerActivity(

ERROR: Unable to parse file: /code/src/Module/User/Activity/TypeHandler/GenericActivityTypeHandler.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Module\User\Activity\TypeHandler;
27: 
28: use Ampache\Repository\UserActivityRepositoryInterface;
29: 
30: class GenericActivityTypeHandler implements ActivityTypeHandlerInterface
31: {
32:     private UserActivityRepositoryInterface $userActivityRepository;
                ^
33: 
34:     public function __construct(
35:         UserActivityRepositoryInterface $userActivityRepository
36:     ) {
37:         $this->userActivityRepository = $userActivityRepository;
38:     }
39: 
40:     public function registerActivity(
41:         int $objectId,
42:         string $objectType,

ERROR: Unable to parse file: /code/src/Module/User/Activity/UserActivityPoster.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Module\User\Activity;
27: 
28: use Ampache\Module\System\LegacyLogger;
29: use Ampache\Module\User\Activity\TypeHandler\ActivityTypeHandlerMapperInterface;
30: use Psr\Log\LoggerInterface;
31: 
32: final class UserActivityPoster implements UserActivityPosterInterface
33: {
34:     private ActivityTypeHandlerMapperInterface $activityTypeHandlerMapper;
                ^
35: 
36:     private LoggerInterface $logger;
37: 
38:     public function __construct(
39:         ActivityTypeHandlerMapperInterface $activityTypeHandlerMapper,
40:         LoggerInterface $logger
41:     ) {
42:         $this->activityTypeHandlerMapper = $activityTypeHandlerMapper;
43:         $this->logger                    = $logger;
44:     }

ERROR: Unable to parse file: /code/src/Module/User/Activity/UserActivityRenderer.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Module\User\Activity;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Repository\Model\library_item;
30: use Ampache\Repository\Model\ModelFactoryInterface;
31: use Ampache\Repository\Model\Useractivity;
32: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
33: 
34: final class UserActivityRenderer implements UserActivityRendererInterface
35: {
36:     private ConfigContainerInterface $configContainer;
                ^
37: 
38:     private ModelFactoryInterface $modelFactory;
39: 
40:     public function __construct(
41:         ConfigContainerInterface $configContainer,
42:         ModelFactoryInterface $modelFactory
43:     ) {
44:         $this->configContainer = $configContainer;
45:         $this->modelFactory    = $modelFactory;
46:     }

ERROR: Unable to parse file: /code/src/Module/User/Following/UserFollowStateRenderer.php
ERROR: Parse error at line 31 column 13:

21:  *
22:  */
23: 
24: namespace Ampache\Module\User\Following;
25: 
26: use Ampache\Module\Api\Ajax;
27: use Ampache\Repository\UserFollowerRepositoryInterface;
28: 
29: final class UserFollowStateRenderer implements UserFollowStateRendererInterface
30: {
31:     private UserFollowerRepositoryInterface $userFollowerRepository;
                ^
32: 
33:     public function __construct(
34:         UserFollowerRepositoryInterface $userFollowerRepository
35:     ) {
36:         $this->userFollowerRepository = $userFollowerRepository;
37:     }
38: 
39:     /**
40:      * Get html code to display the follow/unfollow link
41:      *

ERROR: Unable to parse file: /code/src/Module/User/Following/UserFollowToggler.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Module\User\Following;
27: 
28: use Ampache\Module\User\Activity\UserActivityPosterInterface;
29: use Ampache\Repository\UserFollowerRepositoryInterface;
30: 
31: final class UserFollowToggler implements UserFollowTogglerInterface
32: {
33:     private UserFollowerRepositoryInterface $userFollowerRepository;
                ^
34: 
35:     private UserActivityPosterInterface $userActivityPoster;
36: 
37:     public function __construct(
38:         UserFollowerRepositoryInterface $userFollowerRepository,
39:         UserActivityPosterInterface $userActivityPoster
40:     ) {
41:         $this->userFollowerRepository = $userFollowerRepository;
42:         $this->userActivityPoster     = $userActivityPoster;
43:     }

ERROR: Unable to parse file: /code/src/Module/User/UserStateToggler.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Util\UtilityFactoryInterface;
32: use Ampache\Repository\UserRepositoryInterface;
33: 
34: /**
35:  * Disables/Enables users
36:  */
37: final class UserStateToggler implements UserStateTogglerInterface
38: {
39:     private ConfigContainerInterface $configContainer;
                ^
40: 
41:     private UtilityFactoryInterface $utilityFactory;
42: 
43:     private UserRepositoryInterface $userRepository;
44: 
45:     public function __construct(
46:         ConfigContainerInterface $configContainer,
47:         UtilityFactoryInterface $utilityFactory,
48:         UserRepositoryInterface $userRepository
49:     ) {

ERROR: Unable to parse file: /code/src/Module/User/PrivateMessage/PrivateMessageCreator.php
ERROR: Parse error at line 36 column 20:

26: namespace Ampache\Module\User\PrivateMessage;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Util\UtilityFactoryInterface;
32: use Ampache\Repository\PrivateMessageRepositoryInterface;
33: 
34: final class PrivateMessageCreator implements PrivateMessageCreatorInterface
35: {
36:     private PrivateMessageRepositoryInterface $privateMessageRepository;
                       ^
37: 
38:     private UtilityFactoryInterface $utilityFactory;
39: 
40:     private ConfigContainerInterface $configContainer;
41: 
42:     public function __construct(
43:         PrivateMessageRepositoryInterface $privateMessageRepository,
44:         UtilityFactoryInterface $utilityFactory,
45:         ConfigContainerInterface $configContainer
46:     ) {

ERROR: Unable to parse file: /code/src/Module/User/Tracking/UserTracker.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\System\LegacyLogger;
32: use Ampache\Repository\IpHistoryRepositoryInterface;
33: use Ampache\Repository\Model\User;
34: use DateTimeImmutable;
35: use Psr\Log\LoggerInterface;
36: 
37: final class UserTracker implements UserTrackerInterface
38: {
39:     private IpHistoryRepositoryInterface $ipHistoryRepository;
                ^
40: 
41:     private LoggerInterface $logger;
42: 
43:     private ConfigContainerInterface $configContainer;
44: 
45:     public function __construct(
46:         ConfigContainerInterface $configContainer,
47:         IpHistoryRepositoryInterface $ipHistoryRepository,
48:         LoggerInterface $logger
49:     ) {

ERROR: Unable to parse file: /code/src/Module/User/Registration/RegistrationAgreementRenderer.php
ERROR: Parse error at line 32 column 13:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  */
24: 
25: namespace Ampache\Module\User\Registration;
26: 
27: /**
28:  * Default registration agreement renderer (renders static file))
29:  */
30: final class RegistrationAgreementRenderer implements RegistrationAgreementRendererInterface
31: {
32:     private string $filePath;
                ^
33: 
34:     public function __construct(
35:         string $filePath = __DIR__ . '/../../../../config/registration_agreement.php'
36:     ) {
37:         $this->filePath = $filePath;
38:     }
39:     /**
40:      * Renders the registration agreement (if available))
41:      */
42:     public function render(): string

ERROR: Unable to parse file: /code/src/Module/User/Authorization/UserKeyGenerator.php
ERROR: Parse error at line 34 column 13:

24: namespace Ampache\Module\User\Authorization;
25: 
26: use Ampache\Repository\Model\User;
27: use Ampache\Module\System\LegacyLogger;
28: use Ampache\Repository\UserRepositoryInterface;
29: use Exception;
30: use Psr\Log\LoggerInterface;
31: 
32: final class UserKeyGenerator implements UserKeyGeneratorInterface
33: {
34:     private UserRepositoryInterface $userRepository;
                ^
35: 
36:     private LoggerInterface $logger;
37: 
38:     public function __construct(
39:         UserRepositoryInterface $userRepository,
40:         LoggerInterface $logger
41:     ) {
42:         $this->userRepository = $userRepository;
43:         $this->logger         = $logger;
44:     }

ERROR: Unable to parse file: /code/src/Gui/GuiFactory.php
ERROR: Parse error at line 68 column 13:

58: use Ampache\Module\Authorization\GuiGatekeeperInterface;
59: use Ampache\Module\Authorization\Check\FunctionCheckerInterface;
60: use Ampache\Module\Playlist\PlaylistLoaderInterface;
61: use Ampache\Module\Util\AjaxUriRetrieverInterface;
62: use Ampache\Module\Util\ZipHandlerInterface;
63: use Ampache\Repository\UpdateInfoRepositoryInterface;
64: use Ampache\Repository\VideoRepositoryInterface;
65: 
66: final class GuiFactory implements GuiFactoryInterface
67: {
68:     private ConfigContainerInterface $configContainer;
                ^
69: 
70:     private ModelFactoryInterface $modelFactory;
71: 
72:     private ZipHandlerInterface $zipHandler;
73: 
74:     private FunctionCheckerInterface $functionChecker;
75: 
76:     private AjaxUriRetrieverInterface $ajaxUriRetriever;
77: 
78:     private PlaylistLoaderInterface $playlistLoader;

ERROR: Unable to parse file: /code/src/Gui/Playlist/PlaylistViewAdapter.php
ERROR: Parse error at line 45 column 13:

35: use Ampache\Module\Api\Ajax;
36: use Ampache\Module\Authorization\AccessLevelEnum;
37: use Ampache\Module\Authorization\GuiGatekeeperInterface;
38: use Ampache\Module\Authorization\Check\FunctionCheckerInterface;
39: use Ampache\Module\Playback\Stream_Playlist;
40: use Ampache\Module\Util\Ui;
41: use Ampache\Module\Util\ZipHandlerInterface;
42: 
43: final class PlaylistViewAdapter implements PlaylistViewAdapterInterface
44: {
45:     private ConfigContainerInterface $configContainer;
                ^
46: 
47:     private ModelFactoryInterface $modelFactory;
48: 
49:     private ZipHandlerInterface $zipHandler;
50: 
51:     private FunctionCheckerInterface $functionChecker;
52: 
53:     private GuiGatekeeperInterface $gatekeeper;
54: 
55:     private Playlist $playlist;

ERROR: Unable to parse file: /code/src/Gui/Playlist/NewPlaylistDialogAdapter.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Gui\Playlist;
27: 
28: use Ampache\Repository\Model\Playlist;
29: use Ampache\Module\Authorization\GuiGatekeeperInterface;
30: use Ampache\Module\Playlist\PlaylistLoaderInterface;
31: use Ampache\Module\Util\AjaxUriRetrieverInterface;
32: 
33: final class NewPlaylistDialogAdapter implements NewPlaylistDialogAdapterInterface
34: {
35:     private PlaylistLoaderInterface $playlistLoader;
                ^
36: 
37:     private AjaxUriRetrieverInterface $ajaxUriRetriever;
38: 
39:     private GuiGatekeeperInterface $gatekeeper;
40: 
41:     private string $object_type;
42: 
43:     private string $object_ids;
44: 
45:     public function __construct(

ERROR: Unable to parse file: /code/src/Gui/Catalog/CatalogDetails.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Gui\Catalog;
27: 
28: use Ampache\Gui\GuiFactoryInterface;
29: use Ampache\Gui\Stats\CatalogStatsInterface;
30: use Ampache\Repository\Model\Catalog;
31: 
32: final class CatalogDetails implements CatalogDetailsInterface
33: {
34:     private GuiFactoryInterface $guiFactory;
                ^
35: 
36:     private Catalog $catalog;
37: 
38:     public function __construct(
39:         GuiFactoryInterface $guiFactory,
40:         Catalog $catalog
41:     ) {
42:         $this->guiFactory = $guiFactory;
43:         $this->catalog    = $catalog;
44:     }

ERROR: Unable to parse file: /code/src/Gui/Stats/StatsViewAdapter.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Config\ConfigurationKeyEnum;
30: use Ampache\Gui\Catalog\CatalogDetailsInterface;
31: use Ampache\Gui\GuiFactoryInterface;
32: use Ampache\Repository\Model\Catalog;
33: use Ampache\Repository\Model\Video;
34: use Ampache\Repository\VideoRepositoryInterface;
35: 
36: final class StatsViewAdapter implements StatsViewAdapterInterface
37: {
38:     private ConfigContainerInterface $configContainer;
                ^
39: 
40:     private GuiFactoryInterface $guiFactory;
41: 
42:     private VideoRepositoryInterface $videoRepository;
43: 
44:     public function __construct(
45:         ConfigContainerInterface $configContainer,
46:         GuiFactoryInterface $guiFactory,
47:         VideoRepositoryInterface $videoRepository
48:     ) {

ERROR: Unable to parse file: /code/src/Gui/Stats/CatalogStats.php
ERROR: Parse error at line 47 column 13:

37:      *  album_disk?: int,
38:      *  artist?: int,
39:      *  song?: int,
40:      *  podcast?: int,
41:      *  podcast_episode?: int,
42:      *  items?: int,
43:      *  video?: int,
44:      *  user?: int
45:      * } $stats
46:      */
47:     private array $stats;
                ^
48: 
49:     /**
50:      * @param array{
51:      *  tags: int,
52:      *  formatted_size: string,
53:      *  time_text: string,
54:      *  users: int,
55:      *  connected: int,
56:      *  album?: int,
57:      *  album_disk?: int,

ERROR: Unable to parse file: /code/src/Gui/TalView.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use PhpTal\PHPTAL;
30: use PhpTal\PhpTalInterface;
31: 
32: /**
33:  * Renders templates using the phptal rendering engine
34:  */
35: final class TalView implements TalViewInterface
36: {
37:     private TalFactoryInterface $talFactory;
                ^
38: 
39:     private ConfigContainerInterface $configContainer;
40: 
41:     private GuiFactoryInterface $guiFactory;
42: 
43:     private ?PhpTalInterface $engine = null;
44: 
45:     public function __construct(
46:         TalFactoryInterface $talFactory,
47:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Gui/Song/SongViewAdapter.php
ERROR: Parse error at line 46 column 13:

36: use Ampache\Module\Api\Ajax;
37: use Ampache\Module\Application\Song\DeleteAction;
38: use Ampache\Module\Authorization\AccessLevelEnum;
39: use Ampache\Module\Authorization\GuiGatekeeperInterface;
40: use Ampache\Module\Playback\Stream_Playlist;
41: use Ampache\Module\System\Core;
42: use Ampache\Module\Util\Ui;
43: 
44: final class SongViewAdapter implements SongViewAdapterInterface
45: {
46:     private ConfigContainerInterface $configContainer;
                ^
47: 
48:     private ModelFactoryInterface $modelFactory;
49: 
50:     private GuiGatekeeperInterface $gatekeeper;
51: 
52:     private Song $song;
53: 
54:     public function __construct(
55:         ConfigContainerInterface $configContainer,
56:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Gui/TalFactory.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Gui;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use PhpTal\PHPTAL;
30: use PhpTal\PhpTalInterface;
31: use PhpTal\TranslationServiceInterface;
32: 
33: final class TalFactory implements TalFactoryInterface
34: {
35:     private ConfigContainerInterface $configContainer;
                ^
36: 
37:     private GuiFactoryInterface $guiFactory;
38: 
39:     public function __construct(
40:         ConfigContainerInterface $configContainer,
41:         GuiFactoryInterface $guiFactory
42:     ) {
43:         $this->configContainer = $configContainer;
44:         $this->guiFactory      = $guiFactory;
45:     }

ERROR: Unable to parse file: /code/src/Gui/AlbumDisk/AlbumDiskViewAdapter.php
ERROR: Parse error at line 49 column 13:

39: use Ampache\Module\Application\Album\DeleteAction;
40: use Ampache\Module\Authorization\AccessLevelEnum;
41: use Ampache\Module\Authorization\GuiGatekeeperInterface;
42: use Ampache\Module\Authorization\Check\FunctionCheckerInterface;
43: use Ampache\Module\Playback\Stream_Playlist;
44: use Ampache\Module\Util\Ui;
45: use Ampache\Module\Util\ZipHandlerInterface;
46: 
47: final class AlbumDiskViewAdapter implements AlbumDiskViewAdapterInterface
48: {
49:     private ConfigContainerInterface $configContainer;
                ^
50: 
51:     private ModelFactoryInterface $modelFactory;
52: 
53:     private ZipHandlerInterface $zipHandler;
54: 
55:     private FunctionCheckerInterface $functionChecker;
56: 
57:     private GuiGatekeeperInterface $gatekeeper;
58: 
59:     private Browse $browse;

ERROR: Unable to parse file: /code/src/Gui/System/ConfigViewAdapter.php
ERROR: Parse error at line 31 column 13:

21:  *
22:  */
23: 
24: namespace Ampache\Gui\System;
25: 
26: use Ampache\Config\ConfigContainerInterface;
27: use Ampache\Config\ConfigurationKeyEnum;
28: 
29: final class ConfigViewAdapter implements ConfigViewAdapterInterface
30: {
31:     private ConfigContainerInterface $configContainer;
                ^
32: 
33:     public function __construct(
34:         ConfigContainerInterface $configContainer
35:     ) {
36:         $this->configContainer = $configContainer;
37:     }
38: 
39:     public function isWaveformEnabled(): bool
40:     {
41:         return $this->configContainer->isFeatureEnabled(ConfigurationKeyEnum::WAVEFORM);

ERROR: Unable to parse file: /code/src/Gui/System/UpdateViewAdapter.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Application\Update\UpdateAction;
31: use Ampache\Module\System\AmpError;
32: use Ampache\Module\System\Update;
33: use Ampache\Module\Util\Ui;
34: use Ampache\Repository\Model\UpdateInfoEnum;
35: use Ampache\Repository\UpdateInfoRepositoryInterface;
36: use Generator;
37: 
38: final class UpdateViewAdapter implements UpdateViewAdapterInterface
39: {
40:     private ConfigContainerInterface $configContainer;
                ^
41: 
42:     private UpdateInfoRepositoryInterface $updateInfoRepository;
43: 
44:     private Update\UpdateHelperInterface $updateHelper;
45: 
46:     private Update\UpdaterInterface $updater;
47: 
48:     public function __construct(
49:         ConfigContainerInterface $configContainer,
50:         UpdateInfoRepositoryInterface $updateInfoRepository,

ERROR: Unable to parse file: /code/src/Gui/Album/AlbumViewAdapter.php
ERROR: Parse error at line 49 column 13:

39: use Ampache\Module\Application\Album\DeleteAction;
40: use Ampache\Module\Authorization\AccessLevelEnum;
41: use Ampache\Module\Authorization\GuiGatekeeperInterface;
42: use Ampache\Module\Authorization\Check\FunctionCheckerInterface;
43: use Ampache\Module\Playback\Stream_Playlist;
44: use Ampache\Module\Util\Ui;
45: use Ampache\Module\Util\ZipHandlerInterface;
46: 
47: final class AlbumViewAdapter implements AlbumViewAdapterInterface
48: {
49:     private ConfigContainerInterface $configContainer;
                ^
50: 
51:     private ModelFactoryInterface $modelFactory;
52: 
53:     private ZipHandlerInterface $zipHandler;
54: 
55:     private FunctionCheckerInterface $functionChecker;
56: 
57:     private GuiGatekeeperInterface $gatekeeper;
58: 
59:     private Browse $browse;

ERROR: Unable to parse file: /code/src/Repository/LicenseRepository.php
ERROR: Parse error at line 42 column 15:

32: 
33: /**
34:  * Manages access to license data
35:  *
36:  * Tables: `license`
37:  *
38:  * @extends BaseRepository<License>
39:  */
40: final class LicenseRepository extends BaseRepository implements LicenseRepositoryInterface
41: {
42:     protected DatabaseConnectionInterface $connection;
                  ^
43: 
44:     public function __construct(
45:         DatabaseConnectionInterface $connection
46:     ) {
47:         $this->connection = $connection;
48:     }
49: 
50:     /**
51:      * Returns a list of licenses accessible by the current user.
52:      *

ERROR: Unable to parse file: /code/src/Repository/ImageRepository.php
ERROR: Parse error at line 39 column 13:

29: use Generator;
30: use PDO;
31: 
32: /**
33:  * Manages database access related to images (`Art`)
34:  *
35:  * Tables: `image`
36:  */
37: final class ImageRepository implements ImageRepositoryInterface
38: {
39:     private DatabaseConnectionInterface $connection;
                ^
40: 
41:     public function __construct(
42:         DatabaseConnectionInterface $connection
43:     ) {
44:         $this->connection = $connection;
45:     }
46: 
47:     /**
48:      * Get the object details for the art table
49:      */

ERROR: Unable to parse file: /code/src/Repository/ArtistRepository.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Repository;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Module\Database\DatabaseConnectionInterface;
30: use Ampache\Module\System\Dba;
31: use Ampache\Repository\Model\Artist;
32: use Ampache\Repository\Model\Catalog;
33: 
34: final class ArtistRepository implements ArtistRepositoryInterface
35: {
36:     private DatabaseConnectionInterface $connection;
                ^
37: 
38:     public function __construct(
39:         DatabaseConnectionInterface $connection
40:     ) {
41:         $this->connection = $connection;
42:     }
43: 
44:     /**
45:      * Deletes the artist entry
46:      */

ERROR: Unable to parse file: /code/src/Repository/SongRepository.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\Artist;
31: use Ampache\Repository\Model\Catalog;
32: use Ampache\Module\System\Core;
33: use Ampache\Module\System\Dba;
34: use Ampache\Repository\Model\Song;
35: use Ampache\Repository\Model\Tag;
36: use Generator;
37: 
38: final class SongRepository implements SongRepositoryInterface
39: {
40:     private DatabaseConnectionInterface $connection;
                ^
41: 
42:     public function __construct(
43:         DatabaseConnectionInterface $connection
44:     ) {
45:         $this->connection = $connection;
46:     }
47: 
48:     /**
49:      * gets the songs for an album takes an optional limit
50:      *

ERROR: Unable to parse file: /code/src/Repository/ShareRepository.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Repository\Model\User;
35: use DateTimeInterface;
36: 
37: /**
38:  * Manages share related database access
39:  *
40:  * Tables: `share`
41:  */
42: final class ShareRepository implements ShareRepositoryInterface
43: {
44:     private DatabaseConnectionInterface $connection;
                ^
45: 
46:     private ConfigContainerInterface $configContainer;
47: 
48:     public function __construct(
49:         DatabaseConnectionInterface $connection,
50:         ConfigContainerInterface $configContainer
51:     ) {
52:         $this->connection      = $connection;
53:         $this->configContainer = $configContainer;
54:     }

ERROR: Unable to parse file: /code/src/Repository/BaseRepository.php
ERROR: Parse error at line 37 column 15:

27: 
28: use Ampache\Module\Database\DatabaseConnectionInterface;
29: use Ampache\Repository\Model\ModelInterface;
30: use PDO;
31: 
32: /**
33:  * @template TModel as ModelInterface
34:  */
35: abstract class BaseRepository
36: {
37:     protected DatabaseConnectionInterface $connection;
                  ^
38: 
39:     /**
40:      * @return class-string<TModel>
41:      */
42:     abstract protected function getModelClass(): string;
43: 
44:     abstract protected function getTableName(): string;
45: 
46:     /**
47:      * @return list<mixed>

ERROR: Unable to parse file: /code/src/Repository/PrivateMessageRepository.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\PrivateMessageInterface;
31: use Ampache\Repository\Model\User;
32: 
33: /**
34:  * Manages database access related to private-message
35:  *
36:  * Table: `user_pvmsg`
37:  */
38: final class PrivateMessageRepository implements PrivateMessageRepositoryInterface
39: {
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private DatabaseConnectionInterface $connection;
43: 
44:     public function __construct(
45:         ModelFactoryInterface $modelFactory,
46:         DatabaseConnectionInterface $connection
47:     ) {
48:         $this->modelFactory = $modelFactory;
49:         $this->connection   = $connection;
50:     }

ERROR: Unable to parse file: /code/src/Repository/AlbumDiskRepository.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Database\DatabaseConnectionInterface;
29: use Ampache\Repository\Model\Album;
30: use Ampache\Repository\Model\AlbumDisk;
31: 
32: /**
33:  * Provides database access to album-disks
34:  */
35: final class AlbumDiskRepository implements AlbumDiskRepositoryInterface
36: {
37:     private DatabaseConnectionInterface $connection;
                ^
38: 
39:     public function __construct(
40:         DatabaseConnectionInterface $connection
41:     ) {
42:         $this->connection = $connection;
43:     }
44: 
45:     /**
46:      * Returns the disks for an album
47:      *

ERROR: Unable to parse file: /code/src/Repository/PodcastRepository.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Repository\Model\Podcast;
31: use Generator;
32: 
33: /**
34:  * Manages podcast related database access
35:  *
36:  * Tables: `podcast`, `podcast_episode`, `deleted_podcast_episodes`
37:  */
38: final class PodcastRepository implements PodcastRepositoryInterface
39: {
40:     private ModelFactoryInterface $modelFactory;
                ^
41: 
42:     private DatabaseConnectionInterface $connection;
43: 
44:     public function __construct(
45:         ModelFactoryInterface $modelFactory,
46:         DatabaseConnectionInterface $connection
47:     ) {
48:         $this->modelFactory    = $modelFactory;
49:         $this->connection      = $connection;
50:     }

ERROR: Unable to parse file: /code/src/Repository/BookmarkRepository.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Repository;
27: 
28: use Ampache\Module\Database\DatabaseConnectionInterface;
29: use Ampache\Repository\Model\Bookmark;
30: use Ampache\Repository\Model\User;
31: use DateTimeInterface;
32: 
33: final class BookmarkRepository implements BookmarkRepositoryInterface
34: {
35:     private DatabaseConnectionInterface $connection;
                ^
36: 
37:     public function __construct(
38:         DatabaseConnectionInterface $connection
39:     ) {
40:         $this->connection = $connection;
41:     }
42: 
43:     /**
44:      * @return list<int>
45:      */

ERROR: Unable to parse file: /code/src/Repository/AlbumRepository.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Module\Database\DatabaseConnectionInterface;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\System\Dba;
32: use Ampache\Repository\Model\Album;
33: use Ampache\Repository\Model\Catalog;
34: 
35: final class AlbumRepository implements AlbumRepositoryInterface
36: {
37:     private DatabaseConnectionInterface $connection;
                ^
38: 
39:     public function __construct(
40:         DatabaseConnectionInterface $connection
41:     ) {
42:         $this->connection = $connection;
43:     }
44: 
45:     /**
46:      * This returns a number of random albums
47:      *

ERROR: Unable to parse file: /code/src/Repository/DeletedPodcastEpisodeRepository.php
ERROR: Parse error at line 39 column 13:

29: use Generator;
30: use PDO;
31: 
32: /**
33:  * Manages database access related to deleted podcast-episodes
34:  *
35:  * Tables: `deleted_podcast_episodes`
36:  */
37: final class DeletedPodcastEpisodeRepository implements DeletedPodcastEpisodeRepositoryInterface
38: {
39:     private DatabaseConnectionInterface $connection;
                ^
40: 
41:     public function __construct(
42:         DatabaseConnectionInterface $connection
43:     ) {
44:         $this->connection = $connection;
45:     }
46: 
47:     /**
48:     * Returns all deleted podcast episodes
49:     *

ERROR: Unable to parse file: /code/src/Repository/MetadataFieldRepository.php
ERROR: Parse error at line 40 column 13:

30: use Generator;
31: use PDO;
32: 
33: /**
34:  * Manages song metadata-fields related database access
35:  *
36:  * Tables: `metadata_field`
37:  */
38: final class MetadataFieldRepository implements MetadataFieldRepositoryInterface
39: {
40:     private DatabaseConnectionInterface $connection;
                ^
41: 
42:     public function __construct(
43:         DatabaseConnectionInterface $connection
44:     ) {
45:         $this->connection = $connection;
46:     }
47: 
48:     /**
49:      * Remove metadata for songs which don't exist anymore
50:      */

ERROR: Unable to parse file: /code/src/Repository/UserRepository.php
ERROR: Parse error at line 454 column 13:

444:      */
445:     public function getStatistics(int $timePeriod = 1200): array
446:     {
447:         $userResult = Dba::fetch_single_column(
448:             'SELECT COUNT(`id`) FROM `user`'
449:         );
450: 
451:         $time = time();
452: 
453:         $sessionResult = Dba::fetch_single_column(
454:             <<<SQL
                 ^
455:                 SELECT
456:                 COUNT(DISTINCT `session`.`username`)
457:                 FROM `session`
458:                 INNER JOIN `user`
459:                 ON `session`.`username` = `user`.`username`
460:                 WHERE `session`.`expire` > ? AND `user`.`last_seen` > ?;
461:             SQL,
462:             [$time, $time - $timePeriod]
463:         );
464: 

ERROR: Unable to parse file: /code/src/Repository/WantedRepository.php
ERROR: Parse error at line 42 column 13:

32: 
33: /**
34:  * Manages database access related to Wanted-items/recommendations
35:  *
36:  * Tables: `wanted`
37:  *
38:  * @phpstan-import-type DatabaseRow from WantedRepositoryInterface
39:  */
40: final class WantedRepository implements WantedRepositoryInterface
41: {
42:     private DatabaseConnectionInterface $connection;
                ^
43: 
44:     public function __construct(
45:         DatabaseConnectionInterface $connection
46:     ) {
47:         $this->connection = $connection;
48:     }
49: 
50:     /**
51:      * Get wanted list.
52:      *

ERROR: Unable to parse file: /code/src/Repository/AccessRepository.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Repository\Model\User;
32: use Generator;
33: 
34: /**
35:  * Manages ACL related database access
36:  *
37:  * Table: `access_list`
38:  */
39: final class AccessRepository implements AccessRepositoryInterface
40: {
41:     private DatabaseConnectionInterface $connection;
                ^
42: 
43:     private ModelFactoryInterface $modelFactory;
44: 
45:     public function __construct(
46:         DatabaseConnectionInterface $connection,
47:         ModelFactoryInterface $modelFactory
48:     ) {
49:         $this->connection   = $connection;
50:         $this->modelFactory = $modelFactory;
51:     }

ERROR: Unable to parse file: /code/src/Repository/ShoutRepository.php
ERROR: Parse error at line 43 column 15:

33: 
34: /**
35:  * Manages shout-box related database access
36:  *
37:  * Table: `user_shout`
38:  *
39:  * @extends BaseRepository<Shoutbox>
40:  */
41: final class ShoutRepository extends BaseRepository implements ShoutRepositoryInterface
42: {
43:     protected DatabaseConnectionInterface $connection;
                  ^
44: 
45:     private LoggerInterface $logger;
46: 
47:     public function __construct(
48:         DatabaseConnectionInterface $connection,
49:         LoggerInterface $logger
50:     ) {
51:         $this->connection   = $connection;
52:         $this->logger       = $logger;
53:     }

ERROR: Unable to parse file: /code/src/Repository/MetadataRepository.php
ERROR: Parse error at line 41 column 13:

31: use Generator;
32: use PDO;
33: 
34: /**
35:  * Manages song metadata related database access
36:  *
37:  * Tables: `metadata`
38:  */
39: final class MetadataRepository implements MetadataRepositoryInterface
40: {
41:     private DatabaseConnectionInterface $connection;
                ^
42: 
43:     private MetadataFieldRepositoryInterface $metadataFieldRepository;
44: 
45:     public function __construct(
46:         DatabaseConnectionInterface $connection,
47:         MetadataFieldRepositoryInterface $metadataFieldRepository
48:     ) {
49:         $this->connection              = $connection;
50:         $this->metadataFieldRepository = $metadataFieldRepository;
51:     }

ERROR: Unable to parse file: /code/src/Repository/IpHistoryRepository.php
ERROR: Parse error at line 43 column 13:

33: use Generator;
34: use PDO;
35: 
36: /**
37:  * Manages ip-history related database access
38:  *
39:  * Table: `ip_history`
40:  */
41: final class IpHistoryRepository implements IpHistoryRepositoryInterface
42: {
43:     private DatabaseConnectionInterface $connection;
                ^
44: 
45:     private ConfigContainerInterface $configContainer;
46: 
47:     public function __construct(
48:         DatabaseConnectionInterface $connection,
49:         ConfigContainerInterface $configContainer
50:     ) {
51:         $this->connection      = $connection;
52:         $this->configContainer = $configContainer;
53:     }

ERROR: Unable to parse file: /code/src/Repository/LiveStreamRepository.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Repository\Model\ModelFactoryInterface;
32: use Ampache\Repository\Model\User;
33: 
34: /**
35:  * Manages database access related to Live-Streams (Radiostations)
36:  *
37:  * Tables: `live_stream`
38:  */
39: final class LiveStreamRepository implements LiveStreamRepositoryInterface
40: {
41:     private ModelFactoryInterface $modelFactory;
                ^
42: 
43:     private DatabaseConnectionInterface $connection;
44: 
45:     public function __construct(
46:         ModelFactoryInterface $modelFactory,
47:         DatabaseConnectionInterface $connection
48:     ) {
49:         $this->modelFactory = $modelFactory;
50:         $this->connection   = $connection;
51:     }

ERROR: Unable to parse file: /code/src/Repository/PodcastEpisodeRepository.php
ERROR: Parse error at line 44 column 13:

34: use Ampache\Repository\Model\Podcast_Episode;
35: use Generator;
36: 
37: /**
38:  * Manages database access related to podcast-episodes
39:  *
40:  * Tables: `podcast_episode`
41:  */
42: final class PodcastEpisodeRepository implements PodcastEpisodeRepositoryInterface
43: {
44:     private ModelFactoryInterface $modelFactory;
                ^
45: 
46:     private DatabaseConnectionInterface $connection;
47: 
48:     private ConfigContainerInterface $configContainer;
49: 
50:     public function __construct(
51:         ModelFactoryInterface $modelFactory,
52:         DatabaseConnectionInterface $connection,
53:         ConfigContainerInterface $configContainer
54:     ) {

ERROR: Unable to parse file: /code/src/Repository/PreferenceRepository.php
ERROR: Parse error at line 62 column 16:

52:     public function getAll(?User $user = null): array
53:     {
54:         $userLimit = '';
55:         $userId    = User::INTERNAL_SYSTEM_USER_ID;
56: 
57:         if ($user !== null) {
58:             $userLimit = 'AND `preference`.`category` != \'system\'';
59:             $userId    = $user->getId();
60:         }
61: 
62:         $sql = <<<SQL
                   ^
63:             SELECT
64:                 `preference`.`id`,
65:                 `preference`.`name`,
66:                 `preference`.`description`,
67:                 `preference`.`level`,
68:                 `preference`.`type`,
69:                 `preference`.`category`,
70:                 `preference`.`subcategory`,
71:                 `user_preference`.`value`
72:             FROM

ERROR: Unable to parse file: /code/src/Repository/UpdateInfoRepository.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Repository;
27: 
28: use Ampache\Module\Database\DatabaseConnectionInterface;
29: 
30: /**
31:  * Provides access to the `update_info` table
32:  */
33: final class UpdateInfoRepository implements UpdateInfoRepositoryInterface
34: {
35:     private DatabaseConnectionInterface $connection;
                ^
36: 
37:     public function __construct(
38:         DatabaseConnectionInterface $connection
39:     ) {
40:         $this->connection = $connection;
41:     }
42: 
43:     /**
44:      * Returns a single value by its key
45:      *

ERROR: Unable to parse file: /code/src/Repository/Model/Label.php
ERROR: Parse error at line 44 column 12:

34: 
35: /**
36:  * This is the class responsible for handling the Label object
37:  * it is related to the label table in the database.
38:  */
39: class Label extends database_object implements library_item
40: {
41:     protected const DB_TABLENAME = 'label';
42: 
43:     /* Variables from DB */
44:     public int $id = 0;
               ^
45:     public ?string $name;
46:     public ?string $category;
47:     public ?string $summary;
48:     public ?string $address;
49:     public ?string $email;
50:     public ?string $website;
51:     public ?int $user;
52:     public ?int $creation_date;
53:     public ?string $mbid; // MusicBrainz ID
54:     public ?string $country;

ERROR: Unable to parse file: /code/src/Repository/Model/Shoutbox.php
ERROR: Parse error at line 41 column 13:

31: use DateTimeInterface;
32: 
33: /**
34:  * Shoutbox item
35:  *
36:  * @see ShoutRepository
37:  */
38: class Shoutbox extends BaseModel
39: {
40:     /** @var int User-id */
41:     private int $user = 0;
                ^
42: 
43:     /** @var string Comment */
44:     private string $text = '';
45: 
46:     /** @var int Date */
47:     private int $date = 0;
48: 
49:     /** @var bool True if a sticky shout */
50:     private bool $sticky = false;
51: 

ERROR: Unable to parse file: /code/src/Repository/Model/Podcast.php
ERROR: Parse error at line 47 column 13:

37: /**
38:  * Podcast item
39:  *
40:  * @see PodcastRepository
41:  */
42: class Podcast extends database_object implements library_item, CatalogItemInterface
43: {
44:     protected const DB_TABLENAME = 'podcast';
45: 
46:     /* Variables from DB */
47:     private int $id = 0;
                ^
48: 
49:     private ?string $feed = null;
50: 
51:     private int $catalog = 0;
52: 
53:     private ?string $title = null;
54: 
55:     private ?string $website = null;
56: 
57:     private ?string $description = null;

ERROR: Unable to parse file: /code/src/Repository/Model/TvShow.php
ERROR: Parse error at line 41 column 12:

31: use Ampache\Config\AmpConfig;
32: use Ampache\Repository\ShareRepositoryInterface;
33: use Ampache\Repository\ShoutRepositoryInterface;
34: use Ampache\Repository\UserActivityRepositoryInterface;
35: 
36: class TvShow extends database_object implements library_item, CatalogItemInterface
37: {
38:     protected const DB_TABLENAME = 'tvshow';
39: 
40:     /* Variables from DB */
41:     public int $id = 0;
               ^
42:     public ?string $name;
43:     public ?string $prefix;
44:     public ?string $summary;
45:     public ?int $year;
46: 
47:     public $catalog_id;
48:     public $tags;
49:     public $f_tags;
50:     public $episodes;
51:     public $seasons;

ERROR: Unable to parse file: /code/src/Repository/Model/Personal_Video.php
ERROR: Parse error at line 34 column 12:

24:  */
25: 
26: namespace Ampache\Repository\Model;
27: 
28: use Ampache\Module\System\Dba;
29: 
30: class Personal_Video extends Video
31: {
32:     protected const DB_TABLENAME = 'personal_video';
33: 
34:     public ?string $location;
               ^
35:     public ?string $summary;
36: 
37:     public $video;
38:     public $f_location;
39: 
40:     /**
41:      * Constructor
42:      * This pulls the personal video information from the database and returns
43:      * a constructed object
44:      * @param int|null $object_id

ERROR: Unable to parse file: /code/src/Repository/Model/Live_Stream.php
ERROR: Parse error at line 44 column 12:

34:  *
35:  * This handles the internet radio stuff, that is inserted into live_stream
36:  * this can include podcasts or what-have-you
37:  *
38:  */
39: class Live_Stream extends database_object implements Media, library_item, CatalogItemInterface
40: {
41:     protected const DB_TABLENAME = 'live_stream';
42: 
43:     /* DB based variables */
44:     public int $id = 0;
               ^
45:     public ?string $name;
46:     public ?string $site_url;
47:     public ?string $url;
48:     public int $genre;
49:     public int $catalog;
50:     public ?string $codec;
51: 
52:     public ?string $link = null;
53:     /**
54:      * @var null|string $f_name

ERROR: Unable to parse file: /code/src/Repository/Model/License.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\LicenseRepositoryInterface;
30: 
31: /**
32:  * License item
33:  *
34:  * @see LicenseRepository
35:  */
36: class License extends BaseModel
37: {
38:     /** @var string|null License title */
39:     private ?string $name = null;
                ^
40: 
41:     /** @var string|null Descriptive text */
42:     private ?string $description = null;
43: 
44:     /** @var string|null Lint to the license page */
45:     private ?string $external_link = null;
46: 
47:     private LicenseRepositoryInterface $licenseRepository;
48: 
49:     public function __construct(

ERROR: Unable to parse file: /code/src/Repository/Model/Tag.php
ERROR: Parse error at line 44 column 12:

34: /**
35:  * Tag Class
36:  *
37:  * This class handles all of the genre related operations
38:  *
39:  */
40: class Tag extends database_object implements library_item, GarbageCollectibleInterface
41: {
42:     protected const DB_TABLENAME = 'tag';
43: 
44:     public int $id = 0;
               ^
45:     public ?string $name;
46:     public int $is_hidden;
47: 
48:     public $f_name;
49: 
50:     /**
51:      * constructor
52:      * This takes a tag id and returns all of the relevant information
53:      * @param int|null $tag_id
54:      */

ERROR: Unable to parse file: /code/src/Repository/Model/Artist.php
ERROR: Parse error at line 46 column 12:

36: use Ampache\Repository\LabelRepositoryInterface;
37: use Ampache\Repository\SongRepositoryInterface;
38: use Ampache\Repository\UserActivityRepositoryInterface;
39: use PDOStatement;
40: 
41: class Artist extends database_object implements library_item, CatalogItemInterface
42: {
43:     protected const DB_TABLENAME = 'artist';
44: 
45:     /* Variables from DB */
46:     public int $id = 0;
               ^
47:     public ?string $name;
48:     public ?string $prefix;
49:     public ?string $mbid; // MusicBrainz ID
50:     public ?string $summary;
51:     public ?string $placeformed;
52:     public ?int $yearformed;
53:     public int $last_update;
54:     public ?int $user;
55:     public bool $manual_update;
56:     public ?int $time;

ERROR: Unable to parse file: /code/src/Repository/Model/Bookmark.php
ERROR: Parse error at line 41 column 12:

31: use PDOStatement;
32: 
33: /**
34:  * This manage bookmark on playable items
35:  */
36: class Bookmark extends database_object
37: {
38:     protected const DB_TABLENAME = 'bookmark';
39: 
40:     // Public variables
41:     public int $id = 0;
               ^
42:     public int $user;
43:     public int $position;
44:     public ?string $comment;
45:     public ?string $object_type;
46:     public int $object_id;
47:     public int $creation_date;
48:     public int $update_date;
49: 
50:     /**
51:      * Constructor

ERROR: Unable to parse file: /code/src/Repository/Model/PrivateMsg.php
ERROR: Parse error at line 39 column 13:

29: 
30: /**
31:  * This is the class responsible for handling the PrivateMsg object
32:  * it is related to the user_pvmsg table in the database.
33:  */
34: class PrivateMsg extends database_object implements PrivateMessageInterface
35: {
36:     protected const DB_TABLENAME = 'user_pvmsg';
37: 
38:     /* Variables from DB */
39:     private int $id = 0;
                ^
40:     private ?string $subject;
41:     private ?string $message;
42:     private int $from_user;
43:     private int $to_user;
44:     private bool $is_read;
45:     private ?int $creation_date;
46: 
47: 
48:     /**
49:      * @param int|null $pm_id

ERROR: Unable to parse file: /code/src/Repository/Model/Wanted.php
ERROR: Parse error at line 45 column 12:

35: use Ampache\Repository\WantedRepositoryInterface;
36: use Exception;
37: use MusicBrainz\HttpAdapters\RequestsHttpAdapter;
38: use MusicBrainz\MusicBrainz;
39: 
40: class Wanted extends database_object
41: {
42:     protected const DB_TABLENAME = 'wanted';
43: 
44:     /* Variables from DB */
45:     public int $id = 0;
               ^
46:     public ?int $user;
47:     public ?int $artist = null;
48:     public ?string $artist_mbid;
49:     public ?string $mbid;
50:     public ?string $name;
51:     public ?int $year;
52:     public int $date;
53:     public int $accepted;
54: 
55:     /**

ERROR: Unable to parse file: /code/src/Repository/Model/TVShow_Season.php
ERROR: Parse error at line 43 column 12:

33: use PDOStatement;
34: 
35: class TVShow_Season extends database_object implements
36:     library_item,
37:     GarbageCollectibleInterface,
38:     CatalogItemInterface
39: {
40:     protected const DB_TABLENAME = 'tvshow_season';
41: 
42:     /* Variables from DB */
43:     public int $id = 0;
               ^
44:     public int $season_number;
45:     public int $tvshow;
46: 
47:     public $catalog_id;
48:     public $episodes;
49:     public $f_name;
50:     public $f_tvshow;
51:     public $f_tvshow_link;
52: 
53:     public ?string $link = null;

ERROR: Unable to parse file: /code/src/Repository/Model/Rating.php
ERROR: Parse error at line 60 column 12:

50:         'video',
51:         'playlist',
52:         'search',
53:         'tvshow',
54:         'tvshow_season',
55:         'podcast',
56:         'podcast_episode'
57:     );
58: 
59:     // Public variables
60:     public int $id; // The object_id of the object rated
               ^
61:     public string $type; // The object_type of object we want
62: 
63:     /**
64:      * Constructor
65:      * This is run every time a new object is created, and requires
66:      * the id and type of object that we need to pull the rating for
67:      * @param int|null $rating_id
68:      * @param string $type
69:      */
70:     public function __construct($rating_id, $type)

ERROR: Unable to parse file: /code/src/Repository/Model/BaseModel.php
ERROR: Parse error at line 31 column 15:

21:  * You should have received a copy of the GNU Affero General Public License
22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Repository\Model;
27: 
28: abstract class BaseModel implements ModelInterface
29: {
30:     /** @var int Primary key*/
31:     protected int $id = 0;
                  ^
32: 
33:     /**
34:      * Returns true if the object is new/unknown
35:      */
36:     public function isNew(): bool
37:     {
38:         return $this->id === 0;
39:     }
40: 
41:     /**

ERROR: Unable to parse file: /code/src/Repository/Model/Catalog.php
ERROR: Parse error at line 143 column 12:

133:         'search' => 0,
134:         'share' => 0,
135:         'size' => 0,
136:         'song' => 0,
137:         'tag' => 0,
138:         'time' => 0,
139:         'user' => 0,
140:         'video' => 0
141:     ];
142: 
143:     public int $id = 0;
                ^
144:     public ?string $name;
145:     public ?string $catalog_type;
146:     public int $last_update;
147:     public ?int $last_clean;
148:     public int $last_add;
149:     public bool $enabled;
150:     public ?string $rename_pattern = '';
151:     public ?string $sort_pattern   = '';
152:     public ?string $gather_types   = '';
153: 

ERROR: Unable to parse file: /code/src/Repository/Model/Broadcast.php
ERROR: Parse error at line 39 column 12:

29: use Ampache\Module\Api\Ajax;
30: use Ampache\Config\AmpConfig;
31: use Ampache\Module\System\Core;
32: use Ampache\Module\System\Dba;
33: use PDOStatement;
34: 
35: class Broadcast extends database_object implements library_item
36: {
37:     protected const DB_TABLENAME = 'broadcast';
38: 
39:     public int $id = 0;
               ^
40:     public int $user;
41:     public ?string $name;
42:     public ?string $description;
43:     public bool $is_private;
44:     public int $song;
45:     public bool $started;
46:     public int $listeners;
47:     public ?string $key;
48: 
49:     public ?string $link = null;

ERROR: Unable to parse file: /code/src/Repository/Model/TVShow_Episode.php
ERROR: Parse error at line 34 column 12:

24:  */
25: 
26: namespace Ampache\Repository\Model;
27: 
28: use Ampache\Module\System\Dba;
29: 
30: class TVShow_Episode extends Video
31: {
32:     protected const DB_TABLENAME = 'tvshow_episode';
33: 
34:     public ?string $original_name;
               ^
35:     public int $season;
36:     public int $episode_number;
37:     public ?string $summary;
38: 
39:     public $f_link;
40:     public $f_season;
41:     public $f_season_link;
42:     public $f_tvshow;
43:     public $f_tvshow_link;
44: 

ERROR: Unable to parse file: /code/src/Repository/Model/Share.php
ERROR: Parse error at line 52 column 12:

42:         'album_disk',
43:         'artist',
44:         'playlist',
45:         'podcast',
46:         'podcast_episode',
47:         'search',
48:         'song',
49:         'video'
50:     );
51: 
52:     public int $id = 0;
               ^
53:     public int $user;
54:     public ?string $object_type;
55:     public int $object_id;
56:     public bool $allow_stream;
57:     public bool $allow_download;
58:     public int $expire_days;
59:     public int $max_counter;
60:     public ?string $secret;
61:     public int $counter;
62:     public int $creation_date;

ERROR: Unable to parse file: /code/src/Repository/Model/AlbumDisk.php
ERROR: Parse error at line 41 column 12:

31: 
32: /**
33:  * This is the class responsible for handling the Album object
34:  * it is related to the album table in the database.
35:  */
36: class AlbumDisk extends database_object implements library_item, CatalogItemInterface
37: {
38:     protected const DB_TABLENAME = 'album_disk';
39: 
40:     /* Variables from DB */
41:     public int $id = 0;
               ^
42:     public int $album_id;
43:     public int $disk;
44:     public int $disk_count = 0;
45:     public ?int $time;
46:     public int $catalog;
47:     public int $song_count;
48:     public int $total_count;
49:     public ?string $disksubtitle;
50: 
51:     /* Variables from parent Album */

ERROR: Unable to parse file: /code/src/Repository/Model/Song_Preview.php
ERROR: Parse error at line 39 column 12:

29: use Ampache\Module\Playback\Stream_Url;
30: use Ampache\Module\System\Dba;
31: use Ampache\Config\AmpConfig;
32: use Ampache\Module\System\Core;
33: use Ampache\Module\Wanted\MissingArtistRetrieverInterface;
34: 
35: class Song_Preview extends database_object implements Media, playable_item
36: {
37:     protected const DB_TABLENAME = 'song_preview';
38: 
39:     public int $id = 0;
               ^
40:     public ?string $session;
41:     public ?int $artist; // artist.id (Int)
42:     public ?string $artist_mbid;
43:     public ?string $title;
44:     public ?string $album_mbid;
45:     public ?string $mbid; // MusicBrainz ID
46:     public ?int $disk;
47:     public ?int $track;
48:     public ?string $file;
49: 

ERROR: Unable to parse file: /code/src/Repository/Model/Democratic.php
ERROR: Parse error at line 44 column 12:

34: use Ampache\Module\System\Core;
35: 
36: /**
37:  * This class handles democratic play, which is a fancy
38:  * name for voting based playback.
39:  */
40: class Democratic extends Tmp_Playlist
41: {
42:     protected const DB_TABLENAME = 'democratic';
43: 
44:     public ?string $name      = null;
               ^
45:     public ?int $cooldown     = null;
46:     public int $level         = 0;
47:     public int $user          = 0;
48:     public bool $primary      = false;
49:     public int $base_playlist = 0;
50: 
51:     public $f_cooldown;
52:     public $f_primary;
53:     public $f_level;
54:     public $tmp_playlist;

ERROR: Unable to parse file: /code/src/Repository/Model/Tmp_Playlist.php
ERROR: Parse error at line 43 column 12:

33:  *
34:  * This class handles the temporary playlists in Ampache. It handles the
35:  * tmp_playlist and tmp_playlist_data tables, and sneaks out at night to
36:  * visit user_vote from time to time.
37:  */
38: class Tmp_Playlist extends database_object
39: {
40:     protected const DB_TABLENAME = 'tmp_playlist';
41: 
42:     // Variables from the Database
43:     public int $id = 0;
               ^
44:     public ?string $session;
45:     public ?string $type;
46:     public ?string $object_type;
47: 
48:     // Generated Elements
49:     public $items = array();
50: 
51:     /**
52:      * Constructor
53:      * This takes a playlist_id as an optional argument and gathers the

ERROR: Unable to parse file: /code/src/Repository/Model/User_Playlist.php
ERROR: Parse error at line 41 column 12:

31: /**
32:  * UserPlaylist Class
33:  *
34:  * This class handles the user playlists in Ampache. It handles the
35:  * user_playlist table creating a global play queue for each user
36:  */
37: class User_Playlist extends database_object
38: {
39:     protected const DB_TABLENAME = 'user_playlist';
40: 
41:     public int $user;
               ^
42:     public string $client;
43: 
44:     /**
45:      * Constructor
46:      * This takes a user_id as an optional argument and gathers the
47:      * information.  If no user_id is passed or the requested one isn't
48:      * found, return false.
49:      * @param int|null $user_id
50:      * @param string|null $client
51:      */

ERROR: Unable to parse file: /code/src/Repository/Model/Song.php
ERROR: Parse error at line 63 column 12:

53: class Song extends database_object implements
54:     Media,
55:     library_item,
56:     GarbageCollectibleInterface,
57:     CatalogItemInterface,
58:     MetadataEnabledInterface
59: {
60:     protected const DB_TABLENAME = 'song';
61: 
62:     /* Variables from DB */
63:     public int $id = 0;
               ^
64:     public ?string $file;
65:     public int $catalog;
66:     public int $album;
67:     public ?int $disk = null;
68:     public int $year;
69:     public ?int $artist;
70:     public ?string $title = null;
71:     public int $bitrate;
72:     public int $rate;
73:     public ?string $mode = null;

ERROR: Unable to parse file: /code/src/Repository/Model/Podcast_Episode.php
ERROR: Parse error at line 50 column 12:

40: use DateTime;
41: use DateTimeInterface;
42: 
43: class Podcast_Episode extends database_object implements
44:     Media,
45:     library_item,
46:     CatalogItemInterface
47: {
48:     protected const DB_TABLENAME = 'podcast_episode';
49: 
50:     public int $id = 0;
               ^
51:     public ?string $title;
52:     public ?string $guid;
53:     public int $podcast;
54:     public ?string $state;
55:     public ?string $file;
56:     public ?string $source;
57:     public int $size;
58:     public int $time;
59:     public ?string $website;
60:     public ?string $description;

ERROR: Unable to parse file: /code/src/Repository/Model/Album.php
ERROR: Parse error at line 50 column 12:

40: 
41: /**
42:  * This is the class responsible for handling the Album object
43:  * it is related to the album table in the database.
44:  */
45: class Album extends database_object implements library_item, CatalogItemInterface
46: {
47:     protected const DB_TABLENAME = 'album';
48: 
49:     /* Variables from DB */
50:     public int $id = 0;
               ^
51:     public ?string $name;
52:     public ?string $prefix;
53:     public ?string $mbid; // MusicBrainz ID
54:     public int $year;
55:     public int $disk_count = 0;
56:     public ?string $mbid_group; // MusicBrainz Release Group ID
57:     public ?string $release_type;
58:     public ?int $album_artist;
59:     public ?int $original_year = null;
60:     public ?string $barcode;

ERROR: Unable to parse file: /code/src/Repository/Model/MetadataField.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Repository\MetadataFieldRepositoryInterface;
29: 
30: /**
31:  * Represents metadata fields
32:  */
33: class MetadataField
34: {
35:     /**
36:      * Database ID
37:      */
38:     private int $id = 0;
                ^
39: 
40:     /**
41:      * Tag name
42:      */
43:     private string $name = '';
44: 
45:     /**
46:      * Is the Tag public?
47:      */
48:     private bool $public = true;

ERROR: Unable to parse file: /code/src/Repository/Model/playlist_object.php
ERROR: Parse error at line 40 column 12:

30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\Ui;
32: 
33: /**
34:  * playlist_object
35:  * Abstracting out functionality needed by both normal and smart playlists
36:  */
37: abstract class playlist_object extends database_object implements library_item
38: {
39:     // Database variables
40:     public int $id = 0;
               ^
41:     public ?string $name;
42:     public ?int $user;
43:     public ?string $username;
44:     public ?string $type;
45: 
46:     public ?string $link       = null;
47:     public int $date           = 0;
48:     public ?int $last_duration = 0;
49:     public ?int $last_update   = 0;
50:     public ?string $f_date;

ERROR: Unable to parse file: /code/src/Repository/Model/User.php
ERROR: Parse error at line 54 column 12:

44:  * with a user_id from user.id
45:  */
46: class User extends database_object
47: {
48:     /** @var int Defines the internal system user-id */
49:     public const INTERNAL_SYSTEM_USER_ID = -1;
50: 
51:     protected const DB_TABLENAME = 'user';
52: 
53:     // Basic Components
54:     public int $id = 0;
               ^
55:     public ?string $username;
56:     public ?string $fullname;
57:     public ?string $email;
58:     public ?string $website;
59:     public ?string $apikey;
60:     public int $access;
61:     public bool $disabled;
62:     public int $last_seen;
63:     public ?int $create_date;
64:     public ?string $validation;

ERROR: Unable to parse file: /code/src/Repository/Model/Userflag.php
ERROR: Parse error at line 45 column 12:

35: use PDOStatement;
36: 
37: /**
38:  * This user flag/unflag songs, albums, artists, videos, tvshows, movies ... as favorite.
39:  */
40: class Userflag extends database_object
41: {
42:     protected const DB_TABLENAME = 'user_flag';
43: 
44:     // Public variables
45:     public int $id; // The object_id of the object flagged
               ^
46:     public string $type; // The object_type of object we want
47: 
48:     /**
49:      * Constructor
50:      * This is run every time a new object is created, and requires
51:      * the id and type of object that we need to pull the flag for
52:      * @param int|null $object_id
53:      * @param string $type
54:      */
55:     public function __construct($object_id, $type)

ERROR: Unable to parse file: /code/src/Repository/Model/Movie.php
ERROR: Parse error at line 34 column 12:

24:  */
25: 
26: namespace Ampache\Repository\Model;
27: 
28: use Ampache\Module\System\Dba;
29: 
30: class Movie extends Video
31: {
32:     protected const DB_TABLENAME = 'movie';
33: 
34:     public ?string $original_name;
               ^
35:     public ?string $summary;
36:     public ?int $year;
37:     public ?string $prefix;
38: 
39:     public $video;
40:     public $f_original_name;
41: 
42:     /**
43:      * Constructor
44:      * This pulls the movie information from the database and returns

ERROR: Unable to parse file: /code/src/Repository/Model/Video.php
ERROR: Parse error at line 49 column 12:

39: use Ampache\Repository\UserActivityRepositoryInterface;
40: 
41: class Video extends database_object implements
42:     Media,
43:     library_item,
44:     GarbageCollectibleInterface,
45:     CatalogItemInterface
46: {
47:     protected const DB_TABLENAME = 'video';
48: 
49:     public int $id = 0;
               ^
50:     public string $file;
51:     public int $catalog;
52:     public ?string $title;
53:     public ?string $video_codec;
54:     public ?string $audio_codec;
55:     public int $resolution_x;
56:     public int $resolution_y;
57:     public int $time;
58:     public int $size;
59:     public ?string $mime;

ERROR: Unable to parse file: /code/src/Repository/Model/Search.php
ERROR: Parse error at line 71 column 12:

61:         'label',
62:         'playlist',
63:         'podcast',
64:         'podcast_episode',
65:         'tag',
66:         'user',
67:         'video'
68:     );
69: 
70:     // override playlist_object
71:     public ?string $type = 'public';
               ^
72:     // rules used to run a search (User chooses rules from available types for that object)
73:     public $rules; // JSON string to decoded to array
74:     public ?string $logic_operator = 'AND';
75:     public ?int $random            = 0;
76:     public int $limit              = 0;
77:     public ?int $last_count        = 0;
78: 
79:     public $objectType; // the type of object you want to return (self::VALID_TYPES)
80:     public $search_user; // user running the search
81:     public $types     = array(); // rules that are available to the objectType (title, year, rating, etc)

ERROR: Unable to parse file: /code/src/Repository/Model/Useractivity.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Repository\Model;
27: 
28: use Ampache\Module\System\Dba;
29: use PDOStatement;
30: 
31: class Useractivity extends database_object
32: {
33:     protected const DB_TABLENAME = 'user_activity';
34: 
35:     /* Variables from DB */
36:     public int $id = 0;
               ^
37:     public int $user;
38:     public string $action;
39:     public int $object_id;
40:     public string $object_type;
41:     public int $activity_date;
42: 
43:     /**
44:      * Constructor
45:      * This is run every time a new object is created, and requires
46:      * the id and type of object that we need to pull the flag for

ERROR: Unable to parse file: /code/src/Repository/Model/Metadata.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Repository\MetadataFieldRepositoryInterface;
29: use Ampache\Repository\MetadataRepositoryInterface;
30: 
31: /**
32:  * Represents metadata linked to library-items
33:  */
34: class Metadata
35: {
36:     /** @var int Database primary key */
37:     private int $id = 0;
                ^
38: 
39:     /** @var int Id of a library item like song or video */
40:     private int $object_id = 0;
41: 
42:     /** @var int Id of the linked MetadataField */
43:     private int $field = 0;
44: 
45:     /** @var string Tag Data */
46:     private string $data = '';
47: 

ERROR: Unable to parse file: /code/src/Repository/Model/Clip.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Repository\Model;
27: 
28: use Ampache\Module\System\Dba;
29: use PDOStatement;
30: 
31: class Clip extends Video
32: {
33:     protected const DB_TABLENAME = 'clip';
34: 
35:     public ?int $artist;
               ^
36:     public ?int $song;
37: 
38:     public $video;
39:     public $f_artist;
40:     public $f_song;
41: 
42:     /**
43:      * Constructor
44:      * This pulls the clip information from the database and returns
45:      * a constructed object

ERROR: Unable to parse file: /code/src/Repository/Model/database_object.php
ERROR: Parse error at line 44 column 20:

34:  * caching for all of the objects to cut down on the database calls
35:  */
36: abstract class database_object
37: {
38:     protected const DB_TABLENAME = null;
39: 
40:     private static $object_cache = array();
41: 
42:     // Statistics for debugging
43:     public static $cache_hit       = 0;
44:     private static ?bool $_enabled = null;
                       ^
45: 
46:     /**
47:      * get_info
48:      * retrieves the info from the database and puts it in the cache
49:      * @param int $object_id
50:      * @param string $table_name
51:      */
52:     public function get_info($object_id, $table_name = ''): array
53:     {
54:         $table     = $this->getTableName($table_name);

ERROR: Unable to parse file: /code/src/Repository/LabelRepository.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Repository;
27: 
28: use Ampache\Module\Database\DatabaseConnectionInterface;
29: use Ampache\Repository\Model\Label;
30: use DateTimeInterface;
31: use PDO;
32: 
33: final class LabelRepository implements LabelRepositoryInterface
34: {
35:     private DatabaseConnectionInterface $connection;
                ^
36: 
37:     public function __construct(
38:         DatabaseConnectionInterface $connection
39:     ) {
40:         $this->connection = $connection;
41:     }
42: 
43:     public function findById(int $labelId): ?Label
44:     {
45:         $label = new Label($labelId);

ERROR: Unable to parse file: /code/src/Plugin/AmpacheCatalogFavorites.php
ERROR: Parse error at line 40 column 12:

30: use Ampache\Repository\Model\Preference;
31: use Ampache\Repository\Model\Song;
32: use Ampache\Repository\Model\User;
33: use Ampache\Repository\Model\Userflag;
34: use Ampache\Module\Api\Ajax;
35: use Ampache\Module\Playback\Stream_Playlist;
36: use Ampache\Module\Util\Ui;
37: 
38: class AmpacheCatalogFavorites implements AmpachePluginInterface
39: {
40:     public string $name        = 'Catalog Favorites';
               ^
41:     public string $categories  = 'home';
42:     public string $description = 'Catalog favorites on homepage';
43:     public string $url         = '';
44:     public string $version     = '000002';
45:     public string $min_ampache = '370021';
46:     public string $max_ampache = '999999';
47: 
48:     // These are internal settings used by this class, run this->load to fill them out
49:     private $maxitems;
50:     private $gridview;

ERROR: Unable to parse file: /code/src/Plugin/Ampachechartlyrics.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Song;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use WpOrg\Requests\Requests;
32: 
33: class Ampachechartlyrics implements AmpachePluginInterface
34: {
35:     public string $name        = 'ChartLyrics';
               ^
36:     public string $categories  = 'lyrics';
37:     public string $description = 'Get lyrics from ChartLyrics';
38:     public string $url         = 'http://www.chartlyrics.com';
39:     public string $version     = '000001';
40:     public string $min_ampache = '360022';
41:     public string $max_ampache = '999999';
42: 
43:     /**
44:      * Constructor
45:      */

ERROR: Unable to parse file: /code/src/Plugin/AmpacheLibravatar.php
ERROR: Parse error at line 33 column 12:

23:  *
24:  */
25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\User;
29: use Ampache\Module\System\Core;
30: 
31: class AmpacheLibravatar implements AmpachePluginInterface
32: {
33:     public string $name        = 'Libravatar';
               ^
34:     public string $categories  = 'avatar';
35:     public string $description = 'Users avatar\'s with Libravatar';
36:     public string $url         = 'https://www.libravatar.org';
37:     public string $version     = '000001';
38:     public string $min_ampache = '360040';
39:     public string $max_ampache = '999999';
40: 
41:     /**
42:      * Constructor
43:      */

ERROR: Unable to parse file: /code/src/Plugin/AmpacheLastfm.php
ERROR: Parse error at line 37 column 12:

27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Plugin;
30: use Ampache\Repository\Model\Preference;
31: use Ampache\Repository\Model\Song;
32: use Ampache\Repository\Model\User;
33: use Ampache\Module\Playback\Scrobble\Scrobbler;
34: 
35: class AmpacheLastfm implements AmpachePluginInterface
36: {
37:     public string $name        = 'Last.FM';
               ^
38:     public string $categories  = 'scrobbling';
39:     public string $description = 'Records your played songs to your Last.FM account';
40:     public string $url         = '';
41:     public string $version     = '000005';
42:     public string $min_ampache = '360003';
43:     public string $max_ampache = '999999';
44: 
45:     // These are internal settings used by this class, run this->load to fill them out
46:     private $user_id;
47:     private $challenge;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheStreamBandwidth.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Util\Graph;
32: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
33: 
34: class AmpacheStreamBandwidth implements AmpachePluginInterface
35: {
36:     public string $name        = 'Stream Bandwidth';
               ^
37:     public string $categories  = 'stream_control';
38:     public string $description = 'Control bandwidth per user';
39:     public string $url         = '';
40:     public string $version     = '000001';
41:     public string $min_ampache = '370024';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $user_id;
46:     private $bandwidth_days;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheStreamTime.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Util\Graph;
32: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
33: 
34: class AmpacheStreamTime implements AmpachePluginInterface
35: {
36:     public string $name        = 'Stream Time';
               ^
37:     public string $categories  = 'stream_control';
38:     public string $description = 'Control time per user';
39:     public string $url         = '';
40:     public string $version     = '000001';
41:     public string $min_ampache = '370024';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $user_id;
46:     private $time_days;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheFriendsTimeline.php
ERROR: Parse error at line 39 column 12:

29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Repository\Model\Useractivity;
32: use Ampache\Module\System\Core;
33: use Ampache\Module\User\Activity\UserActivityRendererInterface;
34: use Ampache\Module\Util\Ui;
35: use Ampache\Repository\UserActivityRepositoryInterface;
36: 
37: class AmpacheFriendsTimeline implements AmpachePluginInterface
38: {
39:     public string $name        = 'Friends Timeline';
               ^
40:     public string $categories  = 'home';
41:     public string $description = 'Friends Timeline on homepage';
42:     public string $url         = '';
43:     public string $version     = '000001';
44:     public string $min_ampache = '370040';
45:     public string $max_ampache = '999999';
46: 
47:     // These are internal settings used by this class, run this->load to fill them out
48:     private $maxitems;
49: 

ERROR: Unable to parse file: /code/src/Plugin/AmpacheGravatar.php
ERROR: Parse error at line 32 column 12:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\User;
29: 
30: class AmpacheGravatar implements AmpachePluginInterface
31: {
32:     public string $name        = 'Gravatar';
               ^
33:     public string $categories  = 'avatar';
34:     public string $description = 'User\'s avatars with Gravatar';
35:     public string $url         = 'https://gravatar.com';
36:     public string $version     = '000001';
37:     public string $min_ampache = '360040';
38:     public string $max_ampache = '999999';
39: 
40:     /**
41:      * Constructor
42:      */

ERROR: Unable to parse file: /code/src/Plugin/AmpacheYourls.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use Exception;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheYourls implements AmpachePluginInterface
35: {
36:     public string $name        = 'YOURLS';
               ^
37:     public string $categories  = 'shortener';
38:     public string $description = 'URL shorteners on shared links with YOURLS';
39:     public string $url         = 'http://yourls.org';
40:     public string $version     = '000002';
41:     public string $min_ampache = '360037';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $yourls_domain;
46:     private $yourls_use_idn;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheMusicBrainz.php
ERROR: Parse error at line 42 column 12:

32: use Ampache\Repository\Model\Preference;
33: use Ampache\Repository\Model\User;
34: use Exception;
35: use MusicBrainz\Filters\ArtistFilter;
36: use MusicBrainz\Filters\LabelFilter;
37: use MusicBrainz\MusicBrainz;
38: use MusicBrainz\HttpAdapters\RequestsHttpAdapter;
39: 
40: class AmpacheMusicBrainz implements AmpachePluginInterface
41: {
42:     public string $name        = 'MusicBrainz';
               ^
43:     public string $categories  = 'metadata';
44:     public string $description = 'MusicBrainz metadata integration';
45:     public string $url         = 'http://www.musicbrainz.org';
46:     public string $version     = '000003';
47:     public string $min_ampache = '360003';
48:     public string $max_ampache = '999999';
49: 
50:     // These are internal settings used by this class, run this->load to fill them out
51:     public bool $overwrite_name = false;
52: 

ERROR: Unable to parse file: /code/src/Plugin/Ampachelistenbrainz.php
ERROR: Parse error at line 37 column 12:

27: 
28: use Ampache\Repository\Model\Album;
29: use Ampache\Repository\Model\Artist;
30: use Ampache\Repository\Model\Plugin;
31: use Ampache\Repository\Model\Preference;
32: use Ampache\Repository\Model\Song;
33: use Ampache\Repository\Model\User;
34: 
35: class Ampachelistenbrainz implements AmpachePluginInterface
36: {
37:     public string $name        = 'ListenBrainz';
               ^
38:     public string $categories  = 'scrobbling';
39:     public string $description = 'Records your played songs to your ListenBrainz Account';
40:     public string $url         = '';
41:     public string $version     = '000002';
42:     public string $min_ampache = '380004';
43:     public string $max_ampache = '999999';
44: 
45:     // These are internal settings used by this class, run this->load to fill them out
46:     private $token;
47:     private $api_host;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheHeadphones.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Repository\Model\Wanted;
31: use Exception;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheHeadphones implements AmpachePluginInterface
35: {
36:     public string $name        = 'Headphones';
               ^
37:     public string $categories  = 'wanted';
38:     public string $description = 'Automatically download accepted Wanted List albums with Headphones';
39:     public string $url         = 'https://github.com/rembo10/headphones/';
40:     public string $version     = '000001';
41:     public string $min_ampache = '360030';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $api_url;
46:     private $api_key;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheTwitter.php
ERROR: Parse error at line 32 column 12:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\User;
29: 
30: class AmpacheTwitter implements AmpachePluginInterface
31: {
32:     public string $name        = 'Twitter';
               ^
33:     public string $categories  = 'share';
34:     public string $description = 'Twitter share';
35:     public string $url         = 'https://twitter.com';
36:     public string $version     = '000001';
37:     public string $min_ampache = '370027';
38:     public string $max_ampache = '999999';
39: 
40:     /**
41:      * Constructor
42:      */

ERROR: Unable to parse file: /code/src/Plugin/AmpacheTheaudiodb.php
ERROR: Parse error at line 42 column 12:

32: use Ampache\Repository\Model\Label;
33: use Ampache\Repository\Model\Plugin;
34: use Ampache\Repository\Model\Preference;
35: use Ampache\Repository\Model\User;
36: use Ampache\Module\System\Core;
37: use Exception;
38: use WpOrg\Requests\Requests;
39: 
40: class AmpacheTheaudiodb implements AmpachePluginInterface
41: {
42:     public string $name        = 'TheAudioDb';
               ^
43:     public string $categories  = 'metadata';
44:     public string $description = 'TheAudioDb metadata integration';
45:     public string $url         = 'http://www.theaudiodb.com';
46:     public string $version     = '000003';
47:     public string $min_ampache = '370009';
48:     public string $max_ampache = '999999';
49: 
50:     // These are internal settings used by this class, run this->load to fill them out
51:     public $overwrite_name;
52: 

ERROR: Unable to parse file: /code/src/Plugin/AmpacheRSSView.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\Ui;
32: 
33: class AmpacheRSSView implements AmpachePluginInterface
34: {
35:     public string $name        = 'RSSView';
               ^
36:     public string $categories  = 'home';
37:     public string $description = 'RSS View';
38:     public string $url         = '';
39:     public string $version     = '000001';
40:     public string $min_ampache = '370021';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $feed_url;
45:     private $maxitems;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheMatomo.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\System\Core;
32: 
33: class AmpacheMatomo implements AmpachePluginInterface
34: {
35:     public string $name        = 'Matomo';
               ^
36:     public string $categories  = 'stats';
37:     public string $description = 'Matomo statistics';
38:     public string $url         = '';
39:     public string $version     = '000001';
40:     public string $min_ampache = '370034';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $site_id;
45:     private $matomo_url;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheBitly.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use Exception;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheBitly implements AmpachePluginInterface
35: {
36:     public string $name        = 'Bit.ly';
               ^
37:     public string $categories  = 'shortener';
38:     public string $description = 'URL shorteners on shared links with Bit.ly';
39:     public string $url         = 'http://bitly.com';
40:     public string $version     = '000003';
41:     public string $min_ampache = '360037';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $bitly_token;
46:     private $bitly_group_guid;

ERROR: Unable to parse file: /code/src/Plugin/Ampache7digital.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\Util\OAuth\OAuthConsumer;
31: use Ampache\Module\Util\OAuth\OAuthRequest;
32: use Ampache\Module\Util\OAuth\OAuthSignatureMethod_HMAC_SHA1;
33: 
34: class Ampache7digital implements AmpachePluginInterface
35: {
36:     public string $name        = '7digital';
               ^
37:     public string $categories  = 'preview';
38:     public string $description = 'Song preview from 7digital';
39:     public string $url         = 'http://www.7digital.com';
40:     public string $version     = '000001';
41:     public string $min_ampache = '370015';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $api_key;
46:     private $secret;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheLyristLyrics.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\Song;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\System\Core;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheLyristLyrics implements AmpachePluginInterface
35: {
36:     public string $name        = 'Lyrist Lyrics';
               ^
37:     public string $categories  = 'lyrics';
38:     public string $description = 'Get lyrics from a public Lyrist instance';
39:     public string $url         = 'https://github.com/asrvd/lyrist';
40:     public string $version     = '000002';
41:     public string $min_ampache = '360022';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private string $api_host;
46: 

ERROR: Unable to parse file: /code/src/Plugin/AmpacheRatingMatch.php
ERROR: Parse error at line 40 column 12:

30: use Ampache\Repository\Model\Plugin;
31: use Ampache\Repository\Model\Preference;
32: use Ampache\Repository\Model\Rating;
33: use Ampache\Repository\Model\Song;
34: use Ampache\Repository\Model\User;
35: use Ampache\Repository\Model\Userflag;
36: use Ampache\Module\System\Dba;
37: 
38: class AmpacheRatingMatch implements AmpachePluginInterface
39: {
40:     public string $name        = 'RatingMatch';
               ^
41:     public string $categories  = 'scrobbling';
42:     public string $description = 'Raise the album and artist rating to match the highest song rating';
43:     public string $url         = '';
44:     public string $version     = '000004';
45:     public string $min_ampache = '360003';
46:     public string $max_ampache = '999999';
47: 
48:     // These are internal settings used by this class, run this->load to fill them out
49:     private $min_stars;
50:     private $match_flags;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheTvdb.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Art;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Exception;
32: use Moinax;
33: 
34: class AmpacheTvdb implements AmpachePluginInterface
35: {
36:     public string $name        = 'Tvdb';
               ^
37:     public string $categories  = 'metadata';
38:     public string $description = 'TVDb metadata integration';
39:     public string $url         = 'http://thetvdb.com';
40:     public string $version     = '000003';
41:     public string $min_ampache = '370009';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $api_key;
46: 

ERROR: Unable to parse file: /code/src/Plugin/AmpachePiwik.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\System\Core;
32: 
33: class AmpachePiwik implements AmpachePluginInterface
34: {
35:     public string $name        = 'Piwik';
               ^
36:     public string $categories  = 'stats';
37:     public string $description = 'Piwik statistics';
38:     public string $url         = '';
39:     public string $version     = '000001';
40:     public string $min_ampache = '370034';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $site_id;
45:     private $piwik_url;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheDiscogs.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Art;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Exception;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheDiscogs implements AmpachePluginInterface
35: {
36:     public string $name        = 'Discogs';
               ^
37:     public string $categories  = 'metadata';
38:     public string $description = 'Discogs metadata integration';
39:     public string $url         = 'http://www.discogs.com';
40:     public string $version     = '000001';
41:     public string $min_ampache = '370021';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $api_key;
46:     private $secret;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheFacebook.php
ERROR: Parse error at line 32 column 12:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\User;
29: 
30: class AmpacheFacebook implements AmpachePluginInterface
31: {
32:     public string $name        = 'Facebook';
               ^
33:     public string $categories  = 'share';
34:     public string $description = 'Facebook share';
35:     public string $url         = 'https://facebook.com';
36:     public string $version     = '000001';
37:     public string $min_ampache = '370027';
38:     public string $max_ampache = '999999';
39: 
40:     /**
41:      * Constructor
42:      */

ERROR: Unable to parse file: /code/src/Plugin/Ampacheflickr.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use WpOrg\Requests\Requests;
32: 
33: class Ampacheflickr implements AmpachePluginInterface
34: {
35:     public string $name        = 'Flickr';
               ^
36:     public string $categories  = 'slideshow';
37:     public string $description = 'Artist photos from Flickr';
38:     public string $url         = 'http://www.flickr.com';
39:     public string $version     = '000001';
40:     public string $min_ampache = '360045';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $api_key;
45: 

ERROR: Unable to parse file: /code/src/Plugin/Ampachelibrefm.php
ERROR: Parse error at line 37 column 12:

27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Plugin;
30: use Ampache\Repository\Model\Preference;
31: use Ampache\Repository\Model\Song;
32: use Ampache\Repository\Model\User;
33: use Ampache\Module\Playback\Scrobble\Scrobbler;
34: 
35: class Ampachelibrefm implements AmpachePluginInterface
36: {
37:     public string $name        = 'Libre.FM';
               ^
38:     public string $categories  = 'scrobbling';
39:     public string $description = 'Records your played songs to your Libre.FM Account';
40:     public string $url         = '';
41:     public string $version     = '000003';
42:     public string $min_ampache = '360003';
43:     public string $max_ampache = '999999';
44: 
45:     // These are internal settings used by this class, run this->load to fill them out
46:     private $user_id;
47:     private $challenge;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheAmazon.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Util\AmazonSearch;
32: 
33: class AmpacheAmazon implements AmpachePluginInterface
34: {
35:     public string $name        = 'Amazon';
               ^
36:     public string $categories  = 'metadata';
37:     public string $description = 'Amazon arts';
38:     public string $url         = 'http://www.amazon.com';
39:     public string $version     = '000001';
40:     public string $min_ampache = '370009';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $amazon_base_url;
45:     private $amazon_max_results_pages;

ERROR: Unable to parse file: /code/src/Plugin/AmpachePaypal.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\library_item;
30: use Ampache\Repository\Model\Preference;
31: use Ampache\Repository\Model\User;
32: 
33: class AmpachePaypal implements AmpachePluginInterface
34: {
35:     public string $name        = 'Paypal';
               ^
36:     public string $categories  = 'user';
37:     public string $description = 'PayPal donation button on user page';
38:     public string $url         = '';
39:     public string $version     = '000001';
40:     public string $min_ampache = '370034';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $user;
45:     private $business;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheGoogleAnalytics.php
ERROR: Parse error at line 33 column 12:

23:  *
24:  */
25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: 
31: class AmpacheGoogleAnalytics implements AmpachePluginInterface
32: {
33:     public string $name        = 'GoogleAnalytics';
               ^
34:     public string $categories  = 'stats';
35:     public string $description = 'Google Analytics statistics';
36:     public string $url         = '';
37:     public string $version     = '000001';
38:     public string $min_ampache = '370034';
39:     public string $max_ampache = '999999';
40: 
41:     // These are internal settings used by this class, run this->load to fill them out
42:     private $user;
43:     private $tracking_id;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheOmdb.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Art;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use Exception;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheOmdb implements AmpachePluginInterface
35: {
36:     public string $name        = 'Omdb';
               ^
37:     public string $categories  = 'metadata';
38:     public string $description = 'OMDb metadata integration';
39:     public string $url         = 'http://www.omdbapi.com';
40:     public string $version     = '000001';
41:     public string $min_ampache = '370009';
42:     public string $max_ampache = '999999';
43: 
44:     /**
45:      * Constructor
46:      * This function does nothing

ERROR: Unable to parse file: /code/src/Plugin/AmpacheGoogleMaps.php
ERROR: Parse error at line 36 column 12:

26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\System\Core;
31: use Exception;
32: use WpOrg\Requests\Requests;
33: 
34: class AmpacheGoogleMaps implements AmpachePluginInterface
35: {
36:     public string $name        = 'GoogleMaps';
               ^
37:     public string $categories  = 'geolocation';
38:     public string $description = 'Show user\'s location with Google Maps';
39:     public string $url         = 'http://maps.google.com';
40:     public string $version     = '000001';
41:     public string $min_ampache = '370022';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $api_key;
46: 

ERROR: Unable to parse file: /code/src/Plugin/AmpachePersonalFavorites.php
ERROR: Parse error at line 36 column 12:

26: use Ampache\Repository\Model\Playlist;
27: use Ampache\Repository\Model\Preference;
28: use Ampache\Repository\Model\Search;
29: use Ampache\Repository\Model\User;
30: use Ampache\Module\Api\Ajax;
31: use Ampache\Module\Playback\Stream_Playlist;
32: use Ampache\Module\Util\Ui;
33: 
34: class AmpachePersonalFavorites implements AmpachePluginInterface
35: {
36:     public string $name        = 'Personal Favorites';
               ^
37:     public string $categories  = 'home';
38:     public string $description = 'Personal favorites on homepage';
39:     public string $url         = '';
40:     public string $version     = '000002';
41:     public string $min_ampache = '370021';
42:     public string $max_ampache = '999999';
43: 
44:     // These are internal settings used by this class, run this->load to fill them out
45:     private $display;
46:     private $playlist;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheStreamHits.php
ERROR: Parse error at line 35 column 12:

25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Repository\Model\Preference;
30: use Ampache\Repository\Model\User;
31: use Ampache\Module\Util\Graph;
32: 
33: class AmpacheStreamHits implements AmpachePluginInterface
34: {
35:     public string $name        = 'Stream Hits';
               ^
36:     public string $categories  = 'stream_control';
37:     public string $description = 'Control hits per user';
38:     public string $url         = '';
39:     public string $version     = '000001';
40:     public string $min_ampache = '370024';
41:     public string $max_ampache = '999999';
42: 
43:     // These are internal settings used by this class, run this->load to fill them out
44:     private $user_id;
45:     private $hits_days;

ERROR: Unable to parse file: /code/src/Plugin/AmpacheShoutHome.php
ERROR: Parse error at line 37 column 12:

27: 
28: use Ampache\Config\AmpConfig;
29: use Ampache\Module\Shout\ShoutRendererInterface;
30: use Ampache\Repository\Model\Preference;
31: use Ampache\Repository\Model\User;
32: use Ampache\Module\Util\Ui;
33: use Ampache\Repository\ShoutRepositoryInterface;
34: 
35: class AmpacheShoutHome implements AmpachePluginInterface
36: {
37:     public string $name        = 'Shout Home';
               ^
38:     public string $categories  = 'home';
39:     public string $description = 'Shoutbox on homepage';
40:     public string $url         = '';
41:     public string $version     = '000001';
42:     public string $min_ampache = '370021';
43:     public string $max_ampache = '999999';
44: 
45:     // These are internal settings used by this class, run this->load to fill them out
46:     private $maxitems;
47: 

ERROR: Unable to parse file: /code/src/Config/Init/Init.php
ERROR: Parse error at line 41 column 13:

31: use Ampache\Config\Init\Exception\EnvironmentNotSuitableException;
32: use Ampache\Config\Init\Exception\GetTextNotAvailableException;
33: use Ampache\Module\System\Core;
34: use Ampache\Module\Util\EnvironmentInterface;
35: 
36: /**
37:  * This class performs the complete init process to build a working ampache application environment
38:  */
39: final class Init
40: {
41:     private EnvironmentInterface $environment;
                ^
42: 
43:     /** @var InitializationHandlerInterface[] */
44:     private array $initializationHandler;
45: 
46:     public function __construct(
47:         EnvironmentInterface $environment,
48:         array $initializationHandler
49:     ) {
50:         $this->environment           = $environment;
51:         $this->initializationHandler = $initializationHandler;

ERROR: Unable to parse file: /code/src/Config/Init/InitializationHandlerEnvironment.php
ERROR: Parse error at line 33 column 13:

23:  *
24:  */
25: 
26: namespace Ampache\Config\Init;
27: 
28: use Ampache\Config\Init\Exception\EnvironmentNotSuitableException;
29: use Ampache\Module\Util\EnvironmentInterface;
30: 
31: final class InitializationHandlerEnvironment implements InitializationHandlerInterface
32: {
33:     private EnvironmentInterface $environment;
                ^
34: 
35:     public function __construct(
36:         EnvironmentInterface $environment
37:     ) {
38:         $this->environment = $environment;
39:     }
40: 
41:     public function init(): void
42:     {
43:         if ($this->environment->check() === false) {

ERROR: Unable to parse file: /code/src/Config/Init/InitializationHandlerDatabaseUpdate.php
ERROR: Parse error at line 35 column 13:

25: 
26: namespace Ampache\Config\Init;
27: 
28: use Ampache\Config\Init\Exception\DatabaseOutdatedException;
29: use Ampache\Config\Init\Exception\EnvironmentNotSuitableException;
30: use Ampache\Module\System\Dba;
31: use Ampache\Module\System\Update;
32: 
33: final class InitializationHandlerDatabaseUpdate implements InitializationHandlerInterface
34: {
35:     private Update\UpdaterInterface $updater;
                ^
36: 
37:     public function __construct(
38:         Update\UpdaterInterface $updater
39:     ) {
40:         $this->updater = $updater;
41:     }
42: 
43:     public function init(): void
44:     {
45:         // Check to see if we need to perform an update

ERROR: Unable to parse file: /code/src/Config/Init/InitializationHandlerGlobals.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Config\Init;
27: 
28: use Ampache\Config\ConfigContainerInterface;
29: use Ampache\Module\System\Core;
30: use Ampache\Module\System\Session;
31: 
32: final class InitializationHandlerGlobals implements InitializationHandlerInterface
33: {
34:     private ConfigContainerInterface $configContainer;
                ^
35: 
36:     public function __construct(
37:         ConfigContainerInterface $configContainer
38:     ) {
39:         $this->configContainer = $configContainer;
40:     }
41: 
42:     public function init(): void
43:     {
44:         Core::get_global('user')->format(false);

ERROR: Unable to parse file: /code/src/Config/Init/InitializationHandlerConfig.php
ERROR: Parse error at line 43 column 13:

33: use DateTimeZone;
34: 
35: final class InitializationHandlerConfig implements InitializationHandlerInterface
36: {
37:     private const VERSION        = '6.3.2'; // AMPACHE_VERSION
38:     private const CONFIG_VERSION = '71';
39:     private const STRUCTURE      = 'public';  // Project release is using either the public html folder or squashed structure
40: 
41:     public const CONFIG_FILE_PATH = __DIR__ . '/../../../config/ampache.cfg.php';
42: 
43:     private EnvironmentInterface $environment;
                ^
44: 
45:     public function __construct(
46:         EnvironmentInterface $environment
47:     ) {
48:         $this->environment = $environment;
49:     }
50: 
51:     public function init(): void
52:     {
53:         // Check to make sure the config file exists. If it doesn't then go ahead and

ERROR: Unable to parse file: /code/src/Config/Init/InitializationHandlerAuth.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Config\Init;
27: 
28: use Ampache\Repository\Model\Preference;
29: use Ampache\Module\System\SessionInterface;
30: use Ampache\Module\Util\EnvironmentInterface;
31: 
32: final class InitializationHandlerAuth implements InitializationHandlerInterface
33: {
34:     private EnvironmentInterface $environment;
                ^
35: 
36:     private SessionInterface $session;
37: 
38:     public function __construct(
39:         EnvironmentInterface $environment,
40:         SessionInterface $session
41:     ) {
42:         $this->environment = $environment;
43:         $this->session     = $session;
44:     }

ERROR: Unable to parse file: /code/src/Config/ConfigContainer.php
ERROR: Parse error at line 34 column 13:

24:  */
25: 
26: namespace Ampache\Config;
27: 
28: /**
29:  * The ConfigContainer is a containment for all of Ampache's configuration data.
30:  * Once initialized, the data is immutable
31:  */
32: final class ConfigContainer implements ConfigContainerInterface
33: {
34:     private array $configuration;
                ^
35: 
36:     public function __construct(
37:         array $configuration
38:     ) {
39:         $this->configuration = $configuration;
40:     }
41: 
42:     public function updateConfig(array $configuration): ConfigContainerInterface
43:     {
44:         $this->configuration = array_merge(

ERROR: Unable to parse file: /code/src/Config/DicBuilder.php
ERROR: Parse error at line 65 column 1:

55:     require_once __DIR__ . '/../Module/Authorization/service_definition.php',
56:     require_once __DIR__ . '/../Module/License/service_definition.php',
57:     require_once __DIR__ . '/../Repository/service_definition.php',
58:     require_once __DIR__ . '/../Module/Label/service_definition.php',
59:     require_once __DIR__ . '/../Module/Artist/service_definition.php',
60:     require_once __DIR__ . '/../Module/Wanted/service_definition.php',
61:     require_once __DIR__ . '/../Module/Share/service_definition.php',
62:     require_once __DIR__ . '/../Module/Shout/service_definition.php',
63:     require_once __DIR__ . '/../Module/Podcast/service_definition.php',
64:     require_once __DIR__ . '/../Module/Metadata/service_definition.php',
65: );
    ^
66: 
67: return $builder->build();
68: 

INFO: 1882/1914 files analyzed, current file: /code/src/Config/Init.php
ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/UserAjaxHandler.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Authorization\Access;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\RequestParserInterface;
32: use Ampache\Repository\Model\User;
33: use Ampache\Module\User\Following\UserFollowStateRendererInterface;
34: use Ampache\Module\User\Following\UserFollowTogglerInterface;
35: 
36: final class UserAjaxHandler implements AjaxHandlerInterface
37: {
38:     private RequestParserInterface $requestParser;
                ^
39: 
40:     private UserFollowTogglerInterface $followToggler;
41: 
42:     private UserFollowStateRendererInterface $userFollowStateRenderer;
43: 
44:     public function __construct(
45:         RequestParserInterface $requestParser,
46:         UserFollowTogglerInterface $followToggler,
47:         UserFollowStateRendererInterface $userFollowStateRenderer
48:     ) {

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/SearchAjaxHandler.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Repository\Model\Art;
38: use Ampache\Repository\Model\Artist;
39: use Ampache\Repository\Model\Playlist;
40: use Ampache\Repository\Model\Search;
41: use Ampache\Repository\Model\Song;
42: use Ampache\Repository\Model\User;
43: use Ampache\Module\Wanted\MissingArtistFinderInterface;
44: 
45: final class SearchAjaxHandler implements AjaxHandlerInterface
46: {
47:     private RequestParserInterface $requestParser;
                ^
48: 
49:     private ConfigContainerInterface $configContainer;
50: 
51:     private MissingArtistFinderInterface $missingArtistFinder;
52: 
53:     private LabelRepositoryInterface $labelRepository;
54: 
55:     public function __construct(
56:         RequestParserInterface $requestParser,
57:         ConfigContainerInterface $configContainer,

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/PlaylistAjaxHandler.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Util\InterfaceImplementationChecker;
31: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Repository\Model\Browse;
34: use Ampache\Module\System\Core;
35: use Ampache\Repository\Model\library_item;
36: use Ampache\Repository\Model\Playlist;
37: 
38: final class PlaylistAjaxHandler implements AjaxHandlerInterface
39: {
40:     private RequestParserInterface $requestParser;
                ^
41: 
42:     public function __construct(
43:         RequestParserInterface $requestParser
44:     ) {
45:         $this->requestParser = $requestParser;
46:     }
47: 
48:     public function handle(): void
49:     {
50:         $results = array();

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/StatsAjaxHandler.php
ERROR: Parse error at line 40 column 13:

30: use Ampache\Module\Util\RequestParserInterface;
31: use Ampache\Module\Util\Ui;
32: use Ampache\Repository\Model\Plugin;
33: use Ampache\Module\System\Session;
34: use Ampache\Module\Statistics\Stats;
35: use Ampache\Repository\Model\Song;
36: use Ampache\Repository\Model\User;
37: 
38: final class StatsAjaxHandler implements AjaxHandlerInterface
39: {
40:     private RequestParserInterface $requestParser;
                ^
41: 
42:     public function __construct(
43:         RequestParserInterface $requestParser
44:     ) {
45:         $this->requestParser = $requestParser;
46:     }
47: 
48:     public function handle(): void
49:     {
50:         $results = array();

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/StreamAjaxHandler.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Util\InterfaceImplementationChecker;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\System\Core;
31: use Ampache\Module\Util\RequestParserInterface;
32: use Ampache\Repository\Model\Preference;
33: use Ampache\Module\Util\Ui;
34: 
35: final class StreamAjaxHandler implements AjaxHandlerInterface
36: {
37:     private RequestParserInterface $requestParser;
                ^
38: 
39:     public function __construct(
40:         RequestParserInterface $requestParser
41:     ) {
42:         $this->requestParser = $requestParser;
43:     }
44:     public function handle(): void
45:     {
46:         $results = array();
47:         $action  = $this->requestParser->getFromRequest('action');

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/TagAjaxHandler.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Module\System\Core;
33: use Ampache\Repository\Model\Label;
34: use Ampache\Repository\Model\library_item;
35: use Ampache\Repository\Model\Tag;
36: use Ampache\Module\Util\InterfaceImplementationChecker;
37: use Ampache\Module\Util\ObjectTypeToClassNameMapper;
38: use Ampache\Repository\LabelRepositoryInterface;
39: 
40: final class TagAjaxHandler implements AjaxHandlerInterface
41: {
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private LabelRepositoryInterface $labelRepository;
45: 
46:     public function __construct(
47:         RequestParserInterface $requestParser,
48:         LabelRepositoryInterface $labelRepository
49:     ) {
50:         $this->requestParser   = $requestParser;
51:         $this->labelRepository = $labelRepository;
52:     }

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/IndexAjaxHandler.php
ERROR: Parse error at line 53 column 13:

43: use Ampache\Repository\Model\User;
44: use Ampache\Repository\Model\Wanted;
45: use Ampache\Repository\AlbumRepositoryInterface;
46: use Ampache\Repository\LabelRepositoryInterface;
47: use Ampache\Repository\SongRepositoryInterface;
48: use Ampache\Repository\VideoRepositoryInterface;
49: use Ampache\Repository\WantedRepositoryInterface;
50: 
51: final class IndexAjaxHandler implements AjaxHandlerInterface
52: {
53:     private RequestParserInterface $requestParser;
                ^
54: 
55:     private SlideshowInterface $slideshow;
56: 
57:     private AlbumRepositoryInterface $albumRepository;
58: 
59:     private LabelRepositoryInterface $labelRepository;
60: 
61:     private SongRepositoryInterface $songRepository;
62: 
63:     private WantedRepositoryInterface $wantedRepository;

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/RandomAjaxHandler.php
ERROR: Parse error at line 42 column 13:

32: use Ampache\Repository\Model\Browse;
33: use Ampache\Module\System\Core;
34: use Ampache\Repository\Model\Playlist;
35: use Ampache\Repository\Model\Random;
36: use Ampache\Module\Util\Ui;
37: use Ampache\Repository\AlbumRepositoryInterface;
38: use Ampache\Repository\SongRepositoryInterface;
39: 
40: final class RandomAjaxHandler implements AjaxHandlerInterface
41: {
42:     private RequestParserInterface $requestParser;
                ^
43: 
44:     private AlbumRepositoryInterface $albumRepository;
45: 
46:     private SongRepositoryInterface $songRepository;
47: 
48:     public function __construct(
49:         RequestParserInterface $requestParser,
50:         AlbumRepositoryInterface $albumRepository,
51:         SongRepositoryInterface $songRepository
52:     ) {

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/PlayerAjaxHandler.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Application\Api\Ajax\Handler;
27: 
28: use Ampache\Module\Util\AjaxUriRetrieverInterface;
29: use Ampache\Module\Util\RequestParserInterface;
30: use Ampache\Module\Util\UiInterface;
31: use Ampache\Repository\Model\Broadcast;
32: use Ampache\Module\System\Core;
33: 
34: final class PlayerAjaxHandler implements AjaxHandlerInterface
35: {
36:     private RequestParserInterface $requestParser;
                ^
37: 
38:     private AjaxUriRetrieverInterface $ajaxUriRetriever;
39: 
40:     private UiInterface $ui;
41: 
42:     public function __construct(
43:         RequestParserInterface $requestParser,
44:         AjaxUriRetrieverInterface $ajaxUriRetriever,
45:         UiInterface $ui
46:     ) {

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/BrowseAjaxHandler.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Repository\Model\ModelFactoryInterface;
30: use Ampache\Module\Share\ShareUiLinkRendererInterface;
31: use Ampache\Module\Util\InterfaceImplementationChecker;
32: use Ampache\Module\System\Core;
33: use Ampache\Repository\Model\Playlist;
34: use Ampache\Module\Util\Ui;
35: use Ampache\Repository\LiveStreamRepositoryInterface;
36: 
37: final class BrowseAjaxHandler implements AjaxHandlerInterface
38: {
39:     private RequestParserInterface $requestParser;
                ^
40: 
41:     private ModelFactoryInterface $modelFactory;
42: 
43:     private LiveStreamRepositoryInterface $liveStreamRepository;
44: 
45:     private ShareUiLinkRendererInterface $shareUiLinkRenderer;
46: 
47:     public function __construct(
48:         RequestParserInterface $requestParser,
49:         ModelFactoryInterface $modelFactory,

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/DemocraticPlaybackAjaxHandler.php
ERROR: Parse error at line 37 column 13:

27: 
28: use Ampache\Module\Authorization\Access;
29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\Util\RequestParserInterface;
31: use Ampache\Repository\Model\Browse;
32: use Ampache\Module\System\Core;
33: use Ampache\Repository\Model\Democratic;
34: 
35: final class DemocraticPlaybackAjaxHandler implements AjaxHandlerInterface
36: {
37:     private RequestParserInterface $requestParser;
                ^
38: 
39:     public function __construct(
40:         RequestParserInterface $requestParser
41:     ) {
42:         $this->requestParser = $requestParser;
43:     }
44: 
45:     public function handle(): void
46:     {
47:         $democratic = Democratic::get_current_playlist();

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/DefaultAjaxHandler.php
ERROR: Parse error at line 47 column 13:

37: use Ampache\Repository\Model\Rating;
38: use Ampache\Module\Util\Ui;
39: use Ampache\Repository\Model\Tag;
40: use Ampache\Repository\Model\User;
41: use Ampache\Repository\Model\Userflag;
42: use Ampache\Repository\AlbumRepositoryInterface;
43: use Ampache\Repository\SongRepositoryInterface;
44: 
45: final class DefaultAjaxHandler implements AjaxHandlerInterface
46: {
47:     private RequestParserInterface $requestParser;
                ^
48: 
49:     private AlbumRepositoryInterface $albumRepository;
50: 
51:     private SongRepositoryInterface $songRepository;
52: 
53:     public function __construct(
54:         RequestParserInterface $requestParser,
55:         AlbumRepositoryInterface $albumRepository,
56:         SongRepositoryInterface $songRepository
57:     ) {

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/LocalPlayAjaxHandler.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Config\AmpConfig;
30: use Ampache\Module\Util\RequestParserInterface;
31: use Ampache\Repository\Model\Browse;
32: use Ampache\Module\System\Core;
33: use Ampache\Module\Playback\Localplay\LocalPlay;
34: use Ampache\Repository\Model\Preference;
35: use Ampache\Module\Util\Ui;
36: 
37: final class LocalPlayAjaxHandler implements AjaxHandlerInterface
38: {
39:     private RequestParserInterface $requestParser;
                ^
40: 
41:     public function __construct(
42:         RequestParserInterface $requestParser
43:     ) {
44:         $this->requestParser = $requestParser;
45:     }
46: 
47:     public function handle(): void
48:     {
49:         $results = array();

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/PodcastAjaxHandler.php
ERROR: Parse error at line 38 column 13:

28: use Ampache\Module\Authorization\Access;
29: use Ampache\Module\Podcast\PodcastEpisodeDownloaderInterface;
30: use Ampache\Module\Podcast\PodcastSyncerInterface;
31: use Ampache\Module\System\Core;
32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Repository\Model\Podcast_Episode;
34: use Ampache\Repository\PodcastRepositoryInterface;
35: 
36: final class PodcastAjaxHandler implements AjaxHandlerInterface
37: {
38:     private RequestParserInterface $requestParser;
                ^
39: 
40:     private PodcastSyncerInterface $podcastSyncer;
41: 
42:     private PodcastEpisodeDownloaderInterface $podcastEpisodeDownloader;
43:     private PodcastRepositoryInterface $podcastRepository;
44: 
45:     public function __construct(
46:         RequestParserInterface $requestParser,
47:         PodcastSyncerInterface $podcastSyncer,
48:         PodcastEpisodeDownloaderInterface $podcastEpisodeDownloader,

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/CatalogAjaxHandler.php
ERROR: Parse error at line 36 column 13:

26: namespace Ampache\Application\Api\Ajax\Handler;
27: 
28: use Ampache\Module\Authorization\Access;
29: use Ampache\Module\Api\Ajax;
30: use Ampache\Module\Util\RequestParserInterface;
31: use Ampache\Repository\Model\Catalog;
32: use Ampache\Module\System\Core;
33: 
34: final class CatalogAjaxHandler implements AjaxHandlerInterface
35: {
36:     private RequestParserInterface $requestParser;
                ^
37: 
38:     public function __construct(
39:         RequestParserInterface $requestParser
40:     ) {
41:         $this->requestParser = $requestParser;
42:     }
43: 
44:     public function handle(): void
45:     {
46:         $results = array();

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/Handler/SongAjaxHandler.php
ERROR: Parse error at line 39 column 13:

29: use Ampache\Module\Api\Ajax;
30: use Ampache\Module\Shout\ShoutRendererInterface;
31: use Ampache\Module\System\Core;
32: use Ampache\Module\Util\RequestParserInterface;
33: use Ampache\Repository\Model\Shoutbox;
34: use Ampache\Repository\Model\Song;
35: use Ampache\Repository\ShoutRepositoryInterface;
36: 
37: final class SongAjaxHandler implements AjaxHandlerInterface
38: {
39:     private RequestParserInterface $requestParser;
                ^
40: 
41:     private ShoutRepositoryInterface $shoutRepository;
42: 
43:     private ShoutRendererInterface $shoutRenderer;
44: 
45:     public function __construct(
46:         RequestParserInterface $requestParser,
47:         ShoutRepositoryInterface $shoutRepository,
48:         ShoutRendererInterface $shoutRenderer
49:     ) {

ERROR: Unable to parse file: /code/src/Application/Api/Ajax/AjaxApplication.php
ERROR: Parse error at line 69 column 13:

59:         'podcast' => PodcastAjaxHandler::class,
60:         'random' => RandomAjaxHandler::class,
61:         'search' => SearchAjaxHandler::class,
62:         'song' => SongAjaxHandler::class,
63:         'stats' => StatsAjaxHandler::class,
64:         'stream' => StreamAjaxHandler::class,
65:         'tag' => TagAjaxHandler::class,
66:         'user' => UserAjaxHandler::class,
67:     ];
68: 
69:     private ContainerInterface $dic;
                ^
70: 
71:     public function __construct(
72:         ContainerInterface $dic
73:     ) {
74:         $this->dic = $dic;
75:     }
76: 
77:     public function run(): void
78:     {
79:         xoutput_headers();

ERROR: Unable to parse file: /code/rector.php
ERROR: Parse error at line 21 column 24:

11: 
12: return RectorConfig::configure()
13:     ->withPaths([
14:         __DIR__ . '/tests',
15:     ])
16:     ->withCache(__DIR__ . '/build/rector', FileCacheStorage::class)
17:     ->withImportNames()
18:     ->withRules([
19:         InlineConstructorDefaultToPropertyRector::class
20:     ])
21:     ->withPhpSets(php74: true)
                           ^
22:     ->withPreparedSets(deadCode: true, codeQuality: true, codingStyle: true)
23:     ->withSkip([
24:         FlipTypeControlToUseExclusiveTypeRector::class,
25:         StaticClosureRector::class,
26:         SymplifyQuoteEscapeRector::class,
27:     ]);
28: 

ERROR: Unable to parse file: /code/docs/examples/AmpacheExample.php
ERROR: Parse error at line 32 column 12:

22:  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
23:  *
24:  */
25: 
26: namespace Ampache\Plugin;
27: 
28: use Ampache\Repository\Model\User;
29: 
30: class AmpacheExample implements AmpachePluginInterface
31: {
32:     public string $name        = 'Example';
               ^
33:     public string $categories  = 'home';
34:     public string $description = 'Example Plugin';
35:     public string $url         = '';
36:     public string $version     = '000001';
37:     public string $min_ampache = '370021';
38:     public string $max_ampache = '999999';
39: 
40:     /**
41:      * Constructor
42:      */

INFO: 1914/1914 source files have been analyzed
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 13.922s
INFO: Final Memory: 6M/295M
INFO: ------------------------------------------------------------------------