10
10
import wp1 .logic .selection as logic_selection
11
11
from wp1 .constants import WP1_USER_AGENT
12
12
from wp1 .credentials import CREDENTIALS , ENV
13
- from wp1 .exceptions import ObjectNotFoundError , ZimFarmError
13
+ from wp1 .exceptions import ObjectNotFoundError , ZimFarmError , InvalidZimMetadataError
14
14
from wp1 .logic import util
15
15
from wp1 .time import get_current_datetime
16
16
from wp1 .timestamp import utcnow
17
17
18
18
MWOFFLINER_IMAGE = 'ghcr.io/openzim/mwoffliner:latest'
19
19
REDIS_AUTH_KEY = 'zimfarm.auth'
20
20
21
+ # ZIM metadata limits as per https://wiki.openzim.org/wiki/Metadata
22
+ ZIM_TITLE_MAX_LENGTH = 30
23
+ ZIM_DESCRIPTION_MAX_LENGTH = 80
24
+
21
25
logger = logging .getLogger (__name__ )
22
26
23
27
@@ -121,7 +125,23 @@ def get_webhook_url():
121
125
urllib .parse .quote (token ))
122
126
123
127
124
- def _get_params (s3 , wp10db , builder , description = '' , long_description = '' ):
128
+ def validate_zim_metadata (title = None , description = None ):
129
+ """Validate ZIM metadata fields against length limits."""
130
+ errors = []
131
+ print (f"Validating ZIM metadata: title='{ title } ', description='{ description } '" )
132
+ if title and len (title ) > ZIM_TITLE_MAX_LENGTH :
133
+ errors .append (f"Title exceeds maximum length: { ZIM_TITLE_MAX_LENGTH } characters." )
134
+
135
+ if description and len (description ) > ZIM_DESCRIPTION_MAX_LENGTH :
136
+ errors .append (f"Description exceeds maximum length: { ZIM_DESCRIPTION_MAX_LENGTH } characters." )
137
+
138
+ if errors :
139
+ return False , " " .join (errors )
140
+
141
+ return True , None
142
+
143
+
144
+ def _get_params (s3 , wp10db , builder , title = '' , description = '' , long_description = '' ):
125
145
if builder is None :
126
146
raise ObjectNotFoundError ('Given builder was None: %r' % builder )
127
147
@@ -150,7 +170,7 @@ def _get_params(s3, wp10db, builder, description='', long_description=''):
150
170
'articleList' :
151
171
logic_selection .url_for_selection (selection ),
152
172
'customZimTitle' :
153
- builder . b_name . decode ( 'utf-8' ) ,
173
+ title ,
154
174
'customZimDescription' :
155
175
description
156
176
if description else 'ZIM file created from a WP1 Selection' ,
@@ -193,6 +213,7 @@ def schedule_zim_file(s3,
193
213
redis ,
194
214
wp10db ,
195
215
builder ,
216
+ title = '' ,
196
217
description = '' ,
197
218
long_description = '' ):
198
219
token = get_zimfarm_token (redis )
@@ -201,10 +222,18 @@ def schedule_zim_file(s3,
201
222
202
223
if builder is None :
203
224
raise ObjectNotFoundError ('Cannot schedule for None builder' )
225
+
226
+ valid_metadata , error_message = validate_zim_metadata (
227
+ title = title ,
228
+ description = description ,
229
+ )
230
+ if not valid_metadata :
231
+ raise InvalidZimMetadataError (error_message )
204
232
205
233
params = _get_params (s3 ,
206
234
wp10db ,
207
235
builder ,
236
+ title = title ,
208
237
description = description ,
209
238
long_description = long_description )
210
239
base_url = get_zimfarm_url ()
@@ -314,7 +343,7 @@ def cancel_zim_by_task_id(redis, task_id):
314
343
315
344
token = get_zimfarm_token (redis )
316
345
if token is None :
317
- raise ZimfarmError ('Error retrieving auth token for request' )
346
+ raise ZimFarmError ('Error retrieving auth token for request' )
318
347
base_url = get_zimfarm_url ()
319
348
headers = _get_zimfarm_headers (token )
320
349
0 commit comments