Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
45.31% covered (danger)
45.31%
29 / 64
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
PreSynthesizeMessages
50.00% covered (danger)
50.00%
29 / 58
66.67% covered (warning)
66.67%
2 / 3
22.50
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
1
 execute
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
2
 synthesizeErrorMessage
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 1
56
1<?php
2namespace MediaWiki\Wikispeech;
3
4/**
5 * @file
6 * @ingroup Extensions
7 * @license GPL-2.0-or-later
8 */
9use Exception;
10use InvalidArgumentException;
11use Maintenance;
12use MediaWiki\Wikispeech\Segment\SegmentMessagesFactory;
13use MediaWiki\Wikispeech\Utterance\UtteranceGenerator;
14
15/** @var string MediaWiki installation path */
16$IP = getenv( 'MW_INSTALL_PATH' );
17if ( $IP === false ) {
18    $IP = __DIR__ . '/../../..';
19}
20require_once "$IP/maintenance/Maintenance.php";
21/**
22 * Maintenance script to pre synthesize messages
23 *
24 * @since 0.1.13
25 */
26class PreSynthesizeMessages extends Maintenance {
27    /** @var UtteranceGenerator */
28    private $utteranceGenerator;
29
30    /** @var SegmentMessagesFactory */
31    private $segmentMessagesFactory;
32
33    public function __construct() {
34        parent::__construct();
35        $this->requireExtension( 'Wikispeech' );
36        $this->addDescription( 'Pre synthesize error messages' );
37        $this->addOption(
38            'language',
39            'Pre synthesize error messages with this language.',
40            true,
41            true,
42            'l'
43        );
44        $this->addOption(
45            'voice',
46            'Pre synthesize error messages with this voice (language required).',
47            false,
48            true,
49            'v'
50        );
51    }
52
53    /**
54     * @return bool success
55     */
56    public function execute() {
57        $language = $this->getOption( 'language', null );
58        $voice = $this->getOption( 'voice', null );
59        $this->utteranceGenerator = WikispeechServices::getUtteranceGenerator();
60        $this->segmentMessagesFactory = WikispeechServices::getSegmentMessagesFactory();
61
62        // @todo These messages are arbitrary to show that it works.
63        // In the future we probably want to generate a list of messages
64        $errorMessageKeys = [
65            'wikispeech-error-loading-audio-title',
66            'wikispeech-error-generate-preview-title',
67            'noarticletext'
68        ];
69        foreach ( $errorMessageKeys as $messageKey ) {
70            $this->synthesizeErrorMessage( $messageKey, $language, $voice );
71        }
72        return true;
73    }
74
75    /**
76     * Synthesize the error messages
77     *
78     * @param string $messageKey
79     * @param string $language
80     * @param string $voice
81     */
82    public function synthesizeErrorMessage( $messageKey, $language, $voice ) {
83        try {
84
85            $message = wfMessage( $messageKey );
86            if ( !$message->exists() ) {
87                throw new InvalidArgumentException( "Message key does not exist: $messageKey" );
88            }
89
90            $segmentResponse = $this->segmentMessagesFactory->segmentMessage( $messageKey, $language );
91            $segmentList = $segmentResponse->getSegments();
92            if ( !$voice ) {
93                $voiceHandler = WikispeechServices::getVoiceHandler();
94                $voice = $voiceHandler->getDefaultVoice( $language );
95                if ( !$voice ) {
96                    throw new InvalidArgumentException(
97                        "No default voice found for language: $language"
98                    );
99                }
100            }
101            foreach ( $segmentList->getSegments() as $segment ) {
102                $segmentHash = $segment->getHash();
103
104                if ( $segmentHash === null ) {
105                    throw new InvalidArgumentException(
106                        "Segment hash is null for message key: $messageKey"
107                    );
108                }
109
110                $this->utteranceGenerator->getUtterance(
111                null,
112                $voice,
113                $language,
114                0,
115                $segment,
116                $messageKey
117                );
118            }
119
120            $this->output( "Successfully pre-synthesized message with message key: $messageKey\n" );
121
122        } catch ( Exception $e ) {
123            $this->output( "Error synthesizing message with message key: $messageKey " . $e->getMessage() . "\n" );
124        }
125    }
126}
127 /** @var string This class, required to start via Maintenance. */
128$maintClass = PreSynthesizeMessages::class;
129require_once RUN_MAINTENANCE_IF_MAIN;