1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #include "GUIInfoManager.h"
10 
11 #include "Application.h"
12 #include "FileItem.h"
13 #include "ServiceBroker.h"
14 #include "URL.h"
15 #include "Util.h"
16 #include "cores/DataCacheCore.h"
17 #include "filesystem/File.h"
18 #include "guilib/guiinfo/GUIInfo.h"
19 #include "guilib/guiinfo/GUIInfoHelper.h"
20 #include "guilib/guiinfo/GUIInfoLabels.h"
21 #include "input/WindowTranslator.h"
22 #include "interfaces/AnnouncementManager.h"
23 #include "interfaces/info/InfoExpression.h"
24 #include "messaging/ApplicationMessenger.h"
25 #include "settings/SkinSettings.h"
26 #include "utils/CharsetConverter.h"
27 #include "utils/StringUtils.h"
28 #include "utils/URIUtils.h"
29 #include "utils/log.h"
30 
31 #include <algorithm>
32 #include <cmath>
33 #include <functional>
34 #include <iterator>
35 #include <memory>
36 
37 using namespace KODI::GUILIB;
38 using namespace KODI::GUILIB::GUIINFO;
39 using namespace INFO;
40 
InfoBoolComparator(const InfoPtr & right,const InfoPtr & left)41 bool InfoBoolComparator(const InfoPtr &right, const InfoPtr &left)
42 {
43   return *right < *left;
44 }
45 
CGUIInfoManager(void)46 CGUIInfoManager::CGUIInfoManager(void)
47 : m_currentFile(new CFileItem),
48   m_bools(&InfoBoolComparator)
49 {
50 }
51 
~CGUIInfoManager(void)52 CGUIInfoManager::~CGUIInfoManager(void)
53 {
54   delete m_currentFile;
55 }
56 
Initialize()57 void CGUIInfoManager::Initialize()
58 {
59   KODI::MESSAGING::CApplicationMessenger::GetInstance().RegisterReceiver(this);
60 }
61 
62 /// \brief Translates a string as given by the skin into an int that we use for more
63 /// efficient retrieval of data. Can handle combined strings on the form
64 /// Player.Caching + VideoPlayer.IsFullscreen (Logical and)
65 /// Player.HasVideo | Player.HasAudio (Logical or)
TranslateString(const std::string & condition)66 int CGUIInfoManager::TranslateString(const std::string &condition)
67 {
68   // translate $LOCALIZE as required
69   std::string strCondition(CGUIInfoLabel::ReplaceLocalize(condition));
70   return TranslateSingleString(strCondition);
71 }
72 
73 typedef struct
74 {
75   const char *str;
76   int  val;
77 } infomap;
78 
79 /// \page modules__infolabels_boolean_conditions Infolabels and Boolean conditions
80 /// \tableofcontents
81 ///
82 /// \section modules__infolabels_boolean_conditions_Description Description
83 /// Skins can use boolean conditions with the <b>\<visible\></b> tag or with condition
84 /// attributes. Scripts can read boolean conditions with
85 /// <b>xbmc.getCondVisibility(condition)</b>.
86 ///
87 /// Skins can use infolabels with <b>$INFO[infolabel]</b> or the <b>\<info\></b> tag. Scripts
88 /// can read infolabels with <b>xbmc.getInfoLabel('infolabel')</b>.
89 ///
90 /// @todo [docs] Improve the description and create links for functions
91 /// @todo [docs] Separate boolean conditions from infolabels
92 /// @todo [docs] Order items alphabetically within subsections for a better search experience
93 /// @todo [docs] Order subsections alphabetically
94 /// @todo [docs] Use links instead of bold values for infolabels/bools
95 /// so we can use a link to point users when providing help
96 ///
97 
98 
99 /// \page modules__infolabels_boolean_conditions
100 /// \section modules_list_infolabels_booleans List of Infolabels and Boolean conditions
101 /// \subsection modules__infolabels_boolean_conditions_GlobalBools Global
102 /// \table_start
103 ///   \table_h3{ Labels, Type, Description }
104 ///   \table_row3{   <b>`true`</b>,
105 ///                  \anchor Global_True
106 ///                  _boolean_,
107 ///     @return Always evaluates to **true**.
108 ///     <p>
109 ///   }
110 ///   \table_row3{   <b>`false`</b>,
111 ///                  \anchor Global_False
112 ///                  _boolean_,
113 ///     @return Always evaluates to **false**.
114 ///     <p>
115 ///   }
116 ///   \table_row3{   <b>`yes`</b>,
117 ///                  \anchor Global_Yes
118 ///                  _boolean_,
119 ///     @return same as \link Global_True `true` \endlink.
120 ///     <p>
121 ///   }
122 ///   \table_row3{   <b>`no`</b>,
123 ///                  \anchor Global_No
124 ///                  _boolean_,
125 ///     @return same as \link Global_False `false` \endlink.
126 ///     <p>
127 ///   }
128 /// \table_end
129 ///
130 /// -----------------------------------------------------------------------------
131 
132 
133 /// \page modules__infolabels_boolean_conditions
134 /// \subsection modules__infolabels_boolean_conditions_String String
135 /// \table_start
136 ///   \table_h3{ Labels, Type, Description }
137 ///   \table_row3{   <b>`String.IsEmpty(info)`</b>,
138 ///                  \anchor String_IsEmpty
139 ///                  _boolean_,
140 ///     @return **True** if the info is empty.
141 ///     @param info - infolabel
142 ///     @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
143 ///     \link ListItem_Genre `ListItem.Genre` \endlink.
144 ///     Please note that string can also be a `$LOCALIZE[]`.
145 ///     Also note that in a panelview or similar this only works on the focused item
146 ///     <p><hr>
147 ///     @skinning_v17 **[New Boolean Condition]** \link String_IsEmpty `String.IsEmpty(info)`\endlink
148 ///     <p>
149 ///   }
150 ///   \table_row3{   <b>`String.IsEqual(info\,string)`</b>,
151 ///                  \anchor String_IsEqual
152 ///                  _boolean_,
153 ///     @return **True** if the info is equal to the given string.
154 ///     @param info - infolabel
155 ///     @param string - comparison string
156 ///     @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
157 ///     \link ListItem_Genre `ListItem.Genre` \endlink.
158 ///     Please note that string can also be a `$LOCALIZE[]`.
159 ///     Also note that in a panelview or similar this only works on the focused item
160 ///     <p><hr>
161 ///     @skinning_v17 **[New Boolean Condition]** \link String_IsEqual `String.IsEqual(info\,string)`\endlink
162 ///     <p>
163 ///   }
164 ///   \table_row3{   <b>`String.StartsWith(info\,substring)`</b>,
165 ///                  \anchor String_StartsWith
166 ///                  _boolean_,
167 ///     @return **True** if the info starts with the given substring.
168 ///     @param info - infolabel
169 ///     @param substring - substring to check
170 ///     @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
171 ///     \link ListItem_Genre `ListItem.Genre` \endlink.
172 ///     Please note that string can also be a `$LOCALIZE[]`.
173 ///     Also note that in a panelview or similar this only works on the focused item
174 ///     <p><hr>
175 ///     @skinning_v17 **[New Boolean Condition]** \link String_StartsWith `String.StartsWith(info\,substring)`\endlink
176 ///     <p>
177 ///   }
178 ///   \table_row3{   <b>`String.EndsWith(info\,substring)`</b>,
179 ///                  \anchor String_EndsWith
180 ///                  _boolean_,
181 ///     @return **True** if the info ends with the given substring.
182 ///     @param info - infolabel
183 ///     @param substring - substring to check
184 ///     @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
185 ///     \link ListItem_Genre `ListItem.Genre` \endlink.
186 ///     Please note that string can also be a `$LOCALIZE[]`.
187 ///     Also note that in a panelview or similar this only works on the focused item
188 ///     <p><hr>
189 ///     @skinning_v17 **[New Boolean Condition]** \link String_EndsWith `String.EndsWith(info\,substring)`\endlink
190 ///     <p>
191 ///   }
192 ///   \table_row3{   <b>`String.Contains(info\,substring)`</b>,
193 ///                  \anchor String_Contains
194 ///                  _boolean_,
195 ///     @return **True** if the info contains the given substring.
196 ///     @param info - infolabel
197 ///     @param substring - substring to check
198 ///     @note **Example of info:** \link ListItem_Title `ListItem.Title` \endlink \,
199 ///     \link ListItem_Genre `ListItem.Genre` \endlink.
200 ///     Please note that string can also be a `$LOCALIZE[]`.
201 ///     Also note that in a panelview or similar this only works on the focused item
202 ///     <p><hr>
203 ///     @skinning_v17 **[New Boolean Condition]** \link String_Contains `String.Contains(info\,substring)`\endlink
204 ///     <p>
205 ///   }
206 /// \table_end
207 ///
208 /// -----------------------------------------------------------------------------
209 
210 
211 const infomap string_bools[] =   {{ "isempty",          STRING_IS_EMPTY },
212                                   { "isequal",          STRING_IS_EQUAL },
213                                   { "startswith",       STRING_STARTS_WITH },
214                                   { "endswith",         STRING_ENDS_WITH },
215                                   { "contains",         STRING_CONTAINS }};
216 
217 
218 /// \page modules__infolabels_boolean_conditions
219 /// \subsection modules__infolabels_boolean_conditions_Integer Integer
220 /// \table_start
221 ///   \table_h3{ Labels, Type, Description }
222 ///   \table_row3{   <b>`Integer.IsEqual(info\,number)`</b>,
223 ///                  \anchor Integer_IsEqual
224 ///                  _boolean_,
225 ///     @return **True** if the value of the infolabel is equal to the supplied number.
226 ///     @param info - infolabel
227 ///     @param number - number to compare
228 ///     @note **Example:** `Integer.IsEqual(ListItem.Year\,2000)`
229 ///     <p><hr>
230 ///     @skinning_v17 **[New Boolean Condition]** \link Integer_IsEqual `Integer.IsEqual(info\,number)`\endlink
231 ///     <p>
232 ///   }
233 ///   \table_row3{   <b>`Integer.IsGreater(info\,number)`</b>,
234 ///                  \anchor Integer_IsGreater
235 ///                  _boolean_,
236 ///     @return **True** if the value of the infolabel is greater than to the supplied number.
237 ///     @param info - infolabel
238 ///     @param number - number to compare
239 ///     @note **Example:** `Integer.IsGreater(ListItem.Year\,2000)`
240 ///     <p><hr>
241 ///     @skinning_v17 **[New Boolean Condition]** \link Integer_IsGreater `Integer.IsGreater(info\,number)`\endlink
242 ///     <p>
243 ///   }
244 ///   \table_row3{   <b>`Integer.IsGreaterOrEqual(info\,number)`</b>,
245 ///                  \anchor Integer_IsGreaterOrEqual
246 ///                  _boolean_,
247 ///     @return **True** if the value of the infolabel is greater or equal to the supplied number.
248 ///     @param info - infolabel
249 ///     @param number - number to compare
250 ///     @note **Example:** `Integer.IsGreaterOrEqual(ListItem.Year\,2000)`
251 ///     <p><hr>
252 ///     @skinning_v17 **[New Boolean Condition]** \link Integer_IsGreaterOrEqual `Integer.IsGreaterOrEqual(info\,number)`\endlink
253 ///     <p>
254 ///   }
255 ///   \table_row3{   <b>`Integer.IsLess(info\,number)`</b>,
256 ///                  \anchor Integer_IsLess
257 ///                  _boolean_,
258 ///     @return **True** if the value of the infolabel is less than the supplied number.
259 ///     @param info - infolabel
260 ///     @param number - number to compare
261 ///     @note **Example:** `Integer.IsLess(ListItem.Year\,2000)`
262 ///     <p><hr>
263 ///     @skinning_v17 **[New Boolean Condition]** \link Integer_IsLess `Integer.IsLess(info\,number)`\endlink
264 ///     <p>
265 ///   }
266 ///   \table_row3{   <b>`Integer.IsLessOrEqual(info\,number)`</b>,
267 ///                  \anchor Integer_IsLessOrEqual
268 ///                  _boolean_,
269 ///     @return **True** if the value of the infolabel is less or equal to the supplied number.
270 ///     @param info - infolabel
271 ///     @param number - number to compare
272 ///     @note **Example:** `Integer.IsLessOrEqual(ListItem.Year\,2000)`
273 ///     <p><hr>
274 ///     @skinning_v17 **[New Boolean Condition]** \link Integer_IsLessOrEqual `Integer.IsLessOrEqual(info\,number)`\endlink
275 ///     <p>
276 ///   }
277 ///   \table_row3{   <b>`Integer.IsEven(info)`</b>,
278 ///                  \anchor Integer_IsEven
279 ///                  _boolean_,
280 ///     @return **True** if the value of the infolabel is odd
281 ///     @param info - infolabel
282 ///     @note **Example:** `Integer.IsEven(ListItem.CurrentItem)`
283 ///     <p><hr>
284 ///     @skinning_v19 **[New Boolean Condition]** \link Integer_IsEven `Integer.IsEven(info)`\endlink
285 ///     <p>
286 ///   }
287 ///   \table_row3{   <b>`Integer.IsOdd(info)`</b>,
288 ///                  \anchor Integer_IsOdd
289 ///                  _boolean_,
290 ///     @return **True** if the value of the infolabel is odd
291 ///     @param info - infolabel
292 ///     @note **Example:** `Integer.IsOdd(ListItem.CurrentItem)`
293 ///     <p><hr>
294 ///     @skinning_v19 **[New Boolean Condition]** \link Integer_IsOdd `Integer.IsOdd(info)`\endlink
295 ///     <p>
296 ///   }
297 /// \table_end
298 ///
299 /// -----------------------------------------------------------------------------
300 
301 
302 const infomap integer_bools[] =  {{ "isequal",          INTEGER_IS_EQUAL },
303                                   { "isgreater",        INTEGER_GREATER_THAN },
304                                   { "isgreaterorequal", INTEGER_GREATER_OR_EQUAL },
305                                   { "isless",           INTEGER_LESS_THAN },
306                                   { "islessorequal",    INTEGER_LESS_OR_EQUAL },
307                                   { "iseven",           INTEGER_EVEN },
308                                   { "isodd",            INTEGER_ODD }};
309 
310 
311 /// \page modules__infolabels_boolean_conditions
312 /// \subsection modules__infolabels_boolean_conditions_Player Player
313 /// \table_start
314 ///   \table_h3{ Labels, Type, Description }
315 ///   \table_row3{   <b>`Player.HasAudio`</b>,
316 ///                  \anchor Player_HasAudio
317 ///                  _boolean_,
318 ///     @return **True** if the player has an audio file.
319 ///     <p>
320 ///   }
321 ///   \table_row3{   <b>`Player.HasGame`</b>,
322 ///                  \anchor Player_HasGame
323 ///                  _boolean_,
324 ///     @return **True** if the player has a game file (RETROPLAYER).
325 ///     <p><hr>
326 ///     @skinning_v18 **[New Boolean Condition]** \link Player_HasGame `Player.HasGame`\endlink
327 ///     <p>
328 ///   }
329 ///   \table_row3{   <b>`Player.HasMedia`</b>,
330 ///                  \anchor Player_HasMedia
331 ///                  _boolean_,
332 ///     @return **True** if the player has an audio or video file.
333 ///     <p>
334 ///   }
335 ///   \table_row3{   <b>`Player.HasVideo`</b>,
336 ///                  \anchor Player_HasVideo
337 ///                  _boolean_,
338 ///     @return **True** if the player has a video file.
339 ///     <p>
340 ///   }
341 ///   \table_row3{   <b>`Player.Paused`</b>,
342 ///                  \anchor Player_Paused
343 ///                  _boolean_,
344 ///     @return **True** if the player is paused.
345 ///     <p>
346 ///   }
347 ///   \table_row3{   <b>`Player.Playing`</b>,
348 ///                  \anchor Player_Playing
349 ///                  _boolean_,
350 ///     @return **True** if the player is currently playing (i.e. not ffwding\,
351 ///     rewinding or paused.)
352 ///     <p>
353 ///   }
354 ///   \table_row3{   <b>`Player.Rewinding`</b>,
355 ///                  \anchor Player_Rewinding
356 ///                  _boolean_,
357 ///     @return **True** if the player is rewinding.
358 ///     <p>
359 ///   }
360 ///   \table_row3{   <b>`Player.Rewinding2x`</b>,
361 ///                  \anchor Player_Rewinding2x
362 ///                  _boolean_,
363 ///     @return **True** if the player is rewinding at 2x.
364 ///     <p>
365 ///   }
366 ///   \table_row3{   <b>`Player.Rewinding4x`</b>,
367 ///                  \anchor Player_Rewinding4x
368 ///                  _boolean_,
369 ///     @return **True** if the player is rewinding at 4x.
370 ///     <p>
371 ///   }
372 ///   \table_row3{   <b>`Player.Rewinding8x`</b>,
373 ///                  \anchor Player_Rewinding8x
374 ///                  _boolean_,
375 ///     @return **True** if the player is rewinding at 8x.
376 ///     <p>
377 ///   }
378 ///   \table_row3{   <b>`Player.Rewinding16x`</b>,
379 ///                  \anchor Player_Rewinding16x
380 ///                  _boolean_,
381 ///     @return **True** if the player is rewinding at 16x.
382 ///     <p>
383 ///   }
384 ///   \table_row3{   <b>`Player.Rewinding32x`</b>,
385 ///                  \anchor Player_Rewinding32x
386 ///                  _boolean_,
387 ///     @return **True** if the player is rewinding at 32x.
388 ///     <p>
389 ///   }
390 ///   \table_row3{   <b>`Player.Forwarding`</b>,
391 ///                  \anchor Player_Forwarding
392 ///                  _boolean_,
393 ///     @return **True** if the player is fast forwarding.
394 ///     <p>
395 ///   }
396 ///   \table_row3{   <b>`Player.Forwarding2x`</b>,
397 ///                  \anchor Player_Forwarding2x
398 ///                  _boolean_,
399 ///     @return **True** if the player is fast forwarding at 2x.
400 ///     <p>
401 ///   }
402 ///   \table_row3{   <b>`Player.Forwarding4x`</b>,
403 ///                  \anchor Player_Forwarding4x
404 ///                  _boolean_,
405 ///     @return **True** if the player is fast forwarding at 4x.
406 ///     <p>
407 ///   }
408 ///   \table_row3{   <b>`Player.Forwarding8x`</b>,
409 ///                  \anchor Player_Forwarding8x
410 ///                  _boolean_,
411 ///     @return **True** if the player is fast forwarding at 8x.
412 ///     <p>
413 ///   }
414 ///   \table_row3{   <b>`Player.Forwarding16x`</b>,
415 ///                  \anchor Player_Forwarding16x
416 ///                  _boolean_,
417 ///     @return **True** if the player is fast forwarding at 16x.
418 ///     <p>
419 ///   }
420 ///   \table_row3{   <b>`Player.Forwarding32x`</b>,
421 ///                  \anchor Player_Forwarding32x
422 ///                  _boolean_,
423 ///     @return **True** if the player is fast forwarding at 32x.
424 ///     <p>
425 ///   }
426 ///   \table_row3{   <b>`Player.Caching`</b>,
427 ///                  \anchor Player_Caching
428 ///                  _boolean_,
429 ///     @return **True** if the player is current re-caching data (internet based
430 ///     video playback).
431 ///     <p>
432 ///   }
433 ///   \table_row3{   <b>`Player.DisplayAfterSeek`</b>,
434 ///                  \anchor Player_DisplayAfterSeek
435 ///                  _boolean_,
436 ///     @return **True** for the first 2.5 seconds after a seek.
437 ///     <p>
438 ///   }
439 ///   \table_row3{   <b>`Player.Seekbar`</b>,
440 ///                  \anchor Player_Seekbar
441 ///                  _integer_,
442 ///     @return The percentage of one seek to other position.
443 ///     <p>
444 ///   }
445 ///   \table_row3{   <b>`Player.Seeking`</b>,
446 ///                  \anchor Player_Seeking
447 ///                  _boolean_,
448 ///     @return **True** if a seek is in progress.
449 ///     <p>
450 ///   }
451 ///   \table_row3{   <b>`Player.ShowTime`</b>,
452 ///                  \anchor Player_ShowTime
453 ///                  _boolean_,
454 ///     @return **True** if the user has requested the time to show (occurs in video
455 ///     fullscreen).
456 ///     <p>
457 ///   }
458 ///   \table_row3{   <b>`Player.ShowInfo`</b>,
459 ///                  \anchor Player_ShowInfo
460 ///                  _boolean_,
461 ///     @return **True** if the user has requested the song info to show (occurs in
462 ///     visualisation fullscreen and slideshow).
463 ///     <p>
464 ///   }
465 ///   \table_row3{   <b>`Player.Title`</b>,
466 ///                  \anchor Player_Title
467 ///                  _string_,
468 ///     @return The Musicplayer title for audio and the Videoplayer title for
469 ///     video.
470 ///     <p>
471 ///   }
472 ///   \table_row3{   <b>`Player.offset(number).Title`</b>,
473 ///                  \anchor Player_Offset_Title
474 ///                  _string_,
475 ///     @return The title of audio or video which has an offset `number` with respect to the currently playing item.
476 ///     <p><hr>
477 ///     @skinning_v19 **[New Infolabel]** \link Player_Offset_Title `Player.offset(number).Title`\endlink
478 ///     <p>
479 ///   }
480 ///   \table_row3{   <b>`Player.position(number).Title`</b>,
481 ///                  \anchor Player_Position_Title
482 ///                  _string_,
483 ///     @return The title of the audio or video which has an offset `number` with respect to the start of the playlist.
484 ///     <p>><hr>
485 ///     @skinning_v19 **[New Infolabel]** \link Player_Position_Title `Player.position(number).Title`\endlink
486 ///     <p>
487 ///   }
488 ///   \table_row3{   <b>`Player.Muted`</b>,
489 ///                  \anchor Player_Muted
490 ///                  _boolean_,
491 ///     @return **True** if the volume is muted.
492 ///     <p>
493 ///   }
494 ///   \table_row3{   <b>`Player.HasDuration`</b>,
495 ///                  \anchor Player_HasDuration
496 ///                  _boolean_,
497 ///     @return **True** if Media is not a true stream.
498 ///     <p>
499 ///   }
500 ///   \table_row3{   <b>`Player.Passthrough`</b>,
501 ///                  \anchor Player_Passthrough
502 ///                  _boolean_,
503 ///     @return **True** if the player is using audio passthrough.
504 ///     <p>
505 ///   }
506 ///   \table_row3{   <b>`Player.CacheLevel`</b>,
507 ///                  \anchor Player_CacheLevel
508 ///                  _string_,
509 ///     @return The used cache level as a string with an integer number.
510 ///     <p>
511 ///   }
512 ///   \table_row3{   <b>`Player.Progress`</b>,
513 ///                  \anchor Player_Progress
514 ///                  _integer_ / _string_,
515 ///     @return The progress position as percentage.
516 ///     <p><hr>
517 ///     @skinning_v19 \link Player_Progress `Player.Progress`\endlink infolabel
518 ///     also exposed as a string.
519 ///     <p>
520 ///   }
521 ///   \table_row3{   <b>`Player.ProgressCache`</b>,
522 ///                  \anchor Player_ProgressCache
523 ///                  _integer_ / _string_,
524 ///     @return How much of the file is cached above current play percentage
525 ///     <p><hr>
526 ///     @skinning_v19 \link Player_ProgressCache `Player.ProgressCache`\endlink
527 ///     infolabel also exposed as a string.
528 ///     <p>
529 ///   }
530 ///   \table_row3{   <b>`Player.Volume`</b>,
531 ///                  \anchor Player_Volume
532 ///                  _string_,
533 ///     @return The current player volume with the format `%2.1f` dB
534 ///     <p>
535 ///   }
536 ///   \table_row3{   <b>`Player.SubtitleDelay`</b>,
537 ///                  \anchor Player_SubtitleDelay
538 ///                  _string_,
539 ///     @return The used subtitle delay with the format `%2.3f` s
540 ///     <p>
541 ///   }
542 ///   \table_row3{   <b>`Player.AudioDelay`</b>,
543 ///                  \anchor Player_AudioDelay
544 ///                  _string_,
545 ///     @return The used audio delay with the format `%2.3f` s
546 ///     <p>
547 ///   }
548 ///   \table_row3{   <b>`Player.Chapter`</b>,
549 ///                  \anchor Player_Chapter
550 ///                  _integer_,
551 ///     @return The current chapter of current playing media.
552 ///     <p>
553 ///   }
554 ///   \table_row3{   <b>`Player.ChapterCount`</b>,
555 ///                  \anchor Player_ChapterCount
556 ///                  _integer_,
557 ///     @return The total number of chapters of current playing media.
558 ///     <p>
559 ///   }
560 ///   \table_row3{   <b>`Player.ChapterName`</b>,
561 ///                  \anchor Player_ChapterName
562 ///                  _string_,
563 ///     @return The name of currently used chapter if available.
564 ///     <p>
565 ///   }
566 ///   \table_row3{   <b>`Player.Folderpath`</b>,
567 ///                  \anchor Player_Folderpath
568 ///                  _string_,
569 ///     @return The full path of the currently playing song or movie
570 ///     <p>
571 ///   }
572 ///   \table_row3{   <b>`Player.offset(number).Folderpath`</b>,
573 ///                  \anchor Player_Offset_Folderpath
574 ///                  _string_,
575 ///     @return The full path of the audio or video file which has an offset `number` with respect to the currently playing item.
576 ///     <p><hr>
577 ///     @skinning_v19 **[New Infolabel]** \link Player_Offset_Folderpath `Player.offset(number).Folderpath`\endlink
578 ///     <p>
579 ///   }
580 ///   \table_row3{   <b>`Player.position(number).Folderpath`</b>,
581 ///                  \anchor Player_Position_Folderpath
582 ///                  _string_,
583 ///     @return The full path of the audio or video file which has an offset `number` with respect to the start of the playlist.
584 ///     <p>><hr>
585 ///     @skinning_v19 **[New Infolabel]** \link Player_Position_Folderpath `Player.position(number).Folderpath`\endlink
586 ///     <p>
587 ///   }
588 ///   \table_row3{   <b>`Player.FilenameAndPath`</b>,
589 ///                  \anchor Player_FilenameAndPath
590 ///                  _string_,
591 ///     @return The full path with filename of the currently
592 ///     playing song or movie
593 ///     <p>
594 ///   }
595 ///   \table_row3{   <b>`Player.offset(number).FilenameAndPath`</b>,
596 ///                  \anchor Player_Offset_FilenameAndPath
597 ///                  _string_,
598 ///     @return The full path with filename of audio or video file which has an offset `number` with respect to the currently playing item.
599 ///     <p><hr>
600 ///     @skinning_v19 **[New Infolabel]** \link Player_Offset_FilenameAndPath `Player.offset(number).FilenameAndPath`\endlink
601 ///     <p>
602 ///   }
603 ///   \table_row3{   <b>`Player.position(number).FilenameAndPath`</b>,
604 ///                  \anchor Player_Position_FilenameAndPath
605 ///                  _string_,
606 ///     @return The full path with filename of the audio or video file which has an offset `number` with respect to the start of the playlist.
607 ///     <p>><hr>
608 ///     @skinning_v19 **[New Infolabel]** \link Player_Position_FilenameAndPath `Player.position(number).FilenameAndPath`\endlink
609 ///     <p>
610 ///   }
611 ///   \table_row3{   <b>`Player.Filename`</b>,
612 ///                  \anchor Player_Filename
613 ///                  _string_,
614 ///     @return The filename of the currently playing media.
615 ///     <p><hr>
616 ///     @skinning_v13 **[New Infolabel]** \link Player_Filename `Player.Filename`\endlink
617 ///     <p>
618 ///   }
619 ///   \table_row3{   <b>`Player.offset(number).Filename`</b>,
620 ///                  \anchor Player_Offset_Filename
621 ///                  _string_,
622 ///     @return The filename of audio or video file which has an offset `number` with respect to the currently playing item.
623 ///     <p><hr>
624 ///     @skinning_v19 **[New Infolabel]** \link Player_Offset_Filename `Player.offset(number).Filename`\endlink
625 ///     <p>
626 ///   }
627 ///   \table_row3{   <b>`Player.position(number).Filename`</b>,
628 ///                  \anchor Player_Position_Filename
629 ///                  _string_,
630 ///     @return The filename of the audio or video file which has an offset `number` with respect to the start of the playlist.
631 ///     <p>><hr>
632 ///     @skinning_v19 **[New Infolabel]** \link Player_Position_Filename `Player.position(number).Filename`\endlink
633 ///     <p>
634 ///   }
635 ///   \table_row3{   <b>`Player.IsInternetStream`</b>,
636 ///                  \anchor Player_IsInternetStream
637 ///                  _boolean_,
638 ///     @return **True** if the player is playing an internet stream.
639 ///     <p>
640 ///   }
641 ///   \table_row3{   <b>`Player.PauseEnabled`</b>,
642 ///                  \anchor Player_PauseEnabled
643 ///                  _boolean_,
644 ///     @return **True** if played stream is paused.
645 ///     <p>
646 ///   }
647 ///   \table_row3{   <b>`Player.SeekEnabled`</b>,
648 ///                  \anchor Player_SeekEnabled
649 ///                  _boolean_,
650 ///     @return **True** if seek on playing is enabled.
651 ///     <p>
652 ///   }
653 ///   \table_row3{   <b>`Player.ChannelPreviewActive`</b>,
654 ///                  \anchor Player_ChannelPreviewActive
655 ///                  _boolean_,
656 ///     @return **True** if PVR channel preview is active (used
657 ///     channel tag different from played tag)
658 ///     <p>
659 ///   }
660 ///   \table_row3{   <b>`Player.TempoEnabled`</b>,
661 ///                  \anchor Player_TempoEnabled
662 ///                  _boolean_,
663 ///     @return **True** if player supports tempo (i.e. speed up/down normal
664 ///     playback speed)
665 ///     <p><hr>
666 ///     @skinning_v17 **[New Boolean Condition]** \link Player_TempoEnabled `Player.TempoEnabled`\endlink
667 ///     <p>
668 ///   }
669 ///   \table_row3{   <b>`Player.IsTempo`</b>,
670 ///                  \anchor Player_IsTempo
671 ///                  _boolean_,
672 ///     @return **True** if player has tempo (i.e. is playing with a playback speed higher or
673 ///     lower than normal playback speed)
674 ///     <p><hr>
675 ///     @skinning_v17 **[New Boolean Condition]** \link Player_IsTempo `Player.IsTempo`\endlink
676 ///     <p>
677 ///   }
678 ///   \table_row3{   <b>`Player.PlaySpeed`</b>,
679 ///                  \anchor Player_PlaySpeed
680 ///                  _string_,
681 ///     @return The player playback speed with the format `%1.2f` (1.00 means normal
682 ///     playback speed).
683 ///     @note For Tempo\, the default range is 0.80 - 1.50 (it can be changed
684 ///     in advanced settings). If \ref Player_PlaySpeed "Player.PlaySpeed" returns a value different from 1.00
685 ///     and \ref Player_IsTempo "Player.IsTempo" is false it means the player is in ff/rw mode.
686 ///     <p>
687 ///   }
688 ///   \table_row3{   <b>`Player.HasResolutions`</b>,
689 ///                  \anchor Player_HasResolutions
690 ///                  _boolean_,
691 ///     @return **True** if the player is allowed to switch resolution and refresh rate
692 ///     (i.e. if whitelist modes are configured in Kodi's System/Display settings)
693 ///     <p><hr>
694 ///     @skinning_v18 **[New Boolean Condition]** \link Player_HasResolutions `Player.HasResolutions`\endlink
695 ///     <p>
696 ///   }
697 ///   \table_row3{   <b>`Player.HasPrograms`</b>,
698 ///                  \anchor Player_HasPrograms
699 ///                  _boolean_,
700 ///     @return **True** if the media file being played has programs\, i.e. groups of streams.
701 ///     @note Ex: if a media file has multiple streams (quality\, channels\, etc) a program represents
702 ///     a particular stream combo.
703 ///     <p>
704 ///   }
705 ///   \table_row3{   <b>`Player.FrameAdvance`</b>,
706 ///                  \anchor Player_FrameAdvance
707 ///                  _boolean_,
708 ///     @return **True** if player is in frame advance mode.
709 ///     @note Skins should hide seek bar in this mode
710 ///     <p><hr>
711 ///     @skinning_v18 **[New Boolean Condition]** \link Player_FrameAdvance `Player.FrameAdvance`\endlink
712 ///     <p>
713 ///   }
714 ///   \table_row3{   <b>`Player.Icon`</b>,
715 ///                  \anchor Player_Icon
716 ///                  _string_,
717 ///     @return The thumbnail of the currently playing item. If no thumbnail image exists\,
718 ///     the icon will be returned\, if available.
719 ///     <p><hr>
720 ///     @skinning_v18 **[New Infolabel]** \link Player_Icon `Player.Icon`\endlink
721 ///     <p>
722 ///   }
723 ///   \table_row3{   <b>`Player.Cutlist`</b>,
724 ///                  \anchor Player_Cutlist
725 ///                  _string_,
726 ///     @return The cutlist of the currently playing item as csv in the format start1\,end1\,start2\,end2\,...
727 ///     Tokens must have values in the range from 0.0 to 100.0. end token must be less or equal than start token.
728 ///     <p><hr>
729 ///     @skinning_v19 **[New Infolabel]** \link Player_Cutlist `Player.Cutlist`\endlink
730 ///     <p>
731 ///   }
732 ///   \table_row3{   <b>`Player.Chapters`</b>,
733 ///                  \anchor Player_Chapters
734 ///                  _string_,
735 ///     @return The chapters of the currently playing item as csv in the format start1\,end1\,start2\,end2\,...
736 ///     Tokens must have values in the range from 0.0 to 100.0. end token must be less or equal than start token.
737 ///     <p><hr>
738 ///     @skinning_v19 **[New Infolabel]** \link Player_Chapters `Player.Chapters`\endlink
739 ///     <p>
740 ///   }
741 const infomap player_labels[] =  {{ "hasmedia",         PLAYER_HAS_MEDIA },
742                                   { "hasaudio",         PLAYER_HAS_AUDIO },
743                                   { "hasvideo",         PLAYER_HAS_VIDEO },
744                                   { "hasgame",          PLAYER_HAS_GAME },
745                                   { "playing",          PLAYER_PLAYING },
746                                   { "paused",           PLAYER_PAUSED },
747                                   { "rewinding",        PLAYER_REWINDING },
748                                   { "forwarding",       PLAYER_FORWARDING },
749                                   { "rewinding2x",      PLAYER_REWINDING_2x },
750                                   { "rewinding4x",      PLAYER_REWINDING_4x },
751                                   { "rewinding8x",      PLAYER_REWINDING_8x },
752                                   { "rewinding16x",     PLAYER_REWINDING_16x },
753                                   { "rewinding32x",     PLAYER_REWINDING_32x },
754                                   { "forwarding2x",     PLAYER_FORWARDING_2x },
755                                   { "forwarding4x",     PLAYER_FORWARDING_4x },
756                                   { "forwarding8x",     PLAYER_FORWARDING_8x },
757                                   { "forwarding16x",    PLAYER_FORWARDING_16x },
758                                   { "forwarding32x",    PLAYER_FORWARDING_32x },
759                                   { "displayafterseek", PLAYER_DISPLAY_AFTER_SEEK },
760                                   { "caching",          PLAYER_CACHING },
761                                   { "seekbar",          PLAYER_SEEKBAR },
762                                   { "seeking",          PLAYER_SEEKING },
763                                   { "showtime",         PLAYER_SHOWTIME },
764                                   { "showinfo",         PLAYER_SHOWINFO },
765                                   { "muted",            PLAYER_MUTED },
766                                   { "hasduration",      PLAYER_HASDURATION },
767                                   { "passthrough",      PLAYER_PASSTHROUGH },
768                                   { "cachelevel",       PLAYER_CACHELEVEL },
769                                   { "title",            PLAYER_TITLE },
770                                   { "progress",         PLAYER_PROGRESS },
771                                   { "progresscache",    PLAYER_PROGRESS_CACHE },
772                                   { "volume",           PLAYER_VOLUME },
773                                   { "subtitledelay",    PLAYER_SUBTITLE_DELAY },
774                                   { "audiodelay",       PLAYER_AUDIO_DELAY },
775                                   { "chapter",          PLAYER_CHAPTER },
776                                   { "chaptercount",     PLAYER_CHAPTERCOUNT },
777                                   { "chaptername",      PLAYER_CHAPTERNAME },
778                                   { "folderpath",       PLAYER_PATH },
779                                   { "filenameandpath",  PLAYER_FILEPATH },
780                                   { "filename",         PLAYER_FILENAME },
781                                   { "isinternetstream", PLAYER_ISINTERNETSTREAM },
782                                   { "pauseenabled",     PLAYER_CAN_PAUSE },
783                                   { "seekenabled",      PLAYER_CAN_SEEK },
784                                   { "channelpreviewactive", PLAYER_IS_CHANNEL_PREVIEW_ACTIVE },
785                                   { "tempoenabled",     PLAYER_SUPPORTS_TEMPO },
786                                   { "istempo",          PLAYER_IS_TEMPO },
787                                   { "playspeed",        PLAYER_PLAYSPEED },
788                                   { "hasprograms",      PLAYER_HAS_PROGRAMS },
789                                   { "hasresolutions",   PLAYER_HAS_RESOLUTIONS },
790                                   { "frameadvance",     PLAYER_FRAMEADVANCE },
791                                   { "icon",             PLAYER_ICON },
792                                   { "cutlist",          PLAYER_CUTLIST },
793                                   { "chapters",         PLAYER_CHAPTERS }};
794 
795 /// \page modules__infolabels_boolean_conditions
796 ///   \table_row3{   <b>`Player.Art(type)`</b>,
797 ///                  \anchor Player_Art_type
798 ///                  _string_,
799 ///     @return The Image for the defined art type for the current playing ListItem.
800 ///     @param type - The art type. The type is defined by scripts and scrappers and can have any value.
801 ///     Common example values for type are:
802 ///       - fanart
803 ///       - thumb
804 ///       - poster
805 ///       - banner
806 ///       - clearlogo
807 ///       - tvshow.poster
808 ///       - tvshow.banner
809 ///       - etc
810 ///     @todo get a way of centralize all random art strings used in core so we can point users to them
811 ///     while still making it clear they can have any value.
812 ///     <p>
813 ///   }
814 
815 
816 const infomap player_param[] =   {{ "art",              PLAYER_ITEM_ART }};
817 
818 /// \page modules__infolabels_boolean_conditions
819 ///   \table_row3{   <b>`Player.SeekTime`</b>,
820 ///                  \anchor Player_SeekTime
821 ///                  _string_,
822 ///     @return The time to which the user is seeking.
823 ///     <p>
824 ///   }
825 ///   \table_row3{   <b>`Player.SeekOffset([format])`</b>,
826 ///                  \anchor Player_SeekOffset_format
827 ///                  _string_,
828 ///     @return The seek offset after a seek press in a given format.
829 ///     @param format [opt] The format of the return time value.
830 ///     See \ref TIME_FORMAT for the list of possible values.
831 ///     <p>
832 ///     @note **Example:** user presses BigStepForward\, player.seekoffset returns +10:00
833 ///     <p>
834 ///   }
835 ///   \table_row3{   <b>`Player.SeekStepSize`</b>,
836 ///                  \anchor Player_SeekStepSize
837 ///                  _string_,
838 ///     @return The seek step size.
839 ///     <p>
840 ///     <hr>
841 ///     @skinning_v15 **[New Infolabel]** \link Player_SeekStepSize `Player.SeekStepSize`\endlink
842 ///     <p>
843 ///   }
844 ///   \table_row3{   <b>`Player.TimeRemaining([format])`</b>,
845 ///                  \anchor Player_TimeRemaining_format
846 ///                  _string_,
847 ///     @return The remaining time of current playing media in a given format.
848 ///     @param format [opt] The format of the return time value.
849 ///     See \ref TIME_FORMAT for the list of possible values.
850 ///     <p>
851 ///   }
852 ///   \table_row3{   <b>`Player.TimeSpeed`</b>,
853 ///                  \anchor Player_TimeSpeed
854 ///                  _string_,
855 ///     @return The time and the playspeed formatted: "1:23 (2x)".
856 ///     <p>
857 ///   }
858 ///   \table_row3{   <b>`Player.Time([format])`</b>,
859 ///                  \anchor Player_Time_format
860 ///                  _string_,
861 ///     @return The elapsed time of current playing media in a given format.
862 ///     @param format [opt] The format of the return time value.
863 ///     See \ref TIME_FORMAT for the list of possible values.
864 ///     <p>
865 ///   }
866 ///   \table_row3{   <b>`Player.Duration([format])`</b>,
867 ///                  \anchor Player_Duration_format
868 ///                  _string_,
869 ///     @return The total duration of the current playing media in a given format.
870 ///     @param format [opt] The format of the return time value.
871 ///     See \ref TIME_FORMAT for the list of possible values.
872 ///     <p>
873 ///   }
874 ///   \table_row3{   <b>`Player.FinishTime([format])`</b>,
875 ///                  \anchor Player_FinishTime_format
876 ///                  _string_,
877 ///     @return The time at which the playing media will end (in a specified format).
878 ///     @param format [opt] The format of the return time value.
879 ///     See \ref TIME_FORMAT for the list of possible values.
880 ///     <p>
881 ///   }
882 ///   \table_row3{   <b>`Player.StartTime([format])`</b>,
883 ///                  \anchor Player_StartTime_format
884 ///                  _string_,
885 ///     @return The time at which the playing media began (in a specified format).
886 ///     @param format [opt] The format of the return time value.
887 ///     See \ref TIME_FORMAT for the list of possible values.
888 ///     <p>
889 ///   }
890 ///   \table_row3{   <b>`Player.SeekNumeric([format])`</b>,
891 ///                  \anchor Player_SeekNumeric_format
892 ///                  _string_,
893 ///     @return The time at which the playing media began (in a specified format).
894 ///     @param format [opt] The format of the return time value.
895 ///     See \ref TIME_FORMAT for the list of possible values.
896 ///     <p>
897 ///   }
898 const infomap player_times[] =   {{ "seektime",         PLAYER_SEEKTIME },
899                                   { "seekoffset",       PLAYER_SEEKOFFSET },
900                                   { "seekstepsize",     PLAYER_SEEKSTEPSIZE },
901                                   { "timeremaining",    PLAYER_TIME_REMAINING },
902                                   { "timespeed",        PLAYER_TIME_SPEED },
903                                   { "time",             PLAYER_TIME },
904                                   { "duration",         PLAYER_DURATION },
905                                   { "finishtime",       PLAYER_FINISH_TIME },
906                                   { "starttime",        PLAYER_START_TIME },
907                                   { "seeknumeric",      PLAYER_SEEKNUMERIC } };
908 
909 
910 /// \page modules__infolabels_boolean_conditions
911 ///   \table_row3{   <b>`Player.Process(videohwdecoder)`</b>,
912 ///                  \anchor Player_Process_videohwdecoder
913 ///                  _boolean_,
914 ///     @return **True** if the currently playing video is decoded in hardware.
915 ///     <p><hr>
916 ///     @skinning_v17 **[New Boolean Condition]** \link Player_Process_videohwdecoder `Player.Process(videohwdecoder)`\endlink
917 ///     <p>
918 ///   }
919 ///   \table_row3{   <b>`Player.Process(videodecoder)`</b>,
920 ///                  \anchor Player_Process_videodecoder
921 ///                  _string_,
922 ///     @return The videodecoder name of the currently playing video.
923 ///     <p><hr>
924 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_videodecoder `Player.Process(videodecoder)`\endlink
925 ///     <p>
926 ///   }
927 ///   \table_row3{   <b>`Player.Process(deintmethod)`</b>,
928 ///                  \anchor Player_Process_deintmethod
929 ///                  _string_,
930 ///     @return The deinterlace method of the currently playing video.
931 ///     <p><hr>
932 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_deintmethod `Player.Process(deintmethod)`\endlink
933 ///     <p>
934 ///   }
935 ///   \table_row3{   <b>`Player.Process(pixformat)`</b>,
936 ///                  \anchor Player_Process_pixformat
937 ///                  _string_,
938 ///     @return The pixel format of the currently playing video.
939 ///     <p><hr>
940 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_pixformat `Player.Process(pixformat)`\endlink
941 ///     <p>
942 ///   }
943 ///   \table_row3{   <b>`Player.Process(videowidth)`</b>,
944 ///                  \anchor Player_Process_videowidth
945 ///                  _string_,
946 ///     @return The width of the currently playing video.
947 ///     <p><hr>
948 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_videowidth `Player.Process(videowidth)`\endlink
949 ///     <p>
950 ///   }
951 ///   \table_row3{   <b>`Player.Process(videoheight)`</b>,
952 ///                  \anchor Player_Process_videoheight
953 ///                  _string_,
954 ///     @return The width of the currently playing video.
955 ///     <p><hr>
956 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_videoheight `Player.Process(videoheight)`\endlink
957 ///     <p>
958 ///   }
959 ///   \table_row3{   <b>`Player.Process(videofps)`</b>,
960 ///                  \anchor Player_Process_videofps
961 ///                  _string_,
962 ///     @return The video framerate of the currently playing video.
963 ///     <p><hr>
964 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_videofps `Player.Process(videofps)`\endlink
965 ///     <p>
966 ///   }
967 ///   \table_row3{   <b>`Player.Process(videodar)`</b>,
968 ///                  \anchor Player_Process_videodar
969 ///                  _string_,
970 ///     @return The display aspect ratio of the currently playing video.
971 ///     <p><hr>
972 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_videodar `Player.Process(videodar)`\endlink
973 ///     <p>
974 ///   }
975 ///   \table_row3{   <b>`Player.Process(audiodecoder)`</b>,
976 ///                  \anchor Player_Process_audiodecoder
977 ///                  _string_,
978 ///     @return The audiodecoder name of the currently playing item.
979 ///     <p><hr>
980 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_videodar `Player.Process(audiodecoder)`\endlink
981 ///     <p>
982 ///   }
983 ///   \table_row3{   <b>`Player.Process(audiochannels)`</b>,
984 ///                  \anchor Player_Process_audiochannels
985 ///                  _string_,
986 ///     @return The audiodecoder name of the currently playing item.
987 ///     <p><hr>
988 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_audiochannels `Player.Process(audiochannels)`\endlink
989 ///     <p>
990 ///   }
991 ///   \table_row3{   <b>`Player.Process(audiosamplerate)`</b>,
992 ///                  \anchor Player_Process_audiosamplerate
993 ///                  _string_,
994 ///     @return The samplerate of the currently playing item.
995 ///     <p><hr>
996 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_audiosamplerate `Player.Process(audiosamplerate)`\endlink
997 ///     <p>
998 ///   }
999 ///   \table_row3{   <b>`Player.Process(audiobitspersample)`</b>,
1000 ///                  \anchor Player_Process_audiobitspersample
1001 ///                  _string_,
1002 ///     @return The bits per sample of the currently playing item.
1003 ///     <p><hr>
1004 ///     @skinning_v17 **[New Infolabel]** \link Player_Process_audiobitspersample `Player.Process(audiobitspersample)`\endlink
1005 ///     <p>
1006 ///   }
1007 /// \table_end
1008 ///
1009 /// -----------------------------------------------------------------------------
1010 
1011 const infomap player_process[] =
1012 {
1013   { "videodecoder", PLAYER_PROCESS_VIDEODECODER },
1014   { "deintmethod", PLAYER_PROCESS_DEINTMETHOD },
1015   { "pixformat", PLAYER_PROCESS_PIXELFORMAT },
1016   { "videowidth", PLAYER_PROCESS_VIDEOWIDTH },
1017   { "videoheight", PLAYER_PROCESS_VIDEOHEIGHT },
1018   { "videofps", PLAYER_PROCESS_VIDEOFPS },
1019   { "videodar", PLAYER_PROCESS_VIDEODAR },
1020   { "videohwdecoder", PLAYER_PROCESS_VIDEOHWDECODER },
1021   { "audiodecoder", PLAYER_PROCESS_AUDIODECODER },
1022   { "audiochannels", PLAYER_PROCESS_AUDIOCHANNELS },
1023   { "audiosamplerate", PLAYER_PROCESS_AUDIOSAMPLERATE },
1024   { "audiobitspersample", PLAYER_PROCESS_AUDIOBITSPERSAMPLE }
1025 };
1026 
1027 /// \page modules__infolabels_boolean_conditions
1028 /// \subsection modules__infolabels_boolean_conditions_Weather Weather
1029 /// \table_start
1030 ///   \table_h3{ Labels, Type, Description }
1031 ///   \table_row3{   <b>`Weather.IsFetched`</b>,
1032 ///                  \anchor Weather_IsFetched
1033 ///                  _boolean_,
1034 ///     @return **True** if the weather data has been downloaded.
1035 ///     <p>
1036 ///   }
1037 ///   \table_row3{   <b>`Weather.Conditions`</b>,
1038 ///                  \anchor Weather_Conditions
1039 ///                  _string_,
1040 ///     @return The current weather conditions as textual description.
1041 ///     @note This is looked up in a background process.
1042 ///     <p>
1043 ///   }
1044 ///   \table_row3{   <b>`Weather.ConditionsIcon`</b>,
1045 ///                  \anchor Weather_ConditionsIcon
1046 ///                  _string_,
1047 ///     @return The current weather conditions as an icon.
1048 ///     @note This is looked up in a background process.
1049 ///     <p>
1050 ///   }
1051 ///   \table_row3{   <b>`Weather.Temperature`</b>,
1052 ///                  \anchor Weather_Temperature
1053 ///                  _string_,
1054 ///     @return The current weather temperature.
1055 ///     <p>
1056 ///   }
1057 ///   \table_row3{   <b>`Weather.Location`</b>,
1058 ///                  \anchor Weather_Location
1059 ///                  _string_,
1060 ///     @return The city/town which the above two items are for.
1061 ///     <p>
1062 ///   }
1063 ///   \table_row3{   <b>`Weather.Fanartcode`</b>,
1064 ///                  \anchor Weather_fanartcode
1065 ///                  _string_,
1066 ///     @return The current weather fanartcode.
1067 ///     <p>
1068 ///   }
1069 ///   \table_row3{   <b>`Weather.Plugin`</b>,
1070 ///                  \anchor Weather_plugin
1071 ///                  _string_,
1072 ///     @return The current weather plugin.
1073 ///     <p>
1074 ///   }
1075 /// \table_end
1076 ///
1077 /// -----------------------------------------------------------------------------
1078 const infomap weather[] =        {{ "isfetched",        WEATHER_IS_FETCHED },
1079                                   { "conditions",       WEATHER_CONDITIONS_TEXT },         // labels from here
1080                                   { "temperature",      WEATHER_TEMPERATURE },
1081                                   { "location",         WEATHER_LOCATION },
1082                                   { "fanartcode",       WEATHER_FANART_CODE },
1083                                   { "plugin",           WEATHER_PLUGIN },
1084                                   { "conditionsicon",   WEATHER_CONDITIONS_ICON }};
1085 
1086 /// \page modules__infolabels_boolean_conditions
1087 /// \subsection modules__infolabels_boolean_conditions_System System
1088 /// @todo some values are hardcoded in the middle of the code  - refactor to make it easier to track
1089 /// \table_start
1090 ///   \table_h3{ Labels, Type, Description }
1091 ///   \table_row3{   <b>`System.AlarmLessOrEqual(alarmname\,seconds)`</b>,
1092 ///                  \anchor System_AlarmLessOrEqual
1093 ///                  _boolean_,
1094 ///     @return **True** if the alarm with `alarmname` has less or equal to `seconds` left.
1095 ///     @param alarmname - The name of the alarm. It can be one of the following:
1096 ///       - shutdowntimer
1097 ///     @param seconds - Time in seconds to compare with the alarm trigger event
1098 ///     @note **Example:** `System.Alarmlessorequal(shutdowntimer\,119)`\,
1099 ///     will return true when the shutdowntimer has less then 2 minutes
1100 ///     left.
1101 ///     <p>
1102 ///   }
1103 ///   \table_row3{   <b>`System.HasNetwork`</b>,
1104 ///                  \anchor System_HasNetwork
1105 ///                  _boolean_,
1106 ///     @return **True** if the Kodi host has a network available.
1107 ///     <p>
1108 ///   }
1109 ///   \table_row3{   <b>`System.HasMediadvd`</b>,
1110 ///                  \anchor System_HasMediadvd
1111 ///                  _boolean_,
1112 ///     @return **True** if there is a CD or DVD in the DVD-ROM drive.
1113 ///     <p>
1114 ///   }
1115 ///   \table_row3{   <b>`System.HasMediaAudioCD`</b>,
1116 ///                  \anchor System_HasMediaAudioCD
1117 ///                  _boolean_,
1118 ///     @return **True** if there is an audio CD in the optical drive. **False** if no drive
1119 ///     available\, empty drive or other medium.
1120 ///   <p><hr>
1121 ///   @skinning_v18 **[New Boolean Condition]** \link System_HasMediaAudioCD
1122 ///   `System.HasMediaAudioCD` \endlink <p>
1123 ///   }
1124 ///   \table_row3{   <b>`System.DVDReady`</b>,
1125 ///                  \anchor System_DVDReady
1126 ///                  _boolean_,
1127 ///     @return **True** if the disc is ready to use.
1128 ///     <p>
1129 ///   }
1130 ///   \table_row3{   <b>`System.TrayOpen`</b>,
1131 ///                  \anchor System_TrayOpen
1132 ///                  _boolean_,
1133 ///     @return **True** if the disc tray is open.
1134 ///     <p>
1135 ///   }
1136 ///   \table_row3{   <b>`System.HasLocks`</b>,
1137 ///                  \anchor System_HasLocks
1138 ///                  _boolean_,
1139 ///     @return **True** if the system has an active lock mode.
1140 ///     <p>
1141 ///   }
1142 ///   \table_row3{   <b>`System.IsMaster`</b>,
1143 ///                  \anchor System_IsMaster
1144 ///                  _boolean_,
1145 ///     @return **True** if the system is in master mode.
1146 ///     <p>
1147 ///   }
1148 ///   \table_row3{   <b>`System.ShowExitButton`</b>,
1149 ///                  \anchor System_ShowExitButton
1150 ///                  _boolean_,
1151 ///     @return **True** if the exit button should be shown (configurable via advanced settings).
1152 ///     <p>
1153 ///   }
1154 ///   \table_row3{   <b>`System.DPMSActive`</b>,
1155 ///                  \anchor System_DPMSActive
1156 ///                  _boolean_,
1157 ///     @return **True** if DPMS (VESA Display Power Management Signaling) mode is active.
1158 ///     <p>
1159 ///   }
1160 ///   \table_row3{   <b>`System.IsStandalone`</b>,
1161 ///                  \anchor System_IsStandalone
1162 ///                  _boolean_,
1163 ///     @return **True** if Kodi is running in standalone mode.
1164 ///     <p>
1165 ///   }
1166 ///   \table_row3{   <b>`System.IsFullscreen`</b>,
1167 ///                  \anchor System_IsFullscreen
1168 ///                  _boolean_,
1169 ///     @return **True** if Kodi is running fullscreen.
1170 ///     <p>
1171 ///   }
1172 ///   \table_row3{   <b>`System.LoggedOn`</b>,
1173 ///                  \anchor System_LoggedOn
1174 ///                  _boolean_,
1175 ///     @return **True** if a user is currently logged on under a profile.
1176 ///     <p>
1177 ///   }
1178 ///   \table_row3{   <b>`System.HasLoginScreen`</b>,
1179 ///                  \anchor System_HasLoginScreen
1180 ///                  _boolean_,
1181 ///     @return **True** if the profile login screen is enabled.
1182 ///     <p>
1183 ///   }
1184 ///   \table_row3{   <b>`System.HasPVR`</b>,
1185 ///                  \anchor System_HasPVR
1186 ///                  _boolean_,
1187 ///     @return **True** if PVR is supported from Kodi.
1188 ///     @note normally always true
1189 ///
1190 ///   }
1191 ///   \table_row3{   <b>`System.HasPVRAddon`</b>,
1192 ///                  \anchor System_HasPVRAddon
1193 ///                  _boolean_,
1194 ///     @return **True** if at least one pvr client addon is installed and enabled.
1195 ///     @param id - addon id of the PVR addon
1196 ///     <p><hr>
1197 ///     @skinning_v17 **[New Boolean Condition]** \link System_HasPVRAddon
1198 ///     `System.HasPVRAddon`\endlink <p>
1199 ///   }
1200 ///   \table_row3{   <b>`System.HasCMS`</b>,
1201 ///                  \anchor System_HasCMS
1202 ///                  _boolean_,
1203 ///     @return **True** if colour management is supported from Kodi.
1204 ///     @note currently only supported for OpenGL
1205 ///     <p><hr>
1206 ///     @skinning_v17 **[New Boolean Condition]** \link System_HasCMS `System.HasCMS`\endlink
1207 ///     <p>
1208 ///   }
1209 ///   \table_row3{   <b>`System.HasActiveModalDialog`</b>,
1210 ///                  \anchor System_HasActiveModalDialog
1211 ///                  _boolean_,
1212 ///     @return **True** if a modal dialog is active.
1213 ///     <p><hr>
1214 ///     @skinning_v18 **[New Boolean Condition]** \link System_HasActiveModalDialog
1215 ///     `System.HasActiveModalDialog`\endlink <p>
1216 ///   }
1217 ///   \table_row3{   <b>`System.HasVisibleModalDialog`</b>,
1218 ///                  \anchor System_HasVisibleModalDialog
1219 ///                  _boolean_,
1220 ///     @return **True** if a modal dialog is visible.
1221 ///     <p><hr>
1222 ///     @skinning_v18 **[New Boolean Condition]** \link System_HasVisibleModalDialog
1223 ///     `System.HasVisibleModalDialog`\endlink <p>
1224 ///   }
1225 ///   \table_row3{   <b>`System.Platform.Linux`</b>,
1226 ///                  \anchor System_PlatformLinux
1227 ///                  _boolean_,
1228 ///     @return **True** if Kodi is running on a linux/unix based computer.
1229 ///     <p>
1230 ///   }
1231 ///   \table_row3{   <b>`System.Platform.Windows`</b>,
1232 ///                  \anchor System_PlatformWindows
1233 ///                  _boolean_,
1234 ///     @return **True** if Kodi is running on a windows based computer.
1235 ///     <p>
1236 ///   }
1237 ///   \table_row3{   <b>`System.Platform.UWP`</b>,
1238 ///                  \anchor System_PlatformUWP
1239 ///                  _boolean_,
1240 ///     @return **True** if Kodi is running on Universal Windows Platform (UWP).
1241 ///     <p><hr>
1242 ///     @skinning_v18 **[New Boolean Condition]** \link System_PlatformUWP
1243 ///     `System.Platform.UWP`\endlink <p>
1244 ///   }
1245 ///   \table_row3{   <b>`System.Platform.OSX`</b>,
1246 ///                  \anchor System_PlatformOSX
1247 ///                  _boolean_,
1248 ///     @return **True** if Kodi is running on an OSX based computer.
1249 ///     <p>
1250 ///   }
1251 ///   \table_row3{   <b>`System.Platform.IOS`</b>,
1252 ///                  \anchor System_PlatformIOS
1253 ///                  _boolean_,
1254 ///     @return **True** if Kodi is running on an IOS device.
1255 ///     <p>
1256 ///   }
1257 ///   \table_row3{   <b>`System.Platform.TVOS`</b>,
1258 ///                  \anchor System_PlatformTVOS
1259 ///                  _boolean_,
1260 ///     @return **True** if Kodi is running on a tvOS device.
1261 ///     <p><hr>
1262 ///     @skinning_v19 **[New Boolean Condition]** \link System_PlatformTVOS
1263 ///     `System.Platform.TVOS`\endlink <p>
1264 ///   }
1265 ///   \table_row3{   <b>`System.Platform.Darwin`</b>,
1266 ///                  \anchor System_PlatformDarwin
1267 ///                  _boolean_,
1268 ///     @return **True** if Kodi is running on an OSX or IOS system.
1269 ///     <p>
1270 ///   }
1271 ///   \table_row3{   <b>`System.Platform.Android`</b>,
1272 ///                  \anchor System_PlatformAndroid
1273 ///                  _boolean_,
1274 ///     @return **True** if Kodi is running on an android device.
1275 ///     <p>
1276 ///   }
1277 ///   \table_row3{   <b>`System.CanPowerDown`</b>,
1278 ///                  \anchor System_CanPowerDown
1279 ///                  _boolean_,
1280 ///     @return **True** if Kodi can powerdown the system.
1281 ///     <p>
1282 ///   }
1283 ///   \table_row3{   <b>`System.CanSuspend`</b>,
1284 ///                  \anchor System_CanSuspend
1285 ///                  _boolean_,
1286 ///     @return **True** if Kodi can suspend the system.
1287 ///     <p>
1288 ///   }
1289 ///   \table_row3{   <b>`System.CanHibernate`</b>,
1290 ///                  \anchor System_CanHibernate
1291 ///                  _boolean_,
1292 ///     @return **True** if Kodi can hibernate the system.
1293 ///     <p>
1294 ///   }
1295 ///   \table_row3{   <b>`System.HasHiddenInput`</b>,
1296 ///                  \anchor System_HasHiddenInput
1297 ///                  _boolean_,
1298 ///     @return **True** when to osd keyboard/numeric dialog requests a
1299 ///     password/pincode.
1300 ///     <p><hr>
1301 ///     @skinning_v16 **[New Boolean Condition]** \link System_HasHiddenInput
1302 ///     `System.HasHiddenInput`\endlink <p>
1303 ///   }
1304 ///   \table_row3{   <b>`System.CanReboot`</b>,
1305 ///                  \anchor System_CanReboot
1306 ///                  _boolean_,
1307 ///     @return **True** if Kodi can reboot the system.
1308 ///     <p>
1309 ///   }
1310 ///   \table_row3{   <b>`System.ScreenSaverActive`</b>,
1311 ///                  \anchor System_ScreenSaverActive
1312 ///                  _boolean_,
1313 ///     @return **True** if ScreenSaver is active.
1314 ///     <p>
1315 ///   }
1316 ///   \table_row3{   <b>`System.IsInhibit`</b>,
1317 ///                  \anchor System_IsInhibit
1318 ///                  _boolean_,
1319 ///     @return **True** when shutdown on idle is disabled.
1320 ///     <p>
1321 ///   }
1322 ///   \table_row3{   <b>`System.HasShutdown`</b>,
1323 ///                  \anchor System_HasShutdown
1324 ///                  _boolean_,
1325 ///     @return **True** when shutdown on idle is enabled.
1326 ///     <p>
1327 ///   }
1328 ///   \table_row3{   <b>`System.Time`</b>,
1329 ///                  \anchor System_Time
1330 ///                  _string_,
1331 ///     @return The current time.
1332 ///     <p>
1333 ///   }
1334 ///   \table_row3{   <b>`System.Time(format)`</b>,
1335 ///                  \anchor System_Time_format
1336 ///                  _string_,
1337 ///     @return The current time in a specified format.
1338 ///     @param format [opt] The format of the return time value.
1339 ///     See \ref TIME_FORMAT for the list of possible values.
1340 ///     <p>
1341 ///   }
1342 ///   \table_row3{   <b>`System.Time(startTime[\,endTime])`</b>,
1343 ///                  \anchor System_Time
1344 ///                  _boolean_,
1345 ///     @return **True** if the current system time is >= `startTime` and < `endTime` (if defined).
1346 ///     @param startTime - Start time
1347 ///     @param endTime - [opt] End time
1348 ///     <p>
1349 ///     @note Time must be specified in the format HH:mm\, using
1350 ///     a 24 hour clock.
1351 ///     <p>
1352 ///   }
1353 ///   \table_row3{   <b>`System.Date`</b>,
1354 ///                  \anchor System_Date
1355 ///                  _string_,
1356 ///     @return The current date.
1357 ///     <p><hr>
1358 ///     @skinning_v16 **[Infolabel Updated]** \link System_Date `System.Date`\endlink
1359 ///     will now return the full day and month names. old: sat\, jul 18 2015
1360 ///     new: saturday\, july 18 2015
1361 ///     <p>
1362 ///   }
1363 ///   \table_row3{   <b>`System.Date(format)`</b>,
1364 ///                  \anchor System_Date_format
1365 ///                  _string_,
1366 ///     @return The current date using a specified format.
1367 ///     @param format - the format for the date. It can be one of the following
1368 ///     values:
1369 ///       - **d** - day of month (1-31)
1370 ///       - **dd** - day of month (01-31)
1371 ///       - **ddd** - short day of the week Mon-Sun
1372 ///       - **DDD** - long day of the week Monday-Sunday
1373 ///       - **m** - month (1-12)
1374 ///       - **mm** - month (01-12)
1375 ///       - **mmm** - short month name Jan-Dec
1376 ///       - **MMM** - long month name January-December
1377 ///       - **yy** - 2-digit year
1378 ///       - **yyyy** - 4-digit year
1379 ///     <p>
1380 ///   }
1381 ///   \table_row3{   <b>`System.Date(startDate[\,endDate])`</b>,
1382 ///                  \anchor System_Date
1383 ///                  _boolean_,
1384 ///     @return **True** if the current system date is >= `startDate` and < `endDate` (if defined).
1385 ///     @param startDate - The start date
1386 ///     @param endDate - [opt] The end date
1387 ///     @note Date must be specified in the format MM-DD or YY-MM-DD.
1388 ///     <p>
1389 ///   }
1390 ///   \table_row3{   <b>`System.AlarmPos`</b>,
1391 ///                  \anchor System_AlarmPos
1392 ///                  _string_,
1393 ///     @return The shutdown Timer position.
1394 ///     <p>
1395 ///   }
1396 ///   \table_row3{   <b>`System.BatteryLevel`</b>,
1397 ///                  \anchor System_BatteryLevel
1398 ///                  _string_,
1399 ///     @return The remaining battery level in range 0-100.
1400 ///     <p>
1401 ///   }
1402 ///   \table_row3{   <b>`System.FreeSpace`</b>,
1403 ///                  \anchor System_FreeSpace
1404 ///                  _string_,
1405 ///     @return The total Freespace on the drive.
1406 ///     <p>
1407 ///   }
1408 ///   \table_row3{   <b>`System.UsedSpace`</b>,
1409 ///                  \anchor System_UsedSpace
1410 ///                  _string_,
1411 ///     @return The total Usedspace on the drive.
1412 ///     <p>
1413 ///   }
1414 ///   \table_row3{   <b>`System.TotalSpace`</b>,
1415 ///                  \anchor System_TotalSpace
1416 ///                  _string_,
1417 ///     @return The total space on the drive.
1418 ///     <p>
1419 ///   }
1420 ///   \table_row3{   <b>`System.UsedSpacePercent`</b>,
1421 ///                  \anchor System_UsedSpacePercent
1422 ///                  _string_,
1423 ///     @return The total Usedspace Percent on the drive.
1424 ///     <p>
1425 ///   }
1426 ///   \table_row3{   <b>`System.FreeSpacePercent`</b>,
1427 ///                  \anchor System_FreeSpacePercent
1428 ///                  _string_,
1429 ///     @return The total Freespace Percent on the drive.
1430 ///     <p>
1431 ///   }
1432 ///   \table_row3{   <b>`System.CPUTemperature`</b>,
1433 ///                  \anchor System_CPUTemperature
1434 ///                  _string_,
1435 ///     @return The current CPU temperature.
1436 ///     <p>
1437 ///   }
1438 ///   \table_row3{   <b>`System.CpuUsage`</b>,
1439 ///                  \anchor System_CpuUsage
1440 ///                  _string_,
1441 ///     @return The the cpu usage for each individual cpu core.
1442 ///     <p>
1443 ///   }
1444 ///   \table_row3{   <b>`System.GPUTemperature`</b>,
1445 ///                  \anchor System_GPUTemperature
1446 ///                  _string_,
1447 ///     @return The current GPU temperature.
1448 ///     <p>
1449 ///   }
1450 ///   \table_row3{   <b>`System.FanSpeed`</b>,
1451 ///                  \anchor System_FanSpeed
1452 ///                  _string_,
1453 ///     @return The current fan speed.
1454 ///     <p>
1455 ///   }
1456 ///   \table_row3{   <b>`System.BuildVersion`</b>,
1457 ///                  \anchor System_BuildVersion
1458 ///                  _string_,
1459 ///     @return The version of build.
1460 ///     <p>
1461 ///   }
1462 ///   \table_row3{   <b>`System.BuildVersionShort`</b>,
1463 ///                  \anchor System_BuildVersionShort
1464 ///                  _string_,
1465 ///     @return The shorter string with version of build.
1466 ///     <p>
1467 ///   }
1468 ///   \table_row3{   <b>`System.BuildDate`</b>,
1469 ///                  \anchor System_BuildDate
1470 ///                  _string_,
1471 ///     @return The date of build.
1472 ///     <p>
1473 ///   }
1474 ///   \table_row3{   <b>`System.BuildVersionCode`</b>,
1475 ///                  \anchor System_BuildVersionCode
1476 ///                  _string_,
1477 ///     @return The version code of build.
1478 ///     <p>
1479 ///   }
1480 ///   \table_row3{   <b>`System.BuildVersionGit`</b>,
1481 ///                  \anchor System_BuildVersionGit
1482 ///                  _string_,
1483 ///     @return The git version of build.
1484 ///     <p>
1485 ///   }
1486 ///   \table_row3{   <b>`System.FriendlyName`</b>,
1487 ///                  \anchor System_FriendlyName
1488 ///                  _string_,
1489 ///     @return The Kodi instance name.
1490 ///     @note It will auto append (%hostname%) in case
1491 ///     the device name was not changed. eg. "Kodi (htpc)"
1492 ///     <p>
1493 ///   }
1494 ///   \table_row3{   <b>`System.FPS`</b>,
1495 ///                  \anchor System_FPS
1496 ///                  _string_,
1497 ///     @return The current rendering speed (frames per second).
1498 ///     <p>
1499 ///   }
1500 ///   \table_row3{   <b>`System.FreeMemory`</b>,
1501 ///                  \anchor System_FreeMemory
1502 ///                  _string_,
1503 ///     @return The amount of free memory in Mb.
1504 ///     <p>
1505 ///   }
1506 ///   \table_row3{   <b>`System.ScreenMode`</b>,
1507 ///                  \anchor System_ScreenMode
1508 ///                  _string_,
1509 ///     @return The screenmode (eg windowed / fullscreen).
1510 ///     <p>
1511 ///   }
1512 ///   \table_row3{   <b>`System.ScreenWidth`</b>,
1513 ///                  \anchor System_ScreenWidth
1514 ///                  _string_,
1515 ///     @return The width of screen in pixels.
1516 ///     <p>
1517 ///   }
1518 ///   \table_row3{   <b>`System.ScreenHeight`</b>,
1519 ///                  \anchor System_ScreenHeight
1520 ///                  _string_,
1521 ///     @return The height of screen in pixels.
1522 ///     <p>
1523 ///   }
1524 ///   \table_row3{   <b>`System.StartupWindow`</b>,
1525 ///                  \anchor System_StartupWindow
1526 ///                  _string_,
1527 ///     @return The Window Kodi will load on startup.
1528 ///     <p><hr>
1529 ///     @skinning_v13 **[New Infolabel]** \link System_StartupWindow `System.StartupWindow`\endlink
1530 ///     <p>
1531 ///   }
1532 ///   \table_row3{   <b>`System.CurrentWindow`</b>,
1533 ///                  \anchor System_CurrentWindow
1534 ///                  _string_,
1535 ///     @return The current Window in use.
1536 ///     <p>
1537 ///   }
1538 ///   \table_row3{   <b>`System.CurrentControl`</b>,
1539 ///                  \anchor System_CurrentControl
1540 ///                  _string_,
1541 ///     @return The current focused control
1542 ///     <p>
1543 ///   }
1544 ///   \table_row3{   <b>`System.CurrentControlId`</b>,
1545 ///                  \anchor System_CurrentControlId
1546 ///                  _string_,
1547 ///     @return The ID of the currently focused control.
1548 ///     <p>
1549 ///   }
1550 ///   \table_row3{   <b>`System.DVDLabel`</b>,
1551 ///                  \anchor System_DVDLabel
1552 ///                  _string_,
1553 ///     @return the label of the disk in the DVD-ROM drive.
1554 ///     <p>
1555 ///   }
1556 ///   \table_row3{   <b>`System.KernelVersion`</b>,
1557 ///                  \anchor System_KernelVersion
1558 ///                  _string_,
1559 ///     @return The System kernel version.
1560 ///     <p>
1561 ///   }
1562 ///   \table_row3{   <b>`System.OSVersionInfo`</b>,
1563 ///                  \anchor System_OSVersionInfo
1564 ///                  _string_,
1565 ///     @return The system name + kernel version.
1566 ///     <p>
1567 ///   }
1568 ///   \table_row3{   <b>`System.Uptime`</b>,
1569 ///                  \anchor System_Uptime
1570 ///                  _string_,
1571 ///     @return The system current uptime.
1572 ///     <p>
1573 ///   }
1574 ///   \table_row3{   <b>`System.TotalUptime`</b>,
1575 ///                  \anchor System_TotalUptime
1576 ///                  _string_,
1577 ///     @return The system total uptime.
1578 ///     <p>
1579 ///   }
1580 ///   \table_row3{   <b>`System.CpuFrequency`</b>,
1581 ///                  \anchor System_CpuFrequency
1582 ///                  _string_,
1583 ///     @return The system cpu frequency.
1584 ///     <p>
1585 ///   }
1586 ///   \table_row3{   <b>`System.ScreenResolution`</b>,
1587 ///                  \anchor System_ScreenResolution
1588 ///                  _string_,
1589 ///     @return The screen resolution.
1590 ///     <p>
1591 ///   }
1592 ///   \table_row3{   <b>`System.VideoEncoderInfo`</b>,
1593 ///                  \anchor System_VideoEncoderInfo
1594 ///                  _string_,
1595 ///     @return The video encoder info.
1596 ///     <p>
1597 ///   }
1598 ///   \table_row3{   <b>`System.InternetState`</b>,
1599 ///                  \anchor System_InternetState
1600 ///                  _string_,
1601 ///     @return The internet state: connected or not connected.
1602 ///     @warning Do not use to check status in a pythonscript since it is threaded.
1603 ///     <p>
1604 ///   }
1605 ///   \table_row3{   <b>`System.Language`</b>,
1606 ///                  \anchor System_Language
1607 ///                  _string_,
1608 ///     @return the current language.
1609 ///     <p>
1610 ///   }
1611 ///   \table_row3{   <b>`System.ProfileName`</b>,
1612 ///                  \anchor System_ProfileName
1613 ///                  _string_,
1614 ///     @return The user name of the currently logged in Kodi user
1615 ///     <p>
1616 ///   }
1617 ///   \table_row3{   <b>`System.ProfileThumb`</b>,
1618 ///                  \anchor System_ProfileThumb
1619 ///                  _string_,
1620 ///     @return The thumbnail image of the currently logged in Kodi user
1621 ///     <p>
1622 ///   }
1623 ///   \table_row3{   <b>`System.ProfileCount`</b>,
1624 ///                  \anchor System_ProfileCount
1625 ///                  _string_,
1626 ///     @return The number of defined profiles.
1627 ///     <p>
1628 ///   }
1629 ///   \table_row3{   <b>`System.ProfileAutoLogin`</b>,
1630 ///                  \anchor System_ProfileAutoLogin
1631 ///                  _string_,
1632 ///     @return The profile Kodi will auto login to.
1633 ///     <p><hr>
1634 ///     @skinning_v13 **[New Infolabel]** \link System_ProfileAutoLogin
1635 ///     `System.ProfileAutoLogin`\endlink <p>
1636 ///   }
1637 ///   \table_row3{   <b>`System.StereoscopicMode`</b>,
1638 ///                  \anchor System_StereoscopicMode
1639 ///                  _string_,
1640 ///     @return The prefered stereoscopic mode.
1641 ///     @note Configured in settings > video > playback).
1642 ///     <p><hr>
1643 ///     @skinning_v13 **[New Infolabel]** \link System_StereoscopicMode
1644 ///     `System.StereoscopicMode`\endlink <p>
1645 ///   }
1646 ///   \table_row3{   <b>`System.TemperatureUnits`</b>,
1647 ///                  \anchor System_TemperatureUnits
1648 ///                  _string_,
1649 ///     @return the Celsius or the Fahrenheit symbol.
1650 ///     <p>
1651 ///   }
1652 ///   \table_row3{   <b>`System.Progressbar`</b>,
1653 ///                  \anchor System_Progressbar
1654 ///                  _string_,
1655 ///     @return The percentage of the currently active progress.
1656 ///     <p>
1657 ///   }
1658 ///   \table_row3{   <b>`System.GetBool(boolean)`</b>,
1659 ///                  \anchor System_GetBool
1660 ///                  _string_,
1661 ///     @return The value of any standard system boolean setting.
1662 ///     @note Will not work with settings in advancedsettings.xml
1663 ///     <p>
1664 ///   }
1665 ///   \table_row3{   <b>`System.Memory(type)`</b>,
1666 ///                  \anchor System_Memory
1667 ///                  _string_,
1668 ///     @return The memory value depending on the requested type.
1669 ///     @param type - Can be one of the following:
1670 ///       - <b>free</b>
1671 ///       - <b>free.percent</b>
1672 ///       - <b>used</b>
1673 ///       - <b>used.percent</b>
1674 ///       - <b>total</b>
1675 ///     <p>
1676 ///   }
1677 ///   \table_row3{   <b>`System.AddonTitle(id)`</b>,
1678 ///                  \anchor System_AddonTitle
1679 ///                  _string_,
1680 ///     @return The title of the addon with the given id
1681 ///     @param id - the addon id
1682 ///     <p>
1683 ///   }
1684 ///   \table_row3{   <b>`System.AddonVersion(id)`</b>,
1685 ///                  \anchor System_AddonVersion
1686 ///                  _string_,
1687 ///     @return The version of the addon with the given id.
1688 ///     @param id - the addon id
1689 ///     <p><hr>
1690 ///     @skinning_v13 **[New Infolabel]** \link System_AddonVersion
1691 ///     `System.AddonVersion(id)`\endlink <p>
1692 ///   }
1693 ///   \table_row3{   <b>`System.AddonIcon(id)`</b>,
1694 ///                  \anchor System_AddonVersion
1695 ///                  _string_,
1696 ///     @return The icon of the addon with the given id.
1697 ///     @param id - the addon id
1698 ///     <p>
1699 ///   }
1700 ///   \table_row3{   <b>`System.AddonUpdateCount`</b>,
1701 ///                  \anchor System_AddonUpdateCount
1702 ///                  _string_,
1703 ///     @return The number of available addon updates.
1704 ///     <p><hr>
1705 ///     @skinning_v19 **[New Infolabel]** \link  System_AddonUpdateCount `
1706 ///     System.AddonUpdateCount`\endlink <p>
1707 ///   }
1708 ///   \table_row3{   <b>`System.IdleTime(time)`</b>,
1709 ///                  \anchor System_IdleTime
1710 ///                  _boolean_,
1711 ///     @return **True** if Kodi has had no input for `time` amount of seconds.
1712 ///     @param time - elapsed seconds to check for idle activity.
1713 ///     <p>
1714 ///   }
1715 ///   \table_row3{   <b>`System.PrivacyPolicy`</b>,
1716 ///                  \anchor System_PrivacyPolicy
1717 ///                  _string_,
1718 ///     @return The official Kodi privacy policy.
1719 ///     <p><hr>
1720 ///     @skinning_v17 **[New Infolabel]** \link System_PrivacyPolicy `System.PrivacyPolicy`\endlink
1721 ///     <p>
1722 ///   }
1723 ///   \table_row3{   <b>`System.SupportsCPUUsage`</b>,
1724 ///                  \anchor System_SupportsCPUUsage
1725 ///                  _boolean_,
1726 ///     @return **True** if the system can provide CPU usage information.
1727 ///     <p><hr>
1728 ///     @skinning_v19 **[New Boolean Condition]** \link  System_SupportsCPUUsage `
1729 ///     System.SupportsCPUUsage`\endlink <p>
1730 ///   }
1731 const infomap system_labels[] = {{"hasnetwork", SYSTEM_ETHERNET_LINK_ACTIVE},
1732                                  {"hasmediadvd", SYSTEM_MEDIA_DVD},
1733                                  {"hasmediaaudiocd", SYSTEM_MEDIA_AUDIO_CD},
1734                                  {"dvdready", SYSTEM_DVDREADY},
1735                                  {"trayopen", SYSTEM_TRAYOPEN},
1736                                  {"haslocks", SYSTEM_HASLOCKS},
1737                                  {"hashiddeninput", SYSTEM_HAS_INPUT_HIDDEN},
1738                                  {"hasloginscreen", SYSTEM_HAS_LOGINSCREEN},
1739                                  {"hasactivemodaldialog", SYSTEM_HAS_ACTIVE_MODAL_DIALOG},
1740                                  {"hasvisiblemodaldialog", SYSTEM_HAS_VISIBLE_MODAL_DIALOG},
1741                                  {"ismaster", SYSTEM_ISMASTER},
1742                                  {"isfullscreen", SYSTEM_ISFULLSCREEN},
1743                                  {"isstandalone", SYSTEM_ISSTANDALONE},
1744                                  {"loggedon", SYSTEM_LOGGEDON},
1745                                  {"showexitbutton", SYSTEM_SHOW_EXIT_BUTTON},
1746                                  {"canpowerdown", SYSTEM_CAN_POWERDOWN},
1747                                  {"cansuspend", SYSTEM_CAN_SUSPEND},
1748                                  {"canhibernate", SYSTEM_CAN_HIBERNATE},
1749                                  {"canreboot", SYSTEM_CAN_REBOOT},
1750                                  {"screensaveractive", SYSTEM_SCREENSAVER_ACTIVE},
1751                                  {"dpmsactive", SYSTEM_DPMS_ACTIVE},
1752                                  {"cputemperature", SYSTEM_CPU_TEMPERATURE}, // labels from here
1753                                  {"cpuusage", SYSTEM_CPU_USAGE},
1754                                  {"gputemperature", SYSTEM_GPU_TEMPERATURE},
1755                                  {"fanspeed", SYSTEM_FAN_SPEED},
1756                                  {"freespace", SYSTEM_FREE_SPACE},
1757                                  {"usedspace", SYSTEM_USED_SPACE},
1758                                  {"totalspace", SYSTEM_TOTAL_SPACE},
1759                                  {"usedspacepercent", SYSTEM_USED_SPACE_PERCENT},
1760                                  {"freespacepercent", SYSTEM_FREE_SPACE_PERCENT},
1761                                  {"buildversion", SYSTEM_BUILD_VERSION},
1762                                  {"buildversionshort", SYSTEM_BUILD_VERSION_SHORT},
1763                                  {"buildversioncode", SYSTEM_BUILD_VERSION_CODE},
1764                                  {"buildversiongit", SYSTEM_BUILD_VERSION_GIT},
1765                                  {"builddate", SYSTEM_BUILD_DATE},
1766                                  {"fps", SYSTEM_FPS},
1767                                  {"freememory", SYSTEM_FREE_MEMORY},
1768                                  {"language", SYSTEM_LANGUAGE},
1769                                  {"temperatureunits", SYSTEM_TEMPERATURE_UNITS},
1770                                  {"screenmode", SYSTEM_SCREEN_MODE},
1771                                  {"screenwidth", SYSTEM_SCREEN_WIDTH},
1772                                  {"screenheight", SYSTEM_SCREEN_HEIGHT},
1773                                  {"currentwindow", SYSTEM_CURRENT_WINDOW},
1774                                  {"currentcontrol", SYSTEM_CURRENT_CONTROL},
1775                                  {"currentcontrolid", SYSTEM_CURRENT_CONTROL_ID},
1776                                  {"dvdlabel", SYSTEM_DVD_LABEL},
1777                                  {"internetstate", SYSTEM_INTERNET_STATE},
1778                                  {"osversioninfo", SYSTEM_OS_VERSION_INFO},
1779                                  {"kernelversion", SYSTEM_OS_VERSION_INFO}, // old, not correct name
1780                                  {"uptime", SYSTEM_UPTIME},
1781                                  {"totaluptime", SYSTEM_TOTALUPTIME},
1782                                  {"cpufrequency", SYSTEM_CPUFREQUENCY},
1783                                  {"screenresolution", SYSTEM_SCREEN_RESOLUTION},
1784                                  {"videoencoderinfo", SYSTEM_VIDEO_ENCODER_INFO},
1785                                  {"profilename", SYSTEM_PROFILENAME},
1786                                  {"profilethumb", SYSTEM_PROFILETHUMB},
1787                                  {"profilecount", SYSTEM_PROFILECOUNT},
1788                                  {"profileautologin", SYSTEM_PROFILEAUTOLOGIN},
1789                                  {"progressbar", SYSTEM_PROGRESS_BAR},
1790                                  {"batterylevel", SYSTEM_BATTERY_LEVEL},
1791                                  {"friendlyname", SYSTEM_FRIENDLY_NAME},
1792                                  {"alarmpos", SYSTEM_ALARM_POS},
1793                                  {"isinhibit", SYSTEM_ISINHIBIT},
1794                                  {"hasshutdown", SYSTEM_HAS_SHUTDOWN},
1795                                  {"haspvr", SYSTEM_HAS_PVR},
1796                                  {"startupwindow", SYSTEM_STARTUP_WINDOW},
1797                                  {"stereoscopicmode", SYSTEM_STEREOSCOPIC_MODE},
1798                                  {"hascms", SYSTEM_HAS_CMS},
1799                                  {"privacypolicy", SYSTEM_PRIVACY_POLICY},
1800                                  {"haspvraddon", SYSTEM_HAS_PVR_ADDON},
1801                                  {"addonupdatecount", SYSTEM_ADDON_UPDATE_COUNT},
1802                                  {"supportscpuusage", SYSTEM_SUPPORTS_CPU_USAGE}};
1803 
1804 /// \page modules__infolabels_boolean_conditions
1805 ///   \table_row3{   <b>`System.HasAddon(id)`</b>,
1806 ///                  \anchor System_HasAddon
1807 ///                  _boolean_,
1808 ///     @return **True** if the specified addon is installed on the system.
1809 ///     @param id - the addon id
1810 ///     @skinning_v19 **[Boolean Condition Updated]** \link System_HasAddon `System.HasAddon(id)`\endlink
1811 ///     <p>
1812 ///   }
1813 ///   \table_row3{   <b>`System.AddonIsEnabled(id)`</b>,
1814 ///                  \anchor System_AddonIsEnabled
1815 ///                  _boolean_,
1816 ///     @return **True** if the specified addon is enabled on the system.
1817 ///     @param id - The addon Id
1818 ///     <p><hr>
1819 ///     @skinning_v19 **[New Boolean Condition]** \link System_AddonIsEnabled `System.AddonIsEnabled(id)`\endlink
1820 ///     <p>
1821 ///   }
1822 ///   \table_row3{   <b>`System.HasCoreId(id)`</b>,
1823 ///                  \anchor System_HasCoreId
1824 ///                  _boolean_,
1825 ///     @return **True** if the CPU core with the given 'id' exists.
1826 ///     @param id - the id of the CPU core
1827 ///     <p>
1828 ///   }
1829 ///   \table_row3{   <b>`System.HasAlarm(alarm)`</b>,
1830 ///                  \anchor System_HasAlarm
1831 ///                  _boolean_,
1832 ///     @return **True** if the system has the `alarm` alarm set.
1833 ///     @param alarm - the name of the alarm
1834 ///     <p>
1835 ///   }
1836 ///   \table_row3{   <b>`System.CoreUsage(id)`</b>,
1837 ///                  \anchor System_CoreUsage
1838 ///                  _string_,
1839 ///     @return the usage of the CPU core with the given 'id'
1840 ///     @param id - the id of the CPU core
1841 ///     <p>
1842 ///   }
1843 ///   \table_row3{   <b>`System.Setting(hidewatched)`</b>,
1844 ///                  \anchor System_Setting
1845 ///                  _boolean_,
1846 ///     @return **True** if 'hide watched items' is selected.
1847 ///     <p>
1848 ///   }
1849 /// \table_end
1850 ///
1851 /// -----------------------------------------------------------------------------
1852 const infomap system_param[] =   {{ "hasalarm",         SYSTEM_HAS_ALARM },
1853                                   { "hascoreid",        SYSTEM_HAS_CORE_ID },
1854                                   { "setting",          SYSTEM_SETTING },
1855                                   { "hasaddon",         SYSTEM_HAS_ADDON },
1856                                   { "addonisenabled",   SYSTEM_ADDON_IS_ENABLED },
1857                                   { "coreusage",        SYSTEM_GET_CORE_USAGE }};
1858 
1859 /// \page modules__infolabels_boolean_conditions
1860 /// \subsection modules__infolabels_boolean_conditions_Network Network
1861 /// \table_start
1862 ///   \table_h3{ Labels, Type, Description }
1863 ///   \table_row3{   <b>`Network.IsDHCP`</b>,
1864 ///                  \anchor Network_IsDHCP
1865 ///                  _boolean_,
1866 ///     @return **True** if the network type is DHCP.
1867 ///     @note Network type can be either DHCP or FIXED
1868 ///     <p>
1869 ///   }
1870 ///   \table_row3{   <b>`Network.IPAddress`</b>,
1871 ///                  \anchor Network_IPAddress
1872 ///                  _string_,
1873 ///     @return The system's IP Address. e.g. 192.168.1.15
1874 ///     <p>
1875 ///   }
1876 ///   \table_row3{   <b>`Network.LinkState`</b>,
1877 ///                  \anchor Network_LinkState
1878 ///                  _string_,
1879 ///     @return The network linkstate e.g. 10mbit/100mbit etc.
1880 ///     <p>
1881 ///   }
1882 ///   \table_row3{   <b>`Network.MacAddress`</b>,
1883 ///                  \anchor Network_MacAddress
1884 ///                  _string_,
1885 ///     @return The system's MAC address.
1886 ///     <p>
1887 ///   }
1888 ///   \table_row3{   <b>`Network.SubnetMask`</b>,
1889 ///                  \anchor Network_SubnetMask
1890 ///                  _string_,
1891 ///     @return The network subnet mask.
1892 ///     <p>
1893 ///   }
1894 ///   \table_row3{   <b>`Network.GatewayAddress`</b>,
1895 ///                  \anchor Network_GatewayAddress
1896 ///                  _string_,
1897 ///     @return The network gateway address.
1898 ///     <p>
1899 ///   }
1900 ///   \table_row3{   <b>`Network.DNS1Address`</b>,
1901 ///                  \anchor Network_DNS1Address
1902 ///                  _string_,
1903 ///     @return The network DNS 1 address.
1904 ///     <p>
1905 ///   }
1906 ///   \table_row3{   <b>`Network.DNS2Address`</b>,
1907 ///                  \anchor Network_DNS2Address
1908 ///                  _string_,
1909 ///     @return The network DNS 2 address.
1910 ///     <p>
1911 ///   }
1912 ///   \table_row3{   <b>`Network.DHCPAddress`</b>,
1913 ///                  \anchor Network_DHCPAddress
1914 ///                  _string_,
1915 ///     @return The DHCP IP address.
1916 ///     <p>
1917 ///   }
1918 /// \table_end
1919 ///
1920 /// -----------------------------------------------------------------------------
1921 const infomap network_labels[] = {{ "isdhcp",            NETWORK_IS_DHCP },
1922                                   { "ipaddress",         NETWORK_IP_ADDRESS }, //labels from here
1923                                   { "linkstate",         NETWORK_LINK_STATE },
1924                                   { "macaddress",        NETWORK_MAC_ADDRESS },
1925                                   { "subnetmask",        NETWORK_SUBNET_MASK },
1926                                   { "gatewayaddress",    NETWORK_GATEWAY_ADDRESS },
1927                                   { "dns1address",       NETWORK_DNS1_ADDRESS },
1928                                   { "dns2address",       NETWORK_DNS2_ADDRESS },
1929                                   { "dhcpaddress",       NETWORK_DHCP_ADDRESS }};
1930 
1931 /// \page modules__infolabels_boolean_conditions
1932 /// \subsection modules__infolabels_boolean_conditions_musicpartymode Music party mode
1933 /// \table_start
1934 ///   \table_h3{ Labels, Type, Description }
1935 ///   \table_row3{   <b>`MusicPartyMode.Enabled`</b>,
1936 ///                  \anchor MusicPartyMode_Enabled
1937 ///                  _boolean_,
1938 ///     @return **True** if Party Mode is enabled.
1939 ///     <p>
1940 ///   }
1941 ///   \table_row3{   <b>`MusicPartyMode.SongsPlayed`</b>,
1942 ///                  \anchor MusicPartyMode_SongsPlayed
1943 ///                  _string_,
1944 ///     @return The number of songs played during Party Mode.
1945 ///     <p>
1946 ///   }
1947 ///   \table_row3{   <b>`MusicPartyMode.MatchingSongs`</b>,
1948 ///                  \anchor MusicPartyMode_MatchingSongs
1949 ///                  _string_,
1950 ///     @return The number of songs available to Party Mode.
1951 ///     <p>
1952 ///   }
1953 ///   \table_row3{   <b>`MusicPartyMode.MatchingSongsPicked`</b>,
1954 ///                  \anchor MusicPartyMode_MatchingSongsPicked
1955 ///                  _string_,
1956 ///     @return The number of songs picked already for Party Mode.
1957 ///     <p>
1958 ///   }
1959 ///   \table_row3{   <b>`MusicPartyMode.MatchingSongsLeft`</b>,
1960 ///                  \anchor MusicPartyMode_MatchingSongsLeft
1961 ///                  _string_,
1962 ///     @return The number of songs left to be picked from for Party Mode.
1963 ///     <p>
1964 ///   }
1965 ///   \table_row3{   <b>`MusicPartyMode.RelaxedSongsPicked`</b>,
1966 ///                  \anchor MusicPartyMode_RelaxedSongsPicked
1967 ///                  _string_,
1968 ///     @todo Not currently used
1969 ///     <p>
1970 ///   }
1971 ///   \table_row3{   <b>`MusicPartyMode.RandomSongsPicked`</b>,
1972 ///                  \anchor MusicPartyMode_RandomSongsPicked
1973 ///                  _string_,
1974 ///     @return The number of unique random songs picked during Party Mode.
1975 ///     <p>
1976 ///   }
1977 /// \table_end
1978 ///
1979 /// -----------------------------------------------------------------------------
1980 const infomap musicpartymode[] = {{ "enabled",           MUSICPM_ENABLED },
1981                                   { "songsplayed",       MUSICPM_SONGSPLAYED },
1982                                   { "matchingsongs",     MUSICPM_MATCHINGSONGS },
1983                                   { "matchingsongspicked", MUSICPM_MATCHINGSONGSPICKED },
1984                                   { "matchingsongsleft", MUSICPM_MATCHINGSONGSLEFT },
1985                                   { "relaxedsongspicked", MUSICPM_RELAXEDSONGSPICKED },
1986                                   { "randomsongspicked", MUSICPM_RANDOMSONGSPICKED }};
1987 
1988 /// \page modules__infolabels_boolean_conditions
1989 /// \subsection modules__infolabels_boolean_conditions_MusicPlayer Music player
1990 /// \table_start
1991 ///   \table_h3{ Labels, Type, Description }
1992 ///   \table_row3{   <b>`MusicPlayer.Offset(number).Exists`</b>,
1993 ///                  \anchor MusicPlayer_Offset
1994 ///                  _boolean_,
1995 ///     @return **True** if the music players playlist has a song queued in
1996 ///     position (number).
1997 ///     @param number - song position
1998 ///     <p>
1999 ///   }
2000 ///   \table_row3{   <b>`MusicPlayer.Title`</b>,
2001 ///                  \anchor MusicPlayer_Title
2002 ///                  _string_,
2003 ///     @return The title of the currently playing song.
2004 ///     <p>
2005 ///   }
2006 ///   \table_row3{   <b>`MusicPlayer.offset(number).Title`</b>,
2007 ///                  \anchor MusicPlayer_Offset_Title
2008 ///                  _string_,
2009 ///     @return The title of the song which has an offset `number` with respect to the
2010 ///     current playing song.
2011 ///     @param number - the offset number with respect to the current playing song
2012 ///     <p>
2013 ///   }
2014 ///   \table_row3{   <b>`MusicPlayer.Position(number).Title`</b>,
2015 ///                  \anchor MusicPlayer_Position_Title
2016 ///                  _string_,
2017 ///     @return The title of the song which as an offset `number` with respect to the
2018 ///     start of the playlist.
2019 ///     @param number - the offset number with respect to the start of the playlist
2020 ///     <p>
2021 ///   }
2022 ///   \table_row3{   <b>`MusicPlayer.Album`</b>,
2023 ///                  \anchor MusicPlayer_Album
2024 ///                  _string_,
2025 ///     @return The album from which the current song is from.
2026 ///     <p>
2027 ///   }
2028 ///   \table_row3{   <b>`MusicPlayer.offset(number).Album`</b>,
2029 ///                  \anchor MusicPlayer_OffSet_Album
2030 ///                  _string_,
2031 ///     @return The album from which the song with offset `number` with respect to
2032 ///     the current song is from.
2033 ///     @param number - the offset number with respect to the current playing song
2034 ///     <p>
2035 ///   }
2036 ///   \table_row3{   <b>`MusicPlayer.Position(number).Album`</b>,
2037 ///                  \anchor MusicPlayer_Position_Album
2038 ///                  _string_,
2039 ///     @return The album from which the song with offset `number` with respect to
2040 ///     the start of the playlist is from.
2041 ///     @param number - the offset number with respect to the start of the playlist
2042 ///     <p>
2043 ///   }
2044 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Mood)`</b>,
2045 ///                  \anchor MusicPlayer_Property_Album_Mood
2046 ///                  _string_,
2047 ///     @return The moods of the currently playing Album
2048 ///     <p>
2049 ///   }
2050 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Composer)`</b>,
2051 ///                  \anchor MusicPlayer_Property_Role_Composer
2052 ///                  _string_,
2053 ///     @return The name of the person who composed the selected song.
2054 ///     <p><hr>
2055 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Composer `MusicPlayer.Property(Role.Composer)`\endlink
2056 ///     <p>
2057 ///   }
2058 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Conductor)`</b>,
2059 ///                  \anchor MusicPlayer_Property_Role_Conductor
2060 ///                  _string_,
2061 ///     @return The name of the person who conducted the selected song.
2062 ///     <p><hr>
2063 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Conductor `MusicPlayer.Property(Role.Conductor)`\endlink
2064 ///     <p>
2065 ///   }
2066 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Orchestra)`</b>,
2067 ///                  \anchor MusicPlayer_Property_Role_Orchestra
2068 ///                  _string_,
2069 ///     @return The name of the orchestra performing the selected song.
2070 ///     <p><hr>
2071 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Orchestra `MusicPlayer.Property(Role.Orchestra)`\endlink
2072 ///     <p>
2073 ///   }
2074 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Lyricist)`</b>,
2075 ///                  \anchor MusicPlayer_Property_Role_Lyricist
2076 ///                  _string_,
2077 ///     @return The name of the person who wrote the lyrics of the selected song.
2078 ///     <p><hr>
2079 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Lyricist `MusicPlayer.Property(Role.Lyricist)`\endlink
2080 ///     <p>
2081 ///   }
2082 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Remixer)`</b>,
2083 ///                  \anchor MusicPlayer_Property_Role_Remixer
2084 ///                  _string_,
2085 ///     @return The name of the person who remixed the selected song.
2086 ///     <p><hr>
2087 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Remixer `MusicPlayer.Property(Role.Remixer)`\endlink
2088 ///     <p>
2089 ///   }
2090 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Arranger)`</b>,
2091 ///                  \anchor MusicPlayer_Property_Role_Arranger
2092 ///                  _string_,
2093 ///     @return The name of the person who arranged the selected song.
2094 ///     <p><hr>
2095 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Arranger `MusicPlayer.Property(Role.Arranger)`\endlink
2096 ///     <p>
2097 ///   }
2098 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Engineer)`</b>,
2099 ///                  \anchor MusicPlayer_Property_Role_Engineer
2100 ///                  _string_,
2101 ///     @return The name of the person who was the engineer of the selected song.
2102 ///     <p><hr>
2103 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Engineer `MusicPlayer.Property(Role.Engineer)`\endlink
2104 ///     <p>
2105 ///   }
2106 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Producer)`</b>,
2107 ///                  \anchor MusicPlayer_Property_Role_Producer
2108 ///                  _string_,
2109 ///     @return The name of the person who produced the selected song.
2110 ///     <p><hr>
2111 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Producer `MusicPlayer.Property(Role.Producer)`\endlink
2112 ///     <p>
2113 ///   }
2114 ///   \table_row3{   <b>`MusicPlayer.Property(Role.DJMixer)`</b>,
2115 ///                  \anchor MusicPlayer_Property_Role_DJMixer
2116 ///                  _string_,
2117 ///     @return The name of the dj who remixed the selected song.
2118 ///     <p><hr>
2119 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_DJMixer `MusicPlayer.Property(Role.DJMixer)`\endlink
2120 ///     <p>
2121 ///   }
2122 ///   \table_row3{   <b>`MusicPlayer.Property(Role.Mixer)`</b>,
2123 ///                  \anchor MusicPlayer_Property_Role_Mixer
2124 ///                  _string_,
2125 ///     @return The name of the dj who remixed the selected song.
2126 ///     @todo So maybe rather than a row each have one entry for Role.XXXXX with composer\, arranger etc. as listed values
2127 ///     @note MusicPlayer.Property(Role.any_custom_role) also works\,
2128 ///     where any_custom_role could be an instrument violin or some other production activity e.g. sound engineer.
2129 ///     The roles listed (composer\, arranger etc.) are standard ones but there are many possible.
2130 ///     Music file tagging allows for the musicians and all other people involved in the recording to be added\, Kodi
2131 ///     will gathers and stores that data\, and it is availlable to GUI.
2132 ///     <p><hr>
2133 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Property_Role_Mixer `MusicPlayer.Property(Role.Mixer)`\endlink
2134 ///     <p>
2135 ///   }
2136 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Mood)`</b>,
2137 ///                  \anchor MusicPlayer_Property_Album_Mood
2138 ///                  _string_,
2139 ///     @return the moods of the currently playing Album
2140 ///     <p>
2141 ///   }
2142 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Style)`</b>,
2143 ///                  \anchor MusicPlayer_Property_Album_Style
2144 ///                  _string_,
2145 ///     @return the styles of the currently playing Album.
2146 ///     <p>
2147 ///   }
2148 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Theme)`</b>,
2149 ///                  \anchor MusicPlayer_Property_Album_Theme
2150 ///                  _string_,
2151 ///     @return The themes of the currently playing Album
2152 ///     <p>
2153 ///   }
2154 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Type)`</b>,
2155 ///                  \anchor MusicPlayer_Property_Album_Type
2156 ///                  _string_,
2157 ///     @return The album type (e.g. compilation\, enhanced\, explicit lyrics) of the
2158 ///     currently playing album.
2159 ///     <p>
2160 ///   }
2161 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Label)`</b>,
2162 ///                  \anchor MusicPlayer_Property_Album_Label
2163 ///                  _string_,
2164 ///     @return The record label of the currently playing album.
2165 ///     <p>
2166 ///   }
2167 ///   \table_row3{   <b>`MusicPlayer.Property(Album_Description)`</b>,
2168 ///                  \anchor MusicPlayer_Property_Album_Description
2169 ///                  _string_,
2170 ///     @return A review of the currently playing album
2171 ///     <p>
2172 ///   }
2173 ///   \table_row3{   <b>`MusicPlayer.Artist`</b>,
2174 ///                  \anchor MusicPlayer_Artist
2175 ///                  _string_,
2176 ///     @return Artist(s) of current song.
2177 ///     <p>
2178 ///   }
2179 ///   \table_row3{   <b>`MusicPlayer.offset(number).Artist`</b>,
2180 ///                  \anchor MusicPlayer_Offset_Artist
2181 ///                  _string_,
2182 ///     @return Artist(s) of the song which has an offset `number` with respect
2183 ///     to the current playing song.
2184 ///     @param number - the offset of the song with respect to the current
2185 ///     playing song
2186 ///     <p>
2187 ///   }
2188 ///   \table_row3{   <b>`MusicPlayer.Position(number).Artist`</b>,
2189 ///                  \anchor MusicPlayer_Position_Artist
2190 ///                  _string_,
2191 ///     @return Artist(s) of the song which has an offset `number` with respect
2192 ///     to the start of the playlist.
2193 ///     @param number - the offset of the song with respect to
2194 ///     the start of the playlist
2195 ///     <p>
2196 ///   }
2197 ///   \table_row3{   <b>`MusicPlayer.AlbumArtist`</b>,
2198 ///                  \anchor MusicPlayer_AlbumArtist
2199 ///                  _string_,
2200 ///     @return The album artist of the currently playing song.
2201 ///     <p>
2202 ///   }
2203 ///   \table_row3{   <b>`MusicPlayer.Cover`</b>,
2204 ///                  \anchor MusicPlayer_Cover
2205 ///                  _string_,
2206 ///     @return The album cover of currently playing song.
2207 ///     <p>
2208 ///   }
2209 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Sortname)`</b>,
2210 ///                  \anchor MusicPlayer_Property_Artist_Sortname
2211 ///                  _string_,
2212 ///     @return The sortname of the currently playing Artist.
2213 ///     <p><hr>
2214 ///     @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Sortname `MusicPlayer.Property(Artist_Sortname)`\endlink
2215 ///     <p>
2216 ///   }
2217 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Type)`</b>,
2218 ///                  \anchor MusicPlayer_Property_Artist_Type
2219 ///                  _string_,
2220 ///     @return The type of the currently playing Artist - person\,
2221 ///     group\, orchestra\, choir etc.
2222 ///     <p><hr>
2223 ///     @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Type `MusicPlayer.Property(Artist_Type)`\endlink
2224 ///     <p>
2225 ///   }
2226 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Gender)`</b>,
2227 ///                  \anchor MusicPlayer_Property_Artist_Gender
2228 ///                  _string_,
2229 ///     @return The gender of the currently playing Artist - male\,
2230 ///     female\, other.
2231 ///     <p><hr>
2232 ///     @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Gender `MusicPlayer.Property(Artist_Gender)`\endlink
2233 ///     <p>
2234 ///   }
2235 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Disambiguation)`</b>,
2236 ///                  \anchor MusicPlayer_Property_Artist_Disambiguation
2237 ///                  _string_,
2238 ///     @return A brief description of the currently playing Artist that differentiates them
2239 ///     from others with the same name.
2240 ///     <p><hr>
2241 ///     @skinning_v18 **[New Infolabel]** \link MusicPlayer_Property_Artist_Disambiguation `MusicPlayer.Property(Artist_Disambiguation)`\endlink
2242 ///     <p>
2243 ///   }
2244 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Born)`</b>,
2245 ///                  \anchor MusicPlayer_Property_Artist_Born
2246 ///                  _string_,
2247 ///     @return The date of Birth of the currently playing Artist.
2248 ///     <p>
2249 ///   }
2250 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Died)`</b>,
2251 ///                  \anchor MusicPlayer_Property_Artist_Died
2252 ///                  _string_,
2253 ///     @return The date of Death of the currently playing Artist.
2254 ///     <p>
2255 ///   }
2256 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Formed)`</b>,
2257 ///                  \anchor MusicPlayer_Property_Artist_Formed
2258 ///                  _string_,
2259 ///     @return The Formation date of the currently playing Artist/Band.
2260 ///     <p>
2261 ///   }
2262 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Disbanded)`</b>,
2263 ///                  \anchor MusicPlayer_Property_Artist_Disbanded
2264 ///                  _string_,
2265 ///     @return The disbanding date of the currently playing Artist/Band.
2266 ///     <p>
2267 ///   }
2268 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_YearsActive)`</b>,
2269 ///                  \anchor MusicPlayer_Property_Artist_YearsActive
2270 ///                  _string_,
2271 ///     @return The years the currently Playing artist has been active.
2272 ///     <p>
2273 ///   }
2274 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Instrument)`</b>,
2275 ///                  \anchor MusicPlayer_Property_Artist_Instrument
2276 ///                  _string_,
2277 ///     @return The instruments played by the currently playing artist.
2278 ///     <p>
2279 ///   }
2280 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Description)`</b>,
2281 ///                  \anchor MusicPlayer_Property_Artist_Description
2282 ///                  _string_,
2283 ///     @return A biography of the currently playing artist.
2284 ///     <p>
2285 ///   }
2286 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Mood)`</b>,
2287 ///                  \anchor MusicPlayer_Property_Artist_Mood
2288 ///                  _string_,
2289 ///     @return The moods of the currently playing artist.
2290 ///     <p>
2291 ///   }
2292 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Style)`</b>,
2293 ///                  \anchor MusicPlayer_Property_Artist_Style
2294 ///                  _string_,
2295 ///     @return The styles of the currently playing artist.
2296 ///     <p>
2297 ///   }
2298 ///   \table_row3{   <b>`MusicPlayer.Property(Artist_Genre)`</b>,
2299 ///                  \anchor MusicPlayer_Property_Artist_Genre
2300 ///                  _string_,
2301 ///     @return The genre of the currently playing artist.
2302 ///     <p>
2303 ///   }
2304 ///   \table_row3{   <b>`MusicPlayer.Genre`</b>,
2305 ///                  \anchor MusicPlayer_Genre
2306 ///                  _string_,
2307 ///     @return The genre(s) of current song.
2308 ///     <p>
2309 ///   }
2310 ///   \table_row3{   <b>`MusicPlayer.offset(number).Genre`</b>,
2311 ///                  \anchor MusicPlayer_OffSet_Genre
2312 ///                  _string_,
2313 ///     @return The genre(s) of the song with an offset `number` with respect
2314 ///     to the current playing song.
2315 ///     @param number - the offset song number with respect to the current playing
2316 ///     song.
2317 ///     <p>
2318 ///   }
2319 ///   \table_row3{   <b>`MusicPlayer.Position(number).Genre`</b>,
2320 ///                  \anchor MusicPlayer_Position_Genre
2321 ///                  _string_,
2322 ///     @return The genre(s) of the song with an offset `number` with respect
2323 ///     to the start of the playlist.
2324 ///     @param number - the offset song number with respect to the start of the
2325 ///     playlist
2326 ///     song.
2327 ///     <p>
2328 ///   }
2329 ///   \table_row3{   <b>`MusicPlayer.Lyrics`</b>,
2330 ///                  \anchor MusicPlayer_Lyrics
2331 ///                  _string_,
2332 ///     @return The lyrics of current song stored in ID tag info.
2333 ///     <p>
2334 ///   }
2335 ///   \table_row3{   <b>`MusicPlayer.Year`</b>,
2336 ///                  \anchor MusicPlayer_Year
2337 ///                  _string_,
2338 ///     @return The year of release of current song.
2339 ///     <p>
2340 ///   }
2341 ///   \table_row3{   <b>`MusicPlayer.offset(number).Year`</b>,
2342 ///                  \anchor MusicPlayer_Offset_Year
2343 ///                  _string_,
2344 ///     @return The year of release of the song with an offset `number` with
2345 ///     respect to the current playing song.
2346 ///     @param number - the offset numbet with respect to the current song.
2347 ///     <p>
2348 ///   }
2349 ///   \table_row3{   <b>`MusicPlayer.Position(number).Year`</b>,
2350 ///                  \anchor MusicPlayer_Position_Year
2351 ///                  _string_,
2352 ///     @return The year of release of the song with an offset `number` with
2353 ///     respect to the start of the playlist.
2354 ///     @param number - the offset numbet with respect to the start of the
2355 ///     playlist.
2356 ///     <p>
2357 ///   }
2358 ///   \table_row3{   <b>`MusicPlayer.Rating`</b>,
2359 ///                  \anchor MusicPlayer_Rating
2360 ///                  _string_,
2361 ///     @return The numeric Rating of current song (1-10).
2362 ///     <p>
2363 ///   }
2364 ///   \table_row3{   <b>`MusicPlayer.offset(number).Rating`</b>,
2365 ///                  \anchor MusicPlayer_OffSet_Rating
2366 ///                  _string_,
2367 ///     @return The numeric Rating of song with an offset `number` with
2368 ///     respect to the current playing song.
2369 ///     @param number - the offset with respect to the current playing song
2370 ///     <p>
2371 ///   }
2372 ///   \table_row3{   <b>`MusicPlayer.Position(number).Rating`</b>,
2373 ///                  \anchor MusicPlayer_Position_Rating
2374 ///                  _string_,
2375 ///     @return The numeric Rating of song with an offset `number` with
2376 ///     respect to the start of the playlist.
2377 ///     @param number - the offset with respect to the start of the playlist
2378 ///     <p>
2379 ///   }
2380 ///   \table_row3{   <b>`MusicPlayer.RatingAndVotes`</b>,
2381 ///                  \anchor MusicPlayer_RatingAndVotes
2382 ///                  _string_,
2383 ///     @return The scraped rating and votes of currently playing song\, if it's in the database.
2384 ///     <p>
2385 ///   }
2386 ///   \table_row3{   <b>`MusicPlayer.UserRating`</b>,
2387 ///                  \anchor MusicPlayer_UserRating
2388 ///                  _string_,
2389 ///     @return The scraped rating of the currently playing song (1-10).
2390 ///     <p><hr>
2391 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_UserRating `MusicPlayer.UserRating`\endlink
2392 ///     <p>
2393 ///   }
2394 ///   \table_row3{   <b>`MusicPlayer.Votes`</b>,
2395 ///                  \anchor MusicPlayer_Votes
2396 ///                  _string_,
2397 ///     @return The scraped votes of currently playing song\, if it's in the database.
2398 ///     <p>
2399 ///   }
2400 ///   \table_row3{   <b>`MusicPlayer.DiscNumber`</b>,
2401 ///                  \anchor MusicPlayer_DiscNumber
2402 ///                  _string_,
2403 ///     @return The Disc Number of current song stored in ID tag info.
2404 ///     <p>
2405 ///   }
2406 ///   \table_row3{   <b>`MusicPlayer.offset(number).DiscNumber`</b>,
2407 ///                  \anchor MusicPlayer_Offset_DiscNumber
2408 ///                  _string_,
2409 ///     @return The Disc Number of current song stored in ID tag info for the
2410 ///     song with an offset `number` with respect to the playing song.
2411 ///     @param number - The offset value for the song with respect to the
2412 ///     playing song.
2413 ///     <p>
2414 ///   }
2415 ///   \table_row3{   <b>`MusicPlayer.Position(number).DiscNumber`</b>,
2416 ///                  \anchor MusicPlayer_Position_DiscNumber
2417 ///                  _string_,
2418 ///     @return The Disc Number of current song stored in ID tag info for the
2419 ///     song with an offset `number` with respect to the start of the playlist.
2420 ///     @param number - The offset value for the song with respect to the
2421 ///     start of the playlist.
2422 ///     <p>
2423 ///   }
2424 ///   \table_row3{   <b>`MusicPlayer.Comment`</b>,
2425 ///                  \anchor MusicPlayer_Comment
2426 ///                  _string_,
2427 ///     @return The Comment of current song stored in ID tag info.
2428 ///     <p>
2429 ///   }
2430 ///   \table_row3{   <b>`MusicPlayer.offset(number).Comment`</b>,
2431 ///                  \anchor MusicPlayer_Offset_Comment
2432 ///                  _string_,
2433 ///     @return The Comment of current song stored in ID tag info for the
2434 ///     song with an offset `number` with respect to the playing song.
2435 ///     @param number - The offset value for the song with respect to the
2436 ///     playing song.
2437 ///     <p>
2438 ///   }
2439 ///   \table_row3{   <b>`MusicPlayer.Position(number).Comment`</b>,
2440 ///                  \anchor MusicPlayer_Position_Comment
2441 ///                  _string_,
2442 ///     @return The Comment of current song stored in ID tag info for the
2443 ///     song with an offset `number` with respect to the start of the playlist.
2444 ///     @param number - The offset value for the song with respect to the
2445 ///     start of the playlist.
2446 ///     <p>
2447 ///   }
2448 ///   \table_row3{   <b>`MusicPlayer.Contributors`</b>,
2449 ///                  \anchor MusicPlayer_Contributors
2450 ///                  _string_,
2451 ///     @return The list of all people who've contributed to the currently playing song
2452 ///     <p><hr>
2453 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Contributors `MusicPlayer.Contributors`\endlink
2454 ///     <p>
2455 ///   }
2456 ///   \table_row3{   <b>`MusicPlayer.ContributorAndRole`</b>,
2457 ///                  \anchor MusicPlayer_ContributorAndRole
2458 ///                  _string_,
2459 ///     @return The list of all people and their role who've contributed to the currently playing song.
2460 ///     <p><hr>
2461 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_ContributorAndRole `MusicPlayer.ContributorAndRole`\endlink
2462 ///     <p>
2463 ///   }
2464 ///   \table_row3{   <b>`MusicPlayer.Mood`</b>,
2465 ///                  \anchor MusicPlayer_Mood
2466 ///                  _string_,
2467 ///     @return The mood of the currently playing song.
2468 ///     <p><hr>
2469 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_Mood `MusicPlayer.Mood`\endlink
2470 ///     <p>
2471 ///   }
2472 ///   \table_row3{   <b>`MusicPlayer.PlaylistPlaying`</b>,
2473 ///                  \anchor MusicPlayer_PlaylistPlaying
2474 ///                  _boolean_,
2475 ///     @return **True** if a playlist is currently playing.
2476 ///     <p>
2477 ///   }
2478 ///   \table_row3{   <b>`MusicPlayer.Exists(relative\,position)`</b>,
2479 ///                  \anchor MusicPlayer_Exists
2480 ///                  _boolean_,
2481 ///     @return **True** if the currently playing playlist has a song queued at the given position.
2482 ///     @param relative - bool - If the position is relative
2483 ///     @param position - int - The position of the song
2484 ///     @note It is possible to define whether the position is relative or not\, default is false.
2485 ///     <p>
2486 ///   }
2487 ///   \table_row3{   <b>`MusicPlayer.HasPrevious`</b>,
2488 ///                  \anchor MusicPlayer_HasPrevious
2489 ///                  _boolean_,
2490 ///     @return **True** if the music player has a a Previous Song in the Playlist.
2491 ///     <p>
2492 ///   }
2493 ///   \table_row3{   <b>`MusicPlayer.HasNext`</b>,
2494 ///                  \anchor MusicPlayer_HasNext
2495 ///                  _boolean_,
2496 ///     @return **True** if the music player has a next song queued in the Playlist.
2497 ///     <p>
2498 ///   }
2499 ///   \table_row3{   <b>`MusicPlayer.PlayCount`</b>,
2500 ///                  \anchor MusicPlayer_PlayCount
2501 ///                  _integer_,
2502 ///     @return The play count of currently playing song\, if it's in the database.
2503 ///     <p>
2504 ///   }
2505 ///   \table_row3{   <b>`MusicPlayer.LastPlayed`</b>,
2506 ///                  \anchor MusicPlayer_LastPlayed
2507 ///                  _string_,
2508 ///     @return The last play date of currently playing song\, if it's in the database.
2509 ///     <p>
2510 ///   }
2511 ///   \table_row3{   <b>`MusicPlayer.TrackNumber`</b>,
2512 ///                  \anchor MusicPlayer_TrackNumber
2513 ///                  _string_,
2514 ///     @return The track number of current song.
2515 ///     <p>
2516 ///   }
2517 ///   \table_row3{   <b>`MusicPlayer.offset(number).TrackNumber`</b>,
2518 ///                  \anchor MusicPlayer_Offset_TrackNumber
2519 ///                  _string_,
2520 ///     @return The track number of the song with an offset `number`
2521 ///     with respect to the current playing song.
2522 ///     @param number - The offset number of the song with respect to the
2523 ///     playing song
2524 ///     <p>
2525 ///   }
2526 ///   \table_row3{   <b>`MusicPlayer.Position(number).TrackNumber`</b>,
2527 ///                  \anchor MusicPlayer_Position_TrackNumber
2528 ///                  _string_,
2529 ///     @return The track number of the song with an offset `number`
2530 ///     with respect to start of the playlist.
2531 ///     @param number - The offset number of the song with respect
2532 ///     to start of the playlist
2533 ///     <p>
2534 ///   }
2535 ///   \table_row3{   <b>`MusicPlayer.Duration`</b>,
2536 ///                  \anchor MusicPlayer_Duration
2537 ///                  _string_,
2538 ///     @return The duration of the current song.
2539 ///     <p>
2540 ///   }
2541 ///   \table_row3{   <b>`MusicPlayer.offset(number).Duration`</b>,
2542 ///                  \anchor MusicPlayer_Offset_Duration
2543 ///                  _string_,
2544 ///     @return The duration of the song with an offset `number`
2545 ///     with respect to the current playing song.
2546 ///     @param number - the offset number of the song with respect
2547 ///     to the current playing song
2548 ///     <p>
2549 ///   }
2550 ///   \table_row3{   <b>`MusicPlayer.Position(number).Duration`</b>,
2551 ///                  \anchor MusicPlayer_Position_Duration
2552 ///                  _string_,
2553 ///     @return The duration of the song with an offset `number`
2554 ///     with respect to the start of the playlist.
2555 ///     @param number - the offset number of the song with respect
2556 ///     to the start of the playlist
2557 ///     <p>
2558 ///   }
2559 ///   \table_row3{   <b>`MusicPlayer.BitRate`</b>,
2560 ///                  \anchor MusicPlayer_BitRate
2561 ///                  _string_,
2562 ///     @return The bitrate of current song.
2563 ///     <p>
2564 ///   }
2565 ///   \table_row3{   <b>`MusicPlayer.Channels`</b>,
2566 ///                  \anchor MusicPlayer_Channels
2567 ///                  _string_,
2568 ///     @return The number of channels of current song.
2569 ///     <p>
2570 ///   }
2571 ///   \table_row3{   <b>`MusicPlayer.BitsPerSample`</b>,
2572 ///                  \anchor MusicPlayer_BitsPerSample
2573 ///                  _string_,
2574 ///     @return The number of bits per sample of current song.
2575 ///     <p>
2576 ///   }
2577 ///   \table_row3{   <b>`MusicPlayer.SampleRate`</b>,
2578 ///                  \anchor MusicPlayer_SampleRate
2579 ///                  _string_,
2580 ///     @return The samplerate of current playing song.
2581 ///     <p>
2582 ///   }
2583 ///   \table_row3{   <b>`MusicPlayer.Codec`</b>,
2584 ///                  \anchor MusicPlayer_Codec
2585 ///                  _string_,
2586 ///     @return The codec of current playing song.
2587 ///     <p>
2588 ///   }
2589 ///   \table_row3{   <b>`MusicPlayer.PlaylistPosition`</b>,
2590 ///                  \anchor MusicPlayer_PlaylistPosition
2591 ///                  _string_,
2592 ///     @return The position of the current song in the current music playlist.
2593 ///     <p>
2594 ///   }
2595 ///   \table_row3{   <b>`MusicPlayer.PlaylistLength`</b>,
2596 ///                  \anchor MusicPlayer_PlaylistLength
2597 ///                  _string_,
2598 ///     @return The total size of the current music playlist.
2599 ///     <p>
2600 ///   }
2601 ///   \table_row3{   <b>`MusicPlayer.ChannelName`</b>,
2602 ///                  \anchor MusicPlayer_ChannelName
2603 ///                  _string_,
2604 ///     @return The channel name of the radio programme that's currently playing (PVR).
2605 ///     <p>
2606 ///   }
2607 ///   \table_row3{   <b>`MusicPlayer.ChannelNumberLabel`</b>,
2608 ///                  \anchor MusicPlayer_ChannelNumberLabel
2609 ///                  _string_,
2610 ///     @return The channel and subchannel number of the radio channel that's currently
2611 ///     playing (PVR).
2612 ///     <p><hr>
2613 ///     @skinning_v14 **[New Infolabel]** \link MusicPlayer_ChannelNumberLabel `MusicPlayer.ChannelNumberLabel`\endlink
2614 ///     <p>
2615 ///   }
2616 ///   \table_row3{   <b>`MusicPlayer.ChannelGroup`</b>,
2617 ///                  \anchor MusicPlayer_ChannelGroup
2618 ///                  _string_,
2619 ///     @return The channel group of the radio programme that's currently playing (PVR).
2620 ///     <p>
2621 ///   }
2622 ///   \table_row3{   <b>`MusicPlayer.Property(propname)`</b>,
2623 ///                  \anchor MusicPlayer_Property_Propname
2624 ///                  _string_,
2625 ///     @return The requested property value of the currently playing item.
2626 ///     @param propname - The requested property
2627 ///     <p>
2628 ///   }
2629 ///   \table_row3{   <b>`MusicPlayer.DBID`</b>,
2630 ///                  \anchor MusicPlayer_DBID
2631 ///                  _string_,
2632 ///     @return The database id of the currently playing song.
2633 ///     <p><hr>
2634 ///     @skinning_v17 **[New Infolabel]** \link MusicPlayer_DBID `MusicPlayer.DBID`\endlink
2635 ///     <p>
2636 ///   }
2637 ///   \table_row3{   <b>`MusicPlayer.DiscTitle`</b>,
2638 ///                  \anchor MusicPlayer_DiscTitle
2639 ///                  _string_,
2640 ///     @return The title of the disc currently playing.
2641 ///     <p><hr>
2642 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_DiscTitle `MusicPlayer.DiscTitle`\endlink
2643 ///     <p>
2644 ///   }
2645 ///   \table_row3{   <b>`MusicPlayer.ReleaseDate`</b>,
2646 ///                  \anchor MusicPlayer_ReleaseDate
2647 ///                  _string_,
2648 ///     @return The release date of the song currently playing.
2649 ///     <p><hr>
2650 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_ReleaseDate `MusicPlayer.ReleaseDate`\endlink
2651 ///     <p>
2652 ///   }
2653 ///   \table_row3{   <b>`MusicPlayer.OriginalDate`</b>,
2654 ///                  \anchor MusicPlayer_OriginalDate
2655 ///                  _string_,
2656 ///     @return The original release date of the song currently playing.
2657 ///     <p><hr>
2658 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_OriginalDate `MusicPlayer.OriginalDate`\endlink
2659 ///     <p>
2660 ///   }
2661 ///   \table_row3{   <b>`MusicPlayer.BPM`</b>,
2662 ///                  \anchor MusicPlayer_BPM
2663 ///                  _string_,
2664 ///     @return The bpm of the track currently playing.
2665 ///     <p><hr>
2666 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_BPM `MusicPlayer.BPM`\endlink
2667 ///     <p>
2668 ///   }
2669 ///   \table_row3{   <b>`MusicPlayer.IsMultiDisc`</b>,
2670 ///                  \anchor MusicPlayer_IsMultiDisc
2671 ///                  _boolean_,
2672 ///     @return Returns **true** if the album currently playing has more than one disc.
2673 ///     <p><hr>
2674 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_IsMultiDisc `MusicPlayer.IsMultiDisc`\endlink
2675 ///     <p>
2676 ///   }
2677 ///   \table_row3{   <b>`MusicPlayer.TotalDiscs`</b>,
2678 ///                  \anchor MusicPlayer_TotalDiscs
2679 ///                  _string_,
2680 ///     @return The number of discs associated with the currently playing album.
2681 ///     <p><hr>
2682 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_TotalDiscs `MusicPlayer.TotalDiscs`\endlink
2683 ///     <p>
2684 ///   }
2685 ///   \table_row3{   <b>`MusicPlayer.Station`</b>,
2686 ///                  \anchor MusicPlayer_Station
2687 ///                  _string_,
2688 ///     @return The name of the radio station currently playing (if available).
2689 ///     <p><hr>
2690 ///     @skinning_v19 **[New Infolabel]** \link MusicPlayer_Station `MusicPlayer.Station`\endlink
2691 ///     <p>
2692 ///   }
2693 /// \table_end
2694 ///
2695 /// -----------------------------------------------------------------------------
2696 const infomap musicplayer[] =    {{ "title",            MUSICPLAYER_TITLE },
2697                                   { "album",            MUSICPLAYER_ALBUM },
2698                                   { "artist",           MUSICPLAYER_ARTIST },
2699                                   { "albumartist",      MUSICPLAYER_ALBUM_ARTIST },
2700                                   { "year",             MUSICPLAYER_YEAR },
2701                                   { "genre",            MUSICPLAYER_GENRE },
2702                                   { "duration",         MUSICPLAYER_DURATION },
2703                                   { "tracknumber",      MUSICPLAYER_TRACK_NUMBER },
2704                                   { "cover",            MUSICPLAYER_COVER },
2705                                   { "bitrate",          MUSICPLAYER_BITRATE },
2706                                   { "playlistlength",   MUSICPLAYER_PLAYLISTLEN },
2707                                   { "playlistposition", MUSICPLAYER_PLAYLISTPOS },
2708                                   { "channels",         MUSICPLAYER_CHANNELS },
2709                                   { "bitspersample",    MUSICPLAYER_BITSPERSAMPLE },
2710                                   { "samplerate",       MUSICPLAYER_SAMPLERATE },
2711                                   { "codec",            MUSICPLAYER_CODEC },
2712                                   { "discnumber",       MUSICPLAYER_DISC_NUMBER },
2713                                   { "disctitle",        MUSICPLAYER_DISC_TITLE },
2714                                   { "rating",           MUSICPLAYER_RATING },
2715                                   { "ratingandvotes",   MUSICPLAYER_RATING_AND_VOTES },
2716                                   { "userrating",       MUSICPLAYER_USER_RATING },
2717                                   { "votes",            MUSICPLAYER_VOTES },
2718                                   { "comment",          MUSICPLAYER_COMMENT },
2719                                   { "mood",             MUSICPLAYER_MOOD },
2720                                   { "contributors",     MUSICPLAYER_CONTRIBUTORS },
2721                                   { "contributorandrole", MUSICPLAYER_CONTRIBUTOR_AND_ROLE },
2722                                   { "lyrics",           MUSICPLAYER_LYRICS },
2723                                   { "playlistplaying",  MUSICPLAYER_PLAYLISTPLAYING },
2724                                   { "exists",           MUSICPLAYER_EXISTS },
2725                                   { "hasprevious",      MUSICPLAYER_HASPREVIOUS },
2726                                   { "hasnext",          MUSICPLAYER_HASNEXT },
2727                                   { "playcount",        MUSICPLAYER_PLAYCOUNT },
2728                                   { "lastplayed",       MUSICPLAYER_LASTPLAYED },
2729                                   { "channelname",      MUSICPLAYER_CHANNEL_NAME },
2730                                   { "channelnumberlabel", MUSICPLAYER_CHANNEL_NUMBER },
2731                                   { "channelgroup",     MUSICPLAYER_CHANNEL_GROUP },
2732                                   { "dbid",             MUSICPLAYER_DBID },
2733                                   { "property",         MUSICPLAYER_PROPERTY },
2734                                   { "releasedate",      MUSICPLAYER_RELEASEDATE },
2735                                   { "originaldate",     MUSICPLAYER_ORIGINALDATE },
2736                                   { "bpm",              MUSICPLAYER_BPM },
2737                                   { "ismultidisc",      MUSICPLAYER_ISMULTIDISC },
2738                                   { "totaldiscs",       MUSICPLAYER_TOTALDISCS },
2739                                   { "station",          MUSICPLAYER_STATIONNAME }
2740 };
2741 
2742 /// \page modules__infolabels_boolean_conditions
2743 /// \subsection modules__infolabels_boolean_conditions_Videoplayer Video player
2744 /// \table_start
2745 ///   \table_h3{ Labels, Type, Description }
2746 ///   \table_row3{   <b>`VideoPlayer.UsingOverlays`</b>,
2747 ///                  \anchor VideoPlayer_UsingOverlays
2748 ///                  _boolean_,
2749 ///     @return **True** if the video player is using the hardware overlays render
2750 ///     method.
2751 ///     @note This is useful\, as with hardware overlays you have no alpha blending to
2752 ///     the video image\, so shadows etc. need redoing\, or disabling.
2753 ///     <p>
2754 ///   }
2755 ///   \table_row3{   <b>`VideoPlayer.IsFullscreen`</b>,
2756 ///                  \anchor VideoPlayer_IsFullscreen
2757 ///                  _boolean_,
2758 ///     @return **True** if the video player is in fullscreen mode.
2759 ///     <p>
2760 ///   }
2761 ///   \table_row3{   <b>`VideoPlayer.HasMenu`</b>,
2762 ///                  \anchor VideoPlayer_HasMenu
2763 ///                  _boolean_,
2764 ///     @return **True** if the video player has a menu (ie is playing a DVD).
2765 ///     <p>
2766 ///   }
2767 ///   \table_row3{   <b>`VideoPlayer.HasInfo`</b>,
2768 ///                  \anchor VideoPlayer_HasInfo
2769 ///                  _boolean_,
2770 ///     @return **True** if the current playing video has information from the
2771 ///     library or from a plugin (eg director/plot etc.)
2772 ///     <p>
2773 ///   }
2774 ///   \table_row3{   <b>`VideoPlayer.Content(parameter)`</b>,
2775 ///                  \anchor VideoPlayer_Content
2776 ///                  _boolean_,
2777 ///     @return **True** if the current Video you are playing is contained in
2778 ///     corresponding Video Library sections. The following values are accepted:
2779 ///     - <b>files</b>
2780 ///     - <b>movies</b>
2781 ///     - <b>episodes</b>
2782 ///     - <b>musicvideos</b>
2783 ///     - <b>livetv</b>
2784 ///     <p>
2785 ///   }
2786 ///   \table_row3{   <b>`VideoPlayer.HasSubtitles`</b>,
2787 ///                  \anchor VideoPlayer_HasSubtitles
2788 ///                  _boolean_,
2789 ///     @return **True** if there are subtitles available for video.
2790 ///     <p>
2791 ///   }
2792 ///   \table_row3{   <b>`VideoPlayer.HasTeletext`</b>,
2793 ///                  \anchor VideoPlayer_HasTeletext
2794 ///                  _boolean_,
2795 ///     @return **True** if teletext is usable on played TV channel.
2796 ///     <p>
2797 ///   }
2798 ///   \table_row3{   <b>`VideoPlayer.IsStereoscopic`</b>,
2799 ///                  \anchor VideoPlayer_IsStereoscopic
2800 ///                  _boolean_,
2801 ///     @return **True** when the currently playing video is a 3D (stereoscopic)
2802 ///     video.
2803 ///     <p><hr>
2804 ///     @skinning_v13 **[New Boolean Condition]** \link VideoPlayer_IsStereoscopic `VideoPlayer.IsStereoscopic`\endlink
2805 ///     <p>
2806 ///   }
2807 ///   \table_row3{   <b>`VideoPlayer.SubtitlesEnabled`</b>,
2808 ///                  \anchor VideoPlayer_SubtitlesEnabled
2809 ///                  _boolean_,
2810 ///     @return **True** if subtitles are turned on for video.
2811 ///     <p>
2812 ///   }
2813 ///   \table_row3{   <b>`VideoPlayer.HasEpg`</b>,
2814 ///                  \anchor VideoPlayer_HasEpg
2815 ///                  _boolean_,
2816 ///     @return **True** if epg information is available for the currently playing
2817 ///     programme (PVR).
2818 ///     <p>
2819 ///   }
2820 ///   \table_row3{   <b>`VideoPlayer.CanResumeLiveTV`</b>,
2821 ///                  \anchor VideoPlayer_CanResumeLiveTV
2822 ///                  _boolean_,
2823 ///     @return **True** if a in-progress PVR recording is playing an the respective
2824 ///     live TV channel is available.
2825 ///     <p>
2826 ///   }
2827 ///   \table_row3{   <b>`VideoPlayer.Title`</b>,
2828 ///                  \anchor VideoPlayer_Title
2829 ///                  _string_,
2830 ///     @return The title of currently playing video.
2831 ///     @note If it's in the database it will return the database title\, else the filename.
2832 ///     <p>
2833 ///   }
2834 ///   \table_row3{   <b>`VideoPlayer.offset(number).Title`</b>,
2835 ///                  \anchor VideoPlayer_Offset_Title
2836 ///                  _string_,
2837 ///     @return The title of video which has an offset `number` with respect to the currently playing video.
2838 ///     @note If it's in the database it will return the database title\, else the filename.
2839 ///     <p><hr>
2840 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Title `VideoPlayer.offset(number).Title`\endlink
2841 ///     <p>
2842 ///   }
2843 ///   \table_row3{   <b>`VideoPlayer.position(number).Title`</b>,
2844 ///                  \anchor VideoPlayer_Position_Title
2845 ///                  _string_,
2846 ///     @return The title of the video which has an offset `number` with respect to the start of the playlist.
2847 ///     @note If it's in the database it will return the database title\, else the filename.
2848 ///     <p>><hr>
2849 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Title `VideoPlayer.position(number).Title`\endlink
2850 ///     <p>
2851 ///   }
2852 ///   \table_row3{   <b>`VideoPlayer.OriginalTitle`</b>,
2853 ///                  \anchor VideoPlayer_OriginalTitle
2854 ///                  _string_,
2855 ///     @return The original title of currently playing video. If it's in the database.
2856 ///     <p>
2857 ///   }
2858 ///   \table_row3{   <b>`VideoPlayer.offset(number).OriginalTitle`</b>,
2859 ///                  \anchor VideoPlayer_Offset_OriginalTitle
2860 ///                  _string_,
2861 ///     @return The original title of the video which has an offset `number` with respect to the currently playing video.
2862 ///     <p><hr>
2863 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_OriginalTitle `VideoPlayer.offset(number).OriginalTitle`\endlink
2864 ///     <p>
2865 ///   }
2866 ///   \table_row3{   <b>`VideoPlayer.position(number).OriginalTitle`</b>,
2867 ///                  \anchor VideoPlayer_Position_OriginalTitle
2868 ///                  _string_,
2869 ///     @return The original title of the video which has an offset `number` with respect to the start of the playlist.
2870 ///     <p><hr>
2871 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_OriginalTitle `VideoPlayer.position(number).OriginalTitle`\endlink
2872 ///     <p>
2873 ///   }
2874 ///   \table_row3{   <b>`VideoPlayer.TVShowTitle`</b>,
2875 ///                  \anchor VideoPlayer_TVShowTitle
2876 ///                  _string_,
2877 ///     @return The title of currently playing episode's tvshow name.
2878 ///     <p>
2879 ///   }
2880 ///   \table_row3{   <b>`VideoPlayer.offset(number).TVShowTitle`</b>,
2881 ///                  \anchor VideoPlayer_Offset_TVShowTitle
2882 ///                  _string_,
2883 ///     @return The title of the episode's tvshow name which has an offset `number` with respect to the currently playing video.
2884 ///     <p><hr>
2885 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_TVShowTitle `VideoPlayer.offset(number).TVShowTitle`\endlink
2886 ///     <p>
2887 ///   }
2888 ///   \table_row3{   <b>`VideoPlayer.position(number).TVShowTitle`</b>,
2889 ///                  \anchor VideoPlayer_Position_TVShowTitle
2890 ///                  _string_,
2891 ///     @return The title of the episode's tvshow name which has an offset `number` with respect to the start of the playlist.
2892 ///     <p><hr>
2893 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_TVShowTitle `VideoPlayer.position(number).TVShowTitle`\endlink
2894 ///     <p>
2895 ///   }
2896 ///   \table_row3{   <b>`VideoPlayer.Season`</b>,
2897 ///                  \anchor VideoPlayer_Season
2898 ///                  _string_,
2899 ///     @return The season number of the currently playing episode\, if it's in the database.
2900 ///     <p><hr>
2901 ///     @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Season `VideoPlayer.Season`\endlink
2902 ///     also supports EPG.
2903 ///     <p>
2904 ///   }
2905 ///   \table_row3{   <b>`VideoPlayer.offset(number).Season`</b>,
2906 ///                  \anchor VideoPlayer_Offset_Season
2907 ///                  _string_,
2908 ///     @return The season number of the episode which has an offset `number` with respect to the currently playing video.
2909 ///     <p><hr>
2910 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Season `VideoPlayer.offset(number).Season`\endlink
2911 ///     <p>
2912 ///   }
2913 ///   \table_row3{   <b>`VideoPlayer.position(number).Season`</b>,
2914 ///                  \anchor VideoPlayer_Position_Season
2915 ///                  _string_,
2916 ///     @return The season number of the episode which has an offset `number` with respect to the start of the playlist.
2917 ///     <p><hr>
2918 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Season `VideoPlayer.position(number).Season`\endlink
2919 ///     <p>
2920 ///   }
2921 ///   \table_row3{   <b>`VideoPlayer.Episode`</b>,
2922 ///                  \anchor VideoPlayer_Episode
2923 ///                  _string_,
2924 ///     @return The episode number of the currently playing episode.
2925 ///     <p><hr>
2926 ///     @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Episode `VideoPlayer.Episode`\endlink
2927 ///     also supports EPG.
2928 ///     <p>
2929 ///   }
2930 ///   \table_row3{   <b>`VideoPlayer.offset(number).Episode`</b>,
2931 ///                  \anchor VideoPlayer_Offset_Episode
2932 ///                  _string_,
2933 ///     @return The episode number of the episode which has an offset `number` with respect to the currently playing video.
2934 ///     <p><hr>
2935 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Episode `VideoPlayer.offset(number).Episode`\endlink
2936 ///     <p>
2937 ///   }
2938 ///   \table_row3{   <b>`VideoPlayer.position(number).Episode`</b>,
2939 ///                  \anchor VideoPlayer_Position_Episode
2940 ///                  _string_,
2941 ///     @return The episode number of the episode which has an offset `number` with respect to the start of the playlist.
2942 ///     <p><hr>
2943 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Episode `VideoPlayer.position(number).Episode`\endlink
2944 ///     <p>
2945 ///   }
2946 ///   \table_row3{   <b>`VideoPlayer.Genre`</b>,
2947 ///                  \anchor VideoPlayer_Genre
2948 ///                  _string_,
2949 ///     @return The genre(s) of current movie\, if it's in the database.
2950 ///     <p>
2951 ///   }
2952 ///   \table_row3{   <b>`VideoPlayer.offset(number).Genre`</b>,
2953 ///                  \anchor VideoPlayer_Offset_Genre
2954 ///                  _string_,
2955 ///     @return The genre(s) of the video which has an offset `number` with respect to the currently playing video.
2956 ///     <p><hr>
2957 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Genre `VideoPlayer.offset(number).Genre`\endlink
2958 ///     <p>
2959 ///   }
2960 ///   \table_row3{   <b>`VideoPlayer.position(number).Genre`</b>,
2961 ///                  \anchor VideoPlayer_Position_Genre
2962 ///                  _string_,
2963 ///     @return The genre(s) of the video which has an offset `number` with respect to the start of the playlist.
2964 ///     <p><hr>
2965 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Genre `VideoPlayer.position(number).Genre`\endlink
2966 ///     <p>
2967 ///   }
2968 ///   \table_row3{   <b>`VideoPlayer.Director`</b>,
2969 ///                  \anchor VideoPlayer_Director
2970 ///                  _string_,
2971 ///     @return The director of current movie\, if it's in the database.
2972 ///     <p><hr>
2973 ///     @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Director `VideoPlayer.Director`\endlink
2974 ///     also supports EPG.
2975 ///     <p>
2976 ///   }
2977 ///   \table_row3{   <b>`VideoPlayer.offset(number).Director`</b>,
2978 ///                  \anchor VideoPlayer_Offset_Director
2979 ///                  _string_,
2980 ///     @return The director of the video which has an offset `number` with respect to the currently playing video.
2981 ///     <p><hr>
2982 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Director `VideoPlayer.offset(number).VideoPlayer_Offset_Director`\endlink
2983 ///     <p>
2984 ///   }
2985 ///   \table_row3{   <b>`VideoPlayer.position(number).Director`</b>,
2986 ///                  \anchor VideoPlayer_Position_Director
2987 ///                  _string_,
2988 ///     @return The director of the video which has an offset `number` with respect to the start of the playlist.
2989 ///     <p><hr>
2990 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Director `VideoPlayer.position(number).Director`\endlink
2991 ///     <p>
2992 ///   }
2993 ///   \table_row3{   <b>`VideoPlayer.Country`</b>,
2994 ///                  \anchor VideoPlayer_Country
2995 ///                  _string_,
2996 ///     @return The production country of current movie\, if it's in the database.
2997 ///     <p>
2998 ///   }
2999 ///   \table_row3{   <b>`VideoPlayer.offset(number).Country`</b>,
3000 ///                  \anchor VideoPlayer_Offset_Country
3001 ///                  _string_,
3002 ///     @return The production country of the video which has an offset `number` with respect to the currently playing video.
3003 ///     <p><hr>
3004 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Country `VideoPlayer.offset(number).Country`\endlink
3005 ///     <p>
3006 ///   }
3007 ///   \table_row3{   <b>`VideoPlayer.position(number).Country`</b>,
3008 ///                  \anchor VideoPlayer_Position_Country
3009 ///                  _string_,
3010 ///     @return The production country of the video which has an offset `number` with respect to the start of the playlist.
3011 ///     <p><hr>
3012 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Country `VideoPlayer.position(number).Country`\endlink
3013 ///     <p>
3014 ///   }
3015 ///   \table_row3{   <b>`VideoPlayer.Year`</b>,
3016 ///                  \anchor VideoPlayer_Year
3017 ///                  _string_,
3018 ///     @return The year of release of current movie\, if it's in the database.
3019 ///     <p>
3020 ///   }
3021 ///   \table_row3{   <b>`VideoPlayer.offset(number).Year`</b>,
3022 ///                  \anchor VideoPlayer_Offset_Year
3023 ///                  _string_,
3024 ///     @return The year of release of the video which has an offset `number` with respect to the currently playing video.
3025 ///     <p><hr>
3026 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Year `VideoPlayer.offset(number).Year`\endlink
3027 ///     <p>
3028 ///   }
3029 ///   \table_row3{   <b>`VideoPlayer.position(number).Year`</b>,
3030 ///                  \anchor VideoPlayer_Position_Year
3031 ///                  _string_,
3032 ///     @return The year of release of the video which has an offset `number` with respect to the start of the playlist.
3033 ///     <p><hr>
3034 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Year `VideoPlayer.position(number).Year`\endlink
3035 ///     <p>
3036 ///   }
3037 ///   \table_row3{   <b>`VideoPlayer.Cover`</b>,
3038 ///                  \anchor VideoPlayer_Cover
3039 ///                  _string_,
3040 ///     @return The cover of currently playing movie.
3041 ///     <p>
3042 ///   }
3043 ///   \table_row3{   <b>`VideoPlayer.offset(number).Cover`</b>,
3044 ///                  \anchor VideoPlayer_Offset_Cover
3045 ///                  _string_,
3046 ///     @return The cover of the video which has an offset `number` with respect to the currently playing video.
3047 ///     <p><hr>
3048 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Cover `VideoPlayer.offset(number).Cover`\endlink
3049 ///     <p>
3050 ///   }
3051 ///   \table_row3{   <b>`VideoPlayer.position(number).Cover`</b>,
3052 ///                  \anchor VideoPlayer_Position_Cover
3053 ///                  _string_,
3054 ///     @return The cover of the video which has an offset `number` with respect to the start of the playlist.
3055 ///     <p><hr>
3056 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Cover `VideoPlayer.position(number).Cover`\endlink
3057 ///     <p>
3058 ///   }
3059 ///   \table_row3{   <b>`VideoPlayer.Rating`</b>,
3060 ///                  \anchor VideoPlayer_Rating
3061 ///                  _string_,
3062 ///     @return The scraped rating of current movie\, if it's in the database.
3063 ///     <p>
3064 ///   }
3065 ///   \table_row3{   <b>`VideoPlayer.offset(number).Rating`</b>,
3066 ///                  \anchor VideoPlayer_Offset_Rating
3067 ///                  _string_,
3068 ///     @return The scraped rating of the video which has an offset `number` with respect to the currently playing video.
3069 ///     <p><hr>
3070 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Rating `VideoPlayer.offset(number).Rating`\endlink
3071 ///     <p>
3072 ///   }
3073 ///   \table_row3{   <b>`VideoPlayer.position(number).Rating`</b>,
3074 ///                  \anchor VideoPlayer_Position_Rating
3075 ///                  _string_,
3076 ///     @return The scraped rating of the video which has an offset `number` with respect to the start of the playlist.
3077 ///     <p><hr>
3078 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Rating `VideoPlayer.position(number).Rating`\endlink
3079 ///     <p>
3080 ///   }
3081 ///   \table_row3{   <b>`VideoPlayer.UserRating`</b>,
3082 ///                  \anchor VideoPlayer_UserRating
3083 ///                  _string_,
3084 ///     @return The user rating of the currently playing item.
3085 ///     <p><hr>
3086 ///     @skinning_v16 **[New Infolabel]** \link VideoPlayer_UserRating `VideoPlayer.UserRating`\endlink
3087 ///     <p>
3088 ///   }
3089 ///   \table_row3{   <b>`VideoPlayer.offset(number).UserRating`</b>,
3090 ///                  \anchor VideoPlayer_Offset_UserRating
3091 ///                  _string_,
3092 ///     @return The user rating of the video which has an offset `number` with respect to the currently playing video.
3093 ///     <p><hr>
3094 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_UserRating `VideoPlayer.offset(number).UserRating`\endlink
3095 ///     <p>
3096 ///   }
3097 ///   \table_row3{   <b>`VideoPlayer.position(number).UserRating`</b>,
3098 ///                  \anchor VideoPlayer_Position_UserRating
3099 ///                  _string_,
3100 ///     @return The user rating of the video which has an offset `number` with respect to the start of the playlist.
3101 ///     <p><hr>
3102 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_UserRating `VideoPlayer.position(number).UserRating`\endlink
3103 ///     <p>
3104 ///   }
3105 ///   \table_row3{   <b>`VideoPlayer.Votes`</b>,
3106 ///                  \anchor VideoPlayer_Votes
3107 ///                  _string_,
3108 ///     @return The scraped votes of current movie\, if it's in the database.
3109 ///     <p><hr>
3110 ///     @skinning_v13 **[New Infolabel]** \link VideoPlayer_Votes `VideoPlayer.Votes`\endlink
3111 ///     <p>
3112 ///   }
3113 ///   \table_row3{   <b>`VideoPlayer.offset(number).Votes`</b>,
3114 ///                  \anchor VideoPlayer_Offset_Votes
3115 ///                  _string_,
3116 ///     @return The scraped votes of the video which has an offset `number` with respect to the currently playing video.
3117 ///     <p><hr>
3118 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Votes `VideoPlayer.offset(number).Votes`\endlink
3119 ///     <p>
3120 ///   }
3121 ///   \table_row3{   <b>`VideoPlayer.position(number).Votes`</b>,
3122 ///                  \anchor VideoPlayer_Position_Votes
3123 ///                  _string_,
3124 ///     @return The scraped votes of the video which has an offset `number` with respect to the start of the playlist.
3125 ///     <p><hr>
3126 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Votes `VideoPlayer.position(number).Votes`\endlink
3127 ///     <p>
3128 ///   }
3129 ///   \table_row3{   <b>`VideoPlayer.RatingAndVotes`</b>,
3130 ///                  \anchor VideoPlayer_RatingAndVotes
3131 ///                  _string_,
3132 ///     @return The scraped rating and votes of current movie\, if it's in the database
3133 ///     <p>
3134 ///   }
3135 ///   \table_row3{   <b>`VideoPlayer.offset(number).RatingAndVotes`</b>,
3136 ///                  \anchor VideoPlayer_Offset_RatingAndVotes
3137 ///                  _string_,
3138 ///     @return The scraped rating and votes of the video which has an offset `number` with respect to the currently playing video.
3139 ///     <p><hr>
3140 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_RatingAndVotes `VideoPlayer.offset(number).RatingAndVotes`\endlink
3141 ///     <p>
3142 ///   }
3143 ///   \table_row3{   <b>`VideoPlayer.position(number).RatingAndVotes`</b>,
3144 ///                  \anchor VideoPlayer_Position_RatingAndVotes
3145 ///                  _string_,
3146 ///     @return The scraped rating and votes of the video which has an offset `number` with respect to the start of the playlist.
3147 ///     <p><hr>
3148 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_RatingAndVotes `VideoPlayer.position(number).RatingAndVotes`\endlink
3149 ///     <p>
3150 ///   }
3151 ///   \table_row3{   <b>`VideoPlayer.mpaa`</b>,
3152 ///                  \anchor VideoPlayer_mpaa
3153 ///                  _string_,
3154 ///     @return The MPAA rating of current movie\, if it's in the database.
3155 ///     <p>
3156 ///   }
3157 ///   \table_row3{   <b>`VideoPlayer.offset(number).mpaa`</b>,
3158 ///                  \anchor VideoPlayer_Offset_mpaa
3159 ///                  _string_,
3160 ///     @return The MPAA rating of the video which has an offset `number` with respect to the currently playing video.
3161 ///     <p><hr>
3162 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_mpaa `VideoPlayer.offset(number).mpaa`\endlink
3163 ///     <p>
3164 ///   }
3165 ///   \table_row3{   <b>`VideoPlayer.position(number).mpaa`</b>,
3166 ///                  \anchor VideoPlayer_Position_mpaa
3167 ///                  _string_,
3168 ///     @return The MPAA rating of the video which has an offset `number` with respect to the start of the playlist.
3169 ///     <p><hr>
3170 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_mpaa `VideoPlayer.position(number).mpaa`\endlink
3171 ///     <p>
3172 ///   }
3173 ///   \table_row3{   <b>`VideoPlayer.IMDBNumber`</b>,
3174 ///                  \anchor VideoPlayer_IMDBNumber
3175 ///                  _string_,
3176 ///     @return The IMDb ID of the current movie\, if it's in the database.
3177 ///     <p><hr>
3178 ///     @skinning_v15 **[New Infolabel]** \link VideoPlayer_IMDBNumber `VideoPlayer.IMDBNumber`\endlink
3179 ///     <p>
3180 ///   }
3181 ///   \table_row3{   <b>`VideoPlayer.offset(number).IMDBNumber`</b>,
3182 ///                  \anchor VideoPlayer_Offset_IMDBNumber
3183 ///                  _string_,
3184 ///     @return The IMDb ID of the the video which has an offset `number` with respect to the currently playing video.
3185 ///     <p><hr>
3186 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_IMDBNumber `VideoPlayer.offset(number).IMDBNumber`\endlink
3187 ///     <p>
3188 ///   }
3189 ///   \table_row3{   <b>`VideoPlayer.position(number).IMDBNumber`</b>,
3190 ///                  \anchor VideoPlayer_Position_IMDBNumber
3191 ///                  _string_,
3192 ///     @return The IMDb ID of the video which has an offset `number` with respect to the start of the playlist.
3193 ///     <p><hr>
3194 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_IMDBNumber `VideoPlayer.position(number).IMDBNumber`\endlink
3195 ///     <p>
3196 ///   }
3197 ///   \table_row3{   <b>`VideoPlayer.Top250`</b>,
3198 ///                  \anchor VideoPlayer_Top250
3199 ///                  _string_,
3200 ///     @return The IMDb Top250 position of the currently playing movie\, if it's in the database.
3201 ///     <p>
3202 ///   }
3203 ///   \table_row3{   <b>`VideoPlayer.offset(number).Top250`</b>,
3204 ///                  \anchor VideoPlayer_Offset_Top250
3205 ///                  _string_,
3206 ///     @return The IMDb Top250 position of the video which has an offset `number` with respect to the currently playing video.
3207 ///     <p><hr>
3208 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Top250 `VideoPlayer.offset(number).Top250`\endlink
3209 ///     <p>
3210 ///   }
3211 ///   \table_row3{   <b>`VideoPlayer.position(number).Top250`</b>,
3212 ///                  \anchor VideoPlayer_Position_Top250
3213 ///                  _string_,
3214 ///     @return The IMDb Top250 position of the video which has an offset `number` with respect to the start of the playlist.
3215 ///     <p><hr>
3216 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Top250 `VideoPlayer.position(number).Top250`\endlink
3217 ///     <p>
3218 ///   }
3219 ///   \table_row3{   <b>`VideoPlayer.EpisodeName`</b>,
3220 ///                  \anchor VideoPlayer_EpisodeName
3221 ///                  _string_,
3222 ///     @return The name of the episode if the playing video is a TV Show\,
3223 ///     if it's in the database (PVR).
3224 ///     <p><hr>
3225 ///     @skinning_v15 **[New Infolabel]** \link VideoPlayer_EpisodeName `VideoPlayer.EpisodeName`\endlink
3226 ///     <p>
3227 ///   }
3228 ///   \table_row3{   <b>`VideoPlayer.PlaylistPosition`</b>,
3229 ///                  \anchor VideoPlayer_PlaylistPosition
3230 ///                  _string_,
3231 ///     @return The position of the current song in the current video playlist.
3232 ///     <p>
3233 ///   }
3234 ///   \table_row3{   <b>`VideoPlayer.PlaylistLength`</b>,
3235 ///                  \anchor VideoPlayer_PlaylistLength
3236 ///                  _string_,
3237 ///     @return The total size of the current video playlist.
3238 ///     <p>
3239 ///   }
3240 ///   \table_row3{   <b>`VideoPlayer.Cast`</b>,
3241 ///                  \anchor VideoPlayer_Cast
3242 ///                  _string_,
3243 ///     @return A concatenated string of cast members of the current movie\, if it's in
3244 ///     the database.
3245 ///     <p><hr>
3246 ///     @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Cast `VideoPlayer.Cast`\endlink
3247 ///     also supports EPG.
3248 ///     <p>
3249 ///   }
3250 ///   \table_row3{   <b>`VideoPlayer.CastAndRole`</b>,
3251 ///                  \anchor VideoPlayer_CastAndRole
3252 ///                  _string_,
3253 ///     @return A concatenated string of cast members and roles of the current movie\,
3254 ///     if it's in the database.
3255 ///     <p>
3256 ///   }
3257 ///   \table_row3{   <b>`VideoPlayer.Album`</b>,
3258 ///                  \anchor VideoPlayer_Album
3259 ///                  _string_,
3260 ///     @return The album from which the current Music Video is from\, if it's in the database.
3261 ///     <p>
3262 ///   }
3263 ///   \table_row3{   <b>`VideoPlayer.offset(number).Album`</b>,
3264 ///                  \anchor VideoPlayer_Offset_Album
3265 ///                  _string_,
3266 ///     @return The album from which the video which has an offset `number` with respect to the currently playing video.
3267 ///     <p><hr>
3268 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Album `VideoPlayer.offset(number).Album`\endlink
3269 ///     <p>
3270 ///   }
3271 ///   \table_row3{   <b>`VideoPlayer.position(number).Album`</b>,
3272 ///                  \anchor VideoPlayer_Position_Album
3273 ///                  _string_,
3274 ///     @return The album from which the music video which has an offset `number` with respect to the start of the playlist.
3275 ///     <p><hr>
3276 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Album `VideoPlayer.position(number).Album`\endlink
3277 ///     <p>
3278 ///   }
3279 ///   \table_row3{   <b>`VideoPlayer.Artist`</b>,
3280 ///                  \anchor VideoPlayer_Artist
3281 ///                  _string_,
3282 ///     @return The artist(s) of current Music Video\, if it's in the database.
3283 ///     <p>
3284 ///   }
3285 ///   \table_row3{   <b>`VideoPlayer.offset(number).Artist`</b>,
3286 ///                  \anchor VideoPlayer_Offset_Artist
3287 ///                  _string_,
3288 ///     @return The artist(s) of the video which has an offset `number` with respect to the currently playing video.
3289 ///     <p><hr>
3290 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Artist `VideoPlayer.offset(number).Artist`\endlink
3291 ///     <p>
3292 ///   }
3293 ///   \table_row3{   <b>`VideoPlayer.position(number).Artist`</b>,
3294 ///                  \anchor VideoPlayer_Position_Artist
3295 ///                  _string_,
3296 ///     @return The artist(s) of the music video which has an offset `number` with respect to the start of the playlist.
3297 ///     <p><hr>
3298 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Artist `VideoPlayer.position(number).Artist`\endlink
3299 ///     <p>
3300 ///   }
3301 ///   \table_row3{   <b>`VideoPlayer.Studio`</b>,
3302 ///                  \anchor VideoPlayer_Studio
3303 ///                  _string_,
3304 ///     @return The studio of current Music Video\, if it's in the database.
3305 ///     <p>
3306 ///   }
3307 ///   \table_row3{   <b>`VideoPlayer.offset(number).Studio`</b>,
3308 ///                  \anchor VideoPlayer_Offset_Studio
3309 ///                  _string_,
3310 ///     @return The studio of the video which has an offset `number` with respect to the currently playing video.
3311 ///     <p><hr>
3312 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Studio `VideoPlayer.offset(number).Studio`\endlink
3313 ///     <p>
3314 ///   }
3315 ///   \table_row3{   <b>`VideoPlayer.position(number).Studio`</b>,
3316 ///                  \anchor VideoPlayer_Position_Studio
3317 ///                  _string_,
3318 ///     @return The studio of the video which has an offset `number` with respect to the start of the playlist.
3319 ///     <p><hr>
3320 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Studio `VideoPlayer.position(number).Studio`\endlink
3321 ///     <p>
3322 ///   }
3323 ///   \table_row3{   <b>`VideoPlayer.Writer`</b>,
3324 ///                  \anchor VideoPlayer_Writer
3325 ///                  _string_,
3326 ///     @return The name of Writer of current playing Video\, if it's in the database.
3327 ///     <p><hr>
3328 ///     @skinning_v15 **[Infolabel Updated]** \link VideoPlayer_Writer `VideoPlayer.Writer`\endlink
3329 ///     also supports EPG.
3330 ///     <p>
3331 ///   }
3332 ///   \table_row3{   <b>`VideoPlayer.offset(number).Writer`</b>,
3333 ///                  \anchor VideoPlayer_Offset_Writer
3334 ///                  _string_,
3335 ///     @return The name of Writer of the video which has an offset `number` with respect to the currently playing video.
3336 ///     <p><hr>
3337 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Writer `VideoPlayer.offset(number).Writer`\endlink
3338 ///     <p>
3339 ///   }
3340 ///   \table_row3{   <b>`VideoPlayer.position(number).Writer`</b>,
3341 ///                  \anchor VideoPlayer_Position_Writer
3342 ///                  _string_,
3343 ///     @return The name of Writer of the video which has an offset `number` with respect to the start of the playlist.
3344 ///     <p><hr>
3345 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Writer `VideoPlayer.position(number).Writer`\endlink
3346 ///     <p>
3347 ///   }
3348 ///   \table_row3{   <b>`VideoPlayer.Tagline`</b>,
3349 ///                  \anchor VideoPlayer_Tagline
3350 ///                  _string_,
3351 ///     @return The small Summary of current playing Video\, if it's in the database.
3352 ///     <p>
3353 ///   }
3354 ///   \table_row3{   <b>`VideoPlayer.offset(number).Tagline`</b>,
3355 ///                  \anchor VideoPlayer_Offset_Tagline
3356 ///                  _string_,
3357 ///     @return The small Summary of the video which has an offset `number` with respect to the currently playing video.
3358 ///     <p><hr>
3359 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Tagline `VideoPlayer.offset(number).Tagline`\endlink
3360 ///     <p>
3361 ///   }
3362 ///   \table_row3{   <b>`VideoPlayer.position(number).Tagline`</b>,
3363 ///                  \anchor VideoPlayer_Position_Tagline
3364 ///                  _string_,
3365 ///     @return The small Summary of the video which has an offset `number` with respect to the start of the playlist.
3366 ///     <p><hr>
3367 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Tagline `VideoPlayer.position(number).Tagline`\endlink
3368 ///     <p>
3369 ///   }
3370 ///   \table_row3{   <b>`VideoPlayer.PlotOutline`</b>,
3371 ///                  \anchor VideoPlayer_PlotOutline
3372 ///                  _string_,
3373 ///     @return The small Summary of current playing Video\, if it's in the database.
3374 ///     <p>
3375 ///   }
3376 ///   \table_row3{   <b>`VideoPlayer.offset(number).PlotOutline`</b>,
3377 ///                  \anchor VideoPlayer_Offset_PlotOutline
3378 ///                  _string_,
3379 ///     @return The small Summary of the video which has an offset `number` with respect to the currently playing video.
3380 ///     <p><hr>
3381 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_PlotOutline `VideoPlayer.offset(number).PlotOutline`\endlink
3382 ///     <p>
3383 ///   }
3384 ///   \table_row3{   <b>`VideoPlayer.position(number).PlotOutline`</b>,
3385 ///                  \anchor VideoPlayer_Position_PlotOutline
3386 ///                  _string_,
3387 ///     @return The small Summary of the video which has an offset `number` with respect to the start of the playlist.
3388 ///     <p><hr>
3389 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_PlotOutline `VideoPlayer.position(number).PlotOutline`\endlink
3390 ///     <p>
3391 ///   }
3392 ///   \table_row3{   <b>`VideoPlayer.Plot`</b>,
3393 ///                  \anchor VideoPlayer_Plot
3394 ///                  _string_,
3395 ///     @return The complete Text Summary of current playing Video\, if it's in the database.
3396 ///     <p>
3397 ///   }
3398 ///   \table_row3{   <b>`VideoPlayer.offset(number).Plot`</b>,
3399 ///                  \anchor VideoPlayer_Offset_Plot
3400 ///                  _string_,
3401 ///     @return The complete Text Summary of the video which has an offset `number` with respect to the currently playing video.
3402 ///     <p><hr>
3403 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Plot `VideoPlayer.offset(number).Plot`\endlink
3404 ///     <p>
3405 ///   }
3406 ///   \table_row3{   <b>`VideoPlayer.position(number).Plot`</b>,
3407 ///                  \anchor VideoPlayer_Position_Plot
3408 ///                  _string_,
3409 ///     @return The complete Text Summary of the video which has an offset `number` with respect to the start of the playlist.
3410 ///     <p><hr>
3411 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Plot `VideoPlayer.position(number).Plot`\endlink
3412 ///     <p>
3413 ///   }
3414 ///   \table_row3{   <b>`VideoPlayer.Premiered`</b>,
3415 ///                  \anchor VideoPlayer_Premiered
3416 ///                  _string_,
3417 ///     @return The release or aired date of the currently playing episode\, show\, movie or EPG item\,
3418 ///     if it's in the database.
3419 ///     <p>
3420 ///   }
3421 ///   \table_row3{   <b>`VideoPlayer.offset(number).Premiered`</b>,
3422 ///                  \anchor VideoPlayer_Offset_Premiered
3423 ///                  _string_,
3424 ///     @return The release or aired date of the video which has an offset `number` with respect to the currently playing video.
3425 ///     <p><hr>
3426 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Premiered `VideoPlayer.offset(number).Premiered`\endlink
3427 ///     <p>
3428 ///   }
3429 ///   \table_row3{   <b>`VideoPlayer.position(number).Premiered`</b>,
3430 ///                  \anchor VideoPlayer_Position_Premiered
3431 ///                  _string_,
3432 ///     @return The release or aired date of the video which has an offset `number` with respect to the start of the playlist.
3433 ///     if it's in the database.
3434 ///     <p><hr>
3435 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Premiered `VideoPlayer.position(number).Premiered`\endlink
3436 ///     <p>
3437 ///   }
3438 ///   \table_row3{   <b>`VideoPlayer.Trailer`</b>,
3439 ///                  \anchor VideoPlayer_Trailer
3440 ///                  _string_,
3441 ///     @return The path to the trailer of the currently playing movie\, if it's in the database.
3442 ///     <p>
3443 ///   }
3444 ///   \table_row3{   <b>`VideoPlayer.offset(number).Trailer`</b>,
3445 ///                  \anchor VideoPlayer_Offset_Trailer
3446 ///                  _string_,
3447 ///     @return The path to the trailer of the video which has an offset `number` with respect to the currently playing video.
3448 ///     <p><hr>
3449 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_Trailer `VideoPlayer.offset(number).Title`\endlink
3450 ///     <p>
3451 ///   }
3452 ///   \table_row3{   <b>`VideoPlayer.position(number).Trailer`</b>,
3453 ///                  \anchor VideoPlayer_Position_Trailer
3454 ///                  _string_,
3455 ///     @return The path to the trailer of the video which has an offset `number` with respect to the start of the playlist.
3456 ///     <p><hr>
3457 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_Trailer `VideoPlayer.position(number).Trailer`\endlink
3458 ///     <p>
3459 ///   }
3460 ///   \table_row3{   <b>`VideoPlayer.LastPlayed`</b>,
3461 ///                  \anchor VideoPlayer_LastPlayed
3462 ///                  _string_,
3463 ///     @return The last play date of current playing Video\, if it's in the database.
3464 ///     <p>
3465 ///   }
3466 ///   \table_row3{   <b>`VideoPlayer.offset(number).LastPlayed`</b>,
3467 ///                  \anchor VideoPlayer_Offset_LastPlayed
3468 ///                  _string_,
3469 ///     @return The last play date of the video which has an offset `number` with respect to the currently playing video.
3470 ///     <p><hr>
3471 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_LastPlayed `VideoPlayer.offset(number).LastPlayed`\endlink
3472 ///     <p>
3473 ///   }
3474 ///   \table_row3{   <b>`VideoPlayer.position(number).LastPlayed`</b>,
3475 ///                  \anchor VideoPlayer_Position_LastPlayed
3476 ///                  _string_,
3477 ///     @return The last play date of the video which has an offset `number` with respect to the start of the playlist.
3478 ///     <p><hr>
3479 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_LastPlayed `VideoPlayer.position(number).LastPlayed`\endlink
3480 ///     <p>
3481 ///   }
3482 ///   \table_row3{   <b>`VideoPlayer.PlayCount`</b>,
3483 ///                  \anchor VideoPlayer_PlayCount
3484 ///                  _string_,
3485 ///     @return The playcount of current playing Video\, if it's in the database.
3486 ///     <p>
3487 ///   }
3488 ///   \table_row3{   <b>`VideoPlayer.offset(number).PlayCount`</b>,
3489 ///                  \anchor VideoPlayer_Offset_PlayCount
3490 ///                  _string_,
3491 ///     @return The playcount of the video which has an offset `number` with respect to the currently playing video.
3492 ///     <p><hr>
3493 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_PlayCount `VideoPlayer.offset(number).PlayCount`\endlink
3494 ///     <p>
3495 ///   }
3496 ///   \table_row3{   <b>`VideoPlayer.position(number).PlayCount`</b>,
3497 ///                  \anchor VideoPlayer_Position_PlayCount
3498 ///                  _string_,
3499 ///     @return The playcount of the video which has an offset `number` with respect to the start of the playlist.
3500 ///     <p><hr>
3501 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_PlayCount `VideoPlayer.position(number).PlayCount`\endlink
3502 ///     <p>
3503 ///   }
3504 ///   \table_row3{   <b>`VideoPlayer.VideoCodec`</b>,
3505 ///                  \anchor VideoPlayer_VideoCodec
3506 ///                  _string_,
3507 ///     @return The video codec of the currently playing video (common values: see
3508 ///     \ref ListItem_VideoCodec "ListItem.VideoCodec").
3509 ///     <p>
3510 ///   }
3511 ///   \table_row3{   <b>`VideoPlayer.VideoResolution`</b>,
3512 ///                  \anchor VideoPlayer_VideoResolution
3513 ///                  _string_,
3514 ///     @return The video resolution of the currently playing video (possible
3515 ///     values: see \ref ListItem_VideoResolution "ListItem.VideoResolution").
3516 ///     <p>
3517 ///   }
3518 ///   \table_row3{   <b>`VideoPlayer.VideoAspect`</b>,
3519 ///                  \anchor VideoPlayer_VideoAspect
3520 ///                  _string_,
3521 ///     @return The aspect ratio of the currently playing video (possible values:
3522 ///     see \ref ListItem_VideoAspect "ListItem.VideoAspect").
3523 ///     <p>
3524 ///   }
3525 ///   \table_row3{   <b>`VideoPlayer.AudioCodec`</b>,
3526 ///                  \anchor VideoPlayer_AudioCodec
3527 ///                  _string_,
3528 ///     @return The audio codec of the currently playing video\, optionally 'n'
3529 ///     defines the number of the audiostream (common values: see
3530 ///     \ref ListItem_AudioCodec "ListItem.AudioCodec").
3531 ///     <p>
3532 ///   }
3533 ///   \table_row3{   <b>`VideoPlayer.AudioChannels`</b>,
3534 ///                  \anchor VideoPlayer_AudioChannels
3535 ///                  _string_,
3536 ///     @return The number of audio channels of the currently playing video
3537 ///     (possible values: see \ref ListItem_AudioChannels "ListItem.AudioChannels").
3538 ///     <p><hr>
3539 ///     @skinning_v16 **[Infolabel Updated]** \link VideoPlayer_AudioChannels `VideoPlayer.AudioChannels`\endlink
3540 ///     if a video contains no audio\, these infolabels will now return empty.
3541 ///     (they used to return 0)
3542 ///     <p>
3543 ///   }
3544 ///   \table_row3{   <b>`VideoPlayer.AudioLanguage`</b>,
3545 ///                  \anchor VideoPlayer_AudioLanguage
3546 ///                  _string_,
3547 ///     @return The language of the audio of the currently playing video(possible
3548 ///     values: see \ref ListItem_AudioLanguage "ListItem.AudioLanguage").
3549 ///     <p><hr>
3550 ///     @skinning_v13 **[New Infolabel]** \link VideoPlayer_AudioLanguage `VideoPlayer.AudioLanguage`\endlink
3551 ///     <p>
3552 ///   }
3553 ///   \table_row3{   <b>`VideoPlayer.SubtitlesLanguage`</b>,
3554 ///                  \anchor VideoPlayer_SubtitlesLanguage
3555 ///                  _string_,
3556 ///     @return The language of the subtitle of the currently playing video
3557 ///     (possible values: see \ref ListItem_SubtitleLanguage "ListItem.SubtitleLanguage").
3558 ///     @note `VideoPlayer.SubtitlesLanguage` holds the language of the next available
3559 ///     subtitle stream if subtitles are disabled in the player
3560 ///     <p><hr>
3561 ///     @skinning_v13 **[New Infolabel]** \link VideoPlayer_SubtitlesLanguage `VideoPlayer.SubtitlesLanguage`\endlink
3562 ///     <p>
3563 ///   }
3564 ///   \table_row3{   <b>`VideoPlayer.StereoscopicMode`</b>,
3565 ///                  \anchor VideoPlayer_StereoscopicMode
3566 ///                  _string_,
3567 ///     @return The stereoscopic mode of the currently playing video (possible
3568 ///     values: see \ref ListItem_StereoscopicMode "ListItem.StereoscopicMode").
3569 ///     <p><hr>
3570 ///     @skinning_v13 **[New Infolabel]** \link VideoPlayer_StereoscopicMode `VideoPlayer.StereoscopicMode`\endlink
3571 ///     <p>
3572 ///   }
3573 ///   \table_row3{   <b>`VideoPlayer.StartTime`</b>,
3574 ///                  \anchor VideoPlayer_StartTime
3575 ///                  _string_,
3576 ///     @return The start date and time of the currently playing epg event or recording (PVR).
3577 ///     <p>
3578 ///   }
3579 ///   \table_row3{   <b>`VideoPlayer.EndTime`</b>,
3580 ///                  \anchor VideoPlayer_EndTime
3581 ///                  _string_,
3582 ///     @return The end date and time of the currently playing epg event or recording (PVR).
3583 ///     <p>
3584 ///   }
3585 ///   \table_row3{   <b>`VideoPlayer.NextTitle`</b>,
3586 ///                  \anchor VideoPlayer_NextTitle
3587 ///                  _string_,
3588 ///     @return The title of the programme that will be played next (PVR).
3589 ///     <p>
3590 ///   }
3591 ///   \table_row3{   <b>`VideoPlayer.NextGenre`</b>,
3592 ///                  \anchor VideoPlayer_NextGenre
3593 ///                  _string_,
3594 ///     @return The genre of the programme that will be played next (PVR).
3595 ///     <p>
3596 ///   }
3597 ///   \table_row3{   <b>`VideoPlayer.NextPlot`</b>,
3598 ///                  \anchor VideoPlayer_NextPlot
3599 ///                  _string_,
3600 ///     @return The plot of the programme that will be played next (PVR).
3601 ///     <p>
3602 ///   }
3603 ///   \table_row3{   <b>`VideoPlayer.NextPlotOutline`</b>,
3604 ///                  \anchor VideoPlayer_NextPlotOutline
3605 ///                  _string_,
3606 ///     @return The plot outline of the programme that will be played next (PVR).
3607 ///     <p>
3608 ///   }
3609 ///   \table_row3{   <b>`VideoPlayer.NextStartTime`</b>,
3610 ///                  \anchor VideoPlayer_NextStartTime
3611 ///                  _string_,
3612 ///     @return The start time of the programme that will be played next (PVR).
3613 ///     <p>
3614 ///   }
3615 ///   \table_row3{   <b>`VideoPlayer.NextEndTime`</b>,
3616 ///                  \anchor VideoPlayer_NextEndTime
3617 ///                  _string_,
3618 ///     @return The end time of the programme that will be played next (PVR).
3619 ///     <p>
3620 ///   }
3621 ///   \table_row3{   <b>`VideoPlayer.NextDuration`</b>,
3622 ///                  \anchor VideoPlayer_NextDuration
3623 ///                  _string_,
3624 ///     @return The duration of the programme that will be played next (PVR).
3625 ///     <p>
3626 ///   }
3627 ///   \table_row3{   <b>`VideoPlayer.ChannelName`</b>,
3628 ///                  \anchor VideoPlayer_ChannelName
3629 ///                  _string_,
3630 ///     @return The name of the currently tuned channel (PVR).
3631 ///     <p>
3632 ///   }
3633 ///   \table_row3{   <b>`VideoPlayer.ChannelNumberLabel`</b>,
3634 ///                  \anchor VideoPlayer_ChannelNumberLabel
3635 ///                  _string_,
3636 ///     @return The channel and subchannel number of the tv channel that's currently playing (PVR).
3637 ///     <p><hr>
3638 ///     @skinning_v14 **[New Infolabel]** \link VideoPlayer_ChannelNumberLabel `VideoPlayer.ChannelNumberLabel`\endlink
3639 ///     <p>
3640 ///   }
3641 ///   \table_row3{   <b>`VideoPlayer.ChannelGroup`</b>,
3642 ///                  \anchor VideoPlayer_ChannelGroup
3643 ///                  _string_,
3644 ///     @return The group of the currently tuned channel (PVR).
3645 ///     <p>
3646 ///   }
3647 ///   \table_row3{   <b>`VideoPlayer.ParentalRating`</b>,
3648 ///                  \anchor VideoPlayer_ParentalRating
3649 ///                  _string_,
3650 ///     @return The parental rating of the currently playing programme (PVR).
3651 ///     <p>
3652 ///   }
3653 ///   \table_row3{   <b>`VideoPlayer.DBID`</b>,
3654 ///                  \anchor VideoPlayer_DBID
3655 ///                  _string_,
3656 ///     @return The database id of the currently playing video
3657 ///     <p><hr>
3658 ///     @skinning_v17 **[New Infolabel]** \link VideoPlayer_DBID `VideoPlayer.DBID`\endlink
3659 ///     <p>
3660 ///   }
3661 ///   \table_row3{   <b>`VideoPlayer.offset(number).DBID`</b>,
3662 ///                  \anchor VideoPlayer_Offset_DBID
3663 ///                  _string_,
3664 ///     @return The database id of the video which has an offset `number` with respect to the currently playing video.
3665 ///     <p><hr>
3666 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Offset_DBID `VideoPlayer.offset(number).DBID`\endlink
3667 ///     <p>
3668 ///   }
3669 ///   \table_row3{   <b>`VideoPlayer.position(number).DBID`</b>,
3670 ///                  \anchor VideoPlayer_Position_DBID
3671 ///                  _string_,
3672 ///     @return The database id of the video which has an offset `number` with respect to the start of the playlist.
3673 ///     <p><hr>
3674 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_Position_DBID `VideoPlayer.position(number).DBID`\endlink
3675 ///     <p>
3676 ///   }
3677 ///   \table_row3{   <b>`VideoPlayer.UniqueID(name)`</b>,
3678 ///                  \anchor VideoPlayer_UniqueID
3679 ///                  _string_,
3680 ///     @return The scraped metadata id of current movie\, if it's in the database.
3681 ///     @param name - the name of the metadata provider.
3682 ///     <p><hr>
3683 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_UniqueID `VideoPlayer.UniqueID(name)`\endlink
3684 ///     <p>
3685 ///   }
3686 ///   \table_row3{   <b>`VideoPlayer.TvShowDBID`</b>,
3687 ///                  \anchor VideoPlayer_TvShowDBID
3688 ///                  _string_,
3689 ///     @return The database id of the TvShow for the currently playing Episode
3690 ///     <p><hr>
3691 ///     @skinning_v19 **[New Infolabel]** \link VideoPlayer_TvShowDBID `VideoPlayer.TvShowDBID`\endlink
3692 ///     <p>
3693 ///   }
3694 /// \table_end
3695 ///
3696 /// -----------------------------------------------------------------------------
3697 const infomap videoplayer[] =    {{ "title",            VIDEOPLAYER_TITLE },
3698                                   { "genre",            VIDEOPLAYER_GENRE },
3699                                   { "country",          VIDEOPLAYER_COUNTRY },
3700                                   { "originaltitle",    VIDEOPLAYER_ORIGINALTITLE },
3701                                   { "director",         VIDEOPLAYER_DIRECTOR },
3702                                   { "year",             VIDEOPLAYER_YEAR },
3703                                   { "cover",            VIDEOPLAYER_COVER },
3704                                   { "usingoverlays",    VIDEOPLAYER_USING_OVERLAYS },
3705                                   { "isfullscreen",     VIDEOPLAYER_ISFULLSCREEN },
3706                                   { "hasmenu",          VIDEOPLAYER_HASMENU },
3707                                   { "playlistlength",   VIDEOPLAYER_PLAYLISTLEN },
3708                                   { "playlistposition", VIDEOPLAYER_PLAYLISTPOS },
3709                                   { "plot",             VIDEOPLAYER_PLOT },
3710                                   { "plotoutline",      VIDEOPLAYER_PLOT_OUTLINE },
3711                                   { "episode",          VIDEOPLAYER_EPISODE },
3712                                   { "season",           VIDEOPLAYER_SEASON },
3713                                   { "rating",           VIDEOPLAYER_RATING },
3714                                   { "ratingandvotes",   VIDEOPLAYER_RATING_AND_VOTES },
3715                                   { "userrating",       VIDEOPLAYER_USER_RATING },
3716                                   { "votes",            VIDEOPLAYER_VOTES },
3717                                   { "tvshowtitle",      VIDEOPLAYER_TVSHOW },
3718                                   { "premiered",        VIDEOPLAYER_PREMIERED },
3719                                   { "studio",           VIDEOPLAYER_STUDIO },
3720                                   { "mpaa",             VIDEOPLAYER_MPAA },
3721                                   { "top250",           VIDEOPLAYER_TOP250 },
3722                                   { "cast",             VIDEOPLAYER_CAST },
3723                                   { "castandrole",      VIDEOPLAYER_CAST_AND_ROLE },
3724                                   { "artist",           VIDEOPLAYER_ARTIST },
3725                                   { "album",            VIDEOPLAYER_ALBUM },
3726                                   { "writer",           VIDEOPLAYER_WRITER },
3727                                   { "tagline",          VIDEOPLAYER_TAGLINE },
3728                                   { "hasinfo",          VIDEOPLAYER_HAS_INFO },
3729                                   { "trailer",          VIDEOPLAYER_TRAILER },
3730                                   { "videocodec",       VIDEOPLAYER_VIDEO_CODEC },
3731                                   { "videoresolution",  VIDEOPLAYER_VIDEO_RESOLUTION },
3732                                   { "videoaspect",      VIDEOPLAYER_VIDEO_ASPECT },
3733                                   { "videobitrate",     VIDEOPLAYER_VIDEO_BITRATE },
3734                                   { "audiocodec",       VIDEOPLAYER_AUDIO_CODEC },
3735                                   { "audiochannels",    VIDEOPLAYER_AUDIO_CHANNELS },
3736                                   { "audiobitrate",     VIDEOPLAYER_AUDIO_BITRATE },
3737                                   { "audiolanguage",    VIDEOPLAYER_AUDIO_LANG },
3738                                   { "hasteletext",      VIDEOPLAYER_HASTELETEXT },
3739                                   { "lastplayed",       VIDEOPLAYER_LASTPLAYED },
3740                                   { "playcount",        VIDEOPLAYER_PLAYCOUNT },
3741                                   { "hassubtitles",     VIDEOPLAYER_HASSUBTITLES },
3742                                   { "subtitlesenabled", VIDEOPLAYER_SUBTITLESENABLED },
3743                                   { "subtitleslanguage",VIDEOPLAYER_SUBTITLES_LANG },
3744                                   { "starttime",        VIDEOPLAYER_STARTTIME },
3745                                   { "endtime",          VIDEOPLAYER_ENDTIME },
3746                                   { "nexttitle",        VIDEOPLAYER_NEXT_TITLE },
3747                                   { "nextgenre",        VIDEOPLAYER_NEXT_GENRE },
3748                                   { "nextplot",         VIDEOPLAYER_NEXT_PLOT },
3749                                   { "nextplotoutline",  VIDEOPLAYER_NEXT_PLOT_OUTLINE },
3750                                   { "nextstarttime",    VIDEOPLAYER_NEXT_STARTTIME },
3751                                   { "nextendtime",      VIDEOPLAYER_NEXT_ENDTIME },
3752                                   { "nextduration",     VIDEOPLAYER_NEXT_DURATION },
3753                                   { "channelname",      VIDEOPLAYER_CHANNEL_NAME },
3754                                   { "channelnumberlabel", VIDEOPLAYER_CHANNEL_NUMBER },
3755                                   { "channelgroup",     VIDEOPLAYER_CHANNEL_GROUP },
3756                                   { "hasepg",           VIDEOPLAYER_HAS_EPG },
3757                                   { "parentalrating",   VIDEOPLAYER_PARENTAL_RATING },
3758                                   { "isstereoscopic",   VIDEOPLAYER_IS_STEREOSCOPIC },
3759                                   { "stereoscopicmode", VIDEOPLAYER_STEREOSCOPIC_MODE },
3760                                   { "canresumelivetv",  VIDEOPLAYER_CAN_RESUME_LIVE_TV },
3761                                   { "imdbnumber",       VIDEOPLAYER_IMDBNUMBER },
3762                                   { "episodename",      VIDEOPLAYER_EPISODENAME },
3763                                   { "dbid",             VIDEOPLAYER_DBID },
3764                                   { "uniqueid",         VIDEOPLAYER_UNIQUEID },
3765                                   { "tvshowdbid",       VIDEOPLAYER_TVSHOWDBID },
3766 };
3767 
3768 /// \page modules__infolabels_boolean_conditions
3769 /// \subsection modules__infolabels_boolean_conditions_RetroPlayer RetroPlayer
3770 /// \table_start
3771 ///   \table_h3{ Labels, Type, Description }
3772 ///   \table_row3{   <b>`RetroPlayer.VideoFilter`</b>,
3773 ///                  \anchor RetroPlayer_VideoFilter
3774 ///                  _string_,
3775 ///     @return The video filter of the currently-playing game.
3776 ///     The following values are possible:
3777 ///       - nearest (Nearest neighbor\, i.e. pixelate)
3778 ///       - linear (Bilinear filtering\, i.e. smooth blur)
3779 ///     <p><hr>
3780 ///     @skinning_v18 **[New Infolabel]** \link RetroPlayer_VideoFilter `RetroPlayer.VideoFilter`\endlink
3781 ///     <p>
3782 ///   }
3783 ///   \table_row3{   <b>`RetroPlayer.StretchMode`</b>,
3784 ///                  \anchor RetroPlayer_StretchMode
3785 ///                  _string_,
3786 ///     @return The stretch mode of the currently-playing game.
3787 ///     The following values are possible:
3788 ///       - normal (Show the game normally)
3789 ///       - 4:3 (Stretch to a 4:3 aspect ratio)
3790 ///       - fullscreen (Stretch to the full viewing area)
3791 ///       - original (Shrink to the original resolution)
3792 ///     <p><hr>
3793 ///     @skinning_v18 **[New Infolabel]** \link RetroPlayer_StretchMode `RetroPlayer.StretchMode`\endlink
3794 ///     <p>
3795 ///   }
3796 ///   \table_row3{   <b>`RetroPlayer.VideoRotation`</b>,
3797 ///                  \anchor RetroPlayer_VideoRotation
3798 ///                  _integer_,
3799 ///     @return The video rotation of the currently-playing game
3800 ///     in degrees counter-clockwise.
3801 ///     The following values are possible:
3802 ///       - 0
3803 ///       - 90 (Shown in the GUI as 270 degrees)
3804 ///       - 180
3805 ///       - 270 (Shown in the GUI as 90 degrees)
3806 ///     <p><hr>
3807 ///     @skinning_v18 **[New Infolabel]** \link RetroPlayer_VideoRotation `RetroPlayer.VideoRotation`\endlink
3808 ///     <p>
3809 ///   }
3810 /// \table_end
3811 ///
3812 /// -----------------------------------------------------------------------------
3813 const infomap retroplayer[] =
3814 {
3815   { "videofilter",            RETROPLAYER_VIDEO_FILTER},
3816   { "stretchmode",            RETROPLAYER_STRETCH_MODE},
3817   { "videorotation",          RETROPLAYER_VIDEO_ROTATION},
3818 };
3819 
3820 /// \page modules__infolabels_boolean_conditions
3821 /// \subsection modules__infolabels_boolean_conditions_Container Container
3822 /// \table_start
3823 ///   \table_h3{ Labels, Type, Description }
3824 ///   \table_row3{   <b>`Container.HasFiles`</b>,
3825 ///                  \anchor Container_HasFiles
3826 ///                  _boolean_,
3827 ///     @return **True** if the container contains files.
3828 ///     <p>
3829 ///   }
3830 ///   \table_row3{   <b>`Container.HasFolders`</b>,
3831 ///                  \anchor Container_HasFolders
3832 ///                  _boolean_,
3833 ///     @return **True** if the container contains folders.
3834 ///     <p>
3835 ///   }
3836 ///   \table_row3{   <b>`Container.IsStacked`</b>,
3837 ///                  \anchor Container_IsStacked
3838 ///                  _boolean_,
3839 ///     @return **True** if the container is currently in stacked mode.
3840 ///     <p>
3841 ///   }
3842 ///   \table_row3{   <b>`Container.FolderPath`</b>,
3843 ///                  \anchor Container_FolderPath
3844 ///                  _string_,
3845 ///     @return The complete path of currently displayed folder.
3846 ///     <p>
3847 ///   }
3848 ///   \table_row3{   <b>`Container.FolderName`</b>,
3849 ///                  \anchor Container_FolderName
3850 ///                  _string_,
3851 ///     @return The top most folder in currently displayed folder.
3852 ///     <p>
3853 ///   }
3854 ///   \table_row3{   <b>`Container.PluginName`</b>,
3855 ///                  \anchor Container_PluginName
3856 ///                  _string_,
3857 ///     @return The current plugins base folder name.
3858 ///     <p>
3859 ///   }
3860 ///   \table_row3{   <b>`Container.PluginCategory`</b>,
3861 ///                  \anchor Container_PluginCategory
3862 ///                  _string_,
3863 ///     @return The current plugins category (set by the scripter).
3864 ///     <p><hr>
3865 ///     @skinning_v17 **[New Infolabel]** \link Container_PluginCategory `Container.PluginCategory`\endlink
3866 ///     <p>
3867 ///   }
3868 ///   \table_row3{   <b>`Container.Viewmode`</b>,
3869 ///                  \anchor Container_Viewmode
3870 ///                  _string_,
3871 ///     @return The current viewmode (list\, icons etc).
3872 ///     <p>
3873 ///   }
3874 ///   \table_row3{   <b>`Container.ViewCount`</b>,
3875 ///                  \anchor Container_ViewCount
3876 ///                  _integer_,
3877 ///     @return The number of available skin view modes for the current container listing.
3878 ///     <p><hr>
3879 ///     @skinning_v17 **[New Infolabel]** \link Container_ViewCount `Container.ViewCount`\endlink
3880 ///     <p>
3881 ///   }
3882 ///   \table_row3{   <b>`Container.Totaltime`</b>,
3883 ///                  \anchor Container_Totaltime
3884 ///                  _string_,
3885 ///     @return The total time of all items in the current container.
3886 ///     <p>
3887 ///   }
3888 ///   \table_row3{   <b>`Container.TotalWatched`</b>,
3889 ///                  \anchor Container_TotalWatched
3890 ///                  _string_,
3891 ///     @return The number of watched items in the container.
3892 ///     @param id - [opt] if not supplied the current container will be used.
3893 ///     <p><hr>
3894 ///     @skinning_v16 **[New Infolabel]** \link Container_TotalWatched `Container(id).TotalWatched`\endlink
3895 ///     <p>
3896 ///   }
3897 ///   \table_row3{   <b>`Container.TotalUnWatched`</b>,
3898 ///                  \anchor Container_TotalUnWatched
3899 ///                  _string_,
3900 ///     @return The number of unwatched items in the container.
3901 ///     @param id - [opt] if not supplied the current container will be used.
3902 ///     <p><hr>
3903 ///     @skinning_v16 **[New Infolabel]** \link Container_TotalUnWatched `Container(id).TotalUnWatched`\endlink
3904 ///     <p>
3905 ///   }
3906 ///   \table_row3{   <b>`Container.HasThumb`</b>,
3907 ///                  \anchor Container_HasThumb
3908 ///                  _boolean_,
3909 ///     @return **True** if the current container you are in has a thumb assigned
3910 ///     to it.
3911 ///     <p>
3912 ///   }
3913 ///   \table_row3{   <b>`Container.SortOrder`</b>,
3914 ///                  \anchor Container_SortOrder
3915 ///                  _string_,
3916 ///     @return The current sort order (Ascending/Descending).
3917 ///     <p><hr>
3918 ///     @skinning_v16 **[New Infolabel]** \link Container_SortOrder `Container.SortOrder`\endlink
3919 ///     <p>
3920 ///   }
3921 ///   \table_row3{   <b>`Container.CanFilter`</b>,
3922 ///                  \anchor Container_CanFilter
3923 ///                  _boolean_,
3924 ///     @return **True** when the current container can be filtered.
3925 ///     <p>
3926 ///   }
3927 ///   \table_row3{   <b>`Container.CanFilterAdvanced`</b>,
3928 ///                  \anchor Container_CanFilterAdvanced
3929 ///                  _boolean_,
3930 ///     @return **True** when advanced filtering can be applied to the current container.
3931 ///     <p>
3932 ///   }
3933 ///   \table_row3{   <b>`Container.Filtered`</b>,
3934 ///                  \anchor Container_Filtered
3935 ///                  _boolean_,
3936 ///     @return **True** when a mediafilter is applied to the current container.
3937 ///     <p>
3938 ///   }
3939 ///   \table_row3{   <b>`Container.ShowPlot`</b>,
3940 ///                  \anchor Container_ShowPlot
3941 ///                  _string_,
3942 ///     @return The TV Show plot of the current container and can be used at
3943 ///     season and episode level.
3944 ///     <p>
3945 ///   }
3946 ///   \table_row3{   <b>`Container.ShowTitle`</b>,
3947 ///                  \anchor Container_ShowTitle
3948 ///                  _string_,
3949 ///     @return The TV Show title of the current container and can be used at
3950 ///     season and episode level.
3951 ///     <p><hr>
3952 ///     @skinning_v17 **[New Infolabel]** \link Container_ShowTitle `Container.ShowTitle`\endlink
3953 ///     <p>
3954 ///   }
3955 const infomap mediacontainer[] = {{ "hasfiles",         CONTAINER_HASFILES },
3956                                   { "hasfolders",       CONTAINER_HASFOLDERS },
3957                                   { "isstacked",        CONTAINER_STACKED },
3958                                   { "folderpath",       CONTAINER_FOLDERPATH },
3959                                   { "foldername",       CONTAINER_FOLDERNAME },
3960                                   { "pluginname",       CONTAINER_PLUGINNAME },
3961                                   { "plugincategory",   CONTAINER_PLUGINCATEGORY },
3962                                   { "viewmode",         CONTAINER_VIEWMODE },
3963                                   { "viewcount",        CONTAINER_VIEWCOUNT },
3964                                   { "totaltime",        CONTAINER_TOTALTIME },
3965                                   { "totalwatched",     CONTAINER_TOTALWATCHED },
3966                                   { "totalunwatched",   CONTAINER_TOTALUNWATCHED },
3967                                   { "hasthumb",         CONTAINER_HAS_THUMB },
3968                                   { "sortorder",        CONTAINER_SORT_ORDER },
3969                                   { "canfilter",        CONTAINER_CAN_FILTER },
3970                                   { "canfilteradvanced",CONTAINER_CAN_FILTERADVANCED },
3971                                   { "filtered",         CONTAINER_FILTERED },
3972                                   { "showplot",         CONTAINER_SHOWPLOT },
3973                                   { "showtitle",        CONTAINER_SHOWTITLE }};
3974 
3975 /// \page modules__infolabels_boolean_conditions
3976 ///   \table_row3{   <b>`Container(id).OnNext`</b>,
3977 ///                  \anchor Container_OnNext
3978 ///                  _boolean_,
3979 ///     @return **True** if the container with id (or current container if id is
3980 ///     omitted) is moving to the next item. Allows views to be
3981 ///     custom-designed (such as 3D coverviews etc.)
3982 ///     <p>
3983 ///   }
3984 ///   \table_row3{   <b>`Container(id).OnScrollNext`</b>,
3985 ///                  \anchor Container_OnScrollNext
3986 ///                  _boolean_,
3987 ///     @return **True** if the container with id (or current container if id is
3988 ///     omitted) is scrolling to the next item. Differs from \ref Container_OnNext "OnNext" in that
3989 ///     \ref Container_OnNext "OnNext" triggers on movement even if there is no scroll involved.
3990 ///     <p>
3991 ///   }
3992 ///   \table_row3{   <b>`Container(id).OnPrevious`</b>,
3993 ///                  \anchor Container_OnPrevious
3994 ///                  _boolean_,
3995 ///     @return **True** if the container with id (or current container if id is
3996 ///     omitted) is moving to the previous item. Allows views to be
3997 ///     custom-designed (such as 3D coverviews etc).
3998 ///     <p>
3999 ///   }
4000 ///   \table_row3{   <b>`Container(id).OnScrollPrevious`</b>,
4001 ///                  \anchor Container_OnScrollPrevious
4002 ///                  _boolean_,
4003 ///     @return **True** if the container with id (or current container if id is
4004 ///     omitted) is scrolling to the previous item. Differs from \ref Container_OnPrevious "OnPrevious" in
4005 ///     that \ref Container_OnPrevious "OnPrevious" triggers on movement even if there is no scroll involved.
4006 ///     <p>
4007 ///   }
4008 ///   \table_row3{   <b>`Container(id).NumPages`</b>,
4009 ///                  \anchor Container_NumPages
4010 ///                  _integer_,
4011 ///     @return The number of pages in the container with given id. If no id is specified it
4012 ///     grabs the current container.
4013 ///     <p>
4014 ///   }
4015 ///   \table_row3{   <b>`Container(id).NumItems`</b>,
4016 ///                  \anchor Container_NumItems
4017 ///                  _integer_,
4018 ///     @return The number of items in the container or grouplist with given id excluding parent folder item.
4019 ///     @note If no id is specified it grabs the current container.
4020 ///     <p>
4021 ///   }
4022 ///   \table_row3{   <b>`Container(id).NumAllItems`</b>,
4023 ///                  \anchor Container_NumAllItems
4024 ///                  _integer_,
4025 ///     @return The number of all items in the container or grouplist with given id including parent folder item.
4026 ///     @note If no id is specified it grabs the current container.
4027 ///     <p><hr>
4028 ///     @skinning_v18 **[New Infolabel]** \link Container_NumAllItems `Container(id).NumAllItems`\endlink
4029 ///     <p>
4030 ///   }
4031 ///   \table_row3{   <b>`Container(id).NumNonFolderItems`</b>,
4032 ///                  \anchor Container_NumNonFolderItems
4033 ///                  _integer_,
4034 ///     @return The Number of items in the container or grouplist with given id excluding all folder items.
4035 ///     @note **Example:** pvr recordings folders\, parent ".." folder).
4036 ///     If no id is specified it grabs the current container.
4037 ///     <p><hr>
4038 ///     @skinning_v18 **[New Infolabel]** \link Container_NumNonFolderItems `Container(id).NumNonFolderItems`\endlink
4039 ///     <p>
4040 ///   }
4041 ///   \table_row3{   <b>`Container(id).CurrentPage`</b>,
4042 ///                  \anchor Container_CurrentPage
4043 ///                  _string_,
4044 ///     @return THe current page in the container with given id.
4045 ///     @note If no id is specified it grabs the current container.
4046 ///     <p>
4047 ///   }
4048 ///   \table_row3{   <b>`Container(id).CurrentItem`</b>,
4049 ///                  \anchor Container_CurrentItem
4050 ///                  _integer_,
4051 ///     @return The current item in the container or grouplist with given id.
4052 ///     @note If no id is specified it grabs the current container.
4053 ///     <p><hr>
4054 ///     @skinning_v15 **[New Infolabel]** \link Container_CurrentItem `Container(id).CurrentItem`\endlink
4055 ///     <p>
4056 ///   }
4057 ///   \table_row3{   <b>`Container(id).Scrolling`</b>,
4058 ///                  \anchor Container_Scrolling
4059 ///                  _boolean_,
4060 ///     @return **True** if the user is currently scrolling through the container
4061 ///     with id (or current container if id is omitted).
4062 ///     @note This is slightly delayed from the actual scroll start. Use
4063 ///     \ref Container_OnScrollNext "Container(id).OnScrollNext" or
4064 ///     \ref Container_OnScrollPrevious "Container(id).OnScrollPrevious" to trigger animations
4065 ///     immediately on scroll.
4066 ///     <p>
4067 ///   }
4068 ///   \table_row3{   <b>`Container(id).HasNext`</b>,
4069 ///                  \anchor Container_HasNext
4070 ///                  _boolean_,
4071 ///     @return **True** if the container or textbox with id (id) has a next page.
4072 ///     <p>
4073 ///   }
4074 ///   \table_row3{   <b>`Container(id).HasParent`</b>,
4075 ///                  \anchor Container_HasParent
4076 ///                  _boolean_,
4077 ///     @return **True** when the container with given id contains a parent ('..') item.
4078 ///     @note If no id is specified it grabs the current container.
4079 ///     <p><hr>
4080 ///     @skinning_v16 **[New Boolean Condition]** \link Container_HasParent `Container.HasParent`\endlink
4081 ///     <p>
4082 ///   }
4083 ///   \table_row3{   <b>`Container(id).HasPrevious`</b>,
4084 ///                  \anchor Container_HasPrevious
4085 ///                  _boolean_,
4086 ///     @return **True** if the container or textbox with id (id) has a previous page.
4087 ///     <p>
4088 ///   }
4089 ///   \table_row3{   <b>`Container(id).IsUpdating`</b>,
4090 ///                  \anchor Container_IsUpdating
4091 ///                  _boolean_,
4092 ///     @return **True** if the container with dynamic list content is currently updating.
4093 ///   }
4094 const infomap container_bools[] ={{ "onnext",           CONTAINER_MOVE_NEXT },
4095                                   { "onprevious",       CONTAINER_MOVE_PREVIOUS },
4096                                   { "onscrollnext",     CONTAINER_SCROLL_NEXT },
4097                                   { "onscrollprevious", CONTAINER_SCROLL_PREVIOUS },
4098                                   { "numpages",         CONTAINER_NUM_PAGES },
4099                                   { "numitems",         CONTAINER_NUM_ITEMS },
4100                                   { "numnonfolderitems", CONTAINER_NUM_NONFOLDER_ITEMS },
4101                                   { "numallitems",      CONTAINER_NUM_ALL_ITEMS },
4102                                   { "currentpage",      CONTAINER_CURRENT_PAGE },
4103                                   { "currentitem",      CONTAINER_CURRENT_ITEM },
4104                                   { "scrolling",        CONTAINER_SCROLLING },
4105                                   { "hasnext",          CONTAINER_HAS_NEXT },
4106                                   { "hasparent",        CONTAINER_HAS_PARENT_ITEM },
4107                                   { "hasprevious",      CONTAINER_HAS_PREVIOUS },
4108                                   { "isupdating",       CONTAINER_ISUPDATING }};
4109 
4110 /// \page modules__infolabels_boolean_conditions
4111 ///   \table_row3{   <b>`Container(id).Row`</b>,
4112 ///                  \anchor Container_Row
4113 ///                  _integer_,
4114 ///     @return The row number of the focused position in a panel container.
4115 ///     <p><hr>
4116 ///     @skinning_v16 **[New Infolabel]** \link Container_Row `Container(id).Row`\endlink
4117 ///     <p>
4118 ///   }
4119 ///   \table_row3{   <b>`Container(id).Row(parameter)`</b>,
4120 ///                  \anchor Container_Row_parameter
4121 ///                  _boolean_,
4122 ///     @return **True** if the row number of the focused position matches the specified parameter.
4123 ///     <p>
4124 ///   }
4125 ///   \table_row3{   <b>`Container(id).Column`</b>,
4126 ///                  \anchor Container_Column
4127 ///                  _integer_,
4128 ///     @return The column number of the focused position in a panel container.
4129 ///     <p><hr>
4130 ///     @skinning_v16 **[New Infolabel]** \link Container_Column `Container(id).Column`\endlink
4131 ///     <p>
4132 ///   }
4133 ///   \table_row3{   <b>`Container(id).Column(parameter)`</b>,
4134 ///                  \anchor Container_Column_parameter
4135 ///                  _boolean_,
4136 ///     @return **True** if the column number of the focused position matches the specified parameter.
4137 ///     <p>
4138 ///   }
4139 ///   \table_row3{   <b>`Container(id).Position`</b>,
4140 ///                  \anchor Container_Position
4141 ///                  _integer_,
4142 ///     @return The current focused position of container / grouplist (id) as a
4143 ///     numeric label.
4144 ///     <p><hr>
4145 ///     @skinning_v16 **[Infolabel Updated]** \link Container_Position `Container(id).Position`\endlink
4146 ///     now also returns the position for items inside a grouplist.
4147 ///     <p>
4148 ///   }
4149 ///   \table_row3{   <b>`Container(id).Position(parameter)`</b>,
4150 ///                  \anchor Container_Position_parameter
4151 ///                  _boolean_,
4152 ///     @return **True** if the container with id (or current container if id is omitted) is focused on the specified position.
4153 ///     <p>
4154 ///   }
4155 ///   \table_row3{   <b>`Container(id).SubItem(item_number)`</b>,
4156 ///                  \anchor Container_SubItem
4157 ///                  _boolean_,
4158 ///     @return **True** if the container with id (or current container if id is omitted) is focused on the specified subitem.
4159 ///     @note If no id is specified it grabs the current container.
4160 ///     <p>
4161 ///   }
4162 ///   \table_row3{   <b>`Container(id).HasFocus(item_number)`</b>,
4163 ///                  \anchor Container_HasFocus
4164 ///                  _boolean_,
4165 ///     @return **True** if the container with id (or current container if id is
4166 ///     omitted) has static content and is focused on the item with id
4167 ///     item_number.
4168 ///     <p>
4169 ///   }
4170 ///   \table_row3{   <b>`Container.SortMethod`</b>,
4171 ///                  \anchor Container_SortMethod
4172 ///                  _string_,
4173 ///     @return The current sort method (returns a localized value).
4174 ///     <p>
4175 ///   }
4176 ///   \table_row3{   <b>`Container.SortMethod(sortid)`</b>,
4177 ///                  \anchor Container_SortMethod_sortid
4178 ///                  _boolean_,
4179 ///     @return **True** if the current sort method matches the specified SortID (see \ref List_of_sort_methods "SortUtils").
4180 ///     <p>
4181 ///   }
4182 const infomap container_ints[] = {{ "row",              CONTAINER_ROW },
4183                                   { "column",           CONTAINER_COLUMN },
4184                                   { "position",         CONTAINER_POSITION },
4185                                   { "subitem",          CONTAINER_SUBITEM },
4186                                   { "hasfocus",         CONTAINER_HAS_FOCUS },
4187                                   { "sortmethod",       CONTAINER_SORT_METHOD },
4188 };
4189 
4190 /// \page modules__infolabels_boolean_conditions
4191 ///   \table_row3{   <b>`Container.Property(addoncategory)`</b>,
4192 ///                  \anchor Container_Property_addoncategory
4193 ///                  _string_,
4194 ///     @return The current add-on category.
4195 ///     <p>
4196 ///   }
4197 ///   \table_row3{   <b>`Container.Property(reponame)`</b>,
4198 ///                  \anchor Container_Property_reponame
4199 ///                  _string_,
4200 ///     @return The current add-on repository name.
4201 ///     <p>
4202 ///   }
4203 ///   \table_row3{   <b>`Container.Content`</b>,
4204 ///                  \anchor Container_Content
4205 ///                  _string_,
4206 ///     @return The content of the current container.
4207 ///     <p><hr>
4208 ///     @skinning_v16 **[New Infolabel]** \link Container_Content `Container.Content`\endlink
4209 ///     <p>
4210 ///   }
4211 ///   \table_row3{   <b>`Container(id).ListItem(offset).Property`</b>,
4212 ///                  \anchor Container_ListItem_property
4213 ///                  _string_,
4214 ///     @return the property of the ListItem with a given offset.
4215 ///     @param offset - The offset for the listitem.
4216 ///     @note `Property` has to be replaced with `Label`\, `Label2`\, `Icon` etc.
4217 ///     @note **Example:** `Container(50).Listitem(2).Label `
4218 ///     <p>
4219 ///   }
4220 ///   \table_row3{   <b>`Container(id).ListItemNoWrap(offset).Property`</b>,
4221 ///                  \anchor Container_ListItemNoWrap
4222 ///                  _string_,
4223 ///     @return the same as \link Container_ListItem_property `Container(id).ListItem(offset).Property` \endlink
4224 ///     but it won't wrap.
4225 ///     @param offset - The offset for the listitem.
4226 ///     @note That means if the last item of a list is focused\, `ListItemNoWrap(1)`
4227 ///     will be empty while `ListItem(1)` will return the first item of the list.
4228 ///     `Property` has to be replaced with `Label`\, `Label2`\, `Icon` etc.
4229 ///     @note **Example:** `Container(50).ListitemNoWrap(1).Plot`
4230 ///     <p>
4231 ///   }
4232 ///   \table_row3{   <b>`Container(id).ListItemPosition(x).[infolabel]`</b>,
4233 ///                  \anchor Container_ListItemPosition
4234 ///                  _string_,
4235 ///     @return The infolabel for an item in a Container.
4236 ///     @param x - the position in the container relative to the cursor position.
4237 ///     @note **Example:** `Container(50).ListItemPosition(4).Genre`
4238 ///     <p>
4239 ///   }
4240 ///   \table_row3{   <b>`Container(id).ListItemAbsolute(x).[infolabel]`</b>,
4241 ///                  \anchor Container_ListItemAbsolute
4242 ///                  _string_,
4243 ///     @return The infolabel for an item in a Container.
4244 ///     @param x - the absolute position in the container.
4245 ///     @note **Example:** `Container(50).ListItemAbsolute(4).Genre`
4246 ///     <p><hr>
4247 ///     @skinning_v16 **[New Infolabel]** \link Container_ListItemAbsolute `Container(id).ListItemAbsolute(x).[infolabel]`\endlink
4248 ///     <p>
4249 ///   }
4250 ///   \table_row3{   <b>`Container.Content(parameter)`</b>,
4251 ///                  \anchor Container_Content_parameter
4252 ///                  _string_,
4253 ///     @return **True** if the current container you are in contains the following:
4254 ///       - <b>files</b>
4255 ///       - <b>songs</b>
4256 ///       - <b>artists</b>
4257 ///       - <b>albums</b>
4258 ///       - <b>movies</b>
4259 ///       - <b>tvshows</b>
4260 ///       - <b>seasons</b>
4261 ///       - <b>episodes</b>
4262 ///       - <b>musicvideos</b>
4263 ///       - <b>genres</b>
4264 ///       - <b>years</b>
4265 ///       - <b>actors</b>
4266 ///       - <b>playlists</b>
4267 ///       - <b>plugins</b>
4268 ///       - <b>studios</b>
4269 ///       - <b>directors</b>
4270 ///       - <b>sets</b>
4271 ///       - <b>tags</b>
4272 ///     @note These currently only work in the Video and Music
4273 ///     Library or unless a Plugin has set the value) also available are
4274 ///     Addons true when a list of add-ons is shown LiveTV true when a
4275 ///     htsp (tvheadend) directory is shown
4276 ///     <p>
4277 ///   }
4278 ///   \table_row3{   <b>`Container.Art(type)`</b>,
4279 ///                  \anchor Container_Art
4280 ///                  _string_,
4281 ///     @return The path to the art image file for the given type of the current container.
4282 ///     @param type - the art type to request.
4283 ///     @todo List of all art types
4284 ///     <p><hr>
4285 ///     @skinning_v16 **[Infolabel Updated]** \link Container_Art `Container.Art(type)`\endlink
4286 ///     <b>set.fanart</b> as possible type value.
4287 ///     @skinning_v15 **[New Infolabel]** \link Container_Art `Container.Art(type)`\endlink
4288 ///     <p>
4289 ///   }
4290 ///
4291 const infomap container_str[]  = {{ "property",         CONTAINER_PROPERTY },
4292                                   { "content",          CONTAINER_CONTENT },
4293                                   { "art",              CONTAINER_ART }};
4294 
4295 /// \page modules__infolabels_boolean_conditions
4296 ///   \table_row3{   <b>`Container.SortDirection(direction)`</b>,
4297 ///                  \anchor Container_SortDirection
4298 ///                  _boolean_,
4299 ///     @return **True** if the sort direction of a container equals direction.
4300 ///     @param direction - The direction to check. It can be:
4301 ///       - <b>ascending</b>
4302 ///       - <b>descending</b>
4303 ///     <p>
4304 ///   }
4305 /// \table_end
4306 ///
4307 /// -----------------------------------------------------------------------------
4308 
4309 /// \page modules__infolabels_boolean_conditions
4310 /// \subsection modules__infolabels_boolean_conditions_ListItem ListItem
4311 /// \table_start
4312 ///   \table_h3{ Labels, Type, Description }
4313 ///   \table_row3{   <b>`ListItem.Thumb`</b>,
4314 ///                  \anchor ListItem_Thumb
4315 ///                  _string_,
4316 ///     @return The thumbnail (if it exists) of the currently selected item
4317 ///     in a list or thumb control.
4318 ///     @deprecated but still available\, returns
4319 ///     the same as \ref ListItem_Art_Type "ListItem.Art(thumb)"
4320 ///     <p>
4321 ///   }
4322 ///   \table_row3{   <b>`ListItem.Icon`</b>,
4323 ///                  \anchor ListItem_Icon
4324 ///                  _string_,
4325 ///     @return The thumbnail (if it exists) of the currently selected item in a list or thumb control.
4326 ///     @note If no thumbnail image exists\, it will show the icon.
4327 ///     <p>
4328 ///   }
4329 ///   \table_row3{   <b>`ListItem.ActualIcon`</b>,
4330 ///                  \anchor ListItem_ActualIcon
4331 ///                  _string_,
4332 ///     @return The icon of the currently selected item in a list or thumb control.
4333 ///     <p>
4334 ///   }
4335 ///   \table_row3{   <b>`ListItem.Overlay`</b>,
4336 ///                  \anchor ListItem_Overlay
4337 ///                  _string_,
4338 ///     @return The overlay icon status of the currently selected item in a list or thumb control.
4339 ///       - compressed file -- OverlayRAR.png
4340 ///       - watched -- OverlayWatched.png
4341 ///       - unwatched -- OverlayUnwatched.png
4342 ///       - locked -- OverlayLocked.png
4343 ///     <p>
4344 ///   }
4345 ///   \table_row3{   <b>`ListItem.IsFolder`</b>,
4346 ///                  \anchor ListItem_IsFolder
4347 ///                  _boolean_,
4348 ///     @return **True** if the current ListItem is a folder.
4349 ///     <p>
4350 ///   }
4351 ///   \table_row3{   <b>`ListItem.IsPlaying`</b>,
4352 ///                  \anchor ListItem_IsPlaying
4353 ///                  _boolean_,
4354 ///     @return **True** if the current ListItem.* info labels and images are
4355 ///     currently Playing media.
4356 ///     <p>
4357 ///   }
4358 ///   \table_row3{   <b>`ListItem.IsResumable`</b>,
4359 ///                  \anchor ListItem_IsResumable
4360 ///                  _boolean_,
4361 ///     @return **True** when the current ListItem has been partially played.
4362 ///     <p>
4363 ///   }
4364 ///   \table_row3{   <b>`ListItem.IsCollection`</b>,
4365 ///                  \anchor ListItem_IsCollection
4366 ///                  _boolean_,
4367 ///     @return **True** when the current ListItem is a movie set.
4368 ///     <p><hr>
4369 ///     @skinning_v15 **[New Boolean Condition]** \link ListItem_IsCollection `ListItem.IsCollection`\endlink
4370 ///     <p>
4371 ///   }
4372 ///   \table_row3{   <b>`ListItem.IsSelected`</b>,
4373 ///                  \anchor ListItem_IsSelected
4374 ///                  _boolean_,
4375 ///     @return **True** if the current ListItem is selected (f.e. currently playing
4376 ///     in playlist window).
4377 ///     <p>
4378 ///   }
4379 ///   \table_row3{   <b>`ListItem.HasEpg`</b>,
4380 ///                  \anchor ListItem_HasEpg
4381 ///                  _boolean_,
4382 ///     @return **True** when the selected programme has epg info (PVR).
4383 ///     <p>
4384 ///   }
4385 ///   \table_row3{   <b>`ListItem.HasTimer`</b>,
4386 ///                  \anchor ListItem_HasTimer
4387 ///                  _boolean_,
4388 ///     @return **True** when a recording timer has been set for the selected
4389 ///     programme (PVR).
4390 ///     <p>
4391 ///   }
4392 ///   \table_row3{   <b>`ListItem.IsRecording`</b>,
4393 ///                  \anchor ListItem_IsRecording
4394 ///                  _boolean_,
4395 ///     @return **True** when the selected programme is being recorded (PVR).
4396 ///     <p>
4397 ///   }
4398 ///   \table_row3{   <b>`ListItem.IsPlayable`</b>,
4399 ///                  \anchor ListItem_IsPlayable
4400 ///                  _boolean_,
4401 ///     @return **True** when the selected programme can be played (PVR)
4402 ///     <p><hr>
4403 ///     @skinning_v19 **[New Boolean Condition]** \link ListItem_IsPlayable `ListItem.IsPlayable`\endlink
4404 ///     <p>
4405 ///   }
4406 ///   \table_row3{   <b>`ListItem.HasArchive`</b>,
4407 ///                  \anchor ListItem_HasArchive
4408 ///                  _boolean_,
4409 ///     @return **True** when the selected channel has a server-side back buffer (PVR)
4410 ///     <p><hr>
4411 ///     @skinning_v19 **[New Boolean Condition]** \link ListItem_HasArchive `ListItem.HasArchive`\endlink
4412 ///     <p>
4413 ///   }
4414 ///   \table_row3{   <b>`ListItem.IsEncrypted`</b>,
4415 ///                  \anchor ListItem_IsEncrypted
4416 ///                  _boolean_,
4417 ///     @return **True** when the selected programme is encrypted (PVR).
4418 ///     <p>
4419 ///   }
4420 ///   \table_row3{   <b>`ListItem.IsStereoscopic`</b>,
4421 ///                  \anchor ListItem_IsStereoscopic
4422 ///                  _boolean_,
4423 ///     @return **True** when the selected video is a 3D (stereoscopic) video.
4424 ///     <p><hr>
4425 ///     @skinning_v13 **[New Boolean Condition]** \link ListItem_IsStereoscopic `ListItem.IsStereoscopic`\endlink
4426 ///     <p>
4427 ///   }
4428 ///   \table_row3{   <b>`ListItem.Property(IsSpecial)`</b>,
4429 ///                  \anchor ListItem_Property_IsSpecial
4430 ///                  _boolean_,
4431 ///     @return **True** if the current Season/Episode is a Special.
4432 ///     <p>
4433 ///   }
4434 ///   \table_row3{   <b>`ListItem.Property(DateLabel)`</b>,
4435 ///                  \anchor ListItem_Property_DateLabel
4436 ///                  _boolean_,
4437 ///     @return **True** if the item is a date label\, returns false if the item is a time label.
4438 ///     @note Can be used in the rulerlayout of the epggrid control.
4439 ///     <p>
4440 ///   }
4441 ///   \table_row3{   <b>`ListItem.Property(Addon.IsEnabled)`</b>,
4442 ///                  \anchor ListItem_Property_AddonIsEnabled
4443 ///                  _boolean_,
4444 ///     @return **True** when the selected addon is enabled (for use in the addon
4445 ///     info dialog only).
4446 ///     <p><hr>
4447 ///     @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonIsEnabled `ListItem.Property(Addon.IsEnabled)`\endlink
4448 ///     replaces `ListItem.Property(Addon.Enabled)`.
4449 ///     <p>
4450 ///   }
4451 ///   \table_row3{   <b>`ListItem.Property(Addon.IsInstalled)`</b>,
4452 ///                  \anchor ListItem_Property_AddonIsInstalled
4453 ///                  _boolean_,
4454 ///     @return **True** when the selected addon is installed (for use in the addon
4455 ///     info dialog only).
4456 ///     <p><hr>
4457 ///     @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonIsInstalled `ListItem.Property(Addon.IsInstalled)`\endlink
4458 ///     replaces `ListItem.Property(Addon.Installed)`.
4459 ///     <p>
4460 ///   }
4461 ///   \table_row3{   <b>`ListItem.Property(Addon.HasUpdate)`</b>,
4462 ///                  \anchor ListItem_Property_AddonHasUpdate
4463 ///                  _boolean_,
4464 ///     @return **True** when there's an update available for the selected addon.
4465 ///     <p><hr>
4466 ///     @skinning_v17 **[Boolean Condition Updated]** \link ListItem_Property_AddonHasUpdate `ListItem.Property(Addon.HasUpdate)`\endlink
4467 ///     replaces `ListItem.Property(Addon.UpdateAvail)`.
4468 ///     <p>
4469 ///   }
4470 ///   \table_row3{   <b>`ListItem.IsAutoUpdateable`</b>,
4471 ///                  \anchor ListItem_IsAutoUpdateable
4472 ///                  _boolean_,
4473 ///     @return **True** if this add-on can be updated automatically.
4474 ///     <p><hr>
4475 ///     @skinning_v19 **[New Boolean Condition]** \link ListItem_IsAutoUpdateable `ListItem.IsAutoUpdateable`\endlink
4476 ///     <p>
4477 ///   }
4478 ///   \table_row3{   <b>`ListItem.Property(Addon.IsFromOfficialRepo)`</b>,
4479 ///                  \anchor ListItem_Property_AddonIsFromOfficialRepo
4480 ///                  _boolean_,
4481 ///     @return **True** if this add-on is from an official repository.
4482 ///     <p><hr>
4483 ///     @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsFromOfficialRepo `ListItem.Property(Addon.IsFromOfficialRepo)`\endlink
4484 ///     <p>
4485 ///   }
4486 ///   \table_row3{   <b>`ListItem.Property(Addon.IsBinary)`</b>,
4487 ///                  \anchor ListItem_Property_AddonIsBinary
4488 ///                  _boolean_,
4489 ///     @return **True** if this add-on is a binary addon.
4490 ///     <p><hr>
4491 ///     @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsBinary `ListItem.Property(Addon.IsBinary)`\endlink
4492 ///     <p>
4493 ///   }
4494 ///   \table_row3{   <b>`ListItem.Property(Addon.IsUpdate)`</b>,
4495 ///                  \anchor ListItem_Property_AddonIsUpdate
4496 ///                  _boolean_,
4497 ///     @return **True** if this add-on is a valid update of an installed outdated add-on.
4498 ///     <p><hr>
4499 ///     @skinning_v19 **[New Boolean Condition]** \link ListItem_Property_AddonIsUpdate `ListItem.Property(Addon.IsUpdate)`\endlink
4500 ///     <p>
4501 ///   }
4502 ///   \table_row3{   <b>`ListItem.Property(Addon.ValidUpdateOrigin)`</b>,
4503 ///                  \anchor ListItem_Property_ValidUpdateOrigin
4504 ///                  _string_,
4505 ///     @return The origin string of a valid update for the addon. Empty string if there is no valid update available.
4506 ///     <p><hr>
4507 ///     @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateOrigin `ListItem.Property(Addon.ValidUpdateOrigin)`\endlink
4508 ///     <p>
4509 ///   }
4510 ///   \table_row3{   <b>`ListItem.Property(Addon.ValidUpdateVersion)`</b>,
4511 ///                  \anchor ListItem_Property_ValidUpdateVersion
4512 ///                  _string_,
4513 ///     @return The version string of a valid update for the addon. Empty string if there is no valid update available.
4514 ///     <p><hr>
4515 ///     @skinning_v19 **[New Infolabel]** \link ListItem_Property_ValidUpdateVersion `ListItem.Property(Addon.ValidUpdateVersion)`\endlink
4516 ///     <p>
4517 ///   }
4518 ///   \table_row3{   <b>`ListItem.Label`</b>,
4519 ///                  \anchor ListItem_Label
4520 ///                  _string_,
4521 ///     @return The left label of the currently selected item in a container.
4522 ///     <p>
4523 ///   }
4524 ///   \table_row3{   <b>`ListItem.Label2`</b>,
4525 ///                  \anchor ListItem_Label2
4526 ///                  _string_,
4527 ///     @return The right label of the currently selected item in a container.
4528 ///     <p>
4529 ///   }
4530 ///   \table_row3{   <b>`ListItem.Title`</b>,
4531 ///                  \anchor ListItem_Title
4532 ///                  _string_,
4533 ///     @return The title of the currently selected song\, movie\, game in a container.
4534 ///     <p><hr>
4535 ///     @skinning_v18 **[Infolabel Updated]** \link ListItem_Title `ListItem.Title`\endlink extended
4536 ///     to support games
4537 ///     <p>
4538 ///   }
4539 ///   \table_row3{   <b>`ListItem.OriginalTitle`</b>,
4540 ///                  \anchor ListItem_OriginalTitle
4541 ///                  _string_,
4542 ///     @return The original title of the currently selected movie in a container.
4543 ///     <p>
4544 ///   }
4545 ///   \table_row3{   <b>`ListItem.SortLetter`</b>,
4546 ///                  \anchor ListItem_SortLetter
4547 ///                  _string_,
4548 ///     @return The first letter of the current file in a container.
4549 ///     <p>
4550 ///   }
4551 ///   \table_row3{   <b>`ListItem.TrackNumber`</b>,
4552 ///                  \anchor ListItem_TrackNumber
4553 ///                  _string_,
4554 ///     @return The track number of the currently selected song in a container.
4555 ///     <p>
4556 ///   }
4557 ///   \table_row3{   <b>`ListItem.Artist`</b>,
4558 ///                  \anchor ListItem_Artist
4559 ///                  _string_,
4560 ///     @return The artist of the currently selected song in a container.
4561 ///     <p>
4562 ///   }
4563 ///   \table_row3{   <b>`ListItem.AlbumArtist`</b>,
4564 ///                  \anchor ListItem_AlbumArtist
4565 ///                  _string_,
4566 ///     @return The artist of the currently selected album in a list.
4567 ///     <p>
4568 ///   }
4569 ///   \table_row3{   <b>`ListItem.Property(Artist_Sortname)`</b>,
4570 ///                  \anchor ListItem_Property_Artist_Sortname
4571 ///                  _string_,
4572 ///     @return The sortname of the currently selected Artist.
4573 ///     <p><hr>
4574 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Sortname `ListItem.Property(Artist_Sortname)`\endlink
4575 ///     <p>
4576 ///   }
4577 ///   \table_row3{   <b>`ListItem.Property(Artist_Type)`</b>,
4578 ///                  \anchor ListItem_Property_Artist_Type
4579 ///                  _string_,
4580 ///     @return The type of the currently selected Artist - person\, group\, orchestra\, choir etc.
4581 ///     <p><hr>
4582 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Type `ListItem.Property(Artist_Type)`\endlink
4583 ///     <p>
4584 ///   }
4585 ///   \table_row3{   <b>`ListItem.Property(Artist_Gender)`</b>,
4586 ///                  \anchor ListItem_Property_Artist_Gender
4587 ///                  _string_,
4588 ///     @return The Gender of the currently selected Artist - male\, female\, other.
4589 ///     <p><hr>
4590 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Gender `ListItem.Property(Artist_Gender)`\endlink
4591 ///     <p>
4592 ///   }
4593 ///   \table_row3{   <b>`ListItem.Property(Artist_Disambiguation)`</b>,
4594 ///                  \anchor ListItem_Property_Artist_Disambiguation
4595 ///                  _string_,
4596 ///     @return A Brief description of the currently selected Artist that differentiates them
4597 ///     from others with the same name.
4598 ///     <p><hr>
4599 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Artist_Disambiguation `ListItem.Property(Artist_Disambiguation)`\endlink
4600 ///     <p>
4601 ///   }
4602 ///   \table_row3{   <b>`ListItem.Property(Artist_Born)`</b>,
4603 ///                  \anchor ListItem_Property_Artist_Born
4604 ///                  _string_,
4605 ///     @return The date of Birth of the currently selected Artist.
4606 ///     <p>
4607 ///   }
4608 ///   \table_row3{   <b>`ListItem.Property(Artist_Died)`</b>,
4609 ///                  \anchor ListItem_Property_Artist_Died
4610 ///                  _string_,
4611 ///     @return The date of Death of the currently selected Artist.
4612 ///     <p>
4613 ///   }
4614 ///   \table_row3{   <b>`ListItem.Property(Artist_Formed)`</b>,
4615 ///                  \anchor ListItem_Property_Artist_Formed
4616 ///                  _string_,
4617 ///     @return The formation date of the currently selected Band.
4618 ///     <p>
4619 ///   }
4620 ///   \table_row3{   <b>`ListItem.Property(Artist_Disbanded)`</b>,
4621 ///                  \anchor ListItem_Property_Artist_Disbanded
4622 ///                  _string_,
4623 ///     @return The disbanding date of the currently selected Band.
4624 ///     <p>
4625 ///   }
4626 ///   \table_row3{   <b>`ListItem.Property(Artist_YearsActive)`</b>,
4627 ///                  \anchor ListItem_Property_Artist_YearsActive
4628 ///                  _string_,
4629 ///     @return The years the currently selected artist has been active.
4630 ///     <p>
4631 ///   }
4632 ///   \table_row3{   <b>`ListItem.Property(Artist_Instrument)`</b>,
4633 ///                  \anchor ListItem_Property_Artist_Instrument
4634 ///                  _string_,
4635 ///     @return The instruments played by the currently selected artist.
4636 ///     <p>
4637 ///   }
4638 ///   \table_row3{   <b>`ListItem.Property(Artist_Description)`</b>,
4639 ///                  \anchor ListItem_Property_Artist_Description
4640 ///                  _string_,
4641 ///     @return A biography of the currently selected artist.
4642 ///     <p>
4643 ///   }
4644 ///   \table_row3{   <b>`ListItem.Property(Artist_Mood)`</b>,
4645 ///                  \anchor ListItem_Property_Artist_Mood
4646 ///                  _string_,
4647 ///     @return The moods of the currently selected artist.
4648 ///     <p>
4649 ///   }
4650 ///   \table_row3{   <b>`ListItem.Property(Artist_Style)`</b>,
4651 ///                  \anchor ListItem_Property_Artist_Style
4652 ///                  _string_,
4653 ///     @return The styles of the currently selected artist.
4654 ///     <p>
4655 ///   }
4656 ///   \table_row3{   <b>`ListItem.Property(Artist_Genre)`</b>,
4657 ///                  \anchor ListItem_Property_Artist_Genre
4658 ///                  _string_,
4659 ///     @return The genre of the currently selected artist.
4660 ///     <p>
4661 ///   }
4662 ///   \table_row3{   <b>`ListItem.Album`</b>,
4663 ///                  \anchor ListItem_Album
4664 ///                  _string_,
4665 ///     @return The album of the currently selected song in a container.
4666 ///     <p>
4667 ///   }
4668 ///   \table_row3{   <b>`ListItem.Property(Album_Mood)`</b>,
4669 ///                  \anchor ListItem_Property_Album_Mood
4670 ///                  _string_,
4671 ///     @return The moods of the currently selected Album.
4672 ///     <p>
4673 ///   }
4674 ///   \table_row3{   <b>`ListItem.Property(Album_Style)`</b>,
4675 ///                  \anchor ListItem_Property_Album_Style
4676 ///                  _string_,
4677 ///     @return The styles of the currently selected Album.
4678 ///     <p>
4679 ///   }
4680 ///   \table_row3{   <b>`ListItem.Property(Album_Theme)`</b>,
4681 ///                  \anchor ListItem_Property_Album_Theme
4682 ///                  _string_,
4683 ///     @return The themes of the currently selected Album.
4684 ///     <p>
4685 ///   }
4686 ///   \table_row3{   <b>`ListItem.Property(Album_Type)`</b>,
4687 ///                  \anchor ListItem_Property_Album_Type
4688 ///                  _string_,
4689 ///     @return The Album Type (e.g. compilation\, enhanced\, explicit lyrics) of
4690 ///     the currently selected Album.
4691 ///     <p>
4692 ///   }
4693 ///   \table_row3{   <b>`ListItem.Property(Album_Label)`</b>,
4694 ///                  \anchor ListItem_Property_Album_Label
4695 ///                  _string_,
4696 ///     @return The record label of the currently selected Album.
4697 ///     <p>
4698 ///   }
4699 ///   \table_row3{   <b>`ListItem.Property(Album_Description)`</b>,
4700 ///                  \anchor ListItem_Property_Album_Description
4701 ///                  _string_,
4702 ///     @return A review of the currently selected Album.
4703 ///     <p>
4704 ///   }
4705 ///   \table_row3{   <b>`ListItem.Property(Album_Totaldiscs)`</b>,
4706 ///                  \anchor ListItem_Property_Album_Totaldiscs
4707 ///                  _string_,
4708 ///     @return The total number of discs belonging to an album.
4709 ///     <p><hr>
4710 ///     @skinning_v19 **[New Infolabel]** \link ListItem.Property(Album_Totaldiscs) `ListItem.Property(Album_Totaldiscs)`\endlink
4711 ///     <p>
4712 ///   }
4713 ///   \table_row3{   <b>`ListItem.Property(Album_Isboxset)`</b>,
4714 ///                  \anchor ListItem_Property_Album_Isboxset
4715 ///                  _string_,
4716 ///     @return **True** if the album is a boxset.
4717 ///     <p><hr>
4718 ///     @skinning_v19 **[New Infobool]** \link ListItem.Property(Album_Isboxset) `ListItem.Property(Album_Isboxset)`\endlink
4719 ///     <p>
4720 ///   }
4721 ///   \table_row3{   <b>`ListItem.Property(Album_Duration)`</b>,
4722 ///                  \anchor ListItem_Property_Album_Duration
4723 ///                  _string_,
4724 ///     @return The duration of the album in HH:MM:SS.
4725 ///     <p><hr>
4726 ///     @skinning_v19 **[New Infolabel]** \link ListItem_Property_Album_Duration `ListItem.Property(Album_Duration)`\endlink
4727 ///     <p>
4728 ///   }
4729 ///   \table_row3{   <b>`ListItem.DiscNumber`</b>,
4730 ///                  \anchor ListItem_DiscNumber
4731 ///                  _string_,
4732 ///     @return The disc number of the currently selected song in a container.
4733 ///     <p>
4734 ///   }
4735 ///   \table_row3{   <b>`ListItem.Year`</b>,
4736 ///                  \anchor ListItem_Year
4737 ///                  _string_,
4738 ///     @return The year of the currently selected song\, album\, movie\, game  in a
4739 ///     container.
4740 ///     <p><hr>
4741 ///     @skinning_v18 **[Infolabel Updated]** \link ListItem_Title `ListItem.Title`\endlink extended
4742 ///     to support games
4743 ///     <p>
4744 ///   }
4745 ///   \table_row3{   <b>`ListItem.Premiered`</b>,
4746 ///                  \anchor ListItem_Premiered
4747 ///                  _string_,
4748 ///     @return The release/aired date of the currently selected episode\, show\,
4749 ///     movie or EPG item in a container.
4750 ///     <p><hr>
4751 ///     @skinning_v15 **[Infolabel Updated]** \link ListItem_Premiered `ListItem.Premiered`\endlink
4752 ///     now also available for EPG items.
4753 ///     <p>
4754 ///   }
4755 ///   \table_row3{   <b>`ListItem.Genre`</b>,
4756 ///                  \anchor ListItem_Genre
4757 ///                  _string_,
4758 ///     @return The genre of the currently selected song\, album or movie in a
4759 ///     container.
4760 ///     <p>
4761 ///   }
4762 ///   \table_row3{   <b>`ListItem.Contributors`</b>,
4763 ///                  \anchor ListItem_Contributors
4764 ///                  _string_,
4765 ///     @return The list of all people who've contributed to the selected song.
4766 ///     <p><hr>
4767 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Contributors `ListItem.Contributors`\endlink
4768 ///     <p>
4769 ///   }
4770 ///   \table_row3{   <b>`ListItem.ContributorAndRole`</b>,
4771 ///                  \anchor ListItem_ContributorAndRole
4772 ///                  _string_,
4773 ///     @return The list of all people and their role who've contributed to the selected song.
4774 ///     <p><hr>
4775 ///     @skinning_v17 **[New Infolabel]** \link ListItem_ContributorAndRole `ListItem.ContributorAndRole`\endlink
4776 ///     <p>
4777 ///   }
4778 ///   \table_row3{   <b>`ListItem.Director`</b>,
4779 ///                  \anchor ListItem_Director
4780 ///                  _string_,
4781 ///     @return The director of the currently selected movie in a container.
4782 ///     <p><hr>
4783 ///     @skinning_v15 **[Infolabel Updated]** \link ListItem_Director `ListItem.Director`\endlink
4784 ///     also supports EPG.
4785 ///     <p>
4786 ///   }
4787 ///   \table_row3{   <b>`ListItem.Country`</b>,
4788 ///                  \anchor ListItem_Country
4789 ///                  _string_,
4790 ///     @return The production country of the currently selected movie in a
4791 ///     container.
4792 ///     <p>
4793 ///   }
4794 ///   \table_row3{   <b>`ListItem.Episode`</b>,
4795 ///                  \anchor ListItem_Episode
4796 ///                  _string_,
4797 ///     @return The episode number value for the currently selected episode. It
4798 ///     also returns the number of total\, watched or unwatched episodes for the
4799 ///     currently selected tvshow or season\, based on the the current watched
4800 ///     filter.
4801 ///     <p><hr>
4802 ///     @skinning_v15 **[Infolabel Updated]** \link ListItem_Episode `ListItem.Episode`\endlink
4803 ///     also supports EPG.
4804 ///     <p>
4805 ///   }
4806 ///   \table_row3{   <b>`ListItem.Season`</b>,
4807 ///                  \anchor ListItem_Season
4808 ///                  _string_,
4809 ///     @return The season value for the currently selected tvshow.
4810 ///     <p><hr>
4811 ///     @skinning_v15 **[Infolabel Updated]** \link ListItem_Season `ListItem.Season`\endlink
4812 ///     also supports EPG.
4813 ///     <p>
4814 ///   }
4815 ///   \table_row3{   <b>`ListItem.TVShowTitle`</b>,
4816 ///                  \anchor ListItem_TVShowTitle
4817 ///                  _string_,
4818 ///     @return The name value for the currently selected tvshow in the season and
4819 ///     episode depth of the video library.
4820 ///     <p>
4821 ///   }
4822 ///   \table_row3{   <b>`ListItem.Property(TotalSeasons)`</b>,
4823 ///                  \anchor ListItem_Property_TotalSeasons
4824 ///                  _string_,
4825 ///     @return The total number of seasons for the currently selected tvshow.
4826 ///     <p>
4827 ///   }
4828 ///   \table_row3{   <b>`ListItem.Property(TotalEpisodes)`</b>,
4829 ///                  \anchor ListItem_Property_TotalEpisodes
4830 ///                  _string_,
4831 ///     @return the total number of episodes for the currently selected tvshow or
4832 ///     season.
4833 ///     <p>
4834 ///   }
4835 ///   \table_row3{   <b>`ListItem.Property(WatchedEpisodes)`</b>,
4836 ///                  \anchor ListItem_Property_WatchedEpisodes
4837 ///                  _string_,
4838 ///     @return The number of watched episodes for the currently selected tvshow
4839 ///     or season.
4840 ///     <p>
4841 ///   }
4842 ///   \table_row3{   <b>`ListItem.Property(UnWatchedEpisodes)`</b>,
4843 ///                  \anchor ListItem_Property_UnWatchedEpisodes
4844 ///                  _string_,
4845 ///     @return The number of unwatched episodes for the currently selected tvshow
4846 ///     or season.
4847 ///     <p>
4848 ///   }
4849 ///   \table_row3{   <b>`ListItem.Property(NumEpisodes)`</b>,
4850 ///                  \anchor ListItem_Property_NumEpisodes
4851 ///                  _string_,
4852 ///     @return The number of total\, watched or unwatched episodes for the
4853 ///     currently selected tvshow or season\, based on the the current watched filter.
4854 ///     <p>
4855 ///   }
4856 ///   \table_row3{   <b>`ListItem.PictureAperture`</b>,
4857 ///                  \anchor ListItem_PictureAperture
4858 ///                  _string_,
4859 ///     @return The F-stop used to take the selected picture.
4860 ///     @note This is the value of the EXIF FNumber tag (hex code 0x829D).
4861 ///     <p>
4862 ///   }
4863 ///   \table_row3{   <b>`ListItem.PictureAuthor`</b>,
4864 ///                  \anchor ListItem_PictureAuthor
4865 ///                  _string_,
4866 ///     @return The name of the person involved in writing about the selected picture.
4867 ///     @note This is the value of the IPTC Writer tag (hex code 0x7A).
4868 ///     <p><hr>
4869 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureAuthor `ListItem.PictureAuthor`\endlink
4870 ///     <p>
4871 ///   }
4872 ///   \table_row3{   <b>`ListItem.PictureByline`</b>,
4873 ///                  \anchor ListItem_PictureByline
4874 ///                  _string_,
4875 ///     @return The name of the person who created the selected picture.
4876 ///     @note This is the value of the IPTC Byline tag (hex code 0x50).
4877 ///     <p><hr>
4878 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureByline `ListItem.PictureByline`\endlink
4879 ///     <p>
4880 ///   }
4881 ///   \table_row3{   <b>`ListItem.PictureBylineTitle`</b>,
4882 ///                  \anchor ListItem_PictureBylineTitle
4883 ///                  _string_,
4884 ///     @return The title of the person who created the selected picture.
4885 ///     @note This is the value of the IPTC BylineTitle tag (hex code 0x55).
4886 ///     <p><hr>
4887 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureBylineTitle `ListItem.PictureBylineTitle`\endlink
4888 ///     <p>
4889 ///   }
4890 ///   \table_row3{   <b>`ListItem.PictureCamMake`</b>,
4891 ///                  \anchor ListItem_PictureCamMake
4892 ///                  _string_,
4893 ///     @return The manufacturer of the camera used to take the selected picture.
4894 ///     @note This is the value of the EXIF Make tag (hex code 0x010F).
4895 ///     <p>
4896 ///   }
4897 ///   \table_row3{   <b>`ListItem.PictureCamModel`</b>,
4898 ///                  \anchor ListItem_PictureCamModel
4899 ///                  _string_,
4900 ///     @return The manufacturer's model name or number of the camera used to take
4901 ///     the selected picture.
4902 ///     @note This is the value of the EXIF Model tag (hex code 0x0110).
4903 ///     <p>
4904 ///   }
4905 ///   \table_row3{   <b>`ListItem.PictureCaption`</b>,
4906 ///                  \anchor ListItem_PictureCaption
4907 ///                  _string_,
4908 ///     @return A description of the selected picture.
4909 ///     @note This is the value of the IPTC Caption tag (hex code 0x78).
4910 ///     <p>
4911 ///   }
4912 ///   \table_row3{   <b>`ListItem.PictureCategory`</b>,
4913 ///                  \anchor ListItem_PictureCategory
4914 ///                  _string_,
4915 ///     @return The subject of the selected picture as a category code.
4916 ///     @note This is the value of the IPTC Category tag (hex code 0x0F).
4917 ///     <p><hr>
4918 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCategory `ListItem.PictureCategory`\endlink
4919 ///     <p>
4920 ///   }
4921 ///   \table_row3{   <b>`ListItem.PictureCCDWidth`</b>,
4922 ///                  \anchor ListItem_PictureCCDWidth
4923 ///                  _string_,
4924 ///     @return The width of the CCD in the camera used to take the selected
4925 ///     picture.
4926 ///     @note This is calculated from three EXIF tags (0xA002 * 0xA210 / 0xA20e).
4927 ///     <p><hr>
4928 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCCDWidth `ListItem.PictureCCDWidth`\endlink
4929 ///     <p>
4930 ///   }
4931 ///   \table_row3{   <b>`ListItem.PictureCity`</b>,
4932 ///                  \anchor ListItem_PictureCity
4933 ///                  _string_,
4934 ///     @return The city where the selected picture was taken.
4935 ///     @note This is the value of the IPTC City tag (hex code 0x5A).
4936 ///     <p><hr>
4937 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCity `ListItem.PictureCity`\endlink
4938 ///     <p>
4939 ///   }
4940 ///   \table_row3{   <b>`ListItem.PictureColour`</b>,
4941 ///                  \anchor ListItem_PictureColour
4942 ///                  _string_,
4943 ///     @return Whether the selected picture is "Colour" or "Black and White".
4944 ///     <p><hr>
4945 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureColour `ListItem.PictureColour`\endlink
4946 ///     <p>
4947 ///   }
4948 ///   \table_row3{   <b>`ListItem.PictureComment`</b>,
4949 ///                  \anchor ListItem_PictureComment
4950 ///                  _string_,
4951 ///     @return A description of the selected picture.
4952 ///     @note This is the value of the
4953 ///     EXIF User Comment tag (hex code 0x9286). This is the same value as
4954 ///     \ref Slideshow_SlideComment "Slideshow.SlideComment".
4955 ///     <p>
4956 ///   }
4957 ///   \table_row3{   <b>`ListItem.PictureCopyrightNotice`</b>,
4958 ///                  \anchor ListItem_PictureCopyrightNotice
4959 ///                  _string_,
4960 ///     @return The copyright notice of the selected picture.
4961 ///     @note This is the value of the IPTC Copyright tag (hex code 0x74).
4962 ///     <p><hr>
4963 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCopyrightNotice `ListItem.PictureCopyrightNotice`\endlink
4964 ///     <p>
4965 ///   }
4966 ///   \table_row3{   <b>`ListItem.PictureCountry`</b>,
4967 ///                  \anchor ListItem_PictureCountry
4968 ///                  _string_,
4969 ///     @return The full name of the country where the selected picture was taken.
4970 ///     @note This is the value of the IPTC CountryName tag (hex code 0x65).
4971 ///     <p><hr>
4972 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCountry `ListItem.PictureCountry`\endlink
4973 ///     <p>
4974 ///   }
4975 ///   \table_row3{   <b>`ListItem.PictureCountryCode`</b>,
4976 ///                  \anchor ListItem_PictureCountryCode
4977 ///                  _string_,
4978 ///     @return The country code of the country where the selected picture was
4979 ///     taken.
4980 ///     @note This is the value of the IPTC CountryCode tag (hex code 0x64).
4981 ///     <p><hr>
4982 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCountryCode `ListItem.PictureCountryCode`\endlink
4983 ///     <p>
4984 ///   }
4985 ///   \table_row3{   <b>`ListItem.PictureCredit`</b>,
4986 ///                  \anchor ListItem_PictureCredit
4987 ///                  _string_,
4988 ///     @return Who provided the selected picture.
4989 ///     @note This is the value of the IPTC Credit tag (hex code 0x6E).
4990 ///     <p><hr>
4991 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureCredit `ListItem.PictureCredit`\endlink
4992 ///     <p>
4993 ///   }
4994 ///   \table_row3{   <b>`ListItem.PictureDate`</b>,
4995 ///                  \anchor ListItem_PictureDate
4996 ///                  _string_,
4997 ///     @return The localized date of the selected picture. The short form of the
4998 ///     date is used.
4999 ///     @note The value of the EXIF DateTimeOriginal tag (hex code 0x9003)
5000 ///     is preferred. If the DateTimeOriginal tag is not found\, the value of
5001 ///     DateTimeDigitized (hex code 0x9004) or of DateTime (hex code 0x0132) might
5002 ///     be used.
5003 ///     <p><hr>
5004 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureDate `ListItem.PictureDate`\endlink
5005 ///     <p>
5006 ///   }
5007 ///   \table_row3{   <b>`ListItem.PictureDatetime`</b>,
5008 ///                  \anchor ListItem_PictureDatetime
5009 ///                  _string_,
5010 ///     @return The date/timestamp of the selected picture. The localized short form
5011 ///     of the date and time is used.
5012 ///     @note The value of the EXIF DateTimeOriginal tag (hex code 0x9003) is preferred.
5013 ///     If the DateTimeOriginal tag is not found\, the value of DateTimeDigitized
5014 ///     (hex code 0x9004) or of DateTime (hex code 0x0132) might be used.
5015 ///     <p><hr>
5016 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureDatetime `ListItem.PictureDatetime`\endlink
5017 ///     <p>
5018 ///   }
5019 ///   \table_row3{   <b>`ListItem.PictureDesc`</b>,
5020 ///                  \anchor ListItem_PictureDesc
5021 ///                  _string_,
5022 ///     @return A short description of the selected picture. The SlideComment\,
5023 ///     EXIFComment\, or Caption values might contain a longer description.
5024 ///     @note This is the value of the EXIF ImageDescription tag (hex code 0x010E).
5025 ///     <p>
5026 ///   }
5027 ///   \table_row3{   <b>`ListItem.PictureDigitalZoom`</b>,
5028 ///                  \anchor ListItem_PictureDigitalZoom
5029 ///                  _string_,
5030 ///     @return The digital zoom ratio when the selected picture was taken.
5031 ///     @note This is the value of the EXIF DigitalZoomRatio tag (hex code 0xA404).
5032 ///     <p><hr>
5033 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureDigitalZoom `ListItem.PictureDigitalZoom`\endlink
5034 ///     <p>
5035 ///   }
5036 ///   \table_row3{   <b>`ListItem.PictureExpMode`</b>,
5037 ///                  \anchor ListItem_PictureExpMode
5038 ///                  _string_,
5039 ///     @return The exposure mode of the selected picture.
5040 ///     The possible values are:
5041 ///       - <b>"Automatic"</b>
5042 ///       - <b>"Manual"</b>
5043 ///       - <b>"Auto bracketing"</b>
5044 ///     @note This is the value of the EXIF ExposureMode tag (hex code 0xA402).
5045 ///     <p>
5046 ///   }
5047 ///   \table_row3{   <b>`ListItem.PictureExposure`</b>,
5048 ///                  \anchor ListItem_PictureExposure
5049 ///                  _string_,
5050 ///     @return The class of the program used by the camera to set exposure when
5051 ///     the selected picture was taken. Values include:
5052 ///      -  <b>"Manual"</b>
5053 ///      -  <b>"Program (Auto)"</b>
5054 ///      -  <b>"Aperture priority (Semi-Auto)"</b>
5055 ///      -  <b>"Shutter priority (semi-auto)"</b>
5056 ///      -  etc
5057 ///     @note This is the value of the EXIF ExposureProgram tag (hex code 0x8822).
5058 ///     <p><hr>
5059 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureExposure `ListItem.PictureExposure`\endlink
5060 ///     <p>
5061 ///   }
5062 ///   \table_row3{   <b>`ListItem.PictureExposureBias`</b>,
5063 ///                  \anchor ListItem_PictureExposureBias
5064 ///                  _string_,
5065 ///     @return The exposure bias of the selected picture.
5066 ///     Typically this is a number between -99.99 and 99.99.
5067 ///     @note This is the value of the EXIF ExposureBiasValue tag (hex code 0x9204).
5068 ///     <p><hr>
5069 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureExposureBias `ListItem.PictureExposureBias`\endlink
5070 ///     <p>
5071 ///   }
5072 ///   \table_row3{   <b>`ListItem.PictureExpTime`</b>,
5073 ///                  \anchor ListItem_PictureExpTime
5074 ///                  _string_,
5075 ///     @return The exposure time of the selected picture\, in seconds.
5076 ///     @note This is the value of the EXIF ExposureTime tag (hex code 0x829A).
5077 ///     If the ExposureTime tag is not found\, the ShutterSpeedValue tag (hex code 0x9201)
5078 ///     might be used.
5079 ///     <p>
5080 ///   }
5081 ///   \table_row3{   <b>`ListItem.PictureFlashUsed`</b>,
5082 ///                  \anchor ListItem_PictureFlashUsed
5083 ///                  _string_,
5084 ///     @return The status of flash when the selected picture was taken. The value
5085 ///     will be either "Yes" or "No"\, and might include additional information.
5086 ///     @note This is the value of the EXIF Flash tag (hex code 0x9209).
5087 ///     <p><hr>
5088 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureFlashUsed `ListItem.PictureFlashUsed`\endlink
5089 ///     <p>
5090 ///   }
5091 ///   \table_row3{   <b>`ListItem.PictureFocalLen`</b>,
5092 ///                  \anchor ListItem_PictureFocalLen
5093 ///                  _string_,
5094 ///     @return The lens focal length of the selected picture.
5095 ///     <p>
5096 ///   }
5097 ///   \table_row3{   <b>`ListItem.PictureFocusDist`</b>,
5098 ///                  \anchor ListItem_PictureFocusDist
5099 ///                  _string_,
5100 ///     @return The focal length of the lens\, in mm.
5101 ///     @note This is the value of the EXIF FocalLength tag (hex code 0x920A).
5102 ///   }
5103 ///   \table_row3{   <b>`ListItem.PictureGPSLat`</b>,
5104 ///                  \anchor ListItem_PictureGPSLat
5105 ///                  _string_,
5106 ///     @return The latitude where the selected picture was taken (degrees\,
5107 ///     minutes\, seconds North or South).
5108 ///     @note This is the value of the EXIF GPSInfo.GPSLatitude and GPSInfo.GPSLatitudeRef tags.
5109 ///     <p>
5110 ///   }
5111 ///   \table_row3{   <b>`ListItem.PictureGPSLon`</b>,
5112 ///                  \anchor ListItem_PictureGPSLon
5113 ///                  _string_,
5114 ///     @return The longitude where the selected picture was taken (degrees\,
5115 ///     minutes\, seconds East or West).
5116 ///     @note This is the value of the EXIF GPSInfo.GPSLongitude and GPSInfo.GPSLongitudeRef tags.
5117 ///     <p>
5118 ///   }
5119 ///   \table_row3{   <b>`ListItem.PictureGPSAlt`</b>,
5120 ///                  \anchor ListItem_PictureGPSAlt
5121 ///                  _string_,
5122 ///     @return The altitude in meters where the selected picture was taken.
5123 ///     @note This is the value of the EXIF GPSInfo.GPSAltitude tag.
5124 ///     <p>
5125 ///   }
5126 ///   \table_row3{   <b>`ListItem.PictureHeadline`</b>,
5127 ///                  \anchor ListItem_PictureHeadline
5128 ///                  _string_,
5129 ///     @return A synopsis of the contents of the selected picture.
5130 ///     @note This is the value of the IPTC Headline tag (hex code 0x69).
5131 ///     <p><hr>
5132 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureHeadline `ListItem.PictureHeadline`\endlink
5133 ///     <p>
5134 ///   }
5135 ///   \table_row3{   <b>`ListItem.PictureImageType`</b>,
5136 ///                  \anchor ListItem_PictureImageType
5137 ///                  _string_,
5138 ///     @return The color components of the selected picture.
5139 ///     @note This is the value of the IPTC ImageType tag (hex code 0x82).
5140 ///     <p><hr>
5141 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureImageType `ListItem.PictureImageType`\endlink
5142 ///     <p>
5143 ///   }
5144 ///   \table_row3{   <b>`ListItem.PictureIPTCDate`</b>,
5145 ///                  \anchor ListItem_PictureIPTCDate
5146 ///                  _string_,
5147 ///     @return The date when the intellectual content of the selected picture was
5148 ///     created\, rather than when the picture was created.
5149 ///     @note This is the value of the IPTC DateCreated tag (hex code 0x37).
5150 ///     <p><hr>
5151 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureIPTCDate `ListItem.PictureIPTCDate`\endlink
5152 ///     <p>
5153 ///   }
5154 ///   \table_row3{   <b>`ListItem.PictureIPTCTime`</b>,
5155 ///                  \anchor ListItem_PictureIPTCTime
5156 ///                  _string_,
5157 ///     @return The time when the intellectual content of the selected picture was
5158 ///     created\, rather than when the picture was created.
5159 ///     @note This is the value of the IPTC TimeCreated tag (hex code 0x3C).
5160 ///     <p><hr>
5161 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureIPTCTime `ListItem.PictureIPTCTime`\endlink
5162 ///     <p>
5163 ///   }
5164 ///   \table_row3{   <b>`ListItem.PictureISO`</b>,
5165 ///                  \anchor ListItem_PictureISO
5166 ///                  _string_,
5167 ///     @return The ISO speed of the camera when the selected picture was taken.
5168 ///     @note This is the value of the EXIF ISOSpeedRatings tag (hex code 0x8827).
5169 ///     <p>
5170 ///   }
5171 ///   \table_row3{   <b>`ListItem.PictureKeywords`</b>,
5172 ///                  \anchor ListItem_PictureKeywords
5173 ///                  _string_,
5174 ///     @return The keywords assigned to the selected picture.
5175 ///     @note This is the value of the IPTC Keywords tag (hex code 0x19).
5176 ///     <p>
5177 ///   }
5178 ///   \table_row3{   <b>`ListItem.PictureLightSource`</b>,
5179 ///                  \anchor ListItem_PictureLightSource
5180 ///                  _string_,
5181 ///     @return The kind of light source when the picture was taken. Possible
5182 ///     values include:
5183 ///       - <b>"Daylight"</b>
5184 ///       - <b>"Fluorescent"</b>
5185 ///       - <b>"Incandescent</b>
5186 ///       - etc
5187 ///     @note This is the value of the EXIF LightSource tag (hex code 0x9208).
5188 ///     <p><hr>
5189 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureLightSource `ListItem.PictureLightSource`\endlink
5190 ///     <p>
5191 ///   }
5192 ///   \table_row3{   <b>`ListItem.PictureLongDate`</b>,
5193 ///                  \anchor ListItem_PictureLongDate
5194 ///                  _string_,
5195 ///     @return Only the localized date of the selected picture. The long form of
5196 ///     the date is used.
5197 ///     @note The value of the EXIF DateTimeOriginal tag (hex code
5198 ///     0x9003) is preferred. If the DateTimeOriginal tag is not found\, the
5199 ///     value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex code
5200 ///     0x0132) might be used.
5201 ///     <p><hr>
5202 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureLongDate `ListItem.PictureLongDate`\endlink
5203 ///     <p>
5204 ///   }
5205 ///   \table_row3{   <b>`ListItem.PictureLongDatetime`</b>,
5206 ///                  \anchor ListItem_PictureLongDatetime
5207 ///                  _string_,
5208 ///     @return The date/timestamp of the selected picture. The localized long
5209 ///     form of the date and time is used.
5210 ///     @note The value of the EXIF DateTimeOriginal
5211 ///     tag (hex code 0x9003) is preferred. if the DateTimeOriginal tag is not
5212 ///     found\, the value of DateTimeDigitized (hex code 0x9004) or of DateTime
5213 ///     (hex code 0x0132) might be used.
5214 ///     <p>
5215 ///   }
5216 ///   \table_row3{   <b>`ListItem.PictureMeteringMode`</b>,
5217 ///                  \anchor ListItem_PictureMeteringMode
5218 ///                  _string_,
5219 ///     @return The metering mode used when the selected picture was taken. The
5220 ///     possible values are:
5221 ///      - <b>"Center weight"</b>
5222 ///      - <b>"Spot"</b>
5223 ///      - <b>"Matrix"</b>
5224 ///     @note This is the value of the EXIF MeteringMode tag (hex code 0x9207).
5225 ///     <p><hr>
5226 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureMeteringMode `ListItem.PictureMeteringMode`\endlink
5227 ///     <p>
5228 ///   }
5229 ///   \table_row3{   <b>`ListItem.PictureObjectName`</b>,
5230 ///                  \anchor ListItem_PictureObjectName
5231 ///                  _string_,
5232 ///     @return A shorthand reference for the selected picture.
5233 ///     @note This is the value of the IPTC ObjectName tag (hex code 0x05).
5234 ///     <p><hr>
5235 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureObjectName `ListItem.PictureObjectName`\endlink
5236 ///     <p>
5237 ///   }
5238 ///   \table_row3{   <b>`ListItem.PictureOrientation`</b>,
5239 ///                  \anchor ListItem_PictureOrientation
5240 ///                  _string_,
5241 ///     @return The orientation of the selected picture. Possible values are:
5242 ///       - <b>"Top Left"</b>
5243 ///       - <b>"Top Right"</b>
5244 ///       - <b>"Left Top"</b>
5245 ///       - <b>"Right Bottom"</b>
5246 ///       - etc
5247 ///     @note This is the value of the EXIF Orientation tag (hex code 0x0112).
5248 ///     <p><hr>
5249 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureOrientation `ListItem.PictureOrientation`\endlink
5250 ///     <p>
5251 ///   }
5252 ///   \table_row3{   <b>`ListItem.PicturePath`</b>,
5253 ///                  \anchor ListItem_PicturePath
5254 ///                  _string_,
5255 ///     @return The filename and path of the selected picture.
5256 ///     <p>
5257 ///   }
5258 ///   \table_row3{   <b>`ListItem.PictureProcess`</b>,
5259 ///                  \anchor ListItem_PictureProcess
5260 ///                  _string_,
5261 ///     @return The process used to compress the selected picture.
5262 ///     <p><hr>
5263 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureProcess `ListItem.PictureProcess`\endlink
5264 ///     <p>
5265 ///   }
5266 ///   \table_row3{   <b>`ListItem.PictureReferenceService`</b>,
5267 ///                  \anchor ListItem_PictureReferenceService
5268 ///                  _string_,
5269 ///     @return The Service Identifier of a prior envelope to which the selected
5270 ///     picture refers.
5271 ///     @note This is the value of the IPTC ReferenceService tag (hex code 0x2D).
5272 ///     <p><hr>
5273 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureReferenceService `ListItem.PictureReferenceService`\endlink
5274 ///     <p>
5275 ///   }
5276 ///   \table_row3{   <b>`ListItem.PictureResolution`</b>,
5277 ///                  \anchor ListItem_PictureResolution
5278 ///                  _string_,
5279 ///     @return The dimensions of the selected picture.
5280 ///     <p>
5281 ///   }
5282 ///   \table_row3{   <b>`ListItem.PictureSource`</b>,
5283 ///                  \anchor ListItem_PictureSource
5284 ///                  _string_,
5285 ///     @return The original owner of the selected picture.
5286 ///     @note This is the value of the IPTC Source tag (hex code 0x73).
5287 ///     <p><hr>
5288 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureSource `ListItem.PictureSource`\endlink
5289 ///     <p>
5290 ///   }
5291 ///   \table_row3{   <b>`ListItem.PictureSpecialInstructions`</b>,
5292 ///                  \anchor ListItem_PictureSpecialInstructions
5293 ///                  _string_,
5294 ///     @return Other editorial instructions concerning the use of the selected
5295 ///     picture.
5296 ///     @note This is the value of the IPTC SpecialInstructions tag (hex code 0x28).
5297 ///     <p><hr>
5298 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureSpecialInstructions `ListItem.PictureSpecialInstructions`\endlink
5299 ///     <p>
5300 ///   }
5301 ///   \table_row3{   <b>`ListItem.PictureState`</b>,
5302 ///                  \anchor ListItem_PictureState
5303 ///                  _string_,
5304 ///     @return The State/Province where the selected picture was taken.
5305 ///     @note This is the value of the IPTC ProvinceState tag (hex code 0x5F).
5306 ///     <p><hr>
5307 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureState `ListItem.PictureState`\endlink
5308 ///     <p>
5309 ///   }
5310 ///   \table_row3{   <b>`ListItem.PictureSublocation`</b>,
5311 ///                  \anchor ListItem_PictureSublocation
5312 ///                  _string_,
5313 ///     @return The location within a city where the selected picture was taken -
5314 ///     might indicate the nearest landmark.
5315 ///     @note This is the value of the IPTC SubLocation tag (hex code 0x5C).
5316 ///     <p><hr>
5317 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureSublocation `ListItem.PictureSublocation`\endlink
5318 ///     <p>
5319 ///   }
5320 ///   \table_row3{   <b>`ListItem.PictureSupplementalCategories`</b>,
5321 ///                  \anchor ListItem_PictureSupplementalCategories
5322 ///                  _string_,
5323 ///     @return A supplemental category codes to further refine the subject of the
5324 ///     selected picture.
5325 ///     @note This is the value of the IPTC SuppCategory tag (hex code 0x14).
5326 ///     <p><hr>
5327 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureSupplementalCategories `ListItem.PictureSupplementalCategories`\endlink
5328 ///     <p>
5329 ///   }
5330 ///   \table_row3{   <b>`ListItem.PictureTransmissionReference`</b>,
5331 ///                  \anchor ListItem_PictureTransmissionReference
5332 ///                  _string_,
5333 ///     @return A code representing the location of original transmission of the
5334 ///     selected picture.
5335 ///     @note This is the value of the IPTC TransmissionReference tag (hex code 0x67).
5336 ///     <p><hr>
5337 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureTransmissionReference `ListItem.PictureTransmissionReference`\endlink
5338 ///     <p>
5339 ///   }
5340 ///   \table_row3{   <b>`ListItem.PictureUrgency`</b>,
5341 ///                  \anchor ListItem_PictureUrgency
5342 ///                  _string_,
5343 ///     @return The urgency of the selected picture. Values are 1-9.
5344 ///     @note The "1" is most urgent. Some image management programs use urgency to indicate
5345 ///     picture rating\, where urgency "1" is 5 stars and urgency "5" is 1 star.
5346 ///     Urgencies 6-9 are not used for rating. This is the value of the IPTC
5347 ///     Urgency tag (hex code 0x0A).
5348 ///     <p><hr>
5349 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureUrgency `ListItem.PictureUrgency`\endlink
5350 ///     <p>
5351 ///   }
5352 ///   \table_row3{   <b>`ListItem.PictureWhiteBalance`</b>,
5353 ///                  \anchor ListItem_PictureWhiteBalance
5354 ///                  _string_,
5355 ///     @return The white balance mode set when the selected picture was taken.
5356 ///     The possible values are:
5357 ///       - <b>"Manual"</b>
5358 ///       - <b>"Auto"</b>
5359 ///     @note This is the value of the EXIF WhiteBalance tag (hex code 0xA403).
5360 ///     <p><hr>
5361 ///     @skinning_v13 **[New Infolabel]** \link ListItem_PictureWhiteBalance `ListItem.PictureWhiteBalance`\endlink
5362 ///     <p>
5363 ///   }
5364 ///   \table_row3{   <b>`ListItem.FileName`</b>,
5365 ///                  \anchor ListItem_FileName
5366 ///                  _string_,
5367 ///     @return The filename of the currently selected song or movie in a container.
5368 ///     <p>
5369 ///   }
5370 ///   \table_row3{   <b>`ListItem.Path`</b>,
5371 ///                  \anchor ListItem_Path
5372 ///                  _string_,
5373 ///     @return The complete path of the currently selected song or movie in a
5374 ///     container.
5375 ///     <p>
5376 ///   }
5377 ///   \table_row3{   <b>`ListItem.FolderName`</b>,
5378 ///                  \anchor ListItem_FolderName
5379 ///                  _string_,
5380 ///     @return The top most folder of the path of the currently selected song or
5381 ///     movie in a container.
5382 ///     <p>
5383 ///   }
5384 ///   \table_row3{   <b>`ListItem.FolderPath`</b>,
5385 ///                  \anchor ListItem_FolderPath
5386 ///                  _string_,
5387 ///     @return The complete path of the currently selected song or movie in a
5388 ///     container (without user details).
5389 ///     <p>
5390 ///   }
5391 ///   \table_row3{   <b>`ListItem.FileNameAndPath`</b>,
5392 ///                  \anchor ListItem_FileNameAndPath
5393 ///                  _string_,
5394 ///     @return The full path with filename of the currently selected song or
5395 ///     movie in a container.
5396 ///     <p>
5397 ///   }
5398 ///   \table_row3{   <b>`ListItem.FileExtension`</b>,
5399 ///                  \anchor ListItem_FileExtension
5400 ///                  _string_,
5401 ///     @return The file extension (without leading dot) of the currently selected
5402 ///     item in a container.
5403 ///     <p>
5404 ///   }
5405 ///   \table_row3{   <b>`ListItem.FileNameNoExtension`</b>,
5406 ///                  \anchor ListItem_FileName_No_Extension
5407 ///                  _string_,
5408 ///     @return The filename without extension of the currently selected
5409 ///     item in a container.
5410 ///     <p><hr>
5411 ///     @skinning_v19 **[New Infolabel]** \link ListItem_FileName_No_Extension `ListItem.FileNameNoExtension`\endlink
5412 ///     <p>
5413 ///   }
5414 ///   \table_row3{   <b>`ListItem.Date`</b>,
5415 ///                  \anchor ListItem_Date
5416 ///                  _string_,
5417 ///     @return The file date of the currently selected song or movie in a
5418 ///     container / Aired date of an episode / Day\, start time and end time of
5419 ///     current selected TV programme (PVR).
5420 ///     <p>
5421 ///   }
5422 ///   \table_row3{   <b>`ListItem.DateTime`</b>,
5423 ///                  \anchor ListItem_DateTime
5424 ///                  _string_,
5425 ///     @return The date and time a certain event happened (event log).
5426 ///     <p><hr>
5427 ///     @skinning_v16 **[New Infolabel]** \link ListItem_DateTime `ListItem.DateTime`\endlink
5428 ///     <p>
5429 ///   }
5430 ///   \table_row3{   <b>`ListItem.DateAdded`</b>,
5431 ///                  \anchor ListItem_DateAdded
5432 ///                  _string_,
5433 ///     @return The date the currently selected item was added to the
5434 ///     library / Date and time of an event in the EventLog window.
5435 ///     <p>
5436 ///   }
5437 ///   \table_row3{   <b>`ListItem.Size`</b>,
5438 ///                  \anchor ListItem_Size
5439 ///                  _string_,
5440 ///     @return The file size of the currently selected song or movie in a
5441 ///     container.
5442 ///     <p>
5443 ///   }
5444 ///   \table_row3{   <b>`ListItem.Rating([name])`</b>,
5445 ///                  \anchor ListItem_Rating
5446 ///                  _string_,
5447 ///     @return The scraped rating of the currently selected item in a container (1-10).
5448 ///     @param name - [opt] you can specify the name of the scraper to retrieve a specific rating\,
5449 ///     for use in dialogvideoinfo.xml.
5450 ///     <p><hr>
5451 ///     @skinning_v18 **[Infolabel Updated]** \link ListItem_Rating `ListItem.Rating([name])`\endlink replaces
5452 ///     the old `ListItem.Ratings([name])` infolabel.
5453 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Rating `ListItem.Ratings([name])`\endlink
5454 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_Rating `ListItem.Ratings`\endlink
5455 ///     for songs it's now the scraped rating.
5456 ///     <p>
5457 ///   }
5458 ///   \table_row3{   <b>`ListItem.Set`</b>,
5459 ///                  \anchor ListItem_Set
5460 ///                  _string_,
5461 ///     @return The name of the set the movie is part of.
5462 ///     <p><hr>
5463 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Set `ListItem.Set`\endlink
5464 ///     <p>
5465 ///   }
5466 ///   \table_row3{   <b>`ListItem.SetId`</b>,
5467 ///                  \anchor ListItem_SetId
5468 ///                  _string_,
5469 ///     @return The id of the set the movie is part of.
5470 ///     <p><hr>
5471 ///     @skinning_v17 **[New Infolabel]** \link ListItem_SetId `ListItem.SetId`\endlink
5472 ///     <p>
5473 ///   }
5474 ///   \table_row3{   <b>`ListItem.Status`</b>,
5475 ///                  \anchor ListItem_Status
5476 ///                  _string_,
5477 ///     @return One of the following status:
5478 ///       - <b>"returning series"</b>
5479 ///       - <b>"in production"</b>
5480 ///       - <b>"planned"</b>
5481 ///       - <b>"cancelled"</b>
5482 ///       - <b>"ended"</b>
5483 ///     <p>
5484 ///     @note For use with tv shows.
5485 ///     <p><hr>
5486 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Status `ListItem.Status`\endlink
5487 ///     <p>
5488 ///   }
5489 ///   \table_row3{   <b>`ListItem.EndTimeResume`</b>,
5490 ///                  \anchor ListItem_EndTimeResume
5491 ///                  _string_,
5492 ///     @return Returns the time a video will end if you resume it\, instead of playing it from the beginning.
5493 ///     <p><hr>
5494 ///     @skinning_v17 **[New Infolabel]** \link ListItem_EndTimeResume `ListItem.EndTimeResume`\endlink
5495 ///     <p>
5496 ///   }
5497 ///   \table_row3{   <b>`ListItem.UserRating`</b>,
5498 ///                  \anchor ListItem_UserRating
5499 ///                  _string_,
5500 ///     @return The user rating of the currently selected item in a container (1-10).
5501 ///     <p><hr>
5502 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_UserRating `ListItem.UserRating`\endlink
5503 ///     now available for albums/songs.
5504 ///     @skinning_v16 **[New Infolabel]** \link ListItem_UserRating `ListItem.UserRating`\endlink
5505 ///     <p>
5506 ///   }
5507 ///   \table_row3{   <b>`ListItem.Votes([name])`</b>,
5508 ///                  \anchor ListItem_Votes
5509 ///                  _string_,
5510 ///     @return The scraped votes of the currently selected movie in a container.
5511 ///     @param name - [opt] you can specify the name of the scraper to retrieve specific votes\,
5512 ///     for use in `dialogvideoinfo.xml`.
5513 ///     <p><hr>
5514 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_Votes `ListItem.Votes([name])`\endlink
5515 ///     add optional param <b>name</b> to specify the scrapper.
5516 ///     @skinning_v13 **[New Infolabel]** \link ListItem_Votes `ListItem.Votes`\endlink
5517 ///     <p>
5518 ///   }
5519 ///   \table_row3{   <b>`ListItem.RatingAndVotes([name])`</b>,
5520 ///                  \anchor ListItem_RatingAndVotes
5521 ///                  _string_,
5522 ///     @return The scraped rating and votes of the currently selected movie in a
5523 ///     container (1-10).
5524 ///     @param name - [opt] you can specify the name of the scraper to retrieve specific votes\,
5525 ///     for use in `dialogvideoinfo.xml`.
5526 ///     <p><hr>
5527 ///     @skinning_v17 **[New Infolabel]** \link ListItem_RatingAndVotes `ListItem.RatingAndVotes([name])`\endlink
5528 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_RatingAndVotes `ListItem.RatingAndVotes`\endlink
5529 ///     now available for albums/songs.
5530 ///     <p>
5531 ///   }
5532 ///   \table_row3{   <b>`ListItem.Mood`</b>,
5533 ///                  \anchor ListItem_Mood
5534 ///                  _string_,
5535 ///     @return The mood of the selected song.
5536 ///     <p><hr>
5537 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Mood `ListItem.Mood`\endlink
5538 ///     <p>
5539 ///   }
5540 ///   \table_row3{   <b>`ListItem.Mpaa`</b>,
5541 ///                  \anchor ListItem_Mpaa
5542 ///                  _string_,
5543 ///     @return The MPAA rating of the currently selected movie in a container.
5544 ///     <p>
5545 ///   }
5546 ///   \table_row3{   <b>`ListItem.ProgramCount`</b>,
5547 ///                  \anchor ListItem_ProgramCount
5548 ///                  _string_,
5549 ///     @return The number of times an xbe has been run from "my programs".
5550 ///     @todo description might be outdated
5551 ///     <p>
5552 ///   }
5553 ///   \table_row3{   <b>`ListItem.Duration`</b>,
5554 ///                  \anchor ListItem_Duration
5555 ///                  _string_,
5556 ///     @return The duration of the currently selected item in a container
5557 ///     in the format <b>hh:mm:ss</b>.
5558 ///     @note <b>hh:</b> will be omitted if hours value is zero.
5559 ///     <p><hr>
5560 ///     @skinning_v18 **[Infolabel Updated]** \link ListItem_Duration `ListItem.Duration`\endlink will
5561 ///     return <b>hh:mm:ss</b> instead of the duration in minutes.
5562 ///     <p>
5563 ///   }
5564 ///   \table_row3{   <b>`ListItem.Duration(format)`</b>,
5565 ///                  \anchor ListItem_Duration_format
5566 ///                  _string_,
5567 ///     @return The duration of the currently selected item in a container in
5568 ///     different formats.
5569 ///     @param format [opt] The format of the return time value.
5570 ///     See \ref TIME_FORMAT for the list of possible values.
5571 ///     <p>
5572 ///   }
5573 ///   \table_row3{   <b>`ListItem.DBTYPE`</b>,
5574 ///                  \anchor ListItem_DBTYPE
5575 ///                  _string_,
5576 ///     @return The database type of the \ref ListItem_DBID "ListItem.DBID" for videos (movie\, set\,
5577 ///     genre\, actor\, tvshow\, season\, episode). It does not return any value
5578 ///     for the music library.
5579 ///     @note Beware with season\, the "*all seasons" entry does
5580 ///     give a DBTYPE "season" and a DBID\, but you can't get the details of that
5581 ///     entry since it's a virtual entry in the Video Library.
5582 ///     <p><hr>
5583 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_DBTYPE `ListItem.DBTYPE`\endlink
5584 ///     now available in the music library.
5585 ///     <p>
5586 ///   }
5587 ///   \table_row3{   <b>`ListItem.DBID`</b>,
5588 ///                  \anchor ListItem_DBID
5589 ///                  _string_,
5590 ///     @return The database id of the currently selected listitem in a container.
5591 ///     <p>
5592 ///   }
5593 ///   \table_row3{   <b>`ListItem.Appearances`</b>,
5594 ///                  \anchor ListItem_Appearances
5595 ///                  _string_,
5596 ///     @return The number of movies featuring the selected actor / directed by the selected director.
5597 ///     <p><hr>
5598 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Appearances `ListItem.Appearances`\endlink
5599 ///     <p>
5600 ///   }
5601 ///   \table_row3{   <b>`ListItem.Cast`</b>,
5602 ///                  \anchor ListItem_Cast
5603 ///                  _string_,
5604 ///     @return A concatenated string of cast members of the currently selected
5605 ///     movie\, for use in dialogvideoinfo.xml.
5606 ///     <p><hr>
5607 ///     @skinning_v15 **[Infolabel Updated]** \link ListItem_Cast `ListItem.Cast`\endlink
5608 ///     also supports EPG.
5609 ///     <p>
5610 ///   }
5611 ///   \table_row3{   <b>`ListItem.CastAndRole`</b>,
5612 ///                  \anchor ListItem_CastAndRole
5613 ///                  _string_,
5614 ///     @return A concatenated string of cast members and roles of the currently
5615 ///     selected movie\, for use in dialogvideoinfo.xml.
5616 ///     <p>
5617 ///   }
5618 ///   \table_row3{   <b>`ListItem.Studio`</b>,
5619 ///                  \anchor ListItem_Studio
5620 ///                  _string_,
5621 ///     @return The studio of current selected Music Video in a container.
5622 ///     <p>
5623 ///   }
5624 ///   \table_row3{   <b>`ListItem.Top250`</b>,
5625 ///                  \anchor ListItem_Top250
5626 ///                  _string_,
5627 ///     @return The IMDb top250 position of the currently selected listitem in a
5628 ///     container.
5629 ///     <p>
5630 ///   }
5631 ///   \table_row3{   <b>`ListItem.Trailer`</b>,
5632 ///                  \anchor ListItem_Trailer
5633 ///                  _string_,
5634 ///     @return The full trailer path with filename of the currently selected
5635 ///     movie in a container.
5636 ///     <p>
5637 ///   }
5638 ///   \table_row3{   <b>`ListItem.Writer`</b>,
5639 ///                  \anchor ListItem_Writer
5640 ///                  _string_,
5641 ///     @return The name of Writer of current Video in a container.
5642 ///     <p><hr>
5643 ///     @skinning_v15 **[Infolabel Updated]** \link ListItem_Writer `ListItem.Writer`\endlink
5644 ///     also supports EPG.
5645 ///     <p>
5646 ///   }
5647 ///   \table_row3{   <b>`ListItem.Tag`</b>,
5648 ///                  \anchor ListItem_Tag
5649 ///                  _string_,
5650 ///     @return The summary of current Video in a container.
5651 ///     <p><hr>
5652 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Tag `ListItem.Tag`\endlink
5653 ///     <p>
5654 ///   }
5655 ///   \table_row3{   <b>`ListItem.Tagline`</b>,
5656 ///                  \anchor ListItem_Tagline
5657 ///                  _string_,
5658 ///     @return A Small Summary of current Video in a container.
5659 ///     <p>
5660 ///   }
5661 ///   \table_row3{   <b>`ListItem.PlotOutline`</b>,
5662 ///                  \anchor ListItem_PlotOutline
5663 ///                  _string_,
5664 ///     @return A small Summary of current Video in a container.
5665 ///     <p>
5666 ///   }
5667 ///   \table_row3{   <b>`ListItem.Plot`</b>,
5668 ///                  \anchor ListItem_Plot
5669 ///                  _string_,
5670 ///     @return The complete Text Summary of Video in a container.
5671 ///     <p>
5672 ///   }
5673 ///   \table_row3{   <b>`ListItem.IMDBNumber`</b>,
5674 ///                  \anchor ListItem_IMDBNumber
5675 ///                  _string_,
5676 ///     @return The IMDb ID of the selected Video in a container.
5677 ///     <p><hr>
5678 ///     @skinning_v15 **[New Infolabel]** \link ListItem_IMDBNumber `ListItem.IMDBNumber`\endlink
5679 ///     <p>
5680 ///   }
5681 ///   \table_row3{   <b>`ListItem.EpisodeName`</b>,
5682 ///                  \anchor ListItem_EpisodeName
5683 ///                  _string_,
5684 ///     @return The name of the episode if the selected EPG item is a TV Show (PVR).
5685 ///     <p><hr>
5686 ///     @skinning_v15 **[New Infolabel]** \link ListItem_EpisodeName `ListItem.EpisodeName`\endlink
5687 ///     <p>
5688 ///   }
5689 ///   \table_row3{   <b>`ListItem.PercentPlayed`</b>,
5690 ///                  \anchor ListItem_PercentPlayed
5691 ///                  _string_,
5692 ///     @return The percentage value [0-100] of how far the selected video has been
5693 ///     played.
5694 ///     <p>
5695 ///   }
5696 ///   \table_row3{   <b>`ListItem.LastPlayed`</b>,
5697 ///                  \anchor ListItem_LastPlayed
5698 ///                  _string_,
5699 ///     @return The last play date of Video in a container.
5700 ///     <p>
5701 ///   }
5702 ///   \table_row3{   <b>`ListItem.PlayCount`</b>,
5703 ///                  \anchor ListItem_PlayCount
5704 ///                  _string_,
5705 ///     @return The playcount of Video in a container.
5706 ///     <p>
5707 ///   }
5708 ///   \table_row3{   <b>`ListItem.ChannelName`</b>,
5709 ///                  \anchor ListItem_ChannelName
5710 ///                  _string_,
5711 ///     @return The name of current selected TV channel in a container.
5712 ///     <p>
5713 ///   }
5714 ///   \table_row3{   <b>`ListItem.VideoCodec`</b>,
5715 ///                  \anchor ListItem_VideoCodec
5716 ///                  _string_,
5717 ///     @return The video codec of the currently selected video. Common values:
5718 ///      - <b>3iv2</b>
5719 ///      - <b>av1</b>
5720 ///      - <b>avc1</b>
5721 ///      - <b>div2</b>
5722 ///      - <b>div3</b>
5723 ///      - <b>divx</b>
5724 ///      - <b>divx 4</b>
5725 ///      - <b>dx50</b>
5726 ///      - <b>flv</b>
5727 ///      - <b>h264</b>
5728 ///      - <b>microsoft</b>
5729 ///      - <b>mp42</b>
5730 ///      - <b>mp43</b>
5731 ///      - <b>mp4v</b>
5732 ///      - <b>mpeg1video</b>
5733 ///      - <b>mpeg2video</b>
5734 ///      - <b>mpg4</b>
5735 ///      - <b>rv40</b>
5736 ///      - <b>svq1</b>
5737 ///      - <b>svq3</b>
5738 ///      - <b>theora</b>
5739 ///      - <b>vp6f</b>
5740 ///      - <b>wmv2</b>
5741 ///      - <b>wmv3</b>
5742 ///      - <b>wvc1</b>
5743 ///      - <b>xvid</b>
5744 ///      - etc
5745 ///     <p>
5746 ///   }
5747 ///   \table_row3{   <b>`ListItem.VideoResolution`</b>,
5748 ///                  \anchor ListItem_VideoResolution
5749 ///                  _string_,
5750 ///     @return The resolution of the currently selected video. Possible values:
5751 ///       - <b>480</b>
5752 ///       - <b>576</b>
5753 ///       - <b>540</b>
5754 ///       - <b>720</b>
5755 ///       - <b>1080</b>
5756 ///       - <b>4K</b>
5757 ///       - <b>8K</b>
5758 ///     @note 540 usually means a widescreen
5759 ///     format (around 960x540) while 576 means PAL resolutions (normally
5760 ///     720x576)\, therefore 540 is actually better resolution than 576.
5761 ///     <p><hr>
5762 ///     @skinning_v18 **[Updated Infolabel]** \link ListItem_VideoResolution ListItem.VideoResolution\endlink
5763 ///     added <b>8K</b> as a possible value.
5764 ///     <p>
5765 ///   }
5766 ///   \table_row3{   <b>`ListItem.VideoAspect`</b>,
5767 ///                  \anchor ListItem_VideoAspect
5768 ///                  _string_,
5769 ///     @return The aspect ratio of the currently selected video. Possible values:
5770 ///      - <b>1.33</b>
5771 ///      - <b>1.37</b>
5772 ///      - <b>1.66</b>
5773 ///      - <b>1.78</b>
5774 ///      - <b>1.85</b>
5775 ///      - <b>2.20</b>
5776 ///      - <b>2.35</b>
5777 ///      - <b>2.40</b>
5778 ///      - <b>2.55</b>
5779 ///      - <b>2.76</b>
5780 ///     <p>
5781 ///   }
5782 ///   \table_row3{   <b>`ListItem.AudioCodec`</b>,
5783 ///                  \anchor ListItem_AudioCodec
5784 ///                  _string_,
5785 ///     @return The audio codec of the currently selected video. Common values:
5786 ///       - <b>aac</b>
5787 ///       - <b>ac3</b>
5788 ///       - <b>cook</b>
5789 ///       - <b>dca</b>
5790 ///       - <b>dtshd_hra</b>
5791 ///       - <b>dtshd_ma</b>
5792 ///       - <b>eac3</b>
5793 ///       - <b>mp1</b>
5794 ///       - <b>mp2</b>
5795 ///       - <b>mp3</b>
5796 ///       - <b>pcm_s16be</b>
5797 ///       - <b>pcm_s16le</b>
5798 ///       - <b>pcm_u8</b>
5799 ///       - <b>truehd</b>
5800 ///       - <b>vorbis</b>
5801 ///       - <b>wmapro</b>
5802 ///       - <b>wmav2</b>
5803 ///     <p>
5804 ///   }
5805 ///   \table_row3{   <b>`ListItem.AudioChannels`</b>,
5806 ///                  \anchor ListItem_AudioChannels
5807 ///                  _string_,
5808 ///     @return The number of audio channels of the currently selected video. Possible values:
5809 ///       - <b>1</b>
5810 ///       - <b>2</b>
5811 ///       - <b>4</b>
5812 ///       - <b>5</b>
5813 ///       - <b>6</b>
5814 ///       - <b>8</b>
5815 ///       - <b>10</b>
5816 ///     <p><hr>
5817 ///     @skinning_v16 **[Infolabel Updated]** \link ListItem_AudioChannels `ListItem.AudioChannels`\endlink
5818 ///     if a video contains no audio\, these infolabels will now return empty.
5819 ///     (they used to return 0)
5820 ///     <p>
5821 ///   }
5822 ///   \table_row3{   <b>`ListItem.AudioLanguage`</b>,
5823 ///                  \anchor ListItem_AudioLanguage
5824 ///                  _string_,
5825 ///     @return The audio language of the currently selected video (an
5826 ///     ISO 639-2 three character code: e.g. eng\, epo\, deu)
5827 ///     <p>
5828 ///   }
5829 ///   \table_row3{   <b>`ListItem.SubtitleLanguage`</b>,
5830 ///                  \anchor ListItem_SubtitleLanguage
5831 ///                  _string_,
5832 ///     @return The subtitle language of the currently selected video (an
5833 ///     ISO 639-2 three character code: e.g. eng\, epo\, deu)
5834 ///     <p>
5835 ///   }
5836 ///   \table_row3{   <b>`ListItem.Property(AudioCodec.[n])`</b>,
5837 ///                  \anchor ListItem_Property_AudioCodec
5838 ///                  _string_,
5839 ///     @return The audio codec of the currently selected video
5840 ///     @param n - the number of the audiostream (values: see \ref ListItem_AudioCodec "ListItem.AudioCodec")
5841 ///     <p><hr>
5842 ///     @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioCodec `ListItem.Property(AudioCodec.[n])`\endlink
5843 ///     <p>
5844 ///   }
5845 ///   \table_row3{   <b>`ListItem.Property(AudioChannels.[n])`</b>,
5846 ///                  \anchor ListItem_Property_AudioChannels
5847 ///                  _string_,
5848 ///     @return The number of audio channels of the currently selected video
5849 ///     @param n - the number of the audiostream (values: see
5850 ///     \ref ListItem_AudioChannels "ListItem.AudioChannels")
5851 ///     <p><hr>
5852 ///     @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioChannels `ListItem.Property(AudioChannels.[n])`\endlink
5853 ///     <p>
5854 ///   }
5855 ///   \table_row3{   <b>`ListItem.Property(AudioLanguage.[n])`</b>,
5856 ///                  \anchor ListItem_Property_AudioLanguage
5857 ///                  _string_,
5858 ///     @return The audio language of the currently selected video
5859 ///     @param n - the number of the audiostream (values: see \ref ListItem_AudioLanguage "ListItem.AudioLanguage")
5860 ///     <p><hr>
5861 ///     @skinning_v16 **[New Infolabel]** \link ListItem_Property_AudioLanguage `ListItem.Property(AudioLanguage.[n])`\endlink
5862 ///     <p>
5863 ///   }
5864 ///   \table_row3{   <b>`ListItem.Property(SubtitleLanguage.[n])`</b>,
5865 ///                  \anchor ListItem_Property_SubtitleLanguage
5866 ///                  _string_,
5867 ///     @return The subtitle language of the currently selected video
5868 ///     @param n - the number of the subtitle (values: see \ref ListItem_SubtitleLanguage "ListItem.SubtitleLanguage")
5869 ///     <p><hr>
5870 ///     @skinning_v16 **[New Infolabel]** \link ListItem_Property_SubtitleLanguage `ListItem.Property(SubtitleLanguage.[n])`\endlink
5871 ///     <p>
5872 ///   }
5873 ///   \table_row3{   <b>`ListItem.Property(Addon.Disclaimer)`</b>,
5874 ///                  \anchor ListItem_Property_AddonDisclaimer
5875 ///                  _string_,
5876 ///     @return The disclaimer of the currently selected addon.
5877 ///     <p>
5878 ///   }
5879 ///   \table_row3{   <b>`ListItem.Property(Addon.Changelog)`</b>,
5880 ///                  \anchor ListItem_Property_AddonChangelog
5881 ///                  _string_,
5882 ///     @return The changelog of the currently selected addon.
5883 ///     <p>
5884 ///   }
5885 ///   \table_row3{   <b>`ListItem.Property(Addon.ID)`</b>,
5886 ///                  \anchor ListItem_Property_AddonID
5887 ///                  _string_,
5888 ///     @return The identifier of the currently selected addon.
5889 ///     <p>
5890 ///   }
5891 ///   \table_row3{   <b>`ListItem.Property(Addon.Status)`</b>,
5892 ///                  \anchor ListItem_Property_AddonStatus
5893 ///                  _string_,
5894 ///     @return The status of the currently selected addon.
5895 ///     @todo missing reference in GuiInfoManager.cpp making it hard to track.
5896 ///     <p>
5897 ///   }
5898 ///   \table_row3{   <b>`ListItem.Property(Addon.Orphaned)`</b>,
5899 ///                  \anchor ListItem_Property_AddonOrphaned
5900 ///                  _boolean_,
5901 ///     @return **True** if the Addon is orphanad.
5902 ///     @todo missing reference in GuiInfoManager.cpp making it hard to track.
5903 ///     <p><hr>
5904 ///     @skinning_v17 **[New Boolean Condition]** \link ListItem_Property_AddonOrphaned `ListItem.Property(Addon.Orphaned)`\endlink
5905 ///     <p>
5906 ///   }
5907 ///   \table_row3{   <b>`ListItem.Property(Addon.Path)`</b>,
5908 ///                  \anchor ListItem_Property_AddonPath
5909 ///                  _string_,
5910 ///     @return The path of the currently selected addon.
5911 ///     <p>
5912 ///   }
5913 ///   \table_row3{   <b>`ListItem.StartTime`</b>,
5914 ///                  \anchor ListItem_StartTime
5915 ///                  _string_,
5916 ///     @return The start time of current selected TV programme in a container.
5917 ///     <p>
5918 ///   }
5919 ///   \table_row3{   <b>`ListItem.EndTime`</b>,
5920 ///                  \anchor ListItem_EndTime
5921 ///                  _string_,
5922 ///     @return The end time of current selected TV programme in a container.
5923 ///     <p>
5924 ///   }
5925 ///   \table_row3{   <b>`ListItem.StartDate`</b>,
5926 ///                  \anchor ListItem_StartDate
5927 ///                  _string_,
5928 ///     @return The start date of current selected TV programme in a container.
5929 ///     <p>
5930 ///   }
5931 ///   \table_row3{   <b>`ListItem.EndDate`</b>,
5932 ///                  \anchor ListItem_EndDate
5933 ///                  _string_,
5934 ///     @return The end date of current selected TV programme in a container.
5935 ///     <p>
5936 ///   }
5937 ///   \table_row3{   <b>`ListItem.NextTitle`</b>,
5938 ///                  \anchor ListItem_NextTitle
5939 ///                  _string_,
5940 ///     @return The title of the next item (PVR).
5941 ///     <p>
5942 ///   }
5943 ///   \table_row3{   <b>`ListItem.NextGenre`</b>,
5944 ///                  \anchor ListItem_NextGenre
5945 ///                  _string_,
5946 ///     @return The genre of the next item (PVR).
5947 ///     <p>
5948 ///   }
5949 ///   \table_row3{   <b>`ListItem.NextPlot`</b>,
5950 ///                  \anchor ListItem_NextPlot
5951 ///                  _string_,
5952 ///     @return The plot of the next item (PVR).
5953 ///     <p>
5954 ///   }
5955 ///   \table_row3{   <b>`ListItem.NextPlotOutline`</b>,
5956 ///                  \anchor ListItem_NextPlotOutline
5957 ///                  _string_,
5958 ///     @return The plot outline of the next item (PVR).
5959 ///     <p>
5960 ///   }
5961 ///   \table_row3{   <b>`ListItem.NextStartTime`</b>,
5962 ///                  \anchor ListItem_NextStartTime
5963 ///                  _string_,
5964 ///     @return The start time of the next item (PVR).
5965 ///     <p>
5966 ///   }
5967 ///   \table_row3{   <b>`ListItem.NextEndTime`</b>,
5968 ///                  \anchor ListItem_NextEndTime
5969 ///                  _string_,
5970 ///     @return The end of the next item (PVR).
5971 ///     <p>
5972 ///   }
5973 ///   \table_row3{   <b>`ListItem.NextStartDate`</b>,
5974 ///                  \anchor ListItem_NextStartDate
5975 ///                  _string_,
5976 ///     @return The start date of the next item (PVR).
5977 ///     <p>
5978 ///   }
5979 ///   \table_row3{   <b>`ListItem.NextEndDate`</b>,
5980 ///                  \anchor ListItem_NextEndDate
5981 ///                  _string_,
5982 ///     @return The end date of the next item (PVR).
5983 ///     <p>
5984 ///   }
5985 ///   \table_row3{   <b>`ListItem.NextDuration`</b>,
5986 ///                  \anchor ListItem_NextDuration
5987 ///                  _string_,
5988 ///     @return The duration of the next item (PVR) in the format <b>hh:mm:ss</b>.
5989 ///     @note <b>hh:</b> will be omitted if hours value is zero.
5990 ///     <p><hr>
5991 ///     @skinning_v18 **[New Infolabel]** \link ListItem_NextDuration `ListItem.NextDuration`\endlink
5992 ///     <p>
5993 ///   }
5994 ///   \table_row3{   <b>`ListItem.NextDuration(format)`</b>,
5995 ///                  \anchor ListItem_NextDuration_format
5996 ///                  _string_,
5997 ///     @return The duration of the next item (PVR) in different formats.
5998 ///     @param format [opt] The format of the return time value.
5999 ///     See \ref TIME_FORMAT for the list of possible values.
6000 ///     <p><hr>
6001 ///     @skinning_v18 **[New Infolabel]** \link ListItem_NextDuration_format `ListItem.NextDuration(format)`\endlink
6002 ///     <p>
6003 ///   }
6004 ///   \table_row3{   <b>`ListItem.ChannelGroup`</b>,
6005 ///                  \anchor ListItem_ChannelGroup
6006 ///                  _string_,
6007 ///     @return The channel group of the selected item (PVR).
6008 ///     <p>
6009 ///   }
6010 ///   \table_row3{   <b>`ListItem.ChannelNumberLabel`</b>,
6011 ///                  \anchor ListItem_ChannelNumberLabel
6012 ///                  _string_,
6013 ///     @return The channel and subchannel number of the currently selected channel that's
6014 ///     currently playing (PVR).
6015 ///     <p><hr>
6016 ///     @skinning_v14 **[New Infolabel]** \link ListItem_ChannelNumberLabel `ListItem.ChannelNumberLabel`\endlink
6017 ///     <p>
6018 ///   }
6019 ///   \table_row3{   <b>`ListItem.Progress`</b>,
6020 ///                  \anchor ListItem_Progress
6021 ///                  _string_,
6022 ///     @return The part of the programme that's been played (PVR).
6023 ///     <p>
6024 ///   }
6025 ///   \table_row3{   <b>`ListItem.StereoscopicMode`</b>,
6026 ///                  \anchor ListItem_StereoscopicMode
6027 ///                  _string_,
6028 ///     @return The stereomode of the selected video:
6029 ///       - <b>mono</b>
6030 ///       - <b>split_vertical</b>
6031 ///       - <b>split_horizontal</b>
6032 ///       - <b>row_interleaved</b>
6033 ///       - <b>anaglyph_cyan_red</b>
6034 ///       - <b>anaglyph_green_magenta</b>
6035 ///     <p><hr>
6036 ///     @skinning_v13 **[New Infolabel]** \link ListItem_StereoscopicMode `ListItem.StereoscopicMode`\endlink
6037 ///     <p>
6038 ///   }
6039 ///   \table_row3{   <b>`ListItem.HasTimerSchedule`</b>,
6040 ///                  \anchor ListItem_HasTimerSchedule
6041 ///                  _boolean_,
6042 ///     @return **True** if the item was scheduled by a timer rule (PVR).
6043 ///     <p><hr>
6044 ///     @skinning_v16 **[New Boolean Condition]** \ref ListItem_HasTimerSchedule "ListItem.HasTimerSchedule"
6045 ///     <p>
6046 ///   }
6047 ///   \table_row3{   <b>`ListItem.HasReminder`</b>,
6048 ///                  \anchor ListItem_HasReminder
6049 ///                  _boolean_,
6050 ///     @return **True** if the item has a reminder set (PVR).
6051 ///     <p><hr>
6052 ///     @skinning_v19 **[New Boolean Condition]** \ref ListItem_HasReminder "ListItem.HasReminder"
6053 ///     <p>
6054 ///   }
6055 ///   \table_row3{   <b>`ListItem.HasReminderRule`</b>,
6056 ///                  \anchor ListItem_ListItem.HasReminderRule
6057 ///                  _boolean_,
6058 ///     @return **True** if the item was scheduled by a reminder timer rule (PVR).
6059 ///     <p><hr>
6060 ///     @skinning_v19 **[New Boolean Condition]** \ref ListItem_HasReminderRule "ListItem.HasReminderRule"
6061 ///     <p>
6062 ///   }
6063 ///   \table_row3{   <b>`ListItem.HasRecording`</b>,
6064 ///                  \anchor ListItem_HasRecording
6065 ///                  _boolean_,
6066 ///     @return **True** if a given epg tag item currently gets recorded or has been recorded.
6067 ///     <p>
6068 ///   }
6069 ///   \table_row3{   <b>`ListItem.TimerHasError`</b>,
6070 ///                  \anchor ListItem_TimerHasError
6071 ///                  _boolean_,
6072 ///     @return **True** if the item has a timer and it won't be recorded because of an error (PVR).
6073 ///     <p><hr>
6074 ///     @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerHasError "ListItem.TimerHasError"
6075 ///     <p>
6076 ///   }
6077 ///   \table_row3{   <b>`ListItem.TimerHasConflict`</b>,
6078 ///                  \anchor ListItem_TimerHasConflict
6079 ///                  _boolean_,
6080 ///     @return **True** if the item has a timer and it won't be recorded because of a conflict (PVR).
6081 ///     <p><hr>
6082 ///     @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerHasConflict "ListItem.TimerHasConflict"
6083 ///     <p>
6084 ///   }
6085 ///   \table_row3{   <b>`ListItem.TimerIsActive`</b>,
6086 ///                  \anchor ListItem_TimerIsActive
6087 ///                  _boolean_,
6088 ///     @return **True** if the item has a timer that will be recorded\, i.e. the timer is enabled (PVR).
6089 ///     <p><hr>
6090 ///     @skinning_v17 **[New Boolean Condition]** \ref ListItem_TimerIsActive "ListItem.TimerIsActive"
6091 ///     <p>
6092 ///   }
6093 ///   \table_row3{   <b>`ListItem.Comment`</b>,
6094 ///                  \anchor ListItem_Comment
6095 ///                  _string_,
6096 ///     @return The comment assigned to the item (PVR/MUSIC).
6097 ///     <p>
6098 ///   }
6099 ///   \table_row3{   <b>`ListItem.TimerType`</b>,
6100 ///                  \anchor ListItem_TimerType
6101 ///                  _string_,
6102 ///     @return The type of the PVR timer / timer rule item as a human readable string.
6103 ///     <p>
6104 ///   }
6105 ///   \table_row3{   <b>`ListItem.EpgEventTitle`</b>,
6106 ///                  \anchor ListItem_EpgEventTitle
6107 ///                  _string_,
6108 ///     @return The title of the epg event associated with the item\, if any.
6109 ///     <p>
6110 ///   }
6111 ///   \table_row3{   <b>`ListItem.EpgEventIcon`</b>,
6112 ///                  \anchor ListItem_EpgEventIcon
6113 ///                  _string_,
6114 ///     @return The thumbnail for the EPG event associated with the item (if it exists).
6115 ///     <p><hr>
6116 ///     @skinning_v18 **[New Infolabel]** \link ListItem_EpgEventIcon `ListItem.EpgEventIcon`\endlink
6117 ///     <p>
6118 ///   }
6119 ///   \table_row3{   <b>`ListItem.InProgress`</b>,
6120 ///                  \anchor ListItem_InProgress
6121 ///                  _boolean_,
6122 ///     @return **True** if the EPG event item is currently active (time-wise).
6123 ///     <p>
6124 ///   }
6125 ///   \table_row3{   <b>`ListItem.IsParentFolder`</b>,
6126 ///                  \anchor ListItem_IsParentFolder
6127 ///                  _boolean_,
6128 ///     @return **True** if the current list item is the goto parent folder '..'.
6129 ///     <p><hr>
6130 ///     @skinning_v17 **[New Boolean Condition]** \link ListItem_IsParentFolder `ListItem.IsParentFolder`\endlink
6131 ///     <p>
6132 ///   }
6133 ///   \table_row3{   <b>`ListItem.AddonName`</b>,
6134 ///                  \anchor ListItem_AddonName
6135 ///                  _string_,
6136 ///     @return The name of the currently selected addon.
6137 ///     <p><hr>
6138 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonName `ListItem.AddonName`\endlink
6139 ///     replaces `ListItem.Property(Addon.Name)`.
6140 ///     <p>
6141 ///   }
6142 ///   \table_row3{   <b>`ListItem.AddonVersion`</b>,
6143 ///                  \anchor ListItem_AddonVersion
6144 ///                  _string_,
6145 ///     @return The version of the currently selected addon.
6146 ///     <p><hr>
6147 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonVersion `ListItem.AddonVersion`\endlink
6148 ///     replaces `ListItem.Property(Addon.Version)`.
6149 ///     <p>
6150 ///   }
6151 ///   \table_row3{   <b>`ListItem.AddonCreator`</b>,
6152 ///                  \anchor ListItem_AddonCreator
6153 ///                  _string_,
6154 ///     @return The name of the author the currently selected addon.
6155 ///     <p><hr>
6156 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonCreator `ListItem.AddonCreator`\endlink
6157 ///     replaces `ListItem.Property(Addon.Creator)`.
6158 ///     <p>
6159 ///   }
6160 ///   \table_row3{   <b>`ListItem.AddonSummary`</b>,
6161 ///                  \anchor ListItem_AddonSummary
6162 ///                  _string_,
6163 ///     @return A short description of the currently selected addon.
6164 ///     <p><hr>
6165 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonSummary `ListItem.AddonSummary`\endlink
6166 ///     replaces `ListItem.Property(Addon.Summary)`.
6167 ///     <p>
6168 ///   }
6169 ///   \table_row3{   <b>`ListItem.AddonDescription`</b>,
6170 ///                  \anchor ListItem_AddonDescription
6171 ///                  _string_,
6172 ///     @return The full description of the currently selected addon.
6173 ///     <p><hr>
6174 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonDescription `ListItem.AddonDescription`\endlink
6175 ///     replaces `ListItem.Property(Addon.Description)`.
6176 ///     <p>
6177 ///   }
6178 ///   \table_row3{   <b>`ListItem.AddonDisclaimer`</b>,
6179 ///                  \anchor ListItem_AddonDisclaimer
6180 ///                  _string_,
6181 ///     @return The disclaimer of the currently selected addon.
6182 ///     <p><hr>
6183 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonDisclaimer `ListItem.AddonDisclaimer`\endlink
6184 ///     replaces `ListItem.Property(Addon.Disclaimer)`.
6185 ///     <p>
6186 ///   }
6187 ///   \table_row3{   <b>`ListItem.AddonBroken`</b>,
6188 ///                  \anchor ListItem_AddonBroken
6189 ///                  _string_,
6190 ///     @return A message when the addon is marked as broken in the repo.
6191 ///     @deprecated but still available\, use \ref ListItem_AddonLifecycleDesc "ListItem.AddonLifecycleDesc"
6192 ///     instead
6193 ///     <p><hr>
6194 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonBroken `ListItem.AddonBroken`\endlink
6195 ///     replaces `ListItem.Property(Addon.Broken)`.
6196 ///     <p>
6197 ///   }
6198 ///   \table_row3{   <b>`ListItem.AddonLifecycleType`</b>,
6199 ///                  \anchor ListItem_AddonLifecycleType
6200 ///                  _string_,
6201 ///     @return String name when the addon is marked as special condition in the repo.
6202 ///       - <b>Label: 24169 (Normal)</b> - Used if an add-on has no special lifecycle state which is the default state
6203 ///       - <b>Label: 24170 (Deprecated)</b> - The add-on should be marked as deprecated but is still usable
6204 ///       - <b>Label: 24171 (Broken)</b> - The add-on should marked as broken in the repository
6205 ///     <p><hr>
6206 ///     @skinning_v19 **[New Infolabel]** \link ListItem_AddonLifecycleType `ListItem.AddonLifecycleType`\endlink
6207 ///     replaces `ListItem.AddonBroken`.
6208 ///     <p>
6209 ///   }
6210 ///   \table_row3{   <b>`ListItem.AddonLifecycleDesc`</b>,
6211 ///                  \anchor ListItem_AddonLifecycleDesc
6212 ///                  _string_,
6213 ///     @return From addon defined message text when it is marked as special condition inside repository.
6214 ///     <p><hr>
6215 ///     @skinning_v19 **[New Infolabel]** \link ListItem_AddonLifecycleDesc `ListItem.AddonLifecycleDesc``\endlink
6216 ///     replaces `ListItem.AddonBroken`.
6217 ///     <p>
6218 ///   }
6219 
6220 ///   \table_row3{   <b>`ListItem.AddonType`</b>,
6221 ///                  \anchor ListItem_AddonType
6222 ///                  _string_,
6223 ///     @return The type (screensaver\, script\, skin\, etc...) of the currently selected addon.
6224 ///     <p><hr>
6225 ///     @skinning_v17 **[Infolabel Updated]** \link ListItem_AddonType `ListItem.AddonType`\endlink
6226 ///     replaces `ListItem.Property(Addon.Type)`.
6227 ///     <p>
6228 ///   }
6229 ///   \table_row3{   <b>`ListItem.AddonInstallDate`</b>,
6230 ///                  \anchor ListItem_AddonInstallDate
6231 ///                  _string_,
6232 ///     @return The date the addon was installed.
6233 ///     <p><hr>
6234 ///     @skinning_v17 **[New Infolabel]** \link ListItem_AddonInstallDate `ListItem.AddonInstallDate`\endlink
6235 ///     <p>
6236 ///   }
6237 ///   \table_row3{   <b>`ListItem.AddonLastUpdated`</b>,
6238 ///                  \anchor ListItem_AddonLastUpdated
6239 ///                  _string_,
6240 ///     @return The date the addon was last updated.
6241 ///     <p><hr>
6242 ///     @skinning_v17 **[New Infolabel]** \link ListItem_AddonLastUpdated `ListItem.AddonLastUpdated`\endlink
6243 ///     <p>
6244 ///   }
6245 ///   \table_row3{   <b>`ListItem.AddonLastUsed`</b>,
6246 ///                  \anchor ListItem_AddonLastUsed
6247 ///                  _string_,
6248 ///     @return The date the addon was used last.
6249 ///     <p><hr>
6250 ///     @skinning_v17 **[New Infolabel]** \link ListItem_AddonLastUsed `ListItem.AddonLastUsed`\endlink
6251 ///     <p>
6252 ///   }
6253 ///   \table_row3{   <b>`ListItem.AddonNews`</b>,
6254 ///                  \anchor ListItem_AddonNews
6255 ///                  _string_,
6256 ///     @return A brief changelog\, taken from the addons' `addon.xml` file.
6257 ///     <p><hr>
6258 ///     @skinning_v17 **[New Infolabel]** \link ListItem_AddonNews `ListItem.AddonNews`\endlink
6259 ///     <p>
6260 ///   }
6261 ///   \table_row3{   <b>`ListItem.AddonSize`</b>,
6262 ///                  \anchor ListItem_AddonSize
6263 ///                  _string_,
6264 ///     @return The filesize of the addon.
6265 ///     <p><hr>
6266 ///     @skinning_v17 **[New Infolabel]** \link ListItem_AddonSize `ListItem.AddonSize`\endlink
6267 ///     <p>
6268 ///   }
6269 ///   \table_row3{   <b>`ListItem.AddonOrigin`</b>,
6270 ///                  \anchor ListItem_AddonOrigin
6271 ///                  _string_,
6272 ///     @return The name of the repository the add-on originates from.
6273 ///     <p>
6274 ///   }
6275 ///   \table_row3{   <b>`ListItem.ExpirationDate`</b>,
6276 ///                  \anchor ListItem_ExpirationDate
6277 ///                  _string_,
6278 ///     @return The expiration date of the selected item in a container\, empty string if not supported.
6279 ///     <p>
6280 ///   }
6281 ///   \table_row3{   <b>`ListItem.ExpirationTime`</b>,
6282 ///                  \anchor ListItem_ExpirationTime
6283 ///                  _string_,
6284 ///     @return The expiration time of the selected item in a container\, empty string if not supported
6285 ///     <p>
6286 ///   }
6287 ///   \table_row3{   <b>`ListItem.Art(type)`</b>,
6288 ///                  \anchor ListItem_Art_Type
6289 ///                  _string_,
6290 ///     @return A particular art type for an item.
6291 ///     @param type - the art type. It can be any value (set by scripts and scrappers). Common values:
6292 ///       - <b>clearart</b> - the clearart (if it exists) of the currently selected movie or tv show.
6293 ///       - <b>clearlogo</b> - the clearlogo (if it exists) of the currently selected movie or tv show.
6294 ///       - <b>landscape</b> - the 16:9 landscape (if it exists) of the currently selected item.
6295 ///       - <b>thumb</b> - the thumbnail of the currently selected item.
6296 ///       - <b>poster</b> - the poster of the currently selected movie or tv show.
6297 ///       - <b>banner</b> - the banner of the currently selected tv show.
6298 ///       - <b>fanart</b> - the fanart image of the currently selected item.
6299 ///       - <b>set.fanart</b> - the fanart image of the currently selected movieset.
6300 ///       - <b>tvshow.poster</b> - the tv show poster of the parent container.
6301 ///       - <b>tvshow.banner</b> - the tv show banner of the parent container.
6302 ///       - <b>tvshow.clearlogo</b> - the tv show clearlogo (if it exists) of the parent container.
6303 ///       - <b>tvshow.landscape</b> - the tv show landscape (if it exists) of the parent container.
6304 ///       - <b>tvshow.clearart</b> - the tv show clearart (if it exists) of the parent container.
6305 ///       - <b>season.poster</b> - the season poster of the currently selected season. (Only available in DialogVideoInfo.xml).
6306 ///       - <b>season.banner</b> - the season banner of the currently selected season. (Only available in DialogVideoInfo.xml).
6307 ///       - <b>season.fanart</b> - the fanart image of the currently selected season. (Only available in DialogVideoInfo.xml)
6308 ///       - <b>artist.thumb</b> - the artist thumb of an album or song item.
6309 ///       - <b>artist.fanart</b> - the artist fanart of an album or song item.
6310 ///       - <b>album.thumb</b> - the album thumb (cover) of a song item.
6311 ///       - <b>artist[n].*</b> - in case a song has multiple artists\, a digit is added to the art type for the 2nd artist onwards
6312 /// e.g `Listitem.Art(artist1.thumb)` gives the thumb of the 2nd artist of a song.
6313 ///       - <b>albumartist[n].*</b> - n case a song has multiple album artists\, a digit is added to the art type for the 2nd artist
6314 /// onwards e.g `Listitem.Art(artist1.thumb)` gives the thumb of the 2nd artist of a song.
6315 ///     <p>
6316 ///     @todo Find a better way of finding the art types instead of manually defining them here.
6317 ///     <p><hr>
6318 ///     @skinning_v18 **[Infolabel Updated]** \link ListItem_Art_Type `ListItem.Art(type)`\endlink add <b>artist[n].*</b> and
6319 ///     <b>albumartist[n].*</b> as possible targets for <b>type</b>
6320 ///     <p>
6321 ///   }
6322 ///   \table_row3{   <b>`ListItem.Platform`</b>,
6323 ///                  \anchor ListItem_Platform
6324 ///                  _string_,
6325 ///     @return The game platform (e.g. "Atari 2600") (RETROPLAYER).
6326 ///     <p><hr>
6327 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Platform `ListItem.Platform`\endlink
6328 ///     <p>
6329 ///   }
6330 ///   \table_row3{   <b>`ListItem.Genres`</b>,
6331 ///                  \anchor ListItem_Genres
6332 ///                  _string_,
6333 ///     @return The game genres (e.g. "["Action"\,"Strategy"]") (RETROPLAYER).
6334 ///     <p><hr>
6335 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Genres `ListItem.Genres`\endlink
6336 ///     <p>
6337 ///   }
6338 ///   \table_row3{   <b>`ListItem.Publisher`</b>,
6339 ///                  \anchor ListItem_Publisher
6340 ///                  _string_,
6341 ///     @return The game publisher (e.g. "Nintendo") (RETROPLAYER).
6342 ///     <p><hr>
6343 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Publisher `ListItem.Publisher`\endlink
6344 ///     <p>
6345 ///   }
6346 ///   \table_row3{   <b>`ListItem.Developer`</b>,
6347 ///                  \anchor ListItem_Developer
6348 ///                  _string_,
6349 ///     @return The game developer (e.g. "Square") (RETROPLAYER).
6350 ///     <p><hr>
6351 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Developer `ListItem.Developer`\endlink
6352 ///     <p>
6353 ///   }
6354 ///   \table_row3{   <b>`ListItem.Overview`</b>,
6355 ///                  \anchor ListItem_Overview
6356 ///                  _string_,
6357 ///     @return The game overview/summary (RETROPLAYER).
6358 ///     <p><hr>
6359 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Overview `ListItem.Overview`\endlink
6360 ///     <p>
6361 ///   }
6362 ///   \table_row3{   <b>`ListItem.GameClient`</b>,
6363 ///                  \anchor ListItem_GameClient
6364 ///                  _string_,
6365 ///     @return The add-on ID of the game client (a.k.a. emulator) to use for playing the game
6366 ///     (e.g. game.libretro.fceumm) (RETROPLAYER).
6367 ///     <p><hr>
6368 ///     @skinning_v18 **[New Infolabel]** \link ListItem_GameClient `ListItem.GameClient`\endlink
6369 ///     <p>
6370 ///   }
6371 ///   \table_row3{   <b>`ListItem.Property(propname)`</b>,
6372 ///                  \anchor ListItem_Property_Propname
6373 ///                  _string_,
6374 ///     @return The requested property of a ListItem.
6375 ///     @param propname - the property requested
6376 ///     <p>
6377 ///   }
6378 ///   \table_row3{   <b>`ListItem.Property(Role.Composer)`</b>,
6379 ///                  \anchor ListItem_Property_Role_Composer
6380 ///                  _string_,
6381 ///     @return The name of the person who composed the selected song.
6382 ///     <p><hr>
6383 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Composer `ListItem.Property(Role.Composer)`\endlink
6384 ///     <p>
6385 ///   }
6386 ///   \table_row3{   <b>`ListItem.Property(Role.Conductor)`</b>,
6387 ///                  \anchor ListItem_Property_Role_Conductor
6388 ///                  _string_,
6389 ///     @return The name of the person who conducted the selected song.
6390 ///     <p><hr>
6391 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Conductor `ListItem.Property(Role.Conductor)`\endlink
6392 ///     <p>
6393 ///   }
6394 ///   \table_row3{   <b>`ListItem.Property(Role.Orchestra)`</b>,
6395 ///                  \anchor ListItem_Property_Role_Orchestra
6396 ///                  _string_,
6397 ///     @return The name of the orchestra performing the selected song.
6398 ///     <p><hr>
6399 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Orchestra `ListItem.Property(Role.Orchestra)`\endlink
6400 ///     <p>
6401 ///   }
6402 ///   \table_row3{   <b>`ListItem.Property(Role.Lyricist)`</b>,
6403 ///                  \anchor ListItem_Property_Role_Lyricist
6404 ///                  _string_,
6405 ///     @return The name of the person who wrote the lyrics of the selected song.
6406 ///     <p><hr>
6407 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Lyricist `ListItem.Property(Role.Lyricist)`\endlink
6408 ///     <p>
6409 ///   }
6410 ///   \table_row3{   <b>`ListItem.Property(Role.Remixer)`</b>,
6411 ///                  \anchor ListItem_Property_Role_Remixer
6412 ///                  _string_,
6413 ///     @return The name of the person who remixed the selected song.
6414 ///     <p><hr>
6415 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Remixer `ListItem.Property(Role.Remixer)`\endlink
6416 ///     <p>
6417 ///   }
6418 ///   \table_row3{   <b>`ListItem.Property(Role.Arranger)`</b>,
6419 ///                  \anchor ListItem_Property_Role_Arranger
6420 ///                  _string_,
6421 ///     @return The name of the person who arranged the selected song.
6422 ///     <p><hr>
6423 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Arranger `ListItem.Property(Role.Arranger)`\endlink
6424 ///     <p>
6425 ///   }
6426 ///   \table_row3{   <b>`ListItem.Property(Role.Engineer)`</b>,
6427 ///                  \anchor ListItem_Property_Role_Engineer
6428 ///                  _string_,
6429 ///     @return The name of the person who was the engineer of the selected song.
6430 ///     <p><hr>
6431 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Engineer `ListItem.Property(Role.Engineer)`\endlink
6432 ///     <p>
6433 ///   }
6434 ///   \table_row3{   <b>`ListItem.Property(Role.Producer)`</b>,
6435 ///                  \anchor ListItem_Property_Role_Producer
6436 ///                  _string_,
6437 ///     @return The name of the person who produced the selected song.
6438 ///     <p><hr>
6439 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_Producer `ListItem.Property(Role.Producer)`\endlink
6440 ///     <p>
6441 ///   }
6442 ///   \table_row3{   <b>`ListItem.Property(Role.DJMixer)`</b>,
6443 ///                  \anchor ListItem_Property_Role_DJMixer
6444 ///                  _string_,
6445 ///     @return The name of the dj who remixed the selected song.
6446 ///     <p><hr>
6447 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_DJMixer `ListItem.Property(Role.DJMixer)`\endlink
6448 ///     <p>
6449 ///   }
6450 ///   \table_row3{   <b>`ListItem.Property(Role.Mixer)`</b>,
6451 ///                  \anchor ListItem_Property_Role_Mixer
6452 ///                  _string_,
6453 ///     @return The name of the person who mixed the selected song.
6454 ///     <p><hr>
6455 ///     @skinning_v17 **[New Infolabel]** \link ListItem_Property_Role_DJMixer `ListItem.Property(Role.DJMixer)`\endlink
6456 ///     <p>
6457 ///   }
6458 ///   \table_row3{   <b>`ListItem.Property(Game.VideoFilter)`</b>,
6459 ///                  \anchor ListItem_Property_Game_VideoFilter
6460 ///                  _string_,
6461 ///     @return The video filter of the list item representing a
6462 ///     gamewindow control (RETROPLAYER).
6463 ///     See \link RetroPlayer_VideoFilter RetroPlayer.VideoFilter \endlink
6464 ///     for the possible values.
6465 ///     <p><hr>
6466 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_VideoFilter `ListItem.Property(Game.VideoFilter)`\endlink
6467 ///     <p>
6468 ///   }
6469 ///   \table_row3{   <b>`ListItem.Property(Game.StretchMode)`</b>,
6470 ///                  \anchor ListItem_Property_Game_StretchMode
6471 ///                  _string_,
6472 ///     @return The stretch mode of the list item representing a
6473 ///     gamewindow control (RETROPLAYER).
6474 ///     See \link RetroPlayer_StretchMode RetroPlayer.StretchMode \endlink
6475 ///     for the possible values.
6476 ///     <p><hr>
6477 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_StretchMode `ListItem.Property(Game.StretchMode)`\endlink
6478 ///     <p>
6479 ///   }
6480 ///   \table_row3{   <b>`ListItem.Property(Game.VideoRotation)`</b>,
6481 ///                  \anchor ListItem_Property_Game_VideoRotation
6482 ///                  _integer_,
6483 ///     @return The video rotation of the list item representing a
6484 ///     gamewindow control (RETROPLAYER).
6485 ///     See \link RetroPlayer_VideoRotation RetroPlayer.VideoRotation \endlink
6486 ///     for the possible values.
6487 ///     <p><hr>
6488 ///     @skinning_v18 **[New Infolabel]** \link ListItem_Property_Game_VideoRotation `ListItem.Property(Game.VideoRotation)`\endlink
6489 ///     <p>
6490 ///   }
6491 ///   \table_row3{   <b>`ListItem.ParentalRating`</b>,
6492 ///                  \anchor ListItem_ParentalRating
6493 ///                  _string_,
6494 ///     @return The parental rating of the list item (PVR).
6495 ///     <p>
6496 ///   }
6497 ///   \table_row3{   <b>`ListItem.CurrentItem`</b>,
6498 ///                  \anchor ListItem_CurrentItem
6499 ///                  _string_,
6500 ///     @return The current index of the item in a container starting at 1.
6501 ///     <p><hr>
6502 ///     @skinning_v19 **[New Infolabel]** \link ListItem_CurrentItem `ListItem.CurrentItem`\endlink
6503 ///     <p>
6504 ///   }
6505 ///   \table_row3{   <b>`ListItem.IsNew`</b>,
6506 ///                  \anchor ListItem_IsNew
6507 ///                  _boolean_,
6508 ///     @return **True** if the item is new (for example\, a Live TV show that will be first aired).
6509 ///     <p><hr>
6510 ///     @skinning_v19 **[New Infolabel]** \link ListItem_IsNew `ListItem.IsNew`\endlink
6511 ///     <p>
6512 ///   }
6513 ///   \table_row3{   <b>`ListItem.IsPremiere`</b>,
6514 ///                  \anchor ListItem_IsPremiere
6515 ///                  _boolean_,
6516 ///     @return **True** if the item is a premiere (for example\, a Movie first showing or season first on Live TV).
6517 ///     <p><hr>
6518 ///     @skinning_v19 **[New Infolabel]** \link ListItem_IsPremiere `ListItem.IsPremiere`\endlink
6519 ///     <p>
6520 ///   }
6521 ///   \table_row3{   <b>`ListItem.IsFinale`</b>,
6522 ///                  \anchor ListItem_IsFinale
6523 ///                  _boolean_,
6524 ///     @return **True** if the item is a finale (for example\, a season finale showing on Live TV).
6525 ///     <p><hr>
6526 ///     @skinning_v19 **[New Infolabel]** \link ListItem_IsFinale `ListItem.IsFinale`\endlink
6527 ///     <p>
6528 ///   }
6529 ///   \table_row3{   <b>`ListItem.IsLive`</b>,
6530 ///                  \anchor ListItem_IsLive
6531 ///                  _boolean_,
6532 ///     @return **True** if the item is live (for example\, a Live TV sports event).
6533 ///     <p><hr>
6534 ///     @skinning_v19 **[New Infolabel]** \link ListItem_IsLive `ListItem.IsLive`\endlink
6535 ///     <p>
6536 ///   }
6537 ///   \table_row3{   <b>`ListItem.DiscTitle`</b>,
6538 ///                  \anchor ListItem_DiscTitle
6539 ///                  _string_,
6540 ///     @return The disc title of the currently selected album or song.
6541 ///     <p><hr>
6542 ///     @skinning_v19 **[New Infolabel]** \link ListItem_DiscTitle `ListItem.DiscTitle`\endlink
6543 ///     <p>
6544 ///   }
6545 ///   \table_row3{   <b>`ListItem.IsBoxset`</b>,
6546 ///                  \anchor ListItem_IsBoxset
6547 ///                  _boolean_,
6548 ///     @return **True** if the item is part of a boxset album.
6549 ///     <p><hr>
6550 ///     @skinning_v19 **[New Infolabel]** \link ListItem_IsBoxset `ListItem.IsBoxset`\endlink
6551 ///     <p>
6552 ///   }
6553 ///   \table_row3{   <b>`ListItem.TotalDiscs`</b>,
6554 ///                  \anchor ListItem_TotalDiscs
6555 ///                  _boolean_,
6556 ///     @return The total number of discs belonging to an album.
6557 ///     <p><hr>
6558 ///     @skinning_v19 **[New Infolabel]** \link ListItem_TotalDiscs `ListItem.TotalDiscs`\endlink
6559 ///     <p>
6560 ///   }
6561 ///   \table_row3{   <b>`ListItem.ReleaseDate`</b>,
6562 ///                  \anchor ListItem_ReleaseDate
6563 ///                  _string_,
6564 ///     @return The release date of the item.
6565 ///     <p><hr>
6566 ///     @skinning_v19 **[New Infolabel]** \link ListItem_ReleaseDate `ListItem.ReleaseDate`\endlink
6567 ///     <p>
6568 ///   }
6569 ///   \table_row3{   <b>`ListItem.OriginalDate`</b>,
6570 ///                  \anchor ListItem_OriginalDate
6571 ///                  _string_,
6572 ///     @return The original release date of the item. Can be full or partial date.
6573 ///     <p><hr>
6574 ///     @skinning_v19 **[New Infolabel]** \link ListItem_OriginalDate `ListItem.OriginalDate`\endlink
6575 ///     <p>
6576 ///   }
6577 ///   \table_row3{   <b>`ListItem.BPM`</b>,
6578 ///                  \anchor ListItem_BPM
6579 ///                  _string_,
6580 ///     @return The BPM of a song.
6581 ///     <p><hr>
6582 ///     @skinning_v19 **[New Infolabel]** \link ListItem_BPM `ListItem.BPM`\endlink
6583 ///     <p>
6584 ///   }
6585 ///   \table_row3{   <b>`ListItem.UniqueID(name)`</b>,
6586 ///                  \anchor ListItem_UniqueID
6587 ///                  _string_,
6588 ///     @return The scraped metadata id of the currently selected item in a container\,
6589 ///     for use in dialogvideoinfo.xml.
6590 ///     @param name - the name of the metadata provider.
6591 ///     <p><hr>
6592 ///     @skinning_v19 **[New Infolabel]** \link ListItem_UniqueID `ListItem.UniqueID(name)`\endlink
6593 ///     <p>
6594 ///   }
6595 ///   \table_row3{   <b>`ListItem.BitRate`</b>,
6596 ///                  \anchor ListItem_BitRate
6597 ///                  _string_,
6598 ///     @return The bitrate of a song. Actual rate for CBR\, average rate for VBR.
6599 ///     <p><hr>
6600 ///     @skinning_v19 **[New Infolabel]** \link ListItem_BitRate `ListItem.BitRate`\endlink
6601 ///     <p>
6602 ///   }
6603 ///   \table_row3{   <b>`ListItem.SampleRate`</b>,
6604 ///                  \anchor ListItem_SampleRate
6605 ///                  _string_,
6606 ///     @return The sample rate of a song / 1000.0 eg 44.1\, 48\, 96 etc.
6607 ///     <p><hr>
6608 ///     @skinning_v19 **[New Infolabel]** \link ListItem_SampleRate `ListItem.SampleRate`\endlink
6609 ///     <p>
6610 ///   }
6611 ///   \table_row3{   <b>`ListItem.MusicChannels`</b>,
6612 ///                  \anchor ListItem_MusicChannels
6613 ///                  _string_,
6614 ///     @return The number of audio channels of a song.
6615 ///     <p><hr>
6616 ///     @skinning_v19 **[New Infolabel]** \link ListItem_No_Of_Channels `ListItem.NoOfChannels`\endlink
6617 ///     <p>
6618 ///   }
6619 ///   \table_row3{   <b>`ListItem.TvShowDBID`</b>,
6620 ///                  \anchor ListItem_TvShowDBID
6621 ///                  _string_,
6622 ///     @return The database id of the TvShow for the currently selected Season or Episode.
6623 ///     <p><hr>
6624 ///     @skinning_v19 **[New Infolabel]** \link ListItem_TvShowDBID `ListItem.TvShowDBID`\endlink
6625 ///     <p>
6626 ///   }
6627 ///   \table_row3{   <b>`ListItem.AlbumStatus`</b>,
6628 ///                  \anchor ListItem_AlbumStatus
6629 ///                  _string_,
6630 ///     @return The Musicbrainz release status of the album (offical, bootleg, promotion etc)
6631 ///     <p><hr>
6632 ///     @skinning_v19 **[New Infolabel]** \link ListItem_AlbumStatus `ListItem.AlbumStatus`\endlink
6633 ///   }
6634 /// \table_end
6635 ///
6636 /// -----------------------------------------------------------------------------
6637 const infomap listitem_labels[]= {{ "thumb",            LISTITEM_THUMB },
6638                                   { "icon",             LISTITEM_ICON },
6639                                   { "actualicon",       LISTITEM_ACTUAL_ICON },
6640                                   { "overlay",          LISTITEM_OVERLAY },
6641                                   { "label",            LISTITEM_LABEL },
6642                                   { "label2",           LISTITEM_LABEL2 },
6643                                   { "title",            LISTITEM_TITLE },
6644                                   { "tracknumber",      LISTITEM_TRACKNUMBER },
6645                                   { "artist",           LISTITEM_ARTIST },
6646                                   { "album",            LISTITEM_ALBUM },
6647                                   { "albumartist",      LISTITEM_ALBUM_ARTIST },
6648                                   { "year",             LISTITEM_YEAR },
6649                                   { "genre",            LISTITEM_GENRE },
6650                                   { "contributors",     LISTITEM_CONTRIBUTORS },
6651                                   { "contributorandrole", LISTITEM_CONTRIBUTOR_AND_ROLE },
6652                                   { "director",         LISTITEM_DIRECTOR },
6653                                   { "disctitle",        LISTITEM_DISC_TITLE },
6654                                   { "filename",         LISTITEM_FILENAME },
6655                                   { "filenameandpath",  LISTITEM_FILENAME_AND_PATH },
6656                                   { "fileextension",    LISTITEM_FILE_EXTENSION },
6657                                   { "filenamenoextension",  LISTITEM_FILENAME_NO_EXTENSION },
6658                                   { "date",             LISTITEM_DATE },
6659                                   { "datetime",         LISTITEM_DATETIME },
6660                                   { "size",             LISTITEM_SIZE },
6661                                   { "rating",           LISTITEM_RATING },
6662                                   { "ratingandvotes",   LISTITEM_RATING_AND_VOTES },
6663                                   { "userrating",       LISTITEM_USER_RATING },
6664                                   { "votes",            LISTITEM_VOTES },
6665                                   { "mood",             LISTITEM_MOOD },
6666                                   { "programcount",     LISTITEM_PROGRAM_COUNT },
6667                                   { "duration",         LISTITEM_DURATION },
6668                                   { "isselected",       LISTITEM_ISSELECTED },
6669                                   { "isplaying",        LISTITEM_ISPLAYING },
6670                                   { "plot",             LISTITEM_PLOT },
6671                                   { "plotoutline",      LISTITEM_PLOT_OUTLINE },
6672                                   { "episode",          LISTITEM_EPISODE },
6673                                   { "season",           LISTITEM_SEASON },
6674                                   { "tvshowtitle",      LISTITEM_TVSHOW },
6675                                   { "premiered",        LISTITEM_PREMIERED },
6676                                   { "comment",          LISTITEM_COMMENT },
6677                                   { "path",             LISTITEM_PATH },
6678                                   { "foldername",       LISTITEM_FOLDERNAME },
6679                                   { "folderpath",       LISTITEM_FOLDERPATH },
6680                                   { "picturepath",      LISTITEM_PICTURE_PATH },
6681                                   { "pictureresolution",LISTITEM_PICTURE_RESOLUTION },
6682                                   { "picturedatetime",  LISTITEM_PICTURE_DATETIME },
6683                                   { "picturedate",      LISTITEM_PICTURE_DATE },
6684                                   { "picturelongdatetime",LISTITEM_PICTURE_LONGDATETIME },
6685                                   { "picturelongdate",  LISTITEM_PICTURE_LONGDATE },
6686                                   { "picturecomment",   LISTITEM_PICTURE_COMMENT },
6687                                   { "picturecaption",   LISTITEM_PICTURE_CAPTION },
6688                                   { "picturedesc",      LISTITEM_PICTURE_DESC },
6689                                   { "picturekeywords",  LISTITEM_PICTURE_KEYWORDS },
6690                                   { "picturecammake",   LISTITEM_PICTURE_CAM_MAKE },
6691                                   { "picturecammodel",  LISTITEM_PICTURE_CAM_MODEL },
6692                                   { "pictureaperture",  LISTITEM_PICTURE_APERTURE },
6693                                   { "picturefocallen",  LISTITEM_PICTURE_FOCAL_LEN },
6694                                   { "picturefocusdist", LISTITEM_PICTURE_FOCUS_DIST },
6695                                   { "pictureexpmode",   LISTITEM_PICTURE_EXP_MODE },
6696                                   { "pictureexptime",   LISTITEM_PICTURE_EXP_TIME },
6697                                   { "pictureiso",       LISTITEM_PICTURE_ISO },
6698                                   { "pictureauthor",                 LISTITEM_PICTURE_AUTHOR },
6699                                   { "picturebyline",                 LISTITEM_PICTURE_BYLINE },
6700                                   { "picturebylinetitle",            LISTITEM_PICTURE_BYLINE_TITLE },
6701                                   { "picturecategory",               LISTITEM_PICTURE_CATEGORY },
6702                                   { "pictureccdwidth",               LISTITEM_PICTURE_CCD_WIDTH },
6703                                   { "picturecity",                   LISTITEM_PICTURE_CITY },
6704                                   { "pictureurgency",                LISTITEM_PICTURE_URGENCY },
6705                                   { "picturecopyrightnotice",        LISTITEM_PICTURE_COPYRIGHT_NOTICE },
6706                                   { "picturecountry",                LISTITEM_PICTURE_COUNTRY },
6707                                   { "picturecountrycode",            LISTITEM_PICTURE_COUNTRY_CODE },
6708                                   { "picturecredit",                 LISTITEM_PICTURE_CREDIT },
6709                                   { "pictureiptcdate",               LISTITEM_PICTURE_IPTCDATE },
6710                                   { "picturedigitalzoom",            LISTITEM_PICTURE_DIGITAL_ZOOM },
6711                                   { "pictureexposure",               LISTITEM_PICTURE_EXPOSURE },
6712                                   { "pictureexposurebias",           LISTITEM_PICTURE_EXPOSURE_BIAS },
6713                                   { "pictureflashused",              LISTITEM_PICTURE_FLASH_USED },
6714                                   { "pictureheadline",               LISTITEM_PICTURE_HEADLINE },
6715                                   { "picturecolour",                 LISTITEM_PICTURE_COLOUR },
6716                                   { "picturelightsource",            LISTITEM_PICTURE_LIGHT_SOURCE },
6717                                   { "picturemeteringmode",           LISTITEM_PICTURE_METERING_MODE },
6718                                   { "pictureobjectname",             LISTITEM_PICTURE_OBJECT_NAME },
6719                                   { "pictureorientation",            LISTITEM_PICTURE_ORIENTATION },
6720                                   { "pictureprocess",                LISTITEM_PICTURE_PROCESS },
6721                                   { "picturereferenceservice",       LISTITEM_PICTURE_REF_SERVICE },
6722                                   { "picturesource",                 LISTITEM_PICTURE_SOURCE },
6723                                   { "picturespecialinstructions",    LISTITEM_PICTURE_SPEC_INSTR },
6724                                   { "picturestate",                  LISTITEM_PICTURE_STATE },
6725                                   { "picturesupplementalcategories", LISTITEM_PICTURE_SUP_CATEGORIES },
6726                                   { "picturetransmissionreference",  LISTITEM_PICTURE_TX_REFERENCE },
6727                                   { "picturewhitebalance",           LISTITEM_PICTURE_WHITE_BALANCE },
6728                                   { "pictureimagetype",              LISTITEM_PICTURE_IMAGETYPE },
6729                                   { "picturesublocation",            LISTITEM_PICTURE_SUBLOCATION },
6730                                   { "pictureiptctime",               LISTITEM_PICTURE_TIMECREATED },
6731                                   { "picturegpslat",    LISTITEM_PICTURE_GPS_LAT },
6732                                   { "picturegpslon",    LISTITEM_PICTURE_GPS_LON },
6733                                   { "picturegpsalt",    LISTITEM_PICTURE_GPS_ALT },
6734                                   { "studio",           LISTITEM_STUDIO },
6735                                   { "country",          LISTITEM_COUNTRY },
6736                                   { "mpaa",             LISTITEM_MPAA },
6737                                   { "cast",             LISTITEM_CAST },
6738                                   { "castandrole",      LISTITEM_CAST_AND_ROLE },
6739                                   { "writer",           LISTITEM_WRITER },
6740                                   { "tagline",          LISTITEM_TAGLINE },
6741                                   { "status",           LISTITEM_STATUS },
6742                                   { "top250",           LISTITEM_TOP250 },
6743                                   { "trailer",          LISTITEM_TRAILER },
6744                                   { "sortletter",       LISTITEM_SORT_LETTER },
6745                                   { "tag",              LISTITEM_TAG },
6746                                   { "set",              LISTITEM_SET },
6747                                   { "setid",            LISTITEM_SETID },
6748                                   { "videocodec",       LISTITEM_VIDEO_CODEC },
6749                                   { "videoresolution",  LISTITEM_VIDEO_RESOLUTION },
6750                                   { "videoaspect",      LISTITEM_VIDEO_ASPECT },
6751                                   { "audiocodec",       LISTITEM_AUDIO_CODEC },
6752                                   { "audiochannels",    LISTITEM_AUDIO_CHANNELS },
6753                                   { "audiolanguage",    LISTITEM_AUDIO_LANGUAGE },
6754                                   { "subtitlelanguage", LISTITEM_SUBTITLE_LANGUAGE },
6755                                   { "isresumable",      LISTITEM_IS_RESUMABLE},
6756                                   { "percentplayed",    LISTITEM_PERCENT_PLAYED},
6757                                   { "isfolder",         LISTITEM_IS_FOLDER },
6758                                   { "isparentfolder",   LISTITEM_IS_PARENTFOLDER },
6759                                   { "iscollection",     LISTITEM_IS_COLLECTION },
6760                                   { "originaltitle",    LISTITEM_ORIGINALTITLE },
6761                                   { "lastplayed",       LISTITEM_LASTPLAYED },
6762                                   { "playcount",        LISTITEM_PLAYCOUNT },
6763                                   { "discnumber",       LISTITEM_DISC_NUMBER },
6764                                   { "starttime",        LISTITEM_STARTTIME },
6765                                   { "endtime",          LISTITEM_ENDTIME },
6766                                   { "endtimeresume",    LISTITEM_ENDTIME_RESUME },
6767                                   { "startdate",        LISTITEM_STARTDATE },
6768                                   { "enddate",          LISTITEM_ENDDATE },
6769                                   { "nexttitle",        LISTITEM_NEXT_TITLE },
6770                                   { "nextgenre",        LISTITEM_NEXT_GENRE },
6771                                   { "nextplot",         LISTITEM_NEXT_PLOT },
6772                                   { "nextplotoutline",  LISTITEM_NEXT_PLOT_OUTLINE },
6773                                   { "nextstarttime",    LISTITEM_NEXT_STARTTIME },
6774                                   { "nextendtime",      LISTITEM_NEXT_ENDTIME },
6775                                   { "nextstartdate",    LISTITEM_NEXT_STARTDATE },
6776                                   { "nextenddate",      LISTITEM_NEXT_ENDDATE },
6777                                   { "nextduration",     LISTITEM_NEXT_DURATION },
6778                                   { "channelname",      LISTITEM_CHANNEL_NAME },
6779                                   { "channelnumberlabel", LISTITEM_CHANNEL_NUMBER },
6780                                   { "channelgroup",     LISTITEM_CHANNEL_GROUP },
6781                                   { "hasepg",           LISTITEM_HAS_EPG },
6782                                   { "hastimer",         LISTITEM_HASTIMER },
6783                                   { "hastimerschedule", LISTITEM_HASTIMERSCHEDULE },
6784                                   { "hasreminder",      LISTITEM_HASREMINDER },
6785                                   { "hasreminderrule",  LISTITEM_HASREMINDERRULE },
6786                                   { "hasrecording",     LISTITEM_HASRECORDING },
6787                                   { "isrecording",      LISTITEM_ISRECORDING },
6788                                   { "isplayable",       LISTITEM_ISPLAYABLE },
6789                                   { "hasarchive",       LISTITEM_HASARCHIVE },
6790                                   { "inprogress",       LISTITEM_INPROGRESS },
6791                                   { "isencrypted",      LISTITEM_ISENCRYPTED },
6792                                   { "progress",         LISTITEM_PROGRESS },
6793                                   { "dateadded",        LISTITEM_DATE_ADDED },
6794                                   { "dbtype",           LISTITEM_DBTYPE },
6795                                   { "dbid",             LISTITEM_DBID },
6796                                   { "appearances",      LISTITEM_APPEARANCES },
6797                                   { "stereoscopicmode", LISTITEM_STEREOSCOPIC_MODE },
6798                                   { "isstereoscopic",   LISTITEM_IS_STEREOSCOPIC },
6799                                   { "imdbnumber",       LISTITEM_IMDBNUMBER },
6800                                   { "episodename",      LISTITEM_EPISODENAME },
6801                                   { "timertype",        LISTITEM_TIMERTYPE },
6802                                   { "epgeventtitle",    LISTITEM_EPG_EVENT_TITLE },
6803                                   { "epgeventicon",     LISTITEM_EPG_EVENT_ICON },
6804                                   { "timerisactive",    LISTITEM_TIMERISACTIVE },
6805                                   { "timerhaserror",    LISTITEM_TIMERHASERROR },
6806                                   { "timerhasconflict", LISTITEM_TIMERHASCONFLICT },
6807                                   { "addonname",        LISTITEM_ADDON_NAME },
6808                                   { "addonversion",     LISTITEM_ADDON_VERSION },
6809                                   { "addoncreator",     LISTITEM_ADDON_CREATOR },
6810                                   { "addonsummary",     LISTITEM_ADDON_SUMMARY },
6811                                   { "addondescription", LISTITEM_ADDON_DESCRIPTION },
6812                                   { "addondisclaimer",  LISTITEM_ADDON_DISCLAIMER },
6813                                   { "addonnews",        LISTITEM_ADDON_NEWS },
6814                                   { "addonbroken",      LISTITEM_ADDON_BROKEN },
6815                                   { "addonlifecycletype", LISTITEM_ADDON_LIFECYCLE_TYPE },
6816                                   { "addonlifecycledesc", LISTITEM_ADDON_LIFECYCLE_DESC },
6817                                   { "addontype",        LISTITEM_ADDON_TYPE },
6818                                   { "addoninstalldate", LISTITEM_ADDON_INSTALL_DATE },
6819                                   { "addonlastupdated", LISTITEM_ADDON_LAST_UPDATED },
6820                                   { "addonlastused",    LISTITEM_ADDON_LAST_USED },
6821                                   { "addonorigin",      LISTITEM_ADDON_ORIGIN },
6822                                   { "addonsize",        LISTITEM_ADDON_SIZE },
6823                                   { "expirationdate",   LISTITEM_EXPIRATION_DATE },
6824                                   { "expirationtime",   LISTITEM_EXPIRATION_TIME },
6825                                   { "art",              LISTITEM_ART },
6826                                   { "property",         LISTITEM_PROPERTY },
6827                                   { "parentalrating",   LISTITEM_PARENTAL_RATING },
6828                                   { "currentitem",      LISTITEM_CURRENTITEM },
6829                                   { "isnew",            LISTITEM_IS_NEW },
6830                                   { "isboxset",         LISTITEM_IS_BOXSET },
6831                                   { "totaldiscs",       LISTITEM_TOTALDISCS },
6832                                   { "releasedate",      LISTITEM_RELEASEDATE },
6833                                   { "originaldate",     LISTITEM_ORIGINALDATE },
6834                                   { "bpm",              LISTITEM_BPM },
6835                                   { "uniqueid",         LISTITEM_UNIQUEID },
6836                                   { "bitrate",          LISTITEM_BITRATE },
6837                                   { "samplerate",       LISTITEM_SAMPLERATE },
6838                                   { "musicchannels",    LISTITEM_MUSICCHANNELS },
6839                                   { "ispremiere",       LISTITEM_IS_PREMIERE },
6840                                   { "isfinale",         LISTITEM_IS_FINALE },
6841                                   { "islive",           LISTITEM_IS_LIVE },
6842                                   { "tvshowdbid",       LISTITEM_TVSHOWDBID },
6843                                   { "albumstatus",      LISTITEM_ALBUMSTATUS },
6844                                   { "isautoupdateable", LISTITEM_ISAUTOUPDATEABLE },
6845 };
6846 
6847 /// \page modules__infolabels_boolean_conditions
6848 /// \subsection modules__infolabels_boolean_conditions_Visualisation Visualisation
6849 /// \table_start
6850 ///   \table_h3{ Labels, Type, Description }
6851 ///   \table_row3{   <b>`Visualisation.Enabled`</b>,
6852 ///                  \anchor Visualisation_Enabled
6853 ///                  _boolean_,
6854 ///     @return **True** if any visualisation has been set in settings (so not None).
6855 ///     <p>
6856 ///   }
6857 ///   \table_row3{   <b>`Visualisation.HasPresets`</b>,
6858 ///                  \anchor Visualisation_HasPresets
6859 ///                  _boolean_,
6860 ///     @return **True** if the visualisation has built in presets.
6861 ///     <p><hr>
6862 ///     @skinning_v16 **[New Boolean Condition]** \link Visualisation_HasPresets `Visualisation.HasPresets`\endlink
6863 ///     <p>
6864 ///   }
6865 ///   \table_row3{   <b>`Visualisation.Locked`</b>,
6866 ///                  \anchor Visualisation_Locked
6867 ///                  _boolean_,
6868 ///     @return **True** if the current visualisation preset is locked (e.g. in Milkdrop).
6869 ///     <p>
6870 ///   }
6871 ///   \table_row3{   <b>`Visualisation.Preset`</b>,
6872 ///                  \anchor Visualisation_Preset
6873 ///                  _string_,
6874 ///     @return The current preset of the visualisation.
6875 ///     <p>
6876 ///   }
6877 ///   \table_row3{   <b>`Visualisation.Name`</b>,
6878 ///                  \anchor Visualisation_Name
6879 ///                  _string_,
6880 ///     @return the name of the visualisation.
6881 ///     <p>
6882 ///   }
6883 /// \table_end
6884 ///
6885 /// -----------------------------------------------------------------------------
6886 const infomap visualisation[] =  {{ "locked",           VISUALISATION_LOCKED },
6887                                   { "preset",           VISUALISATION_PRESET },
6888                                   { "haspresets",       VISUALISATION_HAS_PRESETS },
6889                                   { "name",             VISUALISATION_NAME },
6890                                   { "enabled",          VISUALISATION_ENABLED }};
6891 
6892 /// \page modules__infolabels_boolean_conditions
6893 /// \subsection modules__infolabels_boolean_conditions_Fanart Fanart
6894 /// \table_start
6895 ///   \table_h3{ Labels, Type, Description }
6896 ///   \table_row3{   <b>`Fanart.Color1`</b>,
6897 ///                  \anchor Fanart_Color1
6898 ///                  _string_,
6899 ///     @return The first of three colors included in the currently selected
6900 ///     Fanart theme for the parent TV Show.
6901 ///     @note Colors are arranged Lightest to Darkest.
6902 ///     <p>
6903 ///   }
6904 ///   \table_row3{   <b>`Fanart.Color2`</b>,
6905 ///                  \anchor Fanart_Color2
6906 ///                  _string_,
6907 ///     @return The second of three colors included in the currently selected
6908 ///     Fanart theme for the parent TV Show.
6909 ///     @note Colors are arranged Lightest to Darkest.
6910 ///     <p>
6911 ///   }
6912 ///   \table_row3{   <b>`Fanart.Color3`</b>,
6913 ///                  \anchor Fanart_Color3
6914 ///                  _string_,
6915 ///     @return The third of three colors included in the currently selected
6916 ///     Fanart theme for the parent TV Show.
6917 ///     @note Colors are arranged Lightest to Darkest.
6918 ///     <p>
6919 ///   }
6920 ///   \table_row3{   <b>`Fanart.Image`</b>,
6921 ///                  \anchor Fanart_Image
6922 ///                  _string_,
6923 ///     @return The fanart image\, if any
6924 ///     <p>
6925 ///   }
6926 /// \table_end
6927 ///
6928 /// -----------------------------------------------------------------------------
6929 const infomap fanart_labels[] =  {{ "color1",           FANART_COLOR1 },
6930                                   { "color2",           FANART_COLOR2 },
6931                                   { "color3",           FANART_COLOR3 },
6932                                   { "image",            FANART_IMAGE }};
6933 
6934 /// \page modules__infolabels_boolean_conditions
6935 /// \subsection modules__infolabels_boolean_conditions_Skin Skin
6936 /// \table_start
6937 ///   \table_h3{ Labels, Type, Description }
6938 ///   \table_row3{   <b>`Skin.CurrentTheme`</b>,
6939 ///                  \anchor Skin_CurrentTheme
6940 ///                  _string_,
6941 ///     @return The current selected skin theme.
6942 ///     <p>
6943 ///   }
6944 ///   \table_row3{   <b>`Skin.CurrentColourTheme`</b>,
6945 ///                  \anchor Skin_CurrentColourTheme
6946 ///                  _string_,
6947 ///     @return the current selected colour theme of the skin.
6948 ///     <p>
6949 ///   }
6950 ///   \table_row3{   <b>`Skin.AspectRatio`</b>,
6951 ///                  \anchor Skin_AspectRatio
6952 ///                  _string_,
6953 ///     @return The closest aspect ratio match using the resolution info from the skin's `addon.xml` file.
6954 ///     <p>
6955 ///   }
6956 ///   \table_row3{   <b>`Skin.Font`</b>,
6957 ///                  \anchor Skin_Font
6958 ///                  _string_,
6959 ///     @return the current fontset from `Font.xml`.
6960 ///     <p><hr>
6961 ///     @skinning_v18 **[New Infolabel]** \link Skin_Font `Skin.Font`\endlink
6962 ///     <p>
6963 ///   }
6964 /// \table_end
6965 ///
6966 /// -----------------------------------------------------------------------------
6967 const infomap skin_labels[] =    {{ "currenttheme",      SKIN_THEME },
6968                                   { "currentcolourtheme",SKIN_COLOUR_THEME },
6969                                   { "aspectratio",       SKIN_ASPECT_RATIO},
6970                                   { "font",              SKIN_FONT}};
6971 
6972 /// \page modules__infolabels_boolean_conditions
6973 /// \subsection modules__infolabels_boolean_conditions_Window Window
6974 /// \table_start
6975 ///   \table_h3{ Labels, Type, Description }
6976 ///   \table_row3{   <b>`Window.IsMedia`</b>,
6977 ///                  \anchor Window_IsMedia
6978 ///                  _boolean_,
6979 ///     @return **True** if this window is a media window (programs\, music\, video\,
6980 ///     scripts\, pictures)
6981 ///     <p>
6982 ///   }
6983 ///   \table_row3{   <b>`Window.Is(window)`</b>,
6984 ///                  \anchor Window_Is
6985 ///                  _boolean_,
6986 ///     @return **True** if the window with the given name is the window which is currently rendered.
6987 ///     @param window - the name of the window
6988 ///     @note Useful in xml files that are shared between multiple windows or dialogs.
6989 ///     <p><hr>
6990 ///     @skinning_v17 **[New Boolean Condition]** \ref Window_Is "Window.Is(window)"
6991 ///     <p>
6992 ///   }
6993 ///   \table_row3{   <b>`Window.IsActive(window)`</b>,
6994 ///                  \anchor Window_IsActive
6995 ///                  _boolean_,
6996 ///     @return **True** if the window with id or title _window_ is active
6997 ///     @param window - the id or name of the window
6998 ///     @note Excludes fade out time on dialogs
6999 ///     <p>
7000 ///   }
7001 ///   \table_row3{   <b>`Window.IsVisible(window)`</b>,
7002 ///                  \anchor Window_IsVisible
7003 ///                  _boolean_,
7004 ///     @return **True** if the window is visible
7005 ///     @note Includes fade out time on dialogs
7006 ///     <p>
7007 ///   }
7008 ///   \table_row3{   <b>`Window.IsTopmost(window)`</b>,
7009 ///                  \anchor Window_IsTopmost
7010 ///                  _boolean_,
7011 ///     @return **True** if the window with id or title _window_ is on top of the
7012 ///     window stack.
7013 ///     @param window - the id or name of the window
7014 ///     @note Excludes fade out time on dialogs
7015 ///     @deprecated use  \ref Window_IsDialogTopmost "Window.IsDialogTopmost(dialog)" instead
7016 ///     <p>
7017 ///   }
7018 ///   \table_row3{   <b>`Window.IsDialogTopmost(dialog)`</b>,
7019 ///                  \anchor Window_IsDialogTopmost
7020 ///                  _boolean_,
7021 ///     @return **True** if the dialog with id or title _dialog_ is on top of the
7022 ///     dialog stack.
7023 ///     @param window - the id or name of the window
7024 ///     @note Excludes fade out time on dialogs
7025 ///     <p>
7026 ///   }
7027 ///   \table_row3{   <b>`Window.IsModalDialogTopmost(dialog)`</b>,
7028 ///                  \anchor Window_IsModalDialogTopmost
7029 ///                  _boolean_,
7030 ///     @return **True** if the dialog with id or title _dialog_ is on top of the
7031 ///     modal dialog stack
7032 ///     @note Excludes fade out time on dialogs
7033 ///     <p>
7034 ///   }
7035 ///   \table_row3{   <b>`Window.Previous(window)`</b>,
7036 ///                  \anchor Window_Previous
7037 ///                  _boolean_,
7038 ///     @return **True** if the window with id or title _window_ is being moved from.
7039 ///     @param window - the window id or title
7040 ///     @note Only valid while windows are changing.
7041 ///     <p>
7042 ///   }
7043 ///   \table_row3{   <b>`Window.Next(window)`</b>,
7044 ///                  \anchor Window_Next
7045 ///                  _boolean_,
7046 ///     @return **True** if the window with id or title _window_ is being moved to.
7047 ///     @param window - the window id or title
7048 ///     @note Only valid while windows are changing.
7049 ///     <p>
7050 ///   }
7051 ///   \table_row3{   <b>`Window.Property(Addon.ID)`</b>,
7052 ///                  \anchor Window_Property_AddonId
7053 ///                  _string_,
7054 ///     @return The id of the selected addon\, in `DialogAddonSettings.xml`.
7055 ///     <p><hr>
7056 ///     @skinning_v17 **[New Infolabel]** \link Window_Property_AddonId `Window.Property(Addon.ID)`\endlink
7057 ///     <p>
7058 ///   }
7059 ///   \table_row3{   <b>`Window([window]).Property(key)`</b>,
7060 ///                  \anchor Window_Window_Property_key
7061 ///                  _string_,
7062 ///     @return A window property.
7063 ///     @param window - [opt] window id or name.
7064 ///     @param key - any value.
7065 ///     <p>
7066 ///   }
7067 ///   \table_row3{   <b>`Window(AddonBrowser).Property(Updated)`</b>,
7068 ///                  \anchor Window_Addonbrowser_Property_Updated
7069 ///                  _string_,
7070 ///     @return The date and time the addon repo was last checked for updates.
7071 ///     @todo move to a future window document.
7072 ///     <p><hr>
7073 ///     @skinning_v15 **[New Infolabel]** \link Window_Addonbrowser_Property_Updated `Window(AddonBrowser).Property(Updated)`\endlink
7074 ///     <p>
7075 ///   }
7076 ///   \table_row3{   <b>`Window(Weather).Property(property)`</b>,
7077 ///                  \anchor Window_Weather_Property
7078 ///                  _string_,
7079 ///     @return The property for the weather window.
7080 ///     @param property - The requested property. The following are available:
7081 ///        - Current.ConditionIcon
7082 ///        - Day[0-6].OutlookIcon
7083 ///        - Current.FanartCode
7084 ///        - Day[0-6].FanartCode
7085 ///        - WeatherProviderLogo
7086 ///        - Daily.%i.OutlookIcon
7087 ///        - 36Hour.%i.OutlookIcon
7088 ///        - Weekend.%i.OutlookIcon
7089 ///        - Hourly.%i.OutlookIcon
7090 ///     @todo move to a future window document.
7091 ///     <p><hr>
7092 ///     @skinning_v16 **[Updated infolabel]** \link Window_Weather_Property `Window(Weather).Property(property)`\endlink
7093 ///     For skins that support extended weather info\, the following infolabels have been changed:
7094 ///       - Daily.%i.OutlookIcon
7095 ///       - 36Hour.%i.OutlookIcon
7096 ///       - Weekend.%i.OutlookIcon
7097 ///       - Hourly.%i.OutlookIcon
7098 ///
7099 ///     previously the openweathermap addon would provide the full\, hardcoded path to the icon
7100 ///     ie. `resource://resource.images.weathericons.default/28.png`
7101 ///     to make it easier for skins to work with custom icon sets\, it now will return the filename only
7102 ///     i.e. 28.png
7103 ///     @skinning_v13 **[Infolabel Updated]** \link Window_Weather_Property `Window(Weather).Property(property)`\endlink
7104 ///     added `WeatherProviderLogo` property - weather provider logo (for weather addons that support it).
7105 ///     <p>
7106 ///   }
7107 /// \table_end
7108 ///
7109 /// -----------------------------------------------------------------------------
7110 const infomap window_bools[] =   {{ "ismedia",          WINDOW_IS_MEDIA },
7111                                   { "is",               WINDOW_IS },
7112                                   { "isactive",         WINDOW_IS_ACTIVE },
7113                                   { "isvisible",        WINDOW_IS_VISIBLE },
7114                                   { "istopmost",        WINDOW_IS_DIALOG_TOPMOST }, //! @deprecated, remove in v19
7115                                   { "isdialogtopmost",  WINDOW_IS_DIALOG_TOPMOST },
7116                                   { "ismodaldialogtopmost", WINDOW_IS_MODAL_DIALOG_TOPMOST },
7117                                   { "previous",         WINDOW_PREVIOUS },
7118                                   { "next",             WINDOW_NEXT }};
7119 
7120 /// \page modules__infolabels_boolean_conditions
7121 /// \subsection modules__infolabels_boolean_conditions_Control Control
7122 /// \table_start
7123 ///   \table_h3{ Labels, Type, Description }
7124 ///   \table_row3{   <b>`Control.HasFocus(id)`</b>,
7125 ///                  \anchor Control_HasFocus
7126 ///                  _boolean_,
7127 ///     @return **True** if the currently focused control has id "id".
7128 ///     @param id - The id of the control
7129 ///     <p>
7130 ///   }
7131 ///   \table_row3{   <b>`Control.IsVisible(id)`</b>,
7132 ///                  \anchor Control_IsVisible
7133 ///                  _boolean_,
7134 ///     @return **True** if the control with id "id" is visible.
7135 ///     @param id - The id of the control
7136 ///     <p>
7137 ///   }
7138 ///   \table_row3{   <b>`Control.IsEnabled(id)`</b>,
7139 ///                  \anchor Control_IsEnabled
7140 ///                  _boolean_,
7141 ///     @return **True** if the control with id "id" is enabled.
7142 ///     @param id - The id of the control
7143 ///     <p>
7144 ///   }
7145 ///   \table_row3{   <b>`Control.GetLabel(id)[.index()]`</b>,
7146 ///                  \anchor Control_GetLabel
7147 ///                  _string_,
7148 ///     @return The label value or texture name of the control with the given id.
7149 ///     @param id - The id of the control
7150 ///     @param index - [opt] Optionally you can specify index(1) to retrieve label2 from an Edit
7151 ///     control.
7152 ///     <p><hr>
7153 ///     @skinning_v15 **[Infolabel Updated]** \link Control_GetLabel `Control.GetLabel(id)`\endlink
7154 ///     added index parameter - allows skinner to retrieve label2 of a control. Only edit controls are supported.
7155 ///     ** Example** : `Control.GetLabel(999).index(1)` where:
7156 ///       - index(0) = label
7157 ///       - index(1) = label2
7158 ///     <p>
7159 ///   }
7160 /// \table_end
7161 ///
7162 /// -----------------------------------------------------------------------------
7163 const infomap control_labels[] = {{ "hasfocus",         CONTROL_HAS_FOCUS },
7164                                   { "isvisible",        CONTROL_IS_VISIBLE },
7165                                   { "isenabled",        CONTROL_IS_ENABLED },
7166                                   { "getlabel",         CONTROL_GET_LABEL }};
7167 
7168 /// \page modules__infolabels_boolean_conditions
7169 /// \subsection modules__infolabels_boolean_conditions_Playlist Playlist
7170 /// \table_start
7171 ///   \table_h3{ Labels, Type, Description }
7172 ///   \table_row3{   <b>`Playlist.Length(media)`</b>,
7173 ///                  \anchor Playlist_Length
7174 ///                  _integer_,
7175 ///     @return The total size of the current playlist.
7176 ///     @param media - [opt] mediatype with is either
7177 ///     video or music.
7178 ///     <p>
7179 ///   }
7180 ///   \table_row3{   <b>`Playlist.Position(media)`</b>,
7181 ///                  \anchor Playlist_Position
7182 ///                  _integer_,
7183 ///     @return The position of the current item in the current playlist.
7184 ///     @param media - [opt] mediatype with is either
7185 ///     video or music.
7186 ///     <p>
7187 ///   }
7188 ///   \table_row3{   <b>`Playlist.Random`</b>,
7189 ///                  \anchor Playlist_Random
7190 ///                  _integer_,
7191 ///     @return String ID for the random mode:
7192 ///       - **16041** (On)
7193 ///       - **591** (Off)
7194 ///     <p><hr>
7195 ///     @skinning_v18 **[Infolabel Updated]** \link Playlist_Random `Playlist.Random`\endlink will
7196 ///     now return **On/Off**
7197 ///     <p>
7198 ///   }
7199 ///   \table_row3{   <b>`Playlist.Repeat`</b>,
7200 ///                  \anchor Playlist_Repeat
7201 ///                  _integer_,
7202 ///     @return The String Id for the repeat mode. It can be one of the following
7203 ///     values:
7204 ///       - **592** (Repeat One)
7205 ///       - **593** (Repeat All)
7206 ///       - **594** (Repeat Off)
7207 ///     <p>
7208 ///   }
7209 ///   \table_row3{   <b>`Playlist.IsRandom`</b>,
7210 ///                  \anchor Playlist_IsRandom
7211 ///                  _boolean_,
7212 ///     @return **True** if the player is in random mode.
7213 ///     <p>
7214 ///   }
7215 ///   \table_row3{   <b>`Playlist.IsRepeat`</b>,
7216 ///                  \anchor Playlist_IsRepeat
7217 ///                  _boolean_,
7218 ///     @return **True** if the player is in repeat all mode.
7219 ///     <p>
7220 ///   }
7221 ///   \table_row3{   <b>`Playlist.IsRepeatOne`</b>,
7222 ///                  \anchor Playlist_IsRepeatOne
7223 ///                  _boolean_,
7224 ///     @return **True** if the player is in repeat one mode.
7225 ///     <p>
7226 ///   }
7227 /// \table_end
7228 ///
7229 /// -----------------------------------------------------------------------------
7230 const infomap playlist[] =       {{ "length",           PLAYLIST_LENGTH },
7231                                   { "position",         PLAYLIST_POSITION },
7232                                   { "random",           PLAYLIST_RANDOM },
7233                                   { "repeat",           PLAYLIST_REPEAT },
7234                                   { "israndom",         PLAYLIST_ISRANDOM },
7235                                   { "isrepeat",         PLAYLIST_ISREPEAT },
7236                                   { "isrepeatone",      PLAYLIST_ISREPEATONE }};
7237 
7238 /// \page modules__infolabels_boolean_conditions
7239 /// \subsection modules__infolabels_boolean_conditions_Pvr Pvr
7240 /// \table_start
7241 ///   \table_h3{ Labels, Type, Description }
7242 ///   \table_row3{   <b>`PVR.IsRecording`</b>,
7243 ///                  \anchor PVR_IsRecording
7244 ///                  _boolean_,
7245 ///     @return **True** when the system is recording a tv or radio programme.
7246 ///     <p>
7247 ///   }
7248 ///   \table_row3{   <b>`PVR.HasTimer`</b>,
7249 ///                  \anchor PVR_HasTimer
7250 ///                  _boolean_,
7251 ///     @return **True** when a recording timer is active.
7252 ///     <p>
7253 ///   }
7254 ///   \table_row3{   <b>`PVR.HasTVChannels`</b>,
7255 ///                  \anchor PVR_HasTVChannels
7256 ///                  _boolean_,
7257 ///     @return **True** if there are TV channels available.
7258 ///     <p>
7259 ///   }
7260 ///   \table_row3{   <b>`PVR.HasRadioChannels`</b>,
7261 ///                  \anchor PVR_HasRadioChannels
7262 ///                  _boolean_,
7263 ///     @return **True** if there are radio channels available.
7264 ///     <p>
7265 ///   }
7266 ///   \table_row3{   <b>`PVR.HasNonRecordingTimer`</b>,
7267 ///                  \anchor PVR_HasNonRecordingTimer
7268 ///                  _boolean_,
7269 ///     @return **True** if there are timers present who currently not do recording.
7270 ///     <p>
7271 ///   }
7272 ///   \table_row3{   <b>`PVR.BackendName`</b>,
7273 ///                  \anchor PVR_BackendName
7274 ///                  _string_,
7275 ///     @return The name of the backend being used.
7276 ///     <p>
7277 ///   }
7278 ///   \table_row3{   <b>`PVR.BackendVersion`</b>,
7279 ///                  \anchor PVR_BackendVersion
7280 ///                  _string_,
7281 ///     @return The version of the backend that's being used.
7282 ///     <p>
7283 ///   }
7284 ///   \table_row3{   <b>`PVR.BackendHost`</b>,
7285 ///                  \anchor PVR_BackendHost
7286 ///                  _string_,
7287 ///     @return The backend hostname.
7288 ///     <p>
7289 ///   }
7290 ///   \table_row3{   <b>`PVR.BackendDiskSpace`</b>,
7291 ///                  \anchor PVR_BackendDiskSpace
7292 ///                  _string_,
7293 ///     @return The available diskspace on the backend as string with size.
7294 ///     <p>
7295 ///   }
7296 ///   \table_row3{   <b>`PVR.BackendDiskSpaceProgr`</b>,
7297 ///                  \anchor PVR_BackendDiskSpaceProgr
7298 ///                  _integer_,
7299 ///     @return The available diskspace on the backend as percent value.
7300 ///     <p><hr>
7301 ///     @skinning_v14 **[New Infolabel]** \link PVR_BackendDiskSpaceProgr `PVR.BackendDiskSpaceProgr`\endlink
7302 ///     <p>
7303 ///   }
7304 ///   \table_row3{   <b>`PVR.BackendChannels`</b>,
7305 ///                  \anchor PVR_BackendChannels
7306 ///                  _string (integer)_,
7307 ///     @return The number of available channels the backend provides.
7308 ///     <p>
7309 ///   }
7310 ///   \table_row3{   <b>`PVR.BackendTimers`</b>,
7311 ///                  \anchor PVR_BackendTimers
7312 ///                  _string (integer)_,
7313 ///     @return The number of timers set for the backend.
7314 ///     <p>
7315 ///   }
7316 ///   \table_row3{   <b>`PVR.BackendRecordings`</b>,
7317 ///                  \anchor PVR_BackendRecordings
7318 ///                  _string (integer)_,
7319 ///     @return The number of recordings available on the backend.
7320 ///     <p>
7321 ///   }
7322 ///   \table_row3{   <b>`PVR.BackendDeletedRecordings`</b>,
7323 ///                  \anchor PVR_BackendDeletedRecordings
7324 ///                  _string (integer)_,
7325 ///     @return The number of deleted recordings present on the backend.
7326 ///     <p>
7327 ///   }
7328 ///   \table_row3{   <b>`PVR.BackendNumber`</b>,
7329 ///                  \anchor PVR_BackendNumber
7330 ///                  _string_,
7331 ///     @return The backend number.
7332 ///     <p>
7333 ///   }
7334 ///   \table_row3{   <b>`PVR.TotalDiscSpace`</b>,
7335 ///                  \anchor PVR_TotalDiscSpace
7336 ///                  _string_,
7337 ///     @return The total diskspace available for recordings.
7338 ///     <p>
7339 ///   }
7340 ///   \table_row3{   <b>`PVR.NextTimer`</b>,
7341 ///                  \anchor PVR_NextTimer
7342 ///                  _boolean_,
7343 ///     @return The next timer date.
7344 ///     <p>
7345 ///   }
7346 ///   \table_row3{   <b>`PVR.IsPlayingTV`</b>,
7347 ///                  \anchor PVR_IsPlayingTV
7348 ///                  _boolean_,
7349 ///     @return **True** when live tv is being watched.
7350 ///     <p>
7351 ///   }
7352 ///   \table_row3{   <b>`PVR.IsPlayingRadio`</b>,
7353 ///                  \anchor PVR_IsPlayingRadio
7354 ///                  _boolean_,
7355 ///     @return **True** when live radio is being listened to.
7356 ///     <p>
7357 ///   }
7358 ///   \table_row3{   <b>`PVR.IsPlayingRecording`</b>,
7359 ///                  \anchor PVR_IsPlayingRecording
7360 ///                  _boolean_,
7361 ///     @return **True** when a recording is being watched.
7362 ///     <p>
7363 ///   }
7364 ///   \table_row3{   <b>`PVR.IsPlayingEpgTag`</b>,
7365 ///                  \anchor PVR_IsPlayingEpgTag
7366 ///                  _boolean_,
7367 ///     @return **True** when an epg tag is being watched.
7368 ///     <p>
7369 ///   }
7370 ///   \table_row3{   <b>`PVR.EpgEventProgress`</b>,
7371 ///                  \anchor PVR_EpgEventProgress
7372 ///                  _integer_,
7373 ///     @return The percentage complete of the currently playing epg event.
7374 ///     <p><hr>
7375 ///     @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventProgress `PVR.EpgEventProgress`\endlink replaces
7376 ///     the old `PVR.Progress` infolabel.
7377 ///     <p>
7378 ///   }
7379 ///   \table_row3{   <b>`PVR.ActStreamClient`</b>,
7380 ///                  \anchor PVR_ActStreamClient
7381 ///                  _string_,
7382 ///     @return The stream client name.
7383 ///     <p>
7384 ///   }
7385 ///   \table_row3{   <b>`PVR.ActStreamDevice`</b>,
7386 ///                  \anchor PVR_ActStreamDevice
7387 ///                  _string_,
7388 ///     @return The stream device name.
7389 ///     <p>
7390 ///   }
7391 ///   \table_row3{   <b>`PVR.ActStreamStatus`</b>,
7392 ///                  \anchor PVR_ActStreamStatus
7393 ///                  _string_,
7394 ///     @return The status of the stream.
7395 ///     <p>
7396 ///   }
7397 ///   \table_row3{   <b>`PVR.ActStreamSignal`</b>,
7398 ///                  \anchor PVR_ActStreamSignal
7399 ///                  _string_,
7400 ///     @return The signal quality of the stream.
7401 ///     <p>
7402 ///   }
7403 ///   \table_row3{   <b>`PVR.ActStreamSnr`</b>,
7404 ///                  \anchor PVR_ActStreamSnr
7405 ///                  _string_,
7406 ///     @return The signal to noise ratio of the stream.
7407 ///     <p>
7408 ///   }
7409 ///   \table_row3{   <b>`PVR.ActStreamBer`</b>,
7410 ///                  \anchor PVR_ActStreamBer
7411 ///                  _string_,
7412 ///     @return The bit error rate of the stream.
7413 ///     <p>
7414 ///   }
7415 ///   \table_row3{   <b>`PVR.ActStreamUnc`</b>,
7416 ///                  \anchor PVR_ActStreamUnc
7417 ///                  _string_,
7418 ///     @return The UNC value of the stream.
7419 ///     <p>
7420 ///   }
7421 ///   \table_row3{   <b>`PVR.ActStreamProgrSignal`</b>,
7422 ///                  \anchor PVR_ActStreamProgrSignal
7423 ///                  _integer_,
7424 ///     @return The signal quality of the programme.
7425 ///     <p>
7426 ///   }
7427 ///   \table_row3{   <b>`PVR.ActStreamProgrSnr`</b>,
7428 ///                  \anchor PVR_ActStreamProgrSnr
7429 ///                  _integer_,
7430 ///     @return The signal to noise ratio of the programme.
7431 ///     <p>
7432 ///   }
7433 ///   \table_row3{   <b>`PVR.ActStreamIsEncrypted`</b>,
7434 ///                  \anchor PVR_ActStreamIsEncrypted
7435 ///                  _boolean_,
7436 ///     @return **True** when channel is encrypted on source.
7437 ///     <p>
7438 ///   }
7439 ///   \table_row3{   <b>`PVR.ActStreamEncryptionName`</b>,
7440 ///                  \anchor PVR_ActStreamEncryptionName
7441 ///                  _string_,
7442 ///     @return The encryption used on the stream.
7443 ///     <p>
7444 ///   }
7445 ///   \table_row3{   <b>`PVR.ActStreamServiceName`</b>,
7446 ///                  \anchor PVR_ActStreamServiceName
7447 ///                  _string_,
7448 ///     @return The service name of played channel if available.
7449 ///     <p>
7450 ///   }
7451 ///   \table_row3{   <b>`PVR.ActStreamMux`</b>,
7452 ///                  \anchor PVR_ActStreamMux
7453 ///                  _string_,
7454 ///     @return The multiplex type of played channel if available.
7455 ///     <p>
7456 ///   }
7457 ///   \table_row3{   <b>`PVR.ActStreamProviderName`</b>,
7458 ///                  \anchor PVR_ActStreamProviderName
7459 ///                  _string_,
7460 ///     @return The provider name of the played channel if available.
7461 ///     <p>
7462 ///   }
7463 ///   \table_row3{   <b>`PVR.IsTimeShift`</b>,
7464 ///                  \anchor PVR_IsTimeShift
7465 ///                  _boolean_,
7466 ///     @return **True** when for channel is timeshift available.
7467 ///     <p>
7468 ///   }
7469 ///   \table_row3{   <b>`PVR.TimeShiftProgress`</b>,
7470 ///                  \anchor PVR_TimeShiftProgress
7471 ///                  _integer_,
7472 ///     @return The position of currently timeshifted title on TV as integer.
7473 ///     <p>
7474 ///   }
7475 ///   \table_row3{   <b>`PVR.TimeShiftSeekbar`</b>,
7476 ///                  \anchor PVR_TimeShiftSeekbar
7477 ///                  _integer_,
7478 ///     @return The percentage we are seeking to in a timeshifted title.
7479 ///     <p><hr>
7480 ///     @skinning_v19 **[New Infolabel]** \link PVR_TimeShiftSeekbar `PVR.TimeShiftSeekbar`\endlink
7481 ///     <p>
7482 ///   }
7483 ///   \table_row3{   <b>`PVR.NowRecordingTitle`</b>,
7484 ///                  \anchor PVR_NowRecordingTitle
7485 ///                  _string_,
7486 ///     @return The title of the programme being recorded.
7487 ///     <p>
7488 ///   }
7489 ///   \table_row3{   <b>`PVR.NowRecordingDateTime`</b>,
7490 ///                  \anchor PVR_NowRecordingDateTime
7491 ///                  _Date/Time string_,
7492 ///     @return The start date and time of the current recording.
7493 ///     <p>
7494 ///   }
7495 ///   \table_row3{   <b>`PVR.NowRecordingChannel`</b>,
7496 ///                  \anchor PVR_NowRecordingChannel
7497 ///                  _string_,
7498 ///     @return The channel name of the current recording.
7499 ///     <p>
7500 ///   }
7501 ///   \table_row3{   <b>`PVR.NowRecordingChannelIcon`</b>,
7502 ///                  \anchor PVR_NowRecordingChannelIcon
7503 ///                  _string_,
7504 ///     @return The icon of the current recording channel.
7505 ///     <p>
7506 ///   }
7507 ///   \table_row3{   <b>`PVR.NextRecordingTitle`</b>,
7508 ///                  \anchor PVR_NextRecordingTitle
7509 ///                  _string_,
7510 ///     @return The title of the next programme that will be recorded.
7511 ///     <p>
7512 ///   }
7513 ///   \table_row3{   <b>`PVR.NextRecordingDateTime`</b>,
7514 ///                  \anchor PVR_NextRecordingDateTime
7515 ///                  _Date/Time string_,
7516 ///     @return The start date and time of the next recording.
7517 ///     <p>
7518 ///   }
7519 ///   \table_row3{   <b>`PVR.NextRecordingChannel`</b>,
7520 ///                  \anchor PVR_NextRecordingChannel
7521 ///                  _string_,
7522 ///     @return The channel name of the next recording.
7523 ///     <p>
7524 ///   }
7525 ///   \table_row3{   <b>`PVR.NextRecordingChannelIcon`</b>,
7526 ///                  \anchor PVR_NextRecordingChannelIcon
7527 ///                  _string_,
7528 ///     @return The icon of the next recording channel.
7529 ///     <p>
7530 ///   }
7531 ///   \table_row3{   <b>`PVR.TVNowRecordingTitle`</b>,
7532 ///                  \anchor PVR_TVNowRecordingTitle
7533 ///                  _string_,
7534 ///     @return The title of the tv programme being recorded.
7535 ///     <p><hr>
7536 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingTitle `PVR.TVNowRecordingTitle`\endlink
7537 ///     <p>
7538 ///   }
7539 ///   \table_row3{   <b>`PVR.TVNowRecordingDateTime`</b>,
7540 ///                  \anchor PVR_TVNowRecordingDateTime
7541 ///                  _Date/Time string_,
7542 ///     @return The start date and time of the current tv recording.
7543 ///     <p><hr>
7544 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingDateTime `PVR.TVNowRecordingDateTime`\endlink
7545 ///     <p>
7546 ///   }
7547 ///   \table_row3{   <b>`PVR.TVNowRecordingChannel`</b>,
7548 ///                  \anchor PVR_TVNowRecordingChannel
7549 ///                  _string_,
7550 ///     @return The channel name of the current tv recording.
7551 ///     <p><hr>
7552 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingChannel `PVR.TVNowRecordingChannel`\endlink
7553 ///     <p>
7554 ///   }
7555 ///   \table_row3{   <b>`PVR.TVNowRecordingChannelIcon`</b>,
7556 ///                  \anchor PVR_TVNowRecordingChannelIcon
7557 ///                  _string_,
7558 ///     @return The icon of the current recording TV channel.
7559 ///     <p><hr>
7560 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNowRecordingChannelIcon `PVR.TVNowRecordingChannelIcon`\endlink
7561 ///     <p>
7562 ///   }
7563 ///   \table_row3{   <b>`PVR.TVNextRecordingTitle`</b>,
7564 ///                  \anchor PVR_TVNextRecordingTitle
7565 ///                  _string_,
7566 ///     @return The title of the next tv programme that will be recorded.
7567 ///     <p><hr>
7568 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingTitle `PVR.TVNextRecordingTitle`\endlink
7569 ///     <p>
7570 ///   }
7571 ///   \table_row3{   <b>`PVR.TVNextRecordingDateTime`</b>,
7572 ///                  \anchor PVR_TVNextRecordingDateTime
7573 ///                  _Date/Time string_,
7574 ///     @return The start date and time of the next tv recording.
7575 ///     <p><hr>
7576 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingDateTime `PVR.TVNextRecordingDateTime`\endlink
7577 ///     <p>
7578 ///   }
7579 ///   \table_row3{   <b>`PVR.TVNextRecordingChannel`</b>,
7580 ///                  \anchor PVR_TVNextRecordingChannel
7581 ///                  _string_,
7582 ///     @return The channel name of the next tv recording.
7583 ///     <p><hr>
7584 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingChannel `PVR.TVNextRecordingChannel`\endlink
7585 ///     <p>
7586 ///   }
7587 ///   \table_row3{   <b>`PVR.TVNextRecordingChannelIcon`</b>,
7588 ///                  \anchor PVR_TVNextRecordingChannelIcon
7589 ///                  _string_,
7590 ///     @return The icon of the next recording tv channel.
7591 ///     <p><hr>
7592 ///     @skinning_v17 **[New Infolabel]** \link PVR_TVNextRecordingChannelIcon `PVR.TVNextRecordingChannelIcon`\endlink
7593 ///     <p>
7594 ///   }
7595 ///   \table_row3{   <b>`PVR.RadioNowRecordingTitle`</b>,
7596 ///                  \anchor PVR_RadioNowRecordingTitle
7597 ///                  _string_,
7598 ///     @return The title of the radio programme being recorded.
7599 ///     <p><hr>
7600 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingTitle `PVR.RadioNowRecordingTitle`\endlink
7601 ///     <p>
7602 ///   }
7603 ///   \table_row3{   <b>`PVR.RadioNowRecordingDateTime`</b>,
7604 ///                  \anchor PVR_RadioNowRecordingDateTime
7605 ///                  _Date/Time string_,
7606 ///     @return The start date and time of the current radio recording.
7607 ///     <p><hr>
7608 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingDateTime `PVR.RadioNowRecordingDateTime`\endlink
7609 ///     <p>
7610 ///   }
7611 ///   \table_row3{   <b>`PVR.RadioNowRecordingChannel`</b>,
7612 ///                  \anchor PVR_RadioNowRecordingChannel
7613 ///                  _string_,
7614 ///     @return The channel name of the current radio recording.
7615 ///     <p><hr>
7616 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingChannel `PVR.RadioNowRecordingChannel`\endlink
7617 ///     <p>
7618 ///   }
7619 ///   \table_row3{   <b>`PVR.RadioNowRecordingChannelIcon`</b>,
7620 ///                  \anchor PVR_RadioNowRecordingChannelIcon
7621 ///                  _string_,
7622 ///     @return The icon of the current recording radio channel.
7623 ///     <p><hr>
7624 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNowRecordingChannelIcon `PVR.RadioNowRecordingChannelIcon`\endlink
7625 ///     <p>
7626 ///   }
7627 ///   \table_row3{   <b>`PVR.RadioNextRecordingTitle`</b>,
7628 ///                  \anchor PVR_RadioNextRecordingTitle
7629 ///                  _string_,
7630 ///     @return The title of the next radio programme that will be recorded.
7631 ///     <p><hr>
7632 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingTitle `PVR.RadioNextRecordingTitle`\endlink
7633 ///     <p>
7634 ///   }
7635 ///   \table_row3{   <b>`PVR.RadioNextRecordingDateTime`</b>,
7636 ///                  \anchor PVR_RadioNextRecordingDateTime
7637 ///                  _Date/Time string_,
7638 ///     @return The start date and time of the next radio recording.
7639 ///     <p><hr>
7640 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingDateTime `PVR.RadioNextRecordingDateTime`\endlink
7641 ///     <p>
7642 ///   }
7643 ///   \table_row3{   <b>`PVR.RadioNextRecordingChannel`</b>,
7644 ///                  \anchor PVR_RadioNextRecordingChannel
7645 ///                  _string_,
7646 ///     @return The channel name of the next radio recording.
7647 ///     <p><hr>
7648 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingChannel `PVR.RadioNextRecordingChannel`\endlink
7649 ///     <p>
7650 ///   }
7651 ///   \table_row3{   <b>`PVR.RadioNextRecordingChannelIcon`</b>,
7652 ///                  \anchor PVR_RadioNextRecordingChannelIcon
7653 ///                  _string_,
7654 ///     @return The icon of the next recording radio channel.
7655 ///     <p><hr>
7656 ///     @skinning_v17 **[New Infolabel]** \link PVR_RadioNextRecordingChannelIcon `PVR.RadioNextRecordingChannelIcon`\endlink
7657 ///     <p>
7658 ///   }
7659 ///   \table_row3{   <b>`PVR.IsRecordingTV`</b>,
7660 ///                  \anchor PVR_IsRecordingTV
7661 ///                  _boolean_,
7662 ///     @return **True** when the system is recording a tv programme.
7663 ///     <p><hr>
7664 ///     @skinning_v17 **[New Boolean Condition]** \link PVR_IsRecordingTV `PVR.IsRecordingTV`\endlink
7665 ///     <p>
7666 ///   }
7667 ///   \table_row3{   <b>`PVR.HasTVTimer`</b>,
7668 ///                  \anchor PVR_HasTVTimer
7669 ///                  _boolean_,
7670 ///     @return **True** if at least one tv timer is active.
7671 ///     <p><hr>
7672 ///     @skinning_v17 **[New Boolean Condition]** \link PVR_HasTVTimer `PVR.HasTVTimer`\endlink
7673 ///     <p>
7674 ///   }
7675 ///   \table_row3{   <b>`PVR.HasNonRecordingTVTimer`</b>,
7676 ///                  \anchor PVR_HasNonRecordingTVTimer
7677 ///                  _boolean_,
7678 ///     @return **True** if there are tv timers present who currently not do recording.
7679 ///     <p><hr>
7680 ///     @skinning_v17 **[New Boolean Condition]** \link PVR_HasNonRecordingTVTimer `PVR.HasNonRecordingTVTimer`\endlink
7681 ///     <p>
7682 ///   }
7683 ///   \table_row3{   <b>`PVR.IsRecordingRadio`</b>,
7684 ///                  \anchor PVR_IsRecordingRadio
7685 ///                  _boolean_,
7686 ///     @return **True** when the system is recording a radio programme.
7687 ///     <p><hr>
7688 ///     @skinning_v17 **[New Boolean Condition]** \link PVR_IsRecordingRadio `PVR.IsRecordingRadio`\endlink
7689 ///     <p>
7690 ///   }
7691 ///   \table_row3{   <b>`PVR.HasRadioTimer`</b>,
7692 ///                  \anchor PVR_HasRadioTimer
7693 ///                  _boolean_,
7694 ///     @return **True** if at least one radio timer is active.
7695 ///     <p><hr>
7696 ///     @skinning_v17 **[New Boolean Condition]** \link PVR_HasRadioTimer `PVR.HasRadioTimer`\endlink
7697 ///     <p>
7698 ///   }
7699 ///   \table_row3{   <b>`PVR.HasNonRecordingRadioTimer`</b>,
7700 ///                  \anchor PVR_HasNonRecordingRadioTimer
7701 ///                  _boolean_,
7702 ///     @return **True** if there are radio timers present who currently not do recording.
7703 ///     <p><hr>
7704 ///     @skinning_v17 **[New Boolean Condition]** \link PVR_HasNonRecordingRadioTimer `PVR.HasRadioTimer`\endlink
7705 ///     <p>
7706 ///   }
7707 ///   \table_row3{   <b>`PVR.ChannelNumberInput`</b>,
7708 ///                  \anchor PVR_ChannelNumberInput
7709 ///                  _string_,
7710 ///     @return The currently entered channel number while in numeric channel input mode\, an empty string otherwise.
7711 ///     <p><hr>
7712 ///     @skinning_v18 **[New Infolabel]** \link PVR_ChannelNumberInput `PVR.ChannelNumberInput`\endlink
7713 ///     <p>
7714 ///   }
7715 ///   \table_row3{   <b>`PVR.CanRecordPlayingChannel`</b>,
7716 ///                  \anchor PVR_CanRecordPlayingChannel
7717 ///                  _boolean_,
7718 ///     @return **True** if PVR is currently playing a channel and if this channel can be recorded.
7719 ///     <p><hr>
7720 ///     @skinning_v18 **[Infolabel Updated]** \link PVR_CanRecordPlayingChannel `PVR.CanRecordPlayingChannel`\endlink replaces
7721 ///     the old `Player.CanRecord` infolabel.
7722 ///     <p>
7723 ///   }
7724 ///   \table_row3{   <b>`PVR.IsRecordingPlayingChannel`</b>,
7725 ///                  \anchor PVR_IsRecordingPlayingChannel
7726 ///                  _boolean_,
7727 ///     @return **True** if PVR is currently playing a channel and if this channel is currently recorded.
7728 ///     <p><hr>
7729 ///     @skinning_v18 **[Infolabel Updated]** \link PVR_IsRecordingPlayingChannel `PVR.IsRecordingPlayingChannel`\endlink replaces
7730 ///     the old `Player.Recording` infolabel.
7731 ///     <p>
7732 ///   }
7733 ///   \table_row3{   <b>`PVR.IsPlayingActiveRecording`</b>,
7734 ///                  \anchor PVR_IsPlayingActiveRecording
7735 ///                  _boolean_,
7736 ///     @return **True** if PVR is currently playing an in progress recording.
7737 ///     <p><hr>
7738 ///     @skinning_v19 **[New Infolabel]** \link PVR_IsPlayingActiveRecording `PVR.IsPlayingActiveRecording`\endlink
7739 ///     <p>
7740 ///   }
7741 ///   \table_row3{   <b>`PVR.TimeshiftProgressPlayPos`</b>,
7742 ///                  \anchor PVR_TimeshiftProgressPlayPos
7743 ///                  _integer_,
7744 ///     @return The percentage of the current play position within the PVR timeshift progress.
7745 ///     <p><hr>
7746 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressPlayPos `PVR.TimeshiftProgressPlayPos`\endlink
7747 ///     <p>
7748 ///   }
7749 ///   \table_row3{   <b>`PVR.TimeshiftProgressEpgStart`</b>,
7750 ///                  \anchor PVR_TimeshiftProgressEpgStart
7751 ///                  _integer_,
7752 ///     @return The percentage of the start of the currently playing epg event within the PVR timeshift progress.
7753 ///     <p><hr>
7754 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEpgStart `PVR.TimeshiftProgressEpgStart`\endlink
7755 ///     <p>
7756 ///   }
7757 ///   \table_row3{   <b>`PVR.TimeshiftProgressEpgEnd`</b>,
7758 ///                  \anchor PVR_TimeshiftProgressEpgEnd
7759 ///                  _integer_,
7760 ///     @return The percentage of the end of the currently playing epg event within the PVR timeshift progress.
7761 ///     <p><hr>
7762 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEpgEnd `PVR.TimeshiftProgressEpgEnd`\endlink
7763 ///     <p>
7764 ///   }
7765 ///   \table_row3{   <b>`PVR.TimeshiftProgressBufferStart`</b>,
7766 ///                  \anchor PVR_TimeshiftProgressBufferStart
7767 ///                  _integer_,
7768 ///     @return The percentage of the start of the timeshift buffer within the PVR timeshift progress.
7769 ///     <p><hr>
7770 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressBufferStart `PVR.TimeshiftProgressBufferStart`\endlink
7771 ///     <p>
7772 ///   }
7773 ///   \table_row3{   <b>`PVR.TimeshiftProgressBufferEnd`</b>,
7774 ///                  \anchor PVR_TimeshiftProgressBufferEnd
7775 ///                  _integer_,
7776 ///     @return The percentage of the end of the timeshift buffer within the PVR timeshift progress.
7777 ///     <p><hr>
7778 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressBufferEnd `PVR.TimeshiftProgressBufferEnd`\endlink
7779 ///     <p>
7780 ///   }
7781 ///   \table_row3{   <b>`PVR.EpgEventIcon`</b>,
7782 ///                  \anchor PVR_EpgEventIcon
7783 ///                  _string_,
7784 ///     @return The icon of the currently playing epg event\, if any.
7785 ///     <p><hr>
7786 ///     @skinning_v18 **[New Infolabel]** \link PVR_EpgEventIcon `PVR_EpgEventIcon`\endlink
7787 ///     <p>
7788 ///   }
7789 ///
7790 const infomap pvr[] =            {{ "isrecording",              PVR_IS_RECORDING },
7791                                   { "hastimer",                 PVR_HAS_TIMER },
7792                                   { "hastvchannels",            PVR_HAS_TV_CHANNELS },
7793                                   { "hasradiochannels",         PVR_HAS_RADIO_CHANNELS },
7794                                   { "hasnonrecordingtimer",     PVR_HAS_NONRECORDING_TIMER },
7795                                   { "backendname",              PVR_BACKEND_NAME },
7796                                   { "backendversion",           PVR_BACKEND_VERSION },
7797                                   { "backendhost",              PVR_BACKEND_HOST },
7798                                   { "backenddiskspace",         PVR_BACKEND_DISKSPACE },
7799                                   { "backenddiskspaceprogr",    PVR_BACKEND_DISKSPACE_PROGR },
7800                                   { "backendchannels",          PVR_BACKEND_CHANNELS },
7801                                   { "backendtimers",            PVR_BACKEND_TIMERS },
7802                                   { "backendrecordings",        PVR_BACKEND_RECORDINGS },
7803                                   { "backenddeletedrecordings", PVR_BACKEND_DELETED_RECORDINGS },
7804                                   { "backendnumber",            PVR_BACKEND_NUMBER },
7805                                   { "totaldiscspace",           PVR_TOTAL_DISKSPACE },
7806                                   { "nexttimer",                PVR_NEXT_TIMER },
7807                                   { "isplayingtv",              PVR_IS_PLAYING_TV },
7808                                   { "isplayingradio",           PVR_IS_PLAYING_RADIO },
7809                                   { "isplayingrecording",       PVR_IS_PLAYING_RECORDING },
7810                                   { "isplayingepgtag",          PVR_IS_PLAYING_EPGTAG },
7811                                   { "epgeventprogress",         PVR_EPG_EVENT_PROGRESS },
7812                                   { "actstreamclient",          PVR_ACTUAL_STREAM_CLIENT },
7813                                   { "actstreamdevice",          PVR_ACTUAL_STREAM_DEVICE },
7814                                   { "actstreamstatus",          PVR_ACTUAL_STREAM_STATUS },
7815                                   { "actstreamsignal",          PVR_ACTUAL_STREAM_SIG },
7816                                   { "actstreamsnr",             PVR_ACTUAL_STREAM_SNR },
7817                                   { "actstreamber",             PVR_ACTUAL_STREAM_BER },
7818                                   { "actstreamunc",             PVR_ACTUAL_STREAM_UNC },
7819                                   { "actstreamprogrsignal",     PVR_ACTUAL_STREAM_SIG_PROGR },
7820                                   { "actstreamprogrsnr",        PVR_ACTUAL_STREAM_SNR_PROGR },
7821                                   { "actstreamisencrypted",     PVR_ACTUAL_STREAM_ENCRYPTED },
7822                                   { "actstreamencryptionname",  PVR_ACTUAL_STREAM_CRYPTION },
7823                                   { "actstreamservicename",     PVR_ACTUAL_STREAM_SERVICE },
7824                                   { "actstreammux",             PVR_ACTUAL_STREAM_MUX },
7825                                   { "actstreamprovidername",    PVR_ACTUAL_STREAM_PROVIDER },
7826                                   { "istimeshift",              PVR_IS_TIMESHIFTING },
7827                                   { "timeshiftprogress",        PVR_TIMESHIFT_PROGRESS },
7828                                   { "timeshiftseekbar",         PVR_TIMESHIFT_SEEKBAR },
7829                                   { "nowrecordingtitle",        PVR_NOW_RECORDING_TITLE },
7830                                   { "nowrecordingdatetime",     PVR_NOW_RECORDING_DATETIME },
7831                                   { "nowrecordingchannel",      PVR_NOW_RECORDING_CHANNEL },
7832                                   { "nowrecordingchannelicon",  PVR_NOW_RECORDING_CHAN_ICO },
7833                                   { "nextrecordingtitle",       PVR_NEXT_RECORDING_TITLE },
7834                                   { "nextrecordingdatetime",    PVR_NEXT_RECORDING_DATETIME },
7835                                   { "nextrecordingchannel",     PVR_NEXT_RECORDING_CHANNEL },
7836                                   { "nextrecordingchannelicon", PVR_NEXT_RECORDING_CHAN_ICO },
7837                                   { "tvnowrecordingtitle",            PVR_TV_NOW_RECORDING_TITLE },
7838                                   { "tvnowrecordingdatetime",         PVR_TV_NOW_RECORDING_DATETIME },
7839                                   { "tvnowrecordingchannel",          PVR_TV_NOW_RECORDING_CHANNEL },
7840                                   { "tvnowrecordingchannelicon",      PVR_TV_NOW_RECORDING_CHAN_ICO },
7841                                   { "tvnextrecordingtitle",           PVR_TV_NEXT_RECORDING_TITLE },
7842                                   { "tvnextrecordingdatetime",        PVR_TV_NEXT_RECORDING_DATETIME },
7843                                   { "tvnextrecordingchannel",         PVR_TV_NEXT_RECORDING_CHANNEL },
7844                                   { "tvnextrecordingchannelicon",     PVR_TV_NEXT_RECORDING_CHAN_ICO },
7845                                   { "radionowrecordingtitle",         PVR_RADIO_NOW_RECORDING_TITLE },
7846                                   { "radionowrecordingdatetime",      PVR_RADIO_NOW_RECORDING_DATETIME },
7847                                   { "radionowrecordingchannel",       PVR_RADIO_NOW_RECORDING_CHANNEL },
7848                                   { "radionowrecordingchannelicon",   PVR_RADIO_NOW_RECORDING_CHAN_ICO },
7849                                   { "radionextrecordingtitle",        PVR_RADIO_NEXT_RECORDING_TITLE },
7850                                   { "radionextrecordingdatetime",     PVR_RADIO_NEXT_RECORDING_DATETIME },
7851                                   { "radionextrecordingchannel",      PVR_RADIO_NEXT_RECORDING_CHANNEL },
7852                                   { "radionextrecordingchannelicon",  PVR_RADIO_NEXT_RECORDING_CHAN_ICO },
7853                                   { "isrecordingtv",              PVR_IS_RECORDING_TV },
7854                                   { "hastvtimer",                 PVR_HAS_TV_TIMER },
7855                                   { "hasnonrecordingtvtimer",     PVR_HAS_NONRECORDING_TV_TIMER },
7856                                   { "isrecordingradio",           PVR_IS_RECORDING_RADIO },
7857                                   { "hasradiotimer",              PVR_HAS_RADIO_TIMER },
7858                                   { "hasnonrecordingradiotimer",  PVR_HAS_NONRECORDING_RADIO_TIMER },
7859                                   { "channelnumberinput",         PVR_CHANNEL_NUMBER_INPUT },
7860                                   { "canrecordplayingchannel",    PVR_CAN_RECORD_PLAYING_CHANNEL },
7861                                   { "isrecordingplayingchannel",  PVR_IS_RECORDING_PLAYING_CHANNEL },
7862                                   { "isplayingactiverecording",   PVR_IS_PLAYING_ACTIVE_RECORDING },
7863                                   { "timeshiftprogressplaypos",   PVR_TIMESHIFT_PROGRESS_PLAY_POS },
7864                                   { "timeshiftprogressepgstart",  PVR_TIMESHIFT_PROGRESS_EPG_START },
7865                                   { "timeshiftprogressepgend",    PVR_TIMESHIFT_PROGRESS_EPG_END },
7866                                   { "timeshiftprogressbufferstart", PVR_TIMESHIFT_PROGRESS_BUFFER_START },
7867                                   { "timeshiftprogressbufferend", PVR_TIMESHIFT_PROGRESS_BUFFER_END },
7868                                   { "epgeventicon",               PVR_EPG_EVENT_ICON }};
7869 
7870 /// \page modules__infolabels_boolean_conditions
7871 ///   \table_row3{   <b>`PVR.EpgEventDuration`</b>,
7872 ///                  \anchor PVR_EpgEventDuration
7873 ///                  _string_,
7874 ///     @return The duration of the currently playing epg event in the
7875 ///     format <b>hh:mm:ss</b>.
7876 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7877 ///     <p><hr>
7878 ///     @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventDuration `PVR.EpgEventDuration`\endlink replaces
7879 ///     the old `PVR.Duration` infolabel.
7880 ///     <p>
7881 ///   }
7882 ///   \table_row3{   <b>`PVR.EpgEventDuration(format)`</b>,
7883 ///                  \anchor PVR_EpgEventDuration_format
7884 ///                  _string_,
7885 ///     @return The duration of the currently playing EPG event in different formats.
7886 ///     @param format [opt] The format of the return time value.
7887 ///     See \ref TIME_FORMAT for the list of possible values.
7888 ///     <p>
7889 ///   }
7890 ///   \table_row3{   <b>`PVR.EpgEventElapsedTime`</b>,
7891 ///                  \anchor PVR_EpgEventElapsedTime
7892 ///                  _string_,
7893 ///     @return the time of the current position of the currently playing epg event in the
7894 ///     format <b>hh:mm:ss</b>.
7895 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7896 ///     <p><hr>
7897 ///     @skinning_v18 **[Infolabel Updated]** \link PVR_EpgEventElapsedTime `PVR.EpgEventElapsedTime`\endlink replaces
7898 ///     the old `PVR.Time` infolabel.
7899 ///     <p>
7900 ///   }
7901 ///   \table_row3{   <b>`PVR.EpgEventElapsedTime(format)`</b>,
7902 ///                  \anchor PVR_EpgEventElapsedTime_format
7903 ///                  _string_,
7904 ///     @return The time of the current position of the currently playing epg event in different formats.
7905 ///     @param format [opt] The format of the return time value.
7906 ///     See \ref TIME_FORMAT for the list of possible values.
7907 ///     <p>
7908 ///   }
7909 ///   \table_row3{   <b>`PVR.EpgEventRemainingTime`</b>,
7910 ///                  \anchor PVR_EpgEventRemainingTime
7911 ///                  _string_,
7912 ///     @return The remaining time for currently playing epg event in the
7913 ///     format <b>hh:mm:ss</b>.
7914 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7915 ///     <p><hr>
7916 ///     @skinning_v18 **[New Infolabel]** \link PVR_EpgEventRemainingTime `PVR.EpgEventRemainingTime`\endlink
7917 ///     <p>
7918 ///   }
7919 ///   \table_row3{   <b>`PVR.EpgEventRemainingTime(format)`</b>,
7920 ///                  \anchor PVR_EpgEventRemainingTime_format
7921 ///                  _string_,
7922 ///     @return The remaining time for currently playing epg event in different formats.
7923 ///     @param format [opt] The format of the return time value.
7924 ///     See \ref TIME_FORMAT for the list of possible values.
7925 ///     <p>
7926 ///   }
7927 ///   \table_row3{   <b>`PVR.EpgEventSeekTime`</b>,
7928 ///                  \anchor PVR_EpgEventSeekTime
7929 ///                  _string_,
7930 ///     @return The time the user is seeking within the currently playing epg event in the
7931 ///     format <b>hh:mm:ss</b>.
7932 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7933 ///     <p><hr>
7934 ///     @skinning_v18 **[New Infolabel]** \link PVR_EpgEventSeekTime `PVR.EpgEventSeekTime`\endlink
7935 ///     <p>
7936 ///   }
7937 ///   \table_row3{   <b>`PVR.EpgEventSeekTime(format)`</b>,
7938 ///                  \anchor PVR_EpgEventSeekTime_format
7939 ///                  _string_,
7940 ///     @return The time the user is seeking within the currently playing epg event in different formats.
7941 ///     @param format [opt] The format of the return time value.
7942 ///     See \ref TIME_FORMAT for the list of possible values.
7943 ///     <p>
7944 ///   }
7945 ///   \table_row3{   <b>`PVR.EpgEventFinishTime`</b>,
7946 ///                  \anchor PVR_EpgEventFinishTime
7947 ///                  _string_,
7948 ///     @return The time the currently playing epg event will end in the
7949 ///     format <b>hh:mm:ss</b>.
7950 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7951 ///     <p><hr>
7952 ///     @skinning_v18 **[New Infolabel]** \link PVR_EpgEventFinishTime `PVR.EpgEventFinishTime`\endlink
7953 ///     <p>
7954 ///   }
7955 ///   \table_row3{   <b>`PVR.EpgEventFinishTime(format)`</b>,
7956 ///                  \anchor PVR_EpgEventFinishTime_format
7957 ///                  _string_,
7958 ///     Returns the time the currently playing epg event will end in different formats.
7959 ///     @param format [opt] The format of the return time value.
7960 ///     See \ref TIME_FORMAT for the list of possible values.
7961 ///     <p>
7962 ///   }
7963 ///   \table_row3{   <b>`PVR.TimeShiftStart`</b>,
7964 ///                  \anchor PVR_TimeShiftStart
7965 ///                  _string_,
7966 ///     @return The start time of the timeshift buffer in the
7967 ///     format <b>hh:mm:ss</b>.
7968 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7969 ///     <p>
7970 ///   }
7971 ///   \table_row3{   <b>`PVR.TimeShiftStart(format)`</b>,
7972 ///                  \anchor PVR_TimeShiftStart_format
7973 ///                  _string_,
7974 ///     Returns the start time of the timeshift buffer in different formats.
7975 ///     @param format [opt] The format of the return time value.
7976 ///     See \ref TIME_FORMAT for the list of possible values.
7977 ///     <p>
7978 ///   }
7979 ///   \table_row3{   <b>`PVR.TimeShiftEnd`</b>,
7980 ///                  \anchor PVR_TimeShiftEnd
7981 ///                  _string_,
7982 ///     @return The end time of the timeshift buffer in the
7983 ///     format <b>hh:mm:ss</b>.
7984 ///     @note <b>hh:</b> will be omitted if hours value is zero.
7985 ///     <p>
7986 ///   }
7987 ///   \table_row3{   <b>`PVR.TimeShiftEnd(format)`</b>,
7988 ///                  \anchor PVR_TimeShiftEnd_format
7989 ///                  _string_,
7990 ///     @return The end time of the timeshift buffer in different formats.
7991 ///     @param format [opt] The format of the return time value.
7992 ///     See \ref TIME_FORMAT for the list of possible values.
7993 ///     <p>
7994 ///   }
7995 ///   \table_row3{   <b>`PVR.TimeShiftCur`</b>,
7996 ///                  \anchor PVR_TimeShiftCur
7997 ///                  _string_,
7998 ///     @return The current playback time within the timeshift buffer in the
7999 ///     format <b>hh:mm:ss</b>.
8000 ///     @note <b>hh:</b> will be omitted if hours value is zero.
8001 ///     <p>
8002 ///   }
8003 ///   \table_row3{   <b>`PVR.TimeShiftCur(format)`</b>,
8004 ///                  \anchor PVR_TimeShiftCur_format
8005 ///                  _string_,
8006 ///     Returns the current playback time within the timeshift buffer in different formats.
8007 ///     @param format [opt] The format of the return time value.
8008 ///     See \ref TIME_FORMAT for the list of possible values.
8009 ///     <p>
8010 ///   }
8011 ///   \table_row3{   <b>`PVR.TimeShiftOffset`</b>,
8012 ///                  \anchor PVR_TimeShiftOffset
8013 ///                  _string_,
8014 ///     @return The delta of timeshifted time to actual time in the
8015 ///     format <b>hh:mm:ss</b>.
8016 ///     @note <b>hh:</b> will be omitted if hours value is zero.
8017 ///     <p>
8018 ///   }
8019 ///   \table_row3{   <b>`PVR.TimeShiftOffset(format)`</b>,
8020 ///                  \anchor PVR_TimeShiftOffset_format
8021 ///                  _string_,
8022 ///     Returns the delta of timeshifted time to actual time in different formats.
8023 ///     @param format [opt] The format of the return time value.
8024 ///     See \ref TIME_FORMAT for the list of possible values.
8025 ///     <p>
8026 ///   }
8027 ///   \table_row3{   <b>`PVR.TimeshiftProgressDuration`</b>,
8028 ///                  \anchor PVR_TimeshiftProgressDuration
8029 ///                  _string_,
8030 ///     @return the duration of the PVR timeshift progress in the
8031 ///     format <b>hh:mm:ss</b>.
8032 ///     @note <b>hh:</b> will be omitted if hours value is zero.
8033 ///     <p><hr>
8034 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressDuration `PVR.TimeshiftProgressDuration`\endlink
8035 ///     <p>
8036 ///   }
8037 ///   \table_row3{   <b>`PVR.TimeshiftProgressDuration(format)`</b>,
8038 ///                  \anchor PVR_TimeshiftProgressDuration_format
8039 ///                  _string_,
8040 ///     @return The duration of the PVR timeshift progress in different formats.
8041 ///     @param format [opt] The format of the return time value.
8042 ///     See \ref TIME_FORMAT for the list of possible values.
8043 ///     <p>
8044 ///   }
8045 ///   \table_row3{   <b>`PVR.TimeshiftProgressStartTime`</b>,
8046 ///                  \anchor PVR_TimeshiftProgressStartTime
8047 ///                  _string_,
8048 ///     @return The start time of the PVR timeshift progress in the
8049 ///     format <b>hh:mm:ss</b>.
8050 ///     @note <b>hh:</b> will be omitted if hours value is zero.
8051 ///     <p><hr>
8052 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressStartTime `PVR.TimeshiftProgressStartTime`\endlink
8053 ///     <p>
8054 ///   }
8055 ///   \table_row3{   <b>`PVR.TimeshiftProgressStartTime(format)`</b>,
8056 ///                  \anchor PVR_TimeshiftProgressStartTime_format
8057 ///                  _string_,
8058 ///     @return The start time of the PVR timeshift progress in different formats.
8059 ///     @param format [opt] The format of the return time value.
8060 ///     See \ref TIME_FORMAT for the list of possible values.
8061 ///     <p>
8062 ///   }
8063 ///   \table_row3{   <b>`PVR.TimeshiftProgressEndTime`</b>,
8064 ///                  \anchor PVR_TimeshiftProgressEndTime
8065 ///                  _string_,
8066 ///     @return The end time of the PVR timeshift progress in the
8067 ///     format <b>hh:mm:ss</b>.
8068 ///     @note hh: will be omitted if hours value is zero.
8069 ///     <p><hr>
8070 ///     @skinning_v18 **[New Infolabel]** \link PVR_TimeshiftProgressEndTime `PVR.TimeshiftProgressEndTime`\endlink
8071 ///     <p>
8072 ///   }
8073 ///   \table_row3{   <b>`PVR.TimeshiftProgressEndTime(format)`</b>,
8074 ///                  \anchor PVR_TimeshiftProgressEndTime_format
8075 ///                  _string_,
8076 ///     @return The end time of the PVR timeshift progress in different formats.
8077 ///     @param format [opt] The format of the return time value.
8078 ///     See \ref TIME_FORMAT for the list of possible values.
8079 ///     <p>
8080 ///   }
8081 /// \table_end
8082 ///
8083 /// -----------------------------------------------------------------------------
8084 const infomap pvr_times[] =      {{ "epgeventduration",       PVR_EPG_EVENT_DURATION },
8085                                   { "epgeventelapsedtime",    PVR_EPG_EVENT_ELAPSED_TIME },
8086                                   { "epgeventremainingtime",  PVR_EPG_EVENT_REMAINING_TIME },
8087                                   { "epgeventfinishtime",     PVR_EPG_EVENT_FINISH_TIME },
8088                                   { "epgeventseektime",       PVR_EPG_EVENT_SEEK_TIME },
8089                                   { "timeshiftstart",         PVR_TIMESHIFT_START_TIME },
8090                                   { "timeshiftend",           PVR_TIMESHIFT_END_TIME },
8091                                   { "timeshiftcur",           PVR_TIMESHIFT_PLAY_TIME },
8092                                   { "timeshiftoffset",        PVR_TIMESHIFT_OFFSET },
8093                                   { "timeshiftprogressduration",  PVR_TIMESHIFT_PROGRESS_DURATION },
8094                                   { "timeshiftprogressstarttime", PVR_TIMESHIFT_PROGRESS_START_TIME },
8095                                   { "timeshiftprogressendtime",   PVR_TIMESHIFT_PROGRESS_END_TIME }};
8096 
8097 /// \page modules__infolabels_boolean_conditions
8098 /// \subsection modules__infolabels_boolean_conditions_RDS RDS
8099 /// @note Only supported if both the PVR backend and the Kodi client support RDS.
8100 ///
8101 /// \table_start
8102 ///   \table_h3{ Labels, Type, Description }
8103 ///   \table_row3{   <b>`RDS.HasRds`</b>,
8104 ///                  \anchor RDS_HasRds
8105 ///                  _boolean_,
8106 ///     @return **True** if RDS is present.
8107 ///     <p><hr>
8108 ///     @skinning_v16 **[New Boolean Condition]** \link RDS_HasRds `RDS.HasRds`\endlink
8109 ///     <p>
8110 ///   }
8111 ///   \table_row3{   <b>`RDS.HasRadioText`</b>,
8112 ///                  \anchor RDS_HasRadioText
8113 ///                  _boolean_,
8114 ///     @return **True** if RDS contains also Radiotext.
8115 ///     <p><hr>
8116 ///     @skinning_v16 **[New Boolean Condition]** \link RDS_HasRadioText `RDS.HasRadioText`\endlink
8117 ///     <p>
8118 ///   }
8119 ///   \table_row3{   <b>`RDS.HasRadioTextPlus`</b>,
8120 ///                  \anchor RDS_HasRadioTextPlus
8121 ///                  _boolean_,
8122 ///     @return **True** if RDS with Radiotext contains also the plus information.
8123 ///     <p><hr>
8124 ///     @skinning_v16 **[New Boolean Condition]** \link RDS_HasRadioTextPlus `RDS.HasRadioTextPlus`\endlink
8125 ///     <p>
8126 ///   }
8127 ///   \table_row3{   <b>`RDS.HasHotline`</b>,
8128 ///                  \anchor RDS_HasHotline
8129 ///                  _boolean_,
8130 ///     @return **True** if a hotline phone number is present.
8131 ///     @note Only available on RadiotextPlus
8132 ///     <p><hr>
8133 ///     @skinning_v16 **[New Boolean Condition]** \link RDS_HasHotline `RDS.HasHotline`\endlink
8134 ///     <p>
8135 ///   }
8136 ///   \table_row3{   <b>`RDS.HasStudio`</b>,
8137 ///                  \anchor RDS_HasStudio
8138 ///                  _boolean_,
8139 ///     @return **True** if a studio name is present.
8140 ///     @note Only available on RadiotextPlus
8141 ///     <p><hr>
8142 ///     @skinning_v16 **[New Boolean Condition]** \link RDS_HasStudio `RDS.HasStudio`\endlink
8143 ///     <p>
8144 ///   }
8145 ///   \table_row3{   <b>`RDS.AudioLanguage`</b>,
8146 ///                  \anchor RDS_AudioLanguage
8147 ///                  _string_,
8148 ///     @return The RDS reported audio language of the channel.
8149 ///     <p><hr>
8150 ///     @skinning_v16 **[New Infolabel]** \link RDS_AudioLanguage `RDS.AudioLanguage`\endlink
8151 ///     <p>
8152 ///   }
8153 ///   \table_row3{   <b>`RDS.ChannelCountry`</b>,
8154 ///                  \anchor RDS_ChannelCountry
8155 ///                  _string_,
8156 ///     @return The country where the radio channel is broadcasted.
8157 ///     <p><hr>
8158 ///     @skinning_v16 **[New Infolabel]** \link RDS_ChannelCountry `RDS.ChannelCountry`\endlink
8159 ///     <p>
8160 ///   }
8161 ///   \table_row3{   <b>`RDS.GetLine(number)`</b>,
8162 ///                  \anchor RDS_GetLine
8163 ///                  _string_,
8164 ///     @return The last sent RDS text messages on given number.
8165 ///     @param number - given number for RDS\, 0 is the
8166 ///     last and 4 rows are supported (0-3)
8167 ///     <p><hr>
8168 ///     @skinning_v16 **[New Infolabel]** \link RDS_GetLine `RDS.GetLine(number)`\endlink
8169 ///     <p>
8170 ///   }
8171 ///   \table_row3{   <b>`RDS.Title`</b>,
8172 ///                  \anchor RDS_Title
8173 ///                  _string_,
8174 ///     @return The title of item; e.g. track title of an album.
8175 ///     @note Only available on RadiotextPlus
8176 ///     <p><hr>
8177 ///     @skinning_v16 **[New Infolabel]** \link RDS_Title `RDS.Title`\endlink
8178 ///     <p>
8179 ///   }
8180 ///   \table_row3{   <b>`RDS.Artist`</b>,
8181 ///                  \anchor RDS_Artist
8182 ///                  _string_,
8183 ///     @return A person or band/collective generally considered responsible for the work.
8184 ///     @note Only available on RadiotextPlus
8185 ///     <p><hr>
8186 ///     @skinning_v16 **[New Infolabel]** \link RDS_Artist `RDS.Artist`\endlink
8187 ///     <p>
8188 ///   }
8189 ///   \table_row3{   <b>`RDS.Band`</b>,
8190 ///                  \anchor RDS_Band
8191 ///                  _string_,
8192 ///     @return The band/orchestra/musician.
8193 ///     @note Only available on RadiotextPlus
8194 ///     <p><hr>
8195 ///     @skinning_v16 **[New Infolabel]** \link RDS_Band `RDS.Band`\endlink
8196 ///     <p>
8197 ///   }
8198 ///   \table_row3{   <b>`RDS.Composer`</b>,
8199 ///                  \anchor RDS_Composer
8200 ///                  _string_,
8201 ///     @return The name of the original composer/author.
8202 ///     @note Only available on RadiotextPlus
8203 ///     <p><hr>
8204 ///     @skinning_v16 **[New Infolabel]** \link RDS_Composer `RDS.Composer`\endlink
8205 ///     <p>
8206 ///   }
8207 ///   \table_row3{   <b>`RDS.Conductor`</b>,
8208 ///                  \anchor RDS_Conductor
8209 ///                  _string_,
8210 ///     @return The artist(s) who performed the work. In classical music this would be
8211 ///     the conductor.
8212 ///     @note Only available on RadiotextPlus
8213 ///     <p><hr>
8214 ///     @skinning_v16 **[New Infolabel]** \link RDS_Conductor `RDS.Conductor`\endlink
8215 ///     <p>
8216 ///   }
8217 ///   \table_row3{   <b>`RDS.Album`</b>,
8218 ///                  \anchor RDS_Album
8219 ///                  _string_,
8220 ///     @return The album of the song.
8221 ///     @note Only available on RadiotextPlus
8222 ///     <p><hr>
8223 ///     @skinning_v16 **[New Infolabel]** \link RDS_Album `RDS.Album`\endlink
8224 ///     <p>
8225 ///   }
8226 ///   \table_row3{   <b>`RDS.TrackNumber`</b>,
8227 ///                  \anchor RDS_TrackNumber
8228 ///                  _string_,
8229 ///     @return The track number of the item on the album on which it was originally
8230 ///     released.
8231 ///     @note Only be available on RadiotextPlus
8232 ///     <p><hr>
8233 ///     @skinning_v16 **[New Infolabel]** \link RDS_TrackNumber `RDS.TrackNumber`\endlink
8234 ///     <p>
8235 ///   }
8236 ///   \table_row3{   <b>`RDS.RadioStyle`</b>,
8237 ///                  \anchor RDS_RadioStyle
8238 ///                  _string_,
8239 ///     @return The style of current played radio channel\, it is always
8240 ///     updated once the style changes\, e.g "popmusic" to "news" or "weather"...
8241 ///     | RDS                     | RBDS                    |
8242 ///     |:------------------------|:------------------------|
8243 ///     | none                    | none                    |
8244 ///     | news                    | news                    |
8245 ///     | currentaffairs          | information             |
8246 ///     | information             | sport                   |
8247 ///     | sport                   | talk                    |
8248 ///     | education               | rockmusic               |
8249 ///     | drama                   | classicrockmusic        |
8250 ///     | cultures                | adulthits               |
8251 ///     | science                 | softrock                |
8252 ///     | variedspeech            | top40                   |
8253 ///     | popmusic                | countrymusic            |
8254 ///     | rockmusic               | oldiesmusic             |
8255 ///     | easylistening           | softmusic               |
8256 ///     | lightclassics           | nostalgia               |
8257 ///     | seriousclassics         | jazzmusic               |
8258 ///     | othermusic              | classical               |
8259 ///     | weather                 | randb                   |
8260 ///     | finance                 | softrandb               |
8261 ///     | childrensprogs          | language                |
8262 ///     | socialaffairs           | religiousmusic          |
8263 ///     | religion                | religioustalk           |
8264 ///     | phonein                 | personality             |
8265 ///     | travelandtouring        | public                  |
8266 ///     | leisureandhobby         | college                 |
8267 ///     | jazzmusic               | spanishtalk             |
8268 ///     | countrymusic            | spanishmusic            |
8269 ///     | nationalmusic           | hiphop                  |
8270 ///     | oldiesmusic             |                         |
8271 ///     | folkmusic               |                         |
8272 ///     | documentary             | weather                 |
8273 ///     | alarmtest               | alarmtest               |
8274 ///     | alarm-alarm             | alarm-alarm             |
8275 ///     @note "alarm-alarm" is normally not used from radio stations\, is thought
8276 ///     to inform about horrible messages who are needed asap to all people.
8277 ///     <p><hr>
8278 ///     @skinning_v16 **[New Infolabel]** \link RDS_RadioStyle `RDS.RadioStyle`\endlink
8279 ///     <p>
8280 ///   }
8281 ///   \table_row3{   <b>`RDS.Comment`</b>,
8282 ///                  \anchor RDS_Comment
8283 ///                  _string_,
8284 ///     @return The radio station comment string if available.
8285 ///     @note Only available on RadiotextPlus)
8286 ///     <p><hr>
8287 ///     @skinning_v16 **[New Infolabel]** \link RDS_Comment `RDS.Comment`\endlink
8288 ///     <p>
8289 ///   }
8290 ///   \table_row3{   <b>`RDS.InfoNews`</b>,
8291 ///                  \anchor RDS_InfoNews
8292 ///                  _string_,
8293 ///     @return The message / headline (if available).
8294 ///     @note Only available on RadiotextPlus
8295 ///     <p><hr>
8296 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoNews `RDS.InfoNews`\endlink
8297 ///     <p>
8298 ///   }
8299 ///   \table_row3{   <b>`RDS.InfoNewsLocal`</b>,
8300 ///                  \anchor RDS_InfoNewsLocal
8301 ///                  _string_,
8302 ///     @return The local information news sended from radio channel (if available).
8303 ///     @note Only available on RadiotextPlus
8304 ///     <p><hr>
8305 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoNewsLocal `RDS.InfoNewsLocal`\endlink
8306 ///     <p>
8307 ///   }
8308 ///   \table_row3{   <b>`RDS.InfoStock`</b>,
8309 ///                  \anchor RDS_InfoStock
8310 ///                  _string_,
8311 ///     @return The stock information; either as one part or as several distinct parts:
8312 ///     "name 99latest value 99change 99high 99low 99volume" (if available).
8313 ///     @note Only available on RadiotextPlus
8314 ///     <p><hr>
8315 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoStock `RDS.InfoStock`\endlink
8316 ///     <p>
8317 ///   }
8318 ///   \table_row3{   <b>`RDS.InfoStockSize`</b>,
8319 ///                  \anchor RDS_InfoStockSize
8320 ///                  _string_,
8321 ///     @return The number of rows present in stock information.
8322 ///     @note Only available on RadiotextPlus
8323 ///     <p><hr>
8324 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoStockSize `RDS.InfoStockSize`\endlink
8325 ///     <p>
8326 ///   }
8327 ///   \table_row3{   <b>`RDS.InfoSport`</b>,
8328 ///                  \anchor RDS_InfoSport
8329 ///                  _string_,
8330 ///     @return The result of a match; either as one part or as several distinct parts:
8331 ///     "match 99result"\, e.g. "Bayern München : Borussia 995:5"  (if available).
8332 ///     @note Only available on RadiotextPlus
8333 ///     <p><hr>
8334 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoSport `RDS.InfoSport`\endlink
8335 ///     <p>
8336 ///   }
8337 ///   \table_row3{   <b>`RDS.InfoSportSize`</b>,
8338 ///                  \anchor RDS_InfoSportSize
8339 ///                  _string_,
8340 ///     @return The number of rows present in sport information.
8341 ///     @note Only available on RadiotextPlus
8342 ///     <p><hr>
8343 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoSportSize `RDS.InfoSportSize`\endlink
8344 ///     <p>
8345 ///   }
8346 ///   \table_row3{   <b>`RDS.InfoLottery`</b>,
8347 ///                  \anchor RDS_InfoLottery
8348 ///                  _string_,
8349 ///     @return The raffle / lottery: "key word 99values" (if available).
8350 ///     @note Only available on RadiotextPlus
8351 ///     <p><hr>
8352 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoLottery `RDS.InfoLottery`\endlink
8353 ///     <p>
8354 ///   }
8355 ///   \table_row3{   <b>`RDS.InfoLotterySize`</b>,
8356 ///                  \anchor RDS_InfoLotterySize
8357 ///                  _string_,
8358 ///     @return The number of rows present in lottery information.
8359 ///     @note Only available on RadiotextPlus
8360 ///     <p><hr>
8361 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoLotterySize `RDS.InfoLotterySize`\endlink
8362 ///     <p>
8363 ///   }
8364 ///   \table_row3{   <b>`RDS.InfoWeather`</b>,
8365 ///                  \anchor RDS_InfoWeather
8366 ///                  _string_,
8367 ///     @return The weather information (if available).
8368 ///     @note Only available on RadiotextPlus
8369 ///     <p><hr>
8370 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoWeather `RDS.InfoWeather`\endlink
8371 ///     <p>
8372 ///   }
8373 ///   \table_row3{   <b>`RDS.InfoWeatherSize`</b>,
8374 ///                  \anchor RDS_InfoWeatherSize
8375 ///                  _string_,
8376 ///     @return The number of rows present in weather information.
8377 ///     @note Only available on RadiotextPlus
8378 ///     <p><hr>
8379 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoWeatherSize `RDS.InfoWeatherSize`\endlink
8380 ///     <p>
8381 ///   }
8382 ///   \table_row3{   <b>`RDS.InfoCinema`</b>,
8383 ///                  \anchor RDS_InfoCinema
8384 ///                  _string_,
8385 ///     @return The information about movies in cinema (if available).
8386 ///     @note Only available on RadiotextPlus
8387 ///     <p><hr>
8388 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoCinema `RDS.InfoCinema`\endlink
8389 ///     <p>
8390 ///   }
8391 ///   \table_row3{   <b>`RDS.InfoCinemaSize`</b>,
8392 ///                  \anchor RDS_InfoCinemaSize
8393 ///                  _string_,
8394 ///     @return The number of rows present in cinema information.
8395 ///     @note Only available on RadiotextPlus
8396 ///     <p><hr>
8397 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoCinemaSize `RDS.InfoCinemaSize`\endlink
8398 ///     <p>
8399 ///   }
8400 ///   \table_row3{   <b>`RDS.InfoHoroscope`</b>,
8401 ///                  \anchor RDS_InfoHoroscope
8402 ///                  _string_,
8403 ///     @return The horoscope; either as one part or as two distinct parts:
8404 ///     "key word 99text"\, e.g. "sign of the zodiac 99blablabla" (if available).
8405 ///     @note Only available on RadiotextPlus
8406 ///     <p><hr>
8407 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoHoroscope `RDS.InfoHoroscope`\endlink
8408 ///     <p>
8409 ///   }
8410 ///   \table_row3{   <b>`RDS.InfoHoroscopeSize`</b>,
8411 ///                  \anchor RDS_InfoHoroscopeSize
8412 ///                  _string_,
8413 ///     @return The Number of rows present in horoscope information.
8414 ///     @note Only available on RadiotextPlus
8415 ///     <p><hr>
8416 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoHoroscopeSize `RDS.InfoHoroscopeSize`\endlink
8417 ///     <p>
8418 ///   }
8419 ///   \table_row3{   <b>`RDS.InfoOther`</b>,
8420 ///                  \anchor RDS_InfoOther
8421 ///                  _string_,
8422 ///     @return Other information\, not especially specified: "key word 99info" (if available).
8423 ///     @note Only available on RadiotextPlus
8424 ///     <p><hr>
8425 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoOther `RDS.InfoOther`\endlink
8426 ///     <p>
8427 ///   }
8428 ///   \table_row3{   <b>`RDS.InfoOtherSize`</b>,
8429 ///                  \anchor RDS_InfoOtherSize
8430 ///                  _string_,
8431 ///     @return The number of rows present with other information.
8432 ///     @note Only available on RadiotextPlus
8433 ///     <p><hr>
8434 ///     @skinning_v16 **[New Infolabel]** \link RDS_InfoOtherSize `RDS.InfoOtherSize`\endlink
8435 ///     <p>
8436 ///   }
8437 ///   \table_row3{   <b>`RDS.ProgStation`</b>,
8438 ///                  \anchor RDS_ProgStation
8439 ///                  _string_,
8440 ///     @return The name of the radio channel.
8441 ///     @note becomes also set from epg if it is not available from RDS
8442 ///     <p><hr>
8443 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgStation `RDS.ProgStation`\endlink
8444 ///     <p>
8445 ///   }
8446 ///   \table_row3{   <b>`RDS.ProgNow`</b>,
8447 ///                  \anchor RDS_ProgNow
8448 ///                  _string_,
8449 ///     @return The now playing program name.
8450 ///     @note becomes also be set from epg if from RDS not available
8451 ///     <p><hr>
8452 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgNow `RDS.ProgNow`\endlink
8453 ///     <p>
8454 ///   }
8455 ///   \table_row3{   <b>`RDS.ProgNext`</b>,
8456 ///                  \anchor RDS_ProgNext
8457 ///                  _string_,
8458 ///     @return The next played program name (if available).
8459 ///     @note becomes also be set from epg if from RDS not available
8460 ///     <p><hr>
8461 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgNext `RDS.ProgNext`\endlink
8462 ///     <p>
8463 ///   }
8464 ///   \table_row3{   <b>`RDS.ProgHost`</b>,
8465 ///                  \anchor RDS_ProgHost
8466 ///                  _string_,
8467 ///     @return The name of the host of the radio show.
8468 ///     <p><hr>
8469 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgHost `RDS.ProgHost`\endlink
8470 ///     <p>
8471 ///   }
8472 ///   \table_row3{   <b>`RDS.ProgEditStaff`</b>,
8473 ///                  \anchor RDS_ProgEditStaff
8474 ///                  _string_,
8475 ///     @return The name of the editorial staff; e.g. name of editorial journalist.
8476 ///     @note Only available on RadiotextPlus
8477 ///     <p><hr>
8478 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgEditStaff `RDS.ProgEditStaff`\endlink
8479 ///     <p>
8480 ///   }
8481 ///   \table_row3{   <b>`RDS.ProgHomepage`</b>,
8482 ///                  \anchor RDS_ProgHomepage
8483 ///                  _string_,
8484 ///     @return The Link to radio station homepage
8485 ///     @note Only available on RadiotextPlus
8486 ///     <p><hr>
8487 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgHomepage `RDS.ProgHomepage`\endlink
8488 ///     <p>
8489 ///   }
8490 ///   \table_row3{   <b>`RDS.ProgStyle`</b>,
8491 ///                  \anchor RDS_ProgStyle
8492 ///                  _string_,
8493 ///     @return A human readable string about radiostyle defined from RDS or RBDS.
8494 ///     <p><hr>
8495 ///     @skinning_v16 **[New Infolabel]** \link RDS_ProgStyle `RDS.ProgStyle`\endlink
8496 ///     <p>
8497 ///   }
8498 ///   \table_row3{   <b>`RDS.PhoneHotline`</b>,
8499 ///                  \anchor RDS_PhoneHotline
8500 ///                  _string_,
8501 ///     @return The telephone number of the radio station's hotline.
8502 ///     @note Only available on RadiotextPlus
8503 ///     <p><hr>
8504 ///     @skinning_v16 **[New Infolabel]** \link RDS_PhoneHotline `RDS.PhoneHotline`\endlink
8505 ///     <p>
8506 ///   }
8507 ///   \table_row3{   <b>`RDS.PhoneStudio`</b>,
8508 ///                  \anchor RDS_PhoneStudio
8509 ///                  _string_,
8510 ///     @return The telephone number of the radio station's studio.
8511 ///     @note Only available on RadiotextPlus
8512 ///     <p><hr>
8513 ///     @skinning_v16 **[New Infolabel]** \link RDS_PhoneStudio `RDS.PhoneStudio`\endlink
8514 ///     <p>
8515 ///   }
8516 ///   \table_row3{   <b>`RDS.SmsStudio`</b>,
8517 ///                  \anchor RDS_SmsStudio
8518 ///                  _string_,
8519 ///     @return The sms number of the radio stations studio (to send directly a sms to
8520 ///     the studio) (if available).
8521 ///     @note Only available on RadiotextPlus
8522 ///     <p><hr>
8523 ///     @skinning_v16 **[New Infolabel]** \link RDS_SmsStudio `RDS.SmsStudio`\endlink
8524 ///     <p>
8525 ///   }
8526 ///   \table_row3{   <b>`RDS.EmailHotline`</b>,
8527 ///                  \anchor RDS_EmailHotline
8528 ///                  _string_,
8529 ///     @return The email address of the radio stations hotline (if available).
8530 ///     @note Only available on RadiotextPlus
8531 ///     <p><hr>
8532 ///     @skinning_v16 **[New Infolabel]** \link RDS_EmailHotline `RDS.EmailHotline`\endlink
8533 ///     <p>
8534 ///   }
8535 ///   \table_row3{   <b>`RDS.EmailStudio`</b>,
8536 ///                  \anchor RDS_EmailStudio
8537 ///                  _string_,
8538 ///     @return The email address of the radio station's studio (if available).
8539 ///     @note Only available on RadiotextPlus
8540 ///     <p><hr>
8541 ///     @skinning_v16 **[New Infolabel]** \link RDS_EmailStudio `RDS.EmailStudio`\endlink
8542 ///     <p>
8543 ///   }
8544 /// \table_end
8545 ///
8546 /// -----------------------------------------------------------------------------
8547 const infomap rds[] =            {{ "hasrds",                   RDS_HAS_RDS },
8548                                   { "hasradiotext",             RDS_HAS_RADIOTEXT },
8549                                   { "hasradiotextplus",         RDS_HAS_RADIOTEXT_PLUS },
8550                                   { "audiolanguage",            RDS_AUDIO_LANG },
8551                                   { "channelcountry",           RDS_CHANNEL_COUNTRY },
8552                                   { "title",                    RDS_TITLE },
8553                                   { "getline",                  RDS_GET_RADIOTEXT_LINE },
8554                                   { "artist",                   RDS_ARTIST },
8555                                   { "band",                     RDS_BAND },
8556                                   { "composer",                 RDS_COMPOSER },
8557                                   { "conductor",                RDS_CONDUCTOR },
8558                                   { "album",                    RDS_ALBUM },
8559                                   { "tracknumber",              RDS_ALBUM_TRACKNUMBER },
8560                                   { "radiostyle",               RDS_GET_RADIO_STYLE },
8561                                   { "comment",                  RDS_COMMENT },
8562                                   { "infonews",                 RDS_INFO_NEWS },
8563                                   { "infonewslocal",            RDS_INFO_NEWS_LOCAL },
8564                                   { "infostock",                RDS_INFO_STOCK },
8565                                   { "infostocksize",            RDS_INFO_STOCK_SIZE },
8566                                   { "infosport",                RDS_INFO_SPORT },
8567                                   { "infosportsize",            RDS_INFO_SPORT_SIZE },
8568                                   { "infolottery",              RDS_INFO_LOTTERY },
8569                                   { "infolotterysize",          RDS_INFO_LOTTERY_SIZE },
8570                                   { "infoweather",              RDS_INFO_WEATHER },
8571                                   { "infoweathersize",          RDS_INFO_WEATHER_SIZE },
8572                                   { "infocinema",               RDS_INFO_CINEMA },
8573                                   { "infocinemasize",           RDS_INFO_CINEMA_SIZE },
8574                                   { "infohoroscope",            RDS_INFO_HOROSCOPE },
8575                                   { "infohoroscopesize",        RDS_INFO_HOROSCOPE_SIZE },
8576                                   { "infoother",                RDS_INFO_OTHER },
8577                                   { "infoothersize",            RDS_INFO_OTHER_SIZE },
8578                                   { "progstation",              RDS_PROG_STATION },
8579                                   { "prognow",                  RDS_PROG_NOW },
8580                                   { "prognext",                 RDS_PROG_NEXT },
8581                                   { "proghost",                 RDS_PROG_HOST },
8582                                   { "progeditstaff",            RDS_PROG_EDIT_STAFF },
8583                                   { "proghomepage",             RDS_PROG_HOMEPAGE },
8584                                   { "progstyle",                RDS_PROG_STYLE },
8585                                   { "phonehotline",             RDS_PHONE_HOTLINE },
8586                                   { "phonestudio",              RDS_PHONE_STUDIO },
8587                                   { "smsstudio",                RDS_SMS_STUDIO },
8588                                   { "emailhotline",             RDS_EMAIL_HOTLINE },
8589                                   { "emailstudio",              RDS_EMAIL_STUDIO },
8590                                   { "hashotline",               RDS_HAS_HOTLINE_DATA },
8591                                   { "hasstudio",                RDS_HAS_STUDIO_DATA }};
8592 
8593 /// \page modules__infolabels_boolean_conditions
8594 /// \subsection modules__infolabels_boolean_conditions_slideshow Slideshow
8595 /// \table_start
8596 ///   \table_h3{ Labels, Type, Description }
8597 ///   \table_row3{   <b>`Slideshow.IsActive`</b>,
8598 ///                  \anchor Slideshow_IsActive
8599 ///                  _boolean_,
8600 ///     @return **True** if the picture slideshow is running.
8601 ///     <p>
8602 ///   }
8603 ///   \table_row3{   <b>`Slideshow.IsPaused`</b>,
8604 ///                  \anchor Slideshow_IsPaused
8605 ///                  _boolean_,
8606 ///     @return **True** if the picture slideshow is paused.
8607 ///     <p>
8608 ///   }
8609 ///   \table_row3{   <b>`Slideshow.IsRandom`</b>,
8610 ///                  \anchor Slideshow_IsRandom
8611 ///                  _boolean_,
8612 ///     @return **True** if the picture slideshow is in random mode.
8613 ///     <p>
8614 ///   }
8615 ///   \table_row3{   <b>`Slideshow.IsVideo`</b>,
8616 ///                  \anchor Slideshow_IsVideo
8617 ///                  _boolean_,
8618 ///     @return **True** if the picture slideshow is playing a video.
8619 ///     <p><hr>
8620 ///     @skinning_v13 **[New Boolean Condition]** \link Slideshow_IsVideo `Slideshow.IsVideo`\endlink
8621 ///     <p>
8622 ///   }
8623 ///   \table_row3{   <b>`Slideshow.Altitude`</b>,
8624 ///                  \anchor Slideshow_Altitude
8625 ///                  _string_,
8626 ///     @return The altitude in meters where the current picture was taken.
8627 ///     @note This is the value of the EXIF GPSInfo.GPSAltitude tag.
8628 ///     <p>
8629 ///   }
8630 ///   \table_row3{   <b>`Slideshow.Aperture`</b>,
8631 ///                  \anchor Slideshow_Aperture
8632 ///                  _string_,
8633 ///     @return The F-stop used to take the current picture.
8634 ///     @note This is the value of the EXIF FNumber tag (hex code 0x829D).
8635 ///     <p>
8636 ///   }
8637 ///   \table_row3{   <b>`Slideshow.Author`</b>,
8638 ///                  \anchor Slideshow_Author
8639 ///                  _string_,
8640 ///     @return The name of the person involved in writing about the current
8641 ///     picture.
8642 ///     @note This is the value of the IPTC Writer tag (hex code 0x7A).
8643 ///     <p><hr>
8644 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Author `Slideshow.Author`\endlink
8645 ///     <p>
8646 ///   }
8647 ///   \table_row3{   <b>`Slideshow.Byline`</b>,
8648 ///                  \anchor Slideshow_Byline
8649 ///                  _string_,
8650 ///     @return The name of the person who created the current picture.
8651 ///     @note This is the value of the IPTC Byline tag (hex code 0x50).
8652 ///     <p><hr>
8653 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Byline `Slideshow.Byline`\endlink
8654 ///     <p>
8655 ///   }
8656 ///   \table_row3{   <b>`Slideshow.BylineTitle`</b>,
8657 ///                  \anchor Slideshow_BylineTitle
8658 ///                  _string_,
8659 ///     @return The title of the person who created the current picture.
8660 ///     @note This is the value of the IPTC BylineTitle tag (hex code 0x55).
8661 ///     <p><hr>
8662 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_BylineTitle `Slideshow.BylineTitle`\endlink
8663 ///     <p>
8664 ///   }
8665 ///   \table_row3{   <b>`Slideshow.CameraMake`</b>,
8666 ///                  \anchor Slideshow_CameraMake
8667 ///                  _string_,
8668 ///     @return The manufacturer of the camera used to take the current picture.
8669 ///     @note This is the value of the EXIF Make tag (hex code 0x010F).
8670 ///     <p>
8671 ///   }
8672 ///   \table_row3{   <b>`Slideshow.CameraModel`</b>,
8673 ///                  \anchor Slideshow_CameraModel
8674 ///                  _string_,
8675 ///     @return The manufacturer's model name or number of the camera used to take
8676 ///     the current picture.
8677 ///     @note This is the value of the EXIF Model tag (hex code 0x0110).
8678 ///     <p>
8679 ///   }
8680 ///   \table_row3{   <b>`Slideshow.Caption`</b>,
8681 ///                  \anchor Slideshow_Caption
8682 ///                  _string_,
8683 ///     @return A description of the current picture.
8684 ///     @note This is the value of the IPTC Caption tag (hex code 0x78).
8685 ///     <p>
8686 ///   }
8687 ///   \table_row3{   <b>`Slideshow.Category`</b>,
8688 ///                  \anchor Slideshow_Category
8689 ///                  _string_,
8690 ///     @return The subject of the current picture as a category code.
8691 ///     @note This is the value of the IPTC Category tag (hex code 0x0F).
8692 ///     <p><hr>
8693 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Category `Slideshow.Category`\endlink
8694 ///     <p>
8695 ///   }
8696 ///   \table_row3{   <b>`Slideshow.CCDWidth`</b>,
8697 ///                  \anchor Slideshow_CCDWidth
8698 ///                  _string_,
8699 ///     @return The width of the CCD in the camera used to take the current
8700 ///     picture.
8701 ///     @note This is calculated from three EXIF tags (0xA002 * 0xA210 / 0xA20e).
8702 ///     <p><hr>
8703 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_CCDWidth `Slideshow.CCDWidth`\endlink
8704 ///     <p>
8705 ///   }
8706 ///   \table_row3{   <b>`Slideshow.City`</b>,
8707 ///                  \anchor Slideshow_City
8708 ///                  _string_,
8709 ///     @return The city where the current picture was taken.
8710 ///     @note This is the value of the IPTC City tag (hex code 0x5A).
8711 ///     <p><hr>
8712 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_City `Slideshow.City`\endlink
8713 ///     <p>
8714 ///   }
8715 ///   \table_row3{   <b>`Slideshow.Colour`</b>,
8716 ///                  \anchor Slideshow_Colour
8717 ///                  _string_,
8718 ///     @return the colour of the picture. It can have one of the following values:
8719 ///       - <b>"Colour"</b>
8720 ///       - <b>"Black and White"</b>
8721 ///     <p><hr>
8722 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Colour `Slideshow.Colour`\endlink
8723 ///     <p>
8724 ///   }
8725 ///   \table_row3{   <b>`Slideshow.CopyrightNotice`</b>,
8726 ///                  \anchor Slideshow_CopyrightNotice
8727 ///                  _string_,
8728 ///     @return The copyright notice of the current picture.
8729 ///     @note This is the value of the IPTC Copyright tag (hex code 0x74).
8730 ///     <p><hr>
8731 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_CopyrightNotice `Slideshow.CopyrightNotice`\endlink
8732 ///     <p>
8733 ///   }
8734 ///   \table_row3{   <b>`Slideshow.Country`</b>,
8735 ///                  \anchor Slideshow_Country
8736 ///                  _string_,
8737 ///     @return The full name of the country where the current picture was taken.
8738 ///     @note This is the value of the IPTC CountryName tag (hex code 0x65).
8739 ///     <p><hr>
8740 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Country `Slideshow.Country`\endlink
8741 ///     <p>
8742 ///   }
8743 ///   \table_row3{   <b>`Slideshow.CountryCode`</b>,
8744 ///                  \anchor Slideshow_CountryCode
8745 ///                  _string_,
8746 ///     @return The country code of the country where the current picture was
8747 ///     taken.
8748 ///     @note This is the value of the IPTC CountryCode tag (hex code 0x64).
8749 ///     <p><hr>
8750 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_CountryCode `Slideshow.CountryCode`\endlink
8751 ///     <p>
8752 ///   }
8753 ///   \table_row3{   <b>`Slideshow.Credit`</b>,
8754 ///                  \anchor Slideshow_Credit
8755 ///                  _string_,
8756 ///     @return Who provided the current picture.
8757 ///     @note This is the value of the IPTC Credit tag (hex code 0x6E).
8758 ///     <p><hr>
8759 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Credit `Slideshow.Credit`\endlink
8760 ///     <p>
8761 ///   }
8762 ///   \table_row3{   <b>`Slideshow.DigitalZoom`</b>,
8763 ///                  \anchor Slideshow_DigitalZoom
8764 ///                  _string_,
8765 ///     @return The digital zoom ratio when the current picture was taken.
8766 ///     @note This is the value of the EXIF .DigitalZoomRatio tag (hex code 0xA404).
8767 ///     <p><hr>
8768 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_DigitalZoom `Slideshow.DigitalZoom`\endlink
8769 ///     <p>
8770 ///   }
8771 ///   \table_row3{   <b>`Slideshow.EXIFComment`</b>,
8772 ///                  \anchor Slideshow_EXIFComment
8773 ///                  _string_,
8774 ///     @return A description of the current picture.
8775 ///     @note This is the value of the EXIF User Comment tag (hex code 0x9286).
8776 ///     This is the same value as \ref Slideshow_SlideComment "Slideshow.SlideComment".
8777 ///     <p>
8778 ///   }
8779 ///   \table_row3{   <b>`Slideshow.EXIFDate`</b>,
8780 ///                  \anchor Slideshow_EXIFDate
8781 ///                  _string_,
8782 ///     @return The localized date of the current picture. The short form of the
8783 ///     date is used.
8784 ///     @note The value of the EXIF DateTimeOriginal tag (hex code
8785 ///     0x9003) is preferred. If the DateTimeOriginal tag is not found\, the
8786 ///     value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex code
8787 ///     0x0132) might be used.
8788 ///     <p><hr>
8789 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_EXIFDate `Slideshow.EXIFDate`\endlink
8790 ///     <p>
8791 ///   }
8792 ///   \table_row3{   <b>`Slideshow.EXIFDescription`</b>,
8793 ///                  \anchor Slideshow_EXIFDescription
8794 ///                  _string_,
8795 ///     @return A short description of the current picture. The SlideComment\,
8796 ///     EXIFComment or Caption values might contain a longer description.
8797 ///     @note This is the value of the EXIF ImageDescription tag (hex code 0x010E).
8798 ///     <p>
8799 ///   }
8800 ///   \table_row3{   <b>`Slideshow.EXIFSoftware`</b>,
8801 ///                  \anchor Slideshow_EXIFSoftware
8802 ///                  _string_,
8803 ///     @return The name and version of the firmware used by the camera that took
8804 ///     the current picture.
8805 ///     @note This is the value of the EXIF Software tag (hex code 0x0131).
8806 ///     <p>
8807 ///   }
8808 ///   \table_row3{   <b>`Slideshow.EXIFTime`</b>,
8809 ///                  \anchor Slideshow_EXIFTime
8810 ///                  _string_,
8811 ///     @return The date/timestamp of the current picture. The localized short
8812 ///     form of the date and time is used.
8813 ///     @note The value of the EXIF DateTimeOriginal tag (hex code 0x9003) is
8814 ///     preferred. If the DateTimeOriginal tag is not found\, the value of
8815 ///     DateTimeDigitized (hex code 0x9004) or of DateTime (hex code 0x0132)
8816 ///     might be used.
8817 ///     <p>
8818 ///   }
8819 ///   \table_row3{   <b>`Slideshow.Exposure`</b>,
8820 ///                  \anchor Slideshow_Exposure
8821 ///                  _string_,
8822 ///     @return The class of the program used by the camera to set exposure when
8823 ///     the current picture was taken. Values include:
8824 ///      - <b>"Manual"</b>
8825 ///      - <b>"Program (Auto)"</b>
8826 ///      - <b>"Aperture priority (Semi-Auto)"</b>
8827 ///      - <b>"Shutter priority (semi-auto)"</b>
8828 ///      - etc...
8829 ///     @note This is the value of the EXIF ExposureProgram tag
8830 ///     (hex code 0x8822).
8831 ///     <p><hr>
8832 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Exposure `Slideshow.Exposure`\endlink
8833 ///     <p>
8834 ///   }
8835 ///   \table_row3{   <b>`Slideshow.ExposureBias`</b>,
8836 ///                  \anchor Slideshow_ExposureBias
8837 ///                  _string_,
8838 ///     @return The exposure bias of the current picture. Typically this is a
8839 ///     number between -99.99 and 99.99.
8840 ///     @note This is the value of the EXIF ExposureBiasValue tag (hex code 0x9204).
8841 ///     <p><hr>
8842 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_ExposureBias `Slideshow.ExposureBias`\endlink
8843 ///     <p>
8844 ///   }
8845 ///   \table_row3{   <b>`Slideshow.ExposureMode`</b>,
8846 ///                  \anchor Slideshow_ExposureMode
8847 ///                  _string_,
8848 ///     @return The exposure mode of the current picture. The possible values are:
8849 ///      - <b>"Automatic"</b>
8850 ///      - <b>"Manual"</b>
8851 ///      - <b>"Auto bracketing"</b>
8852 ///     @note This is the value of the EXIF ExposureMode tag (hex code 0xA402).
8853 ///     <p>
8854 ///   }
8855 ///   \table_row3{   <b>`Slideshow.ExposureTime`</b>,
8856 ///                  \anchor Slideshow_ExposureTime
8857 ///                  _string_,
8858 ///     @return The exposure time of the current picture\, in seconds.
8859 ///     @note This is the value of the EXIF ExposureTime tag (hex code 0x829A).
8860 ///     If the ExposureTime tag is not found\, the ShutterSpeedValue tag (hex code
8861 ///     0x9201) might be used.
8862 ///     <p>
8863 ///   }
8864 ///   \table_row3{   <b>`Slideshow.Filedate`</b>,
8865 ///                  \anchor Slideshow_Filedate
8866 ///                  _string_,
8867 ///     @return The file date of the current picture.
8868 ///     <p>
8869 ///   }
8870 ///   \table_row3{   <b>`Slideshow.Filename`</b>,
8871 ///                  \anchor Slideshow_Filename
8872 ///                  _string_,
8873 ///     @return The file name of the current picture.
8874 ///     <p>
8875 ///   }
8876 ///   \table_row3{   <b>`Slideshow.Filesize`</b>,
8877 ///                  \anchor Slideshow_Filesize
8878 ///                  _string_,
8879 ///     @return The file size of the current picture.
8880 ///     <p>
8881 ///   }
8882 ///   \table_row3{   <b>`Slideshow.FlashUsed`</b>,
8883 ///                  \anchor Slideshow_FlashUsed
8884 ///                  _string_,
8885 ///     @return The status of flash when the current picture was taken. The value
8886 ///     will be either <b>"Yes"</b> or <b>"No"</b>\, and might include additional information.
8887 ///     @note This is the value of the EXIF Flash tag (hex code 0x9209).
8888 ///     <p><hr>
8889 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_FlashUsed `Slideshow.FlashUsed`\endlink
8890 ///     <p>
8891 ///   }
8892 ///   \table_row3{   <b>`Slideshow.FocalLength`</b>,
8893 ///                  \anchor Slideshow_FocalLength
8894 ///                  _string_,
8895 ///     @return The focal length of the lens\, in mm.
8896 ///     @note This is the value of the EXIF FocalLength tag (hex code 0x920A).
8897 ///     <p>
8898 ///   }
8899 ///   \table_row3{   <b>`Slideshow.FocusDistance`</b>,
8900 ///                  \anchor Slideshow_FocusDistance
8901 ///                  _string_,
8902 ///     @return The distance to the subject\, in meters.
8903 ///     @note This is the value of the EXIF SubjectDistance tag (hex code 0x9206).
8904 ///     <p>
8905 ///   }
8906 ///   \table_row3{   <b>`Slideshow.Headline`</b>,
8907 ///                  \anchor Slideshow_Headline
8908 ///                  _string_,
8909 ///     @return A synopsis of the contents of the current picture.
8910 ///     @note This is the value of the IPTC Headline tag (hex code 0x69).
8911 ///     <p><hr>
8912 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Headline `Slideshow.Headline`\endlink
8913 ///     <p>
8914 ///   }
8915 ///   \table_row3{   <b>`Slideshow.ImageType`</b>,
8916 ///                  \anchor Slideshow_ImageType
8917 ///                  _string_,
8918 ///     @return The color components of the current picture.
8919 ///     @note This is the value of the IPTC ImageType tag (hex code 0x82).
8920 ///     <p><hr>
8921 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_ImageType `Slideshow.ImageType`\endlink
8922 ///     <p>
8923 ///   }
8924 ///   \table_row3{   <b>`Slideshow.IPTCDate`</b>,
8925 ///                  \anchor Slideshow_IPTCDate
8926 ///                  _string_,
8927 ///     @return The date when the intellectual content of the current picture was
8928 ///     created\, rather than when the picture was created.
8929 ///     @note This is the value of the IPTC DateCreated tag (hex code 0x37).
8930 ///     <p>
8931 ///   }
8932 ///   \table_row3{   <b>`Slideshow.ISOEquivalence`</b>,
8933 ///                  \anchor Slideshow_ISOEquivalence
8934 ///                  _string_,
8935 ///     @return The ISO speed of the camera when the current picture was taken.
8936 ///     @note This is the value of the EXIF ISOSpeedRatings tag (hex code 0x8827).
8937 ///     <p>
8938 ///   }
8939 ///   \table_row3{   <b>`Slideshow.Keywords`</b>,
8940 ///                  \anchor Slideshow_Keywords
8941 ///                  _string_,
8942 ///     @return The keywords assigned to the current picture.
8943 ///     @note This is the value of the IPTC Keywords tag (hex code 0x19).
8944 ///     <p>
8945 ///   }
8946 ///   \table_row3{   <b>`Slideshow.Latitude`</b>,
8947 ///                  \anchor Slideshow_Latitude
8948 ///                  _string_,
8949 ///     @return The latitude where the current picture was taken (degrees\,
8950 ///     minutes\, seconds North or South).
8951 ///     @note This is the value of the EXIF GPSInfo.GPSLatitude and
8952 ///     GPSInfo.GPSLatitudeRef tags.
8953 ///     <p>
8954 ///   }
8955 ///   \table_row3{   <b>`Slideshow.LightSource`</b>,
8956 ///                  \anchor Slideshow_LightSource
8957 ///                  _string_,
8958 ///     @return The kind of light source when the picture was taken. Possible
8959 ///     values include:
8960 ///      - <b>"Daylight"</b>
8961 ///      - <b>"Fluorescent"</b>
8962 ///      - <b>"Incandescent"</b>
8963 ///      - etc...
8964 ///     @note This is the value of the EXIF LightSource tag (hex code 0x9208).
8965 ///     <p><hr>
8966 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_LightSource `Slideshow.LightSource`\endlink
8967 ///     <p>
8968 ///   }
8969 ///   \table_row3{   <b>`Slideshow.LongEXIFDate`</b>,
8970 ///                  \anchor Slideshow_LongEXIFDate
8971 ///                  _string_,
8972 ///     @return Only the localized date of the current picture. The long form of
8973 ///     the date is used.
8974 ///     @note The value of the EXIF DateTimeOriginal tag (hex code
8975 ///     0x9003) is preferred. If the DateTimeOriginal tag is not found\, the
8976 ///     value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex code
8977 ///     0x0132) might be used.
8978 ///     <p><hr>
8979 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_LongEXIFDate `Slideshow.LongEXIFDate`\endlink
8980 ///     <p>
8981 ///   }
8982 ///   \table_row3{   <b>`Slideshow.LongEXIFTime`</b>,
8983 ///                  \anchor Slideshow_LongEXIFTime
8984 ///                  _string_,
8985 ///     @return The date/timestamp of the current picture. The localized long form
8986 ///     of the date and time is used.
8987 ///     @note The value of the EXIF DateTimeOriginal tag
8988 ///     (hex code 0x9003) is preferred. if the DateTimeOriginal tag is not found\,
8989 ///     the value of DateTimeDigitized (hex code 0x9004) or of DateTime (hex
8990 ///     code 0x0132) might be used.
8991 ///     <p><hr>
8992 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_LongEXIFTime `Slideshow.LongEXIFTime`\endlink
8993 ///     <p>
8994 ///   }
8995 ///   \table_row3{   <b>`Slideshow.Longitude`</b>,
8996 ///                  \anchor Slideshow_Longitude
8997 ///                  _string_,
8998 ///     @return The longitude where the current picture was taken (degrees\,
8999 ///     minutes\, seconds East or West).
9000 ///     @note This is the value of the EXIF GPSInfo.GPSLongitude and
9001 ///     GPSInfo.GPSLongitudeRef tags.
9002 ///     <p>
9003 ///   }
9004 ///   \table_row3{   <b>`Slideshow.MeteringMode`</b>,
9005 ///                  \anchor Slideshow_MeteringMode
9006 ///                  _string_,
9007 ///     @return The metering mode used when the current picture was taken. The
9008 ///     possible values are:
9009 ///      - <b>"Center weight"</b>
9010 ///      - <b>"Spot"</b>
9011 ///      - <b>"Matrix"</b>
9012 ///     @note This is the value of the EXIF MeteringMode tag (hex code 0x9207).
9013 ///     <p><hr>
9014 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_MeteringMode `Slideshow.MeteringMode`\endlink
9015 ///     <p>
9016 ///   }
9017 ///   \table_row3{   <b>`Slideshow.ObjectName`</b>,
9018 ///                  \anchor Slideshow_ObjectName
9019 ///                  _string_,
9020 ///     @return a shorthand reference for the current picture.
9021 ///     @note This is the value of the IPTC ObjectName tag (hex code 0x05).
9022 ///     <p><hr>
9023 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_ObjectName `Slideshow.ObjectName`\endlink
9024 ///     <p>
9025 ///   }
9026 ///   \table_row3{   <b>`Slideshow.Orientation`</b>,
9027 ///                  \anchor Slideshow_Orientation
9028 ///                  _string_,
9029 ///     @return The orientation of the current picture. Possible values are:
9030 ///      - <b>"Top Left"</b>
9031 ///      - <b>"Top Right"</b>
9032 ///      - <b>"Left Top"</b>
9033 ///      - <b>"Right Bottom"</b>
9034 ///      - etc...
9035 ///     @note This is the value of the EXIF Orientation tag (hex code 0x0112).
9036 ///     <p><hr>
9037 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Orientation `Slideshow.Orientation`\endlink
9038 ///     <p>
9039 ///   }
9040 ///   \table_row3{   <b>`Slideshow.Path`</b>,
9041 ///                  \anchor Slideshow_Path
9042 ///                  _string_,
9043 ///     @return The file path of the current picture.
9044 ///     <p>
9045 ///   }
9046 ///   \table_row3{   <b>`Slideshow.Process`</b>,
9047 ///                  \anchor Slideshow_Process
9048 ///                  _string_,
9049 ///     @return The process used to compress the current picture.
9050 ///     <p><hr>
9051 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Process `Slideshow.Process`\endlink
9052 ///     <p>
9053 ///   }
9054 ///   \table_row3{   <b>`Slideshow.ReferenceService`</b>,
9055 ///                  \anchor Slideshow_ReferenceService
9056 ///                  _string_,
9057 ///     @return The Service Identifier of a prior envelope to which the current
9058 ///     picture refers.
9059 ///     @note This is the value of the IPTC ReferenceService tag (hex code 0x2D).
9060 ///     <p><hr>
9061 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_ReferenceService `Slideshow.ReferenceService`\endlink
9062 ///     <p>
9063 ///   }
9064 ///   \table_row3{   <b>`Slideshow.Resolution`</b>,
9065 ///                  \anchor Slideshow_Resolution
9066 ///                  _string_,
9067 ///     @return The dimensions of the current picture (Width x Height)
9068 ///     <p>
9069 ///   }
9070 ///   \table_row3{   <b>`Slideshow.SlideComment`</b>,
9071 ///                  \anchor Slideshow_SlideComment
9072 ///                  _string_,
9073 ///     @return A description of the current picture.
9074 ///     @note This is the value of the EXIF User Comment tag (hex code 0x9286).
9075 ///     This is the same value as \ref Slideshow_EXIFComment "Slideshow.EXIFComment".
9076 ///     <p>
9077 ///   }
9078 ///   \table_row3{   <b>`Slideshow.SlideIndex`</b>,
9079 ///                  \anchor Slideshow_SlideIndex
9080 ///                  _string_,
9081 ///     @return The slide index of the current picture.
9082 ///     <p>
9083 ///   }
9084 ///   \table_row3{   <b>`Slideshow.Source`</b>,
9085 ///                  \anchor Slideshow_Source
9086 ///                  _string_,
9087 ///     @return The original owner of the current picture.
9088 ///     @note This is the value of the IPTC Source tag (hex code 0x73).
9089 ///     <p><hr>
9090 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Source `Slideshow.Source`\endlink
9091 ///     <p>
9092 ///   }
9093 ///   \table_row3{   <b>`Slideshow.SpecialInstructions`</b>,
9094 ///                  \anchor Slideshow_SpecialInstructions
9095 ///                  _string_,
9096 ///     @return Other editorial instructions concerning the use of the current
9097 ///     picture.
9098 ///     @note This is the value of the IPTC SpecialInstructions tag (hex code 0x28).
9099 ///     <p><hr>
9100 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_SpecialInstructions `Slideshow.SpecialInstructions`\endlink
9101 ///     <p>
9102 ///   }
9103 ///   \table_row3{   <b>`Slideshow.State`</b>,
9104 ///                  \anchor Slideshow_State
9105 ///                  _string_,
9106 ///     @return The State/Province where the current picture was taken.
9107 ///     @note This is the value of the IPTC ProvinceState tag (hex code 0x5F).
9108 ///     <p><hr>
9109 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_State `Slideshow.State`\endlink
9110 ///     <p>
9111 ///   }
9112 ///   \table_row3{   <b>`Slideshow.Sublocation`</b>,
9113 ///                  \anchor Slideshow_Sublocation
9114 ///                  _string_,
9115 ///     @return The location within a city where the current picture was taken -
9116 ///     might indicate the nearest landmark.
9117 ///     @note This is the value of the IPTC SubLocation tag (hex code 0x5C).
9118 ///     <p><hr>
9119 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Sublocation `Slideshow.Sublocation`\endlink
9120 ///     <p>
9121 ///   }
9122 ///   \table_row3{   <b>`Slideshow.SupplementalCategories`</b>,
9123 ///                  \anchor Slideshow_SupplementalCategories
9124 ///                  _string_,
9125 ///     @return The supplemental category codes to further refine the subject of the
9126 ///     current picture.
9127 ///     @note This is the value of the IPTC SuppCategory tag (hex
9128 ///     code 0x14).
9129 ///     <p><hr>
9130 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_SupplementalCategories `Slideshow.SupplementalCategories`\endlink
9131 ///     <p>
9132 ///   }
9133 ///   \table_row3{   <b>`Slideshow.TimeCreated`</b>,
9134 ///                  \anchor Slideshow_TimeCreated
9135 ///                  _string_,
9136 ///     @return The time when the intellectual content of the current picture was
9137 ///     created\, rather than when the picture was created.
9138 ///     @note This is the value of the IPTC TimeCreated tag (hex code 0x3C).
9139 ///     <p><hr>
9140 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_TimeCreated `Slideshow.TimeCreated`\endlink
9141 ///     <p>
9142 ///   }
9143 ///   \table_row3{   <b>`Slideshow.TransmissionReference`</b>,
9144 ///                  \anchor Slideshow_TransmissionReference
9145 ///                  _string_,
9146 ///     @return A code representing the location of original transmission of the
9147 ///     current picture.
9148 ///     @note This is the value of the IPTC TransmissionReference tag
9149 ///     (hex code 0x67).
9150 ///     <p><hr>
9151 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_TransmissionReference `Slideshow.TransmissionReference`\endlink
9152 ///     <p>
9153 ///   }
9154 ///   \table_row3{   <b>`Slideshow.Urgency`</b>,
9155 ///                  \anchor Slideshow_Urgency
9156 ///                  _string_,
9157 ///     @return The urgency of the current picture. Values are 1-9. The 1 is most
9158 ///     urgent.
9159 ///     @note Some image management programs use urgency to indicate picture
9160 ///     rating\, where urgency 1 is 5 stars and urgency 5 is 1 star. Urgencies
9161 ///     6-9 are not used for rating. This is the value of the IPTC Urgency tag
9162 ///     (hex code 0x0A).
9163 ///     <p><hr>
9164 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_Urgency `Slideshow.Urgency`\endlink
9165 ///     <p>
9166 ///   }
9167 ///   \table_row3{   <b>`Slideshow.WhiteBalance`</b>,
9168 ///                  \anchor Slideshow_WhiteBalance
9169 ///                  _string_,
9170 ///     @return The white balance mode set when the current picture was taken.
9171 ///     The possible values are:
9172 ///       - <b>"Manual"</b>
9173 ///       - <b>"Auto"</b>
9174 ///     <p>
9175 ///     @note This is the value of the EXIF WhiteBalance tag (hex code 0xA403).
9176 ///     <p><hr>
9177 ///     @skinning_v13 **[New Infolabel]** \link Slideshow_WhiteBalance `Slideshow.WhiteBalance`\endlink
9178 ///     <p>
9179 ///   }
9180 /// \table_end
9181 ///
9182 /// -----------------------------------------------------------------------------
9183 const infomap slideshow[] =      {{ "ispaused",               SLIDESHOW_ISPAUSED },
9184                                   { "isactive",               SLIDESHOW_ISACTIVE },
9185                                   { "isvideo",                SLIDESHOW_ISVIDEO },
9186                                   { "israndom",               SLIDESHOW_ISRANDOM },
9187                                   { "filename",               SLIDESHOW_FILE_NAME },
9188                                   { "path",                   SLIDESHOW_FILE_PATH },
9189                                   { "filesize",               SLIDESHOW_FILE_SIZE },
9190                                   { "filedate",               SLIDESHOW_FILE_DATE },
9191                                   { "slideindex",             SLIDESHOW_INDEX },
9192                                   { "resolution",             SLIDESHOW_RESOLUTION },
9193                                   { "slidecomment",           SLIDESHOW_COMMENT },
9194                                   { "colour",                 SLIDESHOW_COLOUR },
9195                                   { "process",                SLIDESHOW_PROCESS },
9196                                   { "exiftime",               SLIDESHOW_EXIF_DATE_TIME },
9197                                   { "exifdate",               SLIDESHOW_EXIF_DATE },
9198                                   { "longexiftime",           SLIDESHOW_EXIF_LONG_DATE_TIME },
9199                                   { "longexifdate",           SLIDESHOW_EXIF_LONG_DATE },
9200                                   { "exifdescription",        SLIDESHOW_EXIF_DESCRIPTION },
9201                                   { "cameramake",             SLIDESHOW_EXIF_CAMERA_MAKE },
9202                                   { "cameramodel",            SLIDESHOW_EXIF_CAMERA_MODEL },
9203                                   { "exifcomment",            SLIDESHOW_EXIF_COMMENT },
9204                                   { "exifsoftware",           SLIDESHOW_EXIF_SOFTWARE },
9205                                   { "aperture",               SLIDESHOW_EXIF_APERTURE },
9206                                   { "focallength",            SLIDESHOW_EXIF_FOCAL_LENGTH },
9207                                   { "focusdistance",          SLIDESHOW_EXIF_FOCUS_DIST },
9208                                   { "exposure",               SLIDESHOW_EXIF_EXPOSURE },
9209                                   { "exposuretime",           SLIDESHOW_EXIF_EXPOSURE_TIME },
9210                                   { "exposurebias",           SLIDESHOW_EXIF_EXPOSURE_BIAS },
9211                                   { "exposuremode",           SLIDESHOW_EXIF_EXPOSURE_MODE },
9212                                   { "flashused",              SLIDESHOW_EXIF_FLASH_USED },
9213                                   { "whitebalance",           SLIDESHOW_EXIF_WHITE_BALANCE },
9214                                   { "lightsource",            SLIDESHOW_EXIF_LIGHT_SOURCE },
9215                                   { "meteringmode",           SLIDESHOW_EXIF_METERING_MODE },
9216                                   { "isoequivalence",         SLIDESHOW_EXIF_ISO_EQUIV },
9217                                   { "digitalzoom",            SLIDESHOW_EXIF_DIGITAL_ZOOM },
9218                                   { "ccdwidth",               SLIDESHOW_EXIF_CCD_WIDTH },
9219                                   { "orientation",            SLIDESHOW_EXIF_ORIENTATION },
9220                                   { "supplementalcategories", SLIDESHOW_IPTC_SUP_CATEGORIES },
9221                                   { "keywords",               SLIDESHOW_IPTC_KEYWORDS },
9222                                   { "caption",                SLIDESHOW_IPTC_CAPTION },
9223                                   { "author",                 SLIDESHOW_IPTC_AUTHOR },
9224                                   { "headline",               SLIDESHOW_IPTC_HEADLINE },
9225                                   { "specialinstructions",    SLIDESHOW_IPTC_SPEC_INSTR },
9226                                   { "category",               SLIDESHOW_IPTC_CATEGORY },
9227                                   { "byline",                 SLIDESHOW_IPTC_BYLINE },
9228                                   { "bylinetitle",            SLIDESHOW_IPTC_BYLINE_TITLE },
9229                                   { "credit",                 SLIDESHOW_IPTC_CREDIT },
9230                                   { "source",                 SLIDESHOW_IPTC_SOURCE },
9231                                   { "copyrightnotice",        SLIDESHOW_IPTC_COPYRIGHT_NOTICE },
9232                                   { "objectname",             SLIDESHOW_IPTC_OBJECT_NAME },
9233                                   { "city",                   SLIDESHOW_IPTC_CITY },
9234                                   { "state",                  SLIDESHOW_IPTC_STATE },
9235                                   { "country",                SLIDESHOW_IPTC_COUNTRY },
9236                                   { "transmissionreference",  SLIDESHOW_IPTC_TX_REFERENCE },
9237                                   { "iptcdate",               SLIDESHOW_IPTC_DATE },
9238                                   { "urgency",                SLIDESHOW_IPTC_URGENCY },
9239                                   { "countrycode",            SLIDESHOW_IPTC_COUNTRY_CODE },
9240                                   { "referenceservice",       SLIDESHOW_IPTC_REF_SERVICE },
9241                                   { "latitude",               SLIDESHOW_EXIF_GPS_LATITUDE },
9242                                   { "longitude",              SLIDESHOW_EXIF_GPS_LONGITUDE },
9243                                   { "altitude",               SLIDESHOW_EXIF_GPS_ALTITUDE },
9244                                   { "timecreated",            SLIDESHOW_IPTC_TIMECREATED },
9245                                   { "sublocation",            SLIDESHOW_IPTC_SUBLOCATION },
9246                                   { "imagetype",              SLIDESHOW_IPTC_IMAGETYPE },
9247 };
9248 
9249 /// \page modules__infolabels_boolean_conditions
9250 /// \subsection modules__infolabels_boolean_conditions_Library Library
9251 /// @todo Make this annotate an array of infobools/labels to make it easier to track
9252 /// \table_start
9253 ///   \table_h3{ Labels, Type, Description }
9254 ///   \table_row3{   <b>`Library.IsScanning`</b>,
9255 ///                  \anchor Library_IsScanning
9256 ///                  _boolean_,
9257 ///     @return **True** if the library is being scanned.
9258 ///     <p>
9259 ///   }
9260 ///   \table_row3{   <b>`Library.IsScanningVideo`</b>,
9261 ///                  \anchor Library_IsScanningVideo
9262 ///                  _boolean_,
9263 ///     @return **True** if the video library is being scanned.
9264 ///     <p>
9265 ///   }
9266 ///   \table_row3{   <b>`Library.IsScanningMusic`</b>,
9267 ///                  \anchor Library_IsScanningMusic
9268 ///                  _boolean_,
9269 ///     @return **True** if the music library is being scanned.
9270 ///     <p>
9271 ///   }
9272 ///   \table_row3{   <b>`Library.HasContent(music)`</b>,
9273 ///                  \anchor Library_HasContent_Music
9274 ///                  _boolean_,
9275 ///     @return **True** if the library has music content.
9276 ///     <p>
9277 ///   }
9278 ///   \table_row3{   <b>`Library.HasContent(video)`</b>,
9279 ///                  \anchor Library_HasContent_Video
9280 ///                  _boolean_,
9281 ///     @return **True** if the library has video content.
9282 ///     <p>
9283 ///   }
9284 ///   \table_row3{   <b>`Library.HasContent(movies)`</b>,
9285 ///                  \anchor Library_HasContent_Movies
9286 ///                  _boolean_,
9287 ///     @return **True** if the library has movies.
9288 ///     <p>
9289 ///   }
9290 ///   \table_row3{   <b>`Library.HasContent(tvshows)`</b>,
9291 ///                  \anchor Library_HasContent_TVShows
9292 ///                  _boolean_,
9293 ///     @return **True** if the library has tvshows.
9294 ///     <p>
9295 ///   }
9296 ///   \table_row3{   <b>`Library.HasContent(musicvideos)`</b>,
9297 ///                  \anchor Library_HasContent_MusicVideos
9298 ///                  _boolean_,
9299 ///     @return **True** if the library has music videos.
9300 ///     <p>
9301 ///   }
9302 ///   \table_row3{   <b>`Library.HasContent(moviesets)`</b>,
9303 ///                  \anchor Library_HasContent_MovieSets
9304 ///                  _boolean_,
9305 ///     @return **True** if the library has movie sets.
9306 ///     <p>
9307 ///   }
9308 ///   \table_row3{   <b>`Library.HasContent(singles)`</b>,
9309 ///                  \anchor Library_HasContent_Singles
9310 ///                  _boolean_,
9311 ///     @return **True** if the library has singles.
9312 ///     <p>
9313 ///   }
9314 ///   \table_row3{   <b>`Library.HasContent(compilations)`</b>,
9315 ///                  \anchor Library_HasContent_Compilations
9316 ///                  _boolean_,
9317 ///     @return **True** if the library has compilations.
9318 ///     <p>
9319 ///   }
9320 ///   \table_row3{   <b>`Library.HasContent(Role.Composer)`</b>,
9321 ///                  \anchor Library_HasContent_Role_Composer
9322 ///                  _boolean_,
9323 ///     @return **True** if there are songs in the library which have composers.
9324 ///     <p><hr>
9325 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Composer `Library.HasContent(Role.Composer)`\endlink
9326 ///     <p>
9327 ///   }
9328 ///   \table_row3{   <b>`Library.HasContent(Role.Conductor)`</b>,
9329 ///                  \anchor Library_HasContent_Role_Conductor
9330 ///                  _boolean_,
9331 ///     @return **True** if there are songs in the library which have a conductor.
9332 ///     <p><hr>
9333 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Conductor `Library.HasContent(Role.Conductor)`\endlink
9334 ///     <p>
9335 ///   }
9336 ///   \table_row3{   <b>`Library.HasContent(Role.Orchestra)`</b>,
9337 ///                  \anchor Library_HasContent_Role_Orchestra
9338 ///                  _boolean_,
9339 ///     @return **True** if there are songs in the library which have an orchestra.
9340 ///     <p><hr>
9341 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Orchestra `Library.HasContent(Role.Orchestra)`\endlink
9342 ///     <p>
9343 ///   }
9344 ///   \table_row3{   <b>`Library.HasContent(Role.Lyricist)`</b>,
9345 ///                  \anchor Library_HasContent_Role_Lyricist
9346 ///                  _boolean_,
9347 ///     @return **True** if there are songs in the library which have a lyricist.
9348 ///     <p><hr>
9349 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Lyricist `Library.HasContent(Role.Lyricist)`\endlink
9350 ///     <p>
9351 ///   }
9352 ///   \table_row3{   <b>`Library.HasContent(Role.Remixer)`</b>,
9353 ///                  \anchor Library_HasContent_Role_Remixer
9354 ///                  _boolean_,
9355 ///     @return **True** if there are songs in the library which have a remixer.
9356 ///     <p><hr>
9357 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Remixer `Library.HasContent(Role.Remixer)`\endlink
9358 ///     <p>
9359 ///   }
9360 ///   \table_row3{   <b>`Library.HasContent(Role.Arranger)`</b>,
9361 ///                  \anchor Library_HasContent_Role_Remixer
9362 ///                  _boolean_,
9363 ///     @return **True** if there are songs in the library which have an arranger.
9364 ///     <p><hr>
9365 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Remixer `Library.HasContent(Role.Arranger)`\endlink
9366 ///     <p>
9367 ///   }
9368 ///   \table_row3{   <b>`Library.HasContent(Role.Engineer)`</b>,
9369 ///                  \anchor Library_HasContent_Role_Engineer
9370 ///                  _boolean_,
9371 ///     @return **True** if there are songs in the library which have an engineer.
9372 ///     <p><hr>
9373 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Engineer `Library.HasContent(Role.Engineer)`\endlink
9374 ///     <p>
9375 ///   }
9376 ///   \table_row3{   <b>`Library.HasContent(Role.Producer)`</b>,
9377 ///                  \anchor Library_HasContent_Role_Producer
9378 ///                  _boolean_,
9379 ///     @return **True** if there are songs in the library which have an producer.
9380 ///     <p><hr>
9381 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Producer `Library.HasContent(Role.Producer)`\endlink
9382 ///     <p>
9383 ///   }
9384 ///   \table_row3{   <b>`Library.HasContent(Role.DJMixer)`</b>,
9385 ///                  \anchor Library_HasContent_Role_DJMixer
9386 ///                  _boolean_,
9387 ///     @return **True** if there are songs in the library which have a DJMixer.
9388 ///     <p><hr>
9389 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_DJMixer `Library.HasContent(Role.DJMixer)`\endlink
9390 ///     <p>
9391 ///   }
9392 ///   \table_row3{   <b>`Library.HasContent(Role.Mixer)`</b>,
9393 ///                  \anchor Library_HasContent_Role_Mixer
9394 ///                  _boolean_,
9395 ///     @return **True** if there are songs in the library which have a mixer.
9396 ///     <p><hr>
9397 ///     @skinning_v17 **[New Boolean Condition]** \link Library_HasContent_Role_Mixer `Library.HasContent(Role.Mixer)`\endlink
9398 ///     <p>
9399 ///   }
9400 ///   \table_row3{   <b>`Library.HasContent(boxsets)`</b>,
9401 ///                  \anchor Library_HasContent_Boxsets
9402 ///                  _boolean_,
9403 ///     @return **True** if there are albums in the library which are boxsets.
9404 ///     <p><hr>
9405 ///     @skinning_v19 **[New Boolean Condition]** \link Library_HasContent_Boxsets `Library.HasContent(boxsets)`\endlink
9406 ///     <p>
9407 ///   }
9408 ///   \table_row3{   <b>`Library.HasNode(path)`</b>,
9409 ///                  \anchor Library_HasNode
9410 ///                  _boolean_,
9411 ///     @return **True** if there the node is present in the library.
9412 ///     <p><hr>
9413 ///     @skinning_v19 **[New Boolean Condition]** \link Library_HasNode `Library.HasNode(path)`\endlink
9414 ///     <p>
9415 ///   }
9416 /// \table_end
9417 ///
9418 /// -----------------------------------------------------------------------------
9419 
9420 
9421 /// \page modules__infolabels_boolean_conditions
9422 /// \section modules_rm_infolabels_booleans Additional revision history for Infolabels and Boolean Conditions
9423 /// <hr>
9424 /// \subsection modules_rm_infolabels_booleans_v19 Kodi v19 (Matrix)
9425 /// @skinning_v19 **[Removed Infolabels]** The following infolabels have been removed:
9426 ///   - `System.Platform.Linux.RaspberryPi` - use \link System_Platform_Linux `System.Platform.Linux`\endlink instead
9427 ///
9428 /// <hr>
9429 /// \subsection modules_rm_infolabels_booleans_v18 Kodi v18 (Leia)
9430 ///
9431 /// @skinning_v18 **[Removed Infolabels]** The following infolabels have been removed:
9432 ///   - `Listitem.Property(artistthumbs)`, `Listitem.Property(artistthumb)` - use
9433 /// \link ListItem_Art_Type `ListItem.Art(type)`\endlink with <b>albumartist[n].*</b> or <b>artist[n].*</b> as <b>type</b>
9434 ///   - `ADSP.ActiveStreamType`
9435 ///   - `ADSP.DetectedStreamType`
9436 ///   - `ADSP.MasterName`
9437 ///   - `ADSP.MasterInfo`
9438 ///   - `ADSP.MasterOwnIcon`
9439 ///   - `ADSP.MasterOverrideIcon`
9440 ///   - `ListItem.ChannelNumber`, `ListItem.SubChannelNumber`, `MusicPlayer.ChannelNumber`,
9441 /// `MusicPlayer.SubChannelNumber`, `VideoPlayer.ChannelNumber`,
9442 /// `VideoPlayer.SubChannelNumber`. Please use the following alternatives
9443 /// \link ListItem_ChannelNumberLabel `ListItem.ChannelNumberLabel` \endlink,
9444 /// \link MusicPlayer_ChannelNumberLabel `MusicPlayer.ChannelNumberLabel` \endlink
9445 /// \link VideoPlayer_ChannelNumberLabel `VideoPlayer.ChannelNumberLabel` \endlink from now on.
9446 ///
9447 /// @skinning_v18 **[Removed Boolean Conditions]** The following infobools have been removed:
9448 ///   - `System.HasModalDialog`  - use \link System_HasActiveModalDialog `System.HasActiveModalDialog` \endlink and
9449 ///  \link System_HasVisibleModalDialog `System.HasVisibleModalDialog`\endlink instead
9450 ///   - `StringCompare()` - use \link String_IsEqual `String.IsEqual(info,string)`\endlink instead
9451 ///   - `SubString()` - use \link String_Contains `String.Contains(info,substring)`\endlink instead
9452 ///   - `IntegerGreaterThan()` - use \link Integer_IsGreater `Integer.IsGreater(info,number)`\endlink instead
9453 ///   - `IsEmpty()` - use \link String_IsEmpty `String.IsEmpty(info)`\endlink instead
9454 ///   - `System.HasADSP`
9455 ///   - `ADSP.IsActive`
9456 ///   - `ADSP.HasInputResample`
9457 ///   - `ADSP.HasPreProcess`
9458 ///   - `ADSP.HasMasterProcess`
9459 ///   - `ADSP.HasPostProcess`
9460 ///   - `ADSP.HasOutputResample`
9461 ///   - `ADSP.MasterActive`
9462 /// <hr>
9463 /// \subsection modules_rm_infolabels_booleans_v17 Kodi v17 (Krypton)
9464 /// @skinning_v17 **[Removed Infolabels]** The following infolabels have been removed:
9465 ///   - `ListItem.StarRating` - use the other ratings instead.
9466 ///
9467 /// @skinning_v17 **[Removed Boolean Conditions]** The following infobools have been removed:
9468 ///   - `on`  - use `true` instead
9469 ///   - `off`  - use `false` instead
9470 ///   - `Player.ShowCodec`
9471 ///   - `System.GetBool(pvrmanager.enabled)`
9472 /// <hr>
9473 /// \subsection modules_rm_infolabels_booleans_v16 Kodi v16 (Jarvis)
9474 ///  @skinning_v16 **[New Boolean Conditions]** The following infobools were added:
9475 ///    - `System.HasADSP`
9476 ///    - `ADSP.IsActive`
9477 ///    - `ADSP.HasInputResample`
9478 ///    - `ADSP.HasPreProcess`
9479 ///    - `ADSP.HasMasterProcess`
9480 ///    - `ADSP.HasPostProcess`
9481 ///    - `ADSP.HasOutputResample`
9482 ///    - `ADSP.MasterActive`
9483 ///    - `System.HasModalDialog`
9484 ///
9485 ///  @skinning_v16 **[New Infolabels]** The following infolabels were added:
9486 ///    - `ADSP.ActiveStreamType`
9487 ///    - `ADSP.DetectedStreamType`
9488 ///    - `ADSP.MasterName`
9489 ///    - `ADSP.MasterInfo`
9490 ///    - `ADSP.MasterOwnIcon`
9491 ///    - `ADSP.MasterOverrideIcon`
9492 ///
9493 ///   @skinning_v16 **[Removed Boolean Conditions]** The following infobols were removed:
9494 ///    - `System.Platform.ATV2`
9495 
9496 /// <hr>
9497 /// \subsection modules_rm_infolabels_booleans_v15 Kodi v15 (Isengard)
9498 /// <hr>
9499 /// \subsection modules_rm_infolabels_booleans_v14 Kodi v14 (Helix)
9500 ///  @skinning_v14 **[New Infolabels]** The following infolabels were added:
9501 ///    - `ListItem.SubChannelNumber`
9502 ///    - `MusicPlayer.SubChannelNumber`
9503 ///    - `VideoPlayer.SubChannelNumber`
9504 ///
9505 /// <hr>
9506 /// \subsection modules_rm_infolabels_booleans_v13 XBMC v13 (Gotham)
9507 ///   @skinning_v13 **[Removed Infolabels]** The following infolabels were removed:
9508 ///    - `Network.SubnetAddress`
9509 ///
9510 /// <hr>
9511 // Crazy part, to use tableofcontents must it be on end
9512 /// \page modules__infolabels_boolean_conditions
9513 /// \tableofcontents
9514 
Property(const std::string & property,const std::string & parameters)9515 CGUIInfoManager::Property::Property(const std::string &property, const std::string &parameters)
9516 : name(property)
9517 {
9518   CUtil::SplitParams(parameters, params);
9519 }
9520 
param(unsigned int n) const9521 const std::string &CGUIInfoManager::Property::param(unsigned int n /* = 0 */) const
9522 {
9523   if (n < params.size())
9524     return params[n];
9525   return StringUtils::Empty;
9526 }
9527 
num_params() const9528 unsigned int CGUIInfoManager::Property::num_params() const
9529 {
9530   return params.size();
9531 }
9532 
SplitInfoString(const std::string & infoString,std::vector<Property> & info)9533 void CGUIInfoManager::SplitInfoString(const std::string &infoString, std::vector<Property> &info)
9534 {
9535   // our string is of the form:
9536   // category[(params)][.info(params).info2(params)] ...
9537   // so we need to split on . while taking into account of () pairs
9538   unsigned int parentheses = 0;
9539   std::string property;
9540   std::string param;
9541   for (size_t i = 0; i < infoString.size(); ++i)
9542   {
9543     if (infoString[i] == '(')
9544     {
9545       if (!parentheses++)
9546         continue;
9547     }
9548     else if (infoString[i] == ')')
9549     {
9550       if (!parentheses)
9551         CLog::Log(LOGERROR, "unmatched parentheses in %s", infoString.c_str());
9552       else if (!--parentheses)
9553         continue;
9554     }
9555     else if (infoString[i] == '.' && !parentheses)
9556     {
9557       if (!property.empty()) // add our property and parameters
9558       {
9559         StringUtils::ToLower(property);
9560         info.emplace_back(Property(property, param));
9561       }
9562       property.clear();
9563       param.clear();
9564       continue;
9565     }
9566     if (parentheses)
9567       param += infoString[i];
9568     else
9569       property += infoString[i];
9570   }
9571 
9572   if (parentheses)
9573     CLog::Log(LOGERROR, "unmatched parentheses in %s", infoString.c_str());
9574 
9575   if (!property.empty())
9576   {
9577     StringUtils::ToLower(property);
9578     info.emplace_back(Property(property, param));
9579   }
9580 }
9581 
9582 /// \brief Translates a string as given by the skin into an int that we use for more
9583 /// efficient retrieval of data.
TranslateSingleString(const std::string & strCondition)9584 int CGUIInfoManager::TranslateSingleString(const std::string &strCondition)
9585 {
9586   bool listItemDependent;
9587   return TranslateSingleString(strCondition, listItemDependent);
9588 }
9589 
TranslateSingleString(const std::string & strCondition,bool & listItemDependent)9590 int CGUIInfoManager::TranslateSingleString(const std::string &strCondition, bool &listItemDependent)
9591 {
9592   /* We need to disable caching in INFO::InfoBool::Get if either of the following are true:
9593    *  1. if condition is between LISTITEM_START and LISTITEM_END
9594    *  2. if condition is string or integer the corresponding label is between LISTITEM_START and LISTITEM_END
9595    *  This is achieved by setting the bool pointed at by listItemDependent, either here or in a recursive call
9596    */
9597   // trim whitespaces
9598   std::string strTest = strCondition;
9599   StringUtils::Trim(strTest);
9600 
9601   std::vector< Property> info;
9602   SplitInfoString(strTest, info);
9603 
9604   if (info.empty())
9605     return 0;
9606 
9607   const Property &cat = info[0];
9608   if (info.size() == 1)
9609   { // single category
9610     if (cat.name == "false" || cat.name == "no")
9611       return SYSTEM_ALWAYS_FALSE;
9612     else if (cat.name == "true" || cat.name == "yes")
9613       return SYSTEM_ALWAYS_TRUE;
9614   }
9615   else if (info.size() == 2)
9616   {
9617     const Property &prop = info[1];
9618     if (cat.name == "string")
9619     {
9620       if (prop.name == "isempty")
9621       {
9622         return AddMultiInfo(CGUIInfo(STRING_IS_EMPTY, TranslateSingleString(prop.param(), listItemDependent)));
9623       }
9624       else if (prop.num_params() == 2)
9625       {
9626         for (const infomap& string_bool : string_bools)
9627         {
9628           if (prop.name == string_bool.str)
9629           {
9630             int data1 = TranslateSingleString(prop.param(0), listItemDependent);
9631             // pipe our original string through the localize parsing then make it lowercase (picks up $LBRACKET etc.)
9632             std::string label = CGUIInfoLabel::GetLabel(prop.param(1));
9633             StringUtils::ToLower(label);
9634             // 'true', 'false', 'yes', 'no' are valid strings, do not resolve them to SYSTEM_ALWAYS_TRUE or SYSTEM_ALWAYS_FALSE
9635             if (label != "true" && label != "false" && label != "yes" && label != "no")
9636             {
9637               int data2 = TranslateSingleString(prop.param(1), listItemDependent);
9638               if (data2 > 0)
9639                 return AddMultiInfo(CGUIInfo(string_bool.val, data1, -data2));
9640             }
9641             return AddMultiInfo(CGUIInfo(string_bool.val, data1, label));
9642           }
9643         }
9644       }
9645     }
9646     if (cat.name == "integer")
9647     {
9648       for (const infomap& integer_bool : integer_bools)
9649       {
9650         if (prop.name == integer_bool.str)
9651         {
9652           int data1 = TranslateSingleString(prop.param(0), listItemDependent);
9653           int data2 = atoi(prop.param(1).c_str());
9654           return AddMultiInfo(CGUIInfo(integer_bool.val, data1, data2));
9655         }
9656       }
9657     }
9658     else if (cat.name == "player")
9659     {
9660       for (const infomap& player_label : player_labels)
9661       {
9662         if (prop.name == player_label.str)
9663           return player_label.val;
9664       }
9665       for (const infomap& player_time : player_times)
9666       {
9667         if (prop.name == player_time.str)
9668           return AddMultiInfo(CGUIInfo(player_time.val, TranslateTimeFormat(prop.param())));
9669       }
9670       if (prop.name == "process" && prop.num_params())
9671       {
9672         for (const infomap& player_proces : player_process)
9673         {
9674           if (StringUtils::EqualsNoCase(prop.param(), player_proces.str))
9675             return player_proces.val;
9676         }
9677       }
9678       if (prop.num_params() == 1)
9679       {
9680         for (const infomap& i : player_param)
9681         {
9682           if (prop.name == i.str)
9683             return AddMultiInfo(CGUIInfo(i.val, prop.param()));
9684         }
9685       }
9686     }
9687     else if (cat.name == "weather")
9688     {
9689       for (const infomap& i : weather)
9690       {
9691         if (prop.name == i.str)
9692           return i.val;
9693       }
9694     }
9695     else if (cat.name == "network")
9696     {
9697       for (const infomap& network_label : network_labels)
9698       {
9699         if (prop.name == network_label.str)
9700           return network_label.val;
9701       }
9702     }
9703     else if (cat.name == "musicpartymode")
9704     {
9705       for (const infomap& i : musicpartymode)
9706       {
9707         if (prop.name == i.str)
9708           return i.val;
9709       }
9710     }
9711     else if (cat.name == "system")
9712     {
9713       for (const infomap& system_label : system_labels)
9714       {
9715         if (prop.name == system_label.str)
9716           return system_label.val;
9717       }
9718       if (prop.num_params() == 1)
9719       {
9720         const std::string &param = prop.param();
9721         if (prop.name == "getbool")
9722         {
9723           std::string paramCopy = param;
9724           StringUtils::ToLower(paramCopy);
9725           return AddMultiInfo(CGUIInfo(SYSTEM_GET_BOOL, paramCopy));
9726         }
9727         for (const infomap& i : system_param)
9728         {
9729           if (prop.name == i.str)
9730             return AddMultiInfo(CGUIInfo(i.val, param));
9731         }
9732         if (prop.name == "memory")
9733         {
9734           if (param == "free")
9735             return SYSTEM_FREE_MEMORY;
9736           else if (param == "free.percent")
9737             return SYSTEM_FREE_MEMORY_PERCENT;
9738           else if (param == "used")
9739             return SYSTEM_USED_MEMORY;
9740           else if (param == "used.percent")
9741             return SYSTEM_USED_MEMORY_PERCENT;
9742           else if (param == "total")
9743             return SYSTEM_TOTAL_MEMORY;
9744         }
9745         else if (prop.name == "addontitle")
9746         {
9747           // Example: System.AddonTitle(Skin.String(HomeVideosButton1)) => skin string HomeVideosButton1 holds an addon identifier string
9748           int infoLabel = TranslateSingleString(param, listItemDependent);
9749           if (infoLabel > 0)
9750             return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_TITLE, infoLabel, 0));
9751           std::string label = CGUIInfoLabel::GetLabel(param);
9752           StringUtils::ToLower(label);
9753           return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_TITLE, label, 1));
9754         }
9755         else if (prop.name == "addonicon")
9756         {
9757           int infoLabel = TranslateSingleString(param, listItemDependent);
9758           if (infoLabel > 0)
9759             return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_ICON, infoLabel, 0));
9760           std::string label = CGUIInfoLabel::GetLabel(param);
9761           StringUtils::ToLower(label);
9762           return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_ICON, label, 1));
9763         }
9764         else if (prop.name == "addonversion")
9765         {
9766           int infoLabel = TranslateSingleString(param, listItemDependent);
9767           if (infoLabel > 0)
9768             return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_VERSION, infoLabel, 0));
9769           std::string label = CGUIInfoLabel::GetLabel(param);
9770           StringUtils::ToLower(label);
9771           return AddMultiInfo(CGUIInfo(SYSTEM_ADDON_VERSION, label, 1));
9772         }
9773         else if (prop.name == "idletime")
9774           return AddMultiInfo(CGUIInfo(SYSTEM_IDLE_TIME, atoi(param.c_str())));
9775       }
9776       if (prop.name == "alarmlessorequal" && prop.num_params() == 2)
9777         return AddMultiInfo(CGUIInfo(SYSTEM_ALARM_LESS_OR_EQUAL, prop.param(0), atoi(prop.param(1).c_str())));
9778       else if (prop.name == "date")
9779       {
9780         if (prop.num_params() == 2)
9781           return AddMultiInfo(CGUIInfo(SYSTEM_DATE, StringUtils::DateStringToYYYYMMDD(prop.param(0)) % 10000, StringUtils::DateStringToYYYYMMDD(prop.param(1)) % 10000));
9782         else if (prop.num_params() == 1)
9783         {
9784           int dateformat = StringUtils::DateStringToYYYYMMDD(prop.param(0));
9785           if (dateformat <= 0) // not concrete date
9786             return AddMultiInfo(CGUIInfo(SYSTEM_DATE, prop.param(0), -1));
9787           else
9788             return AddMultiInfo(CGUIInfo(SYSTEM_DATE, dateformat % 10000));
9789         }
9790         return SYSTEM_DATE;
9791       }
9792       else if (prop.name == "time")
9793       {
9794         if (prop.num_params() == 0)
9795           return AddMultiInfo(CGUIInfo(SYSTEM_TIME, TIME_FORMAT_GUESS));
9796         if (prop.num_params() == 1)
9797         {
9798           TIME_FORMAT timeFormat = TranslateTimeFormat(prop.param(0));
9799           if (timeFormat == TIME_FORMAT_GUESS)
9800             return AddMultiInfo(CGUIInfo(SYSTEM_TIME, StringUtils::TimeStringToSeconds(prop.param(0))));
9801           return AddMultiInfo(CGUIInfo(SYSTEM_TIME, timeFormat));
9802         }
9803         else
9804           return AddMultiInfo(CGUIInfo(SYSTEM_TIME, StringUtils::TimeStringToSeconds(prop.param(0)), StringUtils::TimeStringToSeconds(prop.param(1))));
9805       }
9806     }
9807     else if (cat.name == "library")
9808     {
9809       if (prop.name == "isscanning")
9810         return LIBRARY_IS_SCANNING;
9811       else if (prop.name == "isscanningvideo")
9812         return LIBRARY_IS_SCANNING_VIDEO; //! @todo change to IsScanning(Video)
9813       else if (prop.name == "isscanningmusic")
9814         return LIBRARY_IS_SCANNING_MUSIC;
9815       else if (prop.name == "hascontent" && prop.num_params())
9816       {
9817         std::string cat = prop.param(0);
9818         StringUtils::ToLower(cat);
9819         if (cat == "music")
9820           return LIBRARY_HAS_MUSIC;
9821         else if (cat == "video")
9822           return LIBRARY_HAS_VIDEO;
9823         else if (cat == "movies")
9824           return LIBRARY_HAS_MOVIES;
9825         else if (cat == "tvshows")
9826           return LIBRARY_HAS_TVSHOWS;
9827         else if (cat == "musicvideos")
9828           return LIBRARY_HAS_MUSICVIDEOS;
9829         else if (cat == "moviesets")
9830           return LIBRARY_HAS_MOVIE_SETS;
9831         else if (cat == "singles")
9832           return LIBRARY_HAS_SINGLES;
9833         else if (cat == "compilations")
9834           return LIBRARY_HAS_COMPILATIONS;
9835         else if (cat == "boxsets")
9836           return LIBRARY_HAS_BOXSETS;
9837         else if (cat == "role" && prop.num_params() > 1)
9838           return AddMultiInfo(CGUIInfo(LIBRARY_HAS_ROLE, prop.param(1), 0));
9839       }
9840       else if (prop.name == "hasnode" && prop.num_params())
9841       {
9842         std::string node = prop.param(0);
9843         StringUtils::ToLower(node);
9844         return AddMultiInfo(CGUIInfo(LIBRARY_HAS_NODE, prop.param(), 0));
9845       }
9846     }
9847     else if (cat.name == "musicplayer")
9848     {
9849       for (const infomap& player_time : player_times) //! @todo remove these, they're repeats
9850       {
9851         if (prop.name == player_time.str)
9852           return AddMultiInfo(CGUIInfo(player_time.val, TranslateTimeFormat(prop.param())));
9853       }
9854       if (prop.name == "content" && prop.num_params())
9855         return AddMultiInfo(CGUIInfo(MUSICPLAYER_CONTENT, prop.param(), 0));
9856       else if (prop.name == "property")
9857       {
9858         if (StringUtils::EqualsNoCase(prop.param(), "fanart_image"))
9859           return AddMultiInfo(CGUIInfo(PLAYER_ITEM_ART, "fanart"));
9860 
9861         return AddMultiInfo(CGUIInfo(MUSICPLAYER_PROPERTY, prop.param()));
9862       }
9863       return TranslateMusicPlayerString(prop.name);
9864     }
9865     else if (cat.name == "videoplayer")
9866     {
9867       if (prop.name != "starttime") // player.starttime is semantically different from videoplayer.starttime which has its own implementation!
9868       {
9869         for (const infomap& player_time : player_times) //! @todo remove these, they're repeats
9870         {
9871           if (prop.name == player_time.str)
9872             return AddMultiInfo(CGUIInfo(player_time.val, TranslateTimeFormat(prop.param())));
9873         }
9874       }
9875       if (prop.name == "content" && prop.num_params())
9876       {
9877         return AddMultiInfo(CGUIInfo(VIDEOPLAYER_CONTENT, prop.param(), 0));
9878       }
9879       if (prop.name == "uniqueid" && prop.num_params())
9880       {
9881         return AddMultiInfo(CGUIInfo(VIDEOPLAYER_UNIQUEID, prop.param(), 0));
9882       }
9883       return TranslateVideoPlayerString(prop.name);
9884     }
9885     else if (cat.name == "retroplayer")
9886     {
9887       for (const infomap& i : retroplayer)
9888       {
9889         if (prop.name == i.str)
9890           return i.val;
9891       }
9892     }
9893     else if (cat.name == "slideshow")
9894     {
9895       for (const infomap& i : slideshow)
9896       {
9897         if (prop.name == i.str)
9898           return i.val;
9899       }
9900     }
9901     else if (cat.name == "container")
9902     {
9903       for (const infomap& i : mediacontainer) // these ones don't have or need an id
9904       {
9905         if (prop.name == i.str)
9906           return i.val;
9907       }
9908       int id = atoi(cat.param().c_str());
9909       for (const infomap& container_bool : container_bools) // these ones can have an id (but don't need to?)
9910       {
9911         if (prop.name == container_bool.str)
9912           return id ? AddMultiInfo(CGUIInfo(container_bool.val, id)) : container_bool.val;
9913       }
9914       for (const infomap& container_int : container_ints) // these ones can have an int param on the property
9915       {
9916         if (prop.name == container_int.str)
9917           return AddMultiInfo(CGUIInfo(container_int.val, id, atoi(prop.param().c_str())));
9918       }
9919       for (const infomap& i : container_str) // these ones have a string param on the property
9920       {
9921         if (prop.name == i.str)
9922           return AddMultiInfo(CGUIInfo(i.val, id, prop.param()));
9923       }
9924       if (prop.name == "sortdirection")
9925       {
9926         SortOrder order = SortOrderNone;
9927         if (StringUtils::EqualsNoCase(prop.param(), "ascending"))
9928           order = SortOrderAscending;
9929         else if (StringUtils::EqualsNoCase(prop.param(), "descending"))
9930           order = SortOrderDescending;
9931         return AddMultiInfo(CGUIInfo(CONTAINER_SORT_DIRECTION, order));
9932       }
9933     }
9934     else if (cat.name == "listitem" ||
9935              cat.name == "listitemposition" ||
9936              cat.name == "listitemnowrap" ||
9937              cat.name == "listitemabsolute")
9938     {
9939       int ret = TranslateListItem(cat, prop, 0, false);
9940       if (ret)
9941         listItemDependent = true;
9942       return ret;
9943     }
9944     else if (cat.name == "visualisation")
9945     {
9946       for (const infomap& i : visualisation)
9947       {
9948         if (prop.name == i.str)
9949           return i.val;
9950       }
9951     }
9952     else if (cat.name == "fanart")
9953     {
9954       for (const infomap& fanart_label : fanart_labels)
9955       {
9956         if (prop.name == fanart_label.str)
9957           return fanart_label.val;
9958       }
9959     }
9960     else if (cat.name == "skin")
9961     {
9962       for (const infomap& skin_label : skin_labels)
9963       {
9964         if (prop.name == skin_label.str)
9965           return skin_label.val;
9966       }
9967       if (prop.num_params())
9968       {
9969         if (prop.name == "string")
9970         {
9971           if (prop.num_params() == 2)
9972             return AddMultiInfo(CGUIInfo(SKIN_STRING_IS_EQUAL, CSkinSettings::GetInstance().TranslateString(prop.param(0)), prop.param(1)));
9973           else
9974             return AddMultiInfo(CGUIInfo(SKIN_STRING, CSkinSettings::GetInstance().TranslateString(prop.param(0))));
9975         }
9976         if (prop.name == "hassetting")
9977           return AddMultiInfo(CGUIInfo(SKIN_BOOL, CSkinSettings::GetInstance().TranslateBool(prop.param(0))));
9978         else if (prop.name == "hastheme")
9979           return AddMultiInfo(CGUIInfo(SKIN_HAS_THEME, prop.param(0)));
9980       }
9981     }
9982     else if (cat.name == "window")
9983     {
9984       if (prop.name == "property" && prop.num_params() == 1)
9985       { //! @todo this doesn't support foo.xml
9986         int winID = cat.param().empty() ? 0 : CWindowTranslator::TranslateWindow(cat.param());
9987         if (winID != WINDOW_INVALID)
9988           return AddMultiInfo(CGUIInfo(WINDOW_PROPERTY, winID, prop.param()));
9989       }
9990       for (const infomap& window_bool : window_bools)
9991       {
9992         if (prop.name == window_bool.str)
9993         { //! @todo The parameter for these should really be on the first not the second property
9994           if (prop.param().find("xml") != std::string::npos)
9995             return AddMultiInfo(CGUIInfo(window_bool.val, 0, prop.param()));
9996           int winID = prop.param().empty() ? WINDOW_INVALID : CWindowTranslator::TranslateWindow(prop.param());
9997           return AddMultiInfo(CGUIInfo(window_bool.val, winID, 0));
9998         }
9999       }
10000     }
10001     else if (cat.name == "control")
10002     {
10003       for (const infomap& control_label : control_labels)
10004       {
10005         if (prop.name == control_label.str)
10006         { //! @todo The parameter for these should really be on the first not the second property
10007           int controlID = atoi(prop.param().c_str());
10008           if (controlID)
10009             return AddMultiInfo(CGUIInfo(control_label.val, controlID, 0));
10010           return 0;
10011         }
10012       }
10013     }
10014     else if (cat.name == "controlgroup" && prop.name == "hasfocus")
10015     {
10016       int groupID = atoi(cat.param().c_str());
10017       if (groupID)
10018         return AddMultiInfo(CGUIInfo(CONTROL_GROUP_HAS_FOCUS, groupID, atoi(prop.param(0).c_str())));
10019     }
10020     else if (cat.name == "playlist")
10021     {
10022       int ret = -1;
10023       for (const infomap& i : playlist)
10024       {
10025         if (prop.name == i.str)
10026         {
10027           ret = i.val;
10028           break;
10029         }
10030       }
10031       if (ret >= 0)
10032       {
10033         if (prop.num_params() <= 0)
10034           return ret;
10035         else
10036         {
10037           int playlistid = PLAYLIST_NONE;
10038           if (StringUtils::EqualsNoCase(prop.param(), "video"))
10039             playlistid = PLAYLIST_VIDEO;
10040           else if (StringUtils::EqualsNoCase(prop.param(), "music"))
10041             playlistid = PLAYLIST_MUSIC;
10042 
10043           if (playlistid > PLAYLIST_NONE)
10044             return AddMultiInfo(CGUIInfo(ret, playlistid, 1));
10045         }
10046       }
10047     }
10048     else if (cat.name == "pvr")
10049     {
10050       for (const infomap& i : pvr)
10051       {
10052         if (prop.name == i.str)
10053           return i.val;
10054       }
10055       for (const infomap& pvr_time : pvr_times)
10056       {
10057         if (prop.name == pvr_time.str)
10058           return AddMultiInfo(CGUIInfo(pvr_time.val, TranslateTimeFormat(prop.param())));
10059       }
10060     }
10061     else if (cat.name == "rds")
10062     {
10063       if (prop.name == "getline")
10064         return AddMultiInfo(CGUIInfo(RDS_GET_RADIOTEXT_LINE, atoi(prop.param(0).c_str())));
10065 
10066       for (const infomap& rd : rds)
10067       {
10068         if (prop.name == rd.str)
10069           return rd.val;
10070       }
10071     }
10072   }
10073   else if (info.size() == 3 || info.size() == 4)
10074   {
10075     if (info[0].name == "system" && info[1].name == "platform")
10076     { //! @todo replace with a single system.platform
10077       std::string platform = info[2].name;
10078       if (platform == "linux")
10079         return SYSTEM_PLATFORM_LINUX;
10080       else if (platform == "windows")
10081         return SYSTEM_PLATFORM_WINDOWS;
10082       else if (platform == "uwp")
10083         return SYSTEM_PLATFORM_UWP;
10084       else if (platform == "darwin")
10085         return SYSTEM_PLATFORM_DARWIN;
10086       else if (platform == "osx")
10087         return SYSTEM_PLATFORM_DARWIN_OSX;
10088       else if (platform == "ios")
10089         return SYSTEM_PLATFORM_DARWIN_IOS;
10090       else if (platform == "tvos")
10091         return SYSTEM_PLATFORM_DARWIN_TVOS;
10092       else if (platform == "android")
10093         return SYSTEM_PLATFORM_ANDROID;
10094     }
10095     if (info[0].name == "musicplayer")
10096     { //! @todo these two don't allow duration(foo) and also don't allow more than this number of levels...
10097       if (info[1].name == "position")
10098       {
10099         int position = atoi(info[1].param().c_str());
10100         int value = TranslateMusicPlayerString(info[2].name); // musicplayer.position(foo).bar
10101         return AddMultiInfo(CGUIInfo(value, 2, position)); // 2 => absolute (0 used for not set)
10102       }
10103       else if (info[1].name == "offset")
10104       {
10105         int position = atoi(info[1].param().c_str());
10106         int value = TranslateMusicPlayerString(info[2].name); // musicplayer.offset(foo).bar
10107         return AddMultiInfo(CGUIInfo(value, 1, position)); // 1 => relative
10108       }
10109     }
10110     else if (info[0].name == "videoplayer")
10111     { //! @todo these two don't allow duration(foo) and also don't allow more than this number of levels...
10112       if (info[1].name == "position")
10113       {
10114         int position = atoi(info[1].param().c_str());
10115         int value = TranslateVideoPlayerString(info[2].name); // videoplayer.position(foo).bar
10116         return AddMultiInfo(CGUIInfo(value, 2, position)); // 2 => absolute (0 used for not set)
10117       }
10118       else if (info[1].name == "offset")
10119       {
10120         int position = atoi(info[1].param().c_str());
10121         int value = TranslateVideoPlayerString(info[2].name); // videoplayer.offset(foo).bar
10122         return AddMultiInfo(CGUIInfo(value, 1, position)); // 1 => relative
10123       }
10124     }
10125     else if (info[0].name == "player")
10126     { //! @todo these two don't allow duration(foo) and also don't allow more than this number of levels...
10127       if (info[1].name == "position")
10128       {
10129         int position = atoi(info[1].param().c_str());
10130         int value = TranslatePlayerString(info[2].name); // player.position(foo).bar
10131         return AddMultiInfo(CGUIInfo(value, 2, position)); // 2 => absolute (0 used for not set)
10132       }
10133       else if (info[1].name == "offset")
10134       {
10135         int position = atoi(info[1].param().c_str());
10136         int value = TranslatePlayerString(info[2].name); // player.offset(foo).bar
10137         return AddMultiInfo(CGUIInfo(value, 1, position)); // 1 => relative
10138       }
10139     }
10140     else if (info[0].name == "container")
10141     {
10142       if (info[1].name == "listitem" ||
10143           info[1].name == "listitemposition" ||
10144           info[1].name == "listitemabsolute" ||
10145           info[1].name == "listitemnowrap")
10146       {
10147         int id = atoi(info[0].param().c_str());
10148         int ret = TranslateListItem(info[1], info[2], id, true);
10149         if (ret)
10150           listItemDependent = true;
10151         return ret;
10152       }
10153     }
10154     else if (info[0].name == "control")
10155     {
10156       const Property &prop = info[1];
10157       for (const infomap& control_label : control_labels)
10158       {
10159         if (prop.name == control_label.str)
10160         { //! @todo The parameter for these should really be on the first not the second property
10161           int controlID = atoi(prop.param().c_str());
10162           if (controlID)
10163             return AddMultiInfo(CGUIInfo(control_label.val, controlID, atoi(info[2].param(0).c_str())));
10164           return 0;
10165         }
10166       }
10167     }
10168   }
10169 
10170   return 0;
10171 }
10172 
TranslateListItem(const Property & cat,const Property & prop,int id,bool container)10173 int CGUIInfoManager::TranslateListItem(const Property& cat, const Property& prop, int id, bool container)
10174 {
10175   int ret = 0;
10176   std::string data3;
10177   int data4 = 0;
10178   if (prop.num_params() == 1)
10179   {
10180     // special case: map 'property(fanart_image)' to 'art(fanart)'
10181     if (prop.name == "property" && StringUtils::EqualsNoCase(prop.param(), "fanart_image"))
10182     {
10183       ret = LISTITEM_ART;
10184       data3 = "fanart";
10185     }
10186     else if (prop.name == "property" ||
10187              prop.name == "art" ||
10188              prop.name == "rating" ||
10189              prop.name == "votes" ||
10190              prop.name == "ratingandvotes" ||
10191              prop.name == "uniqueid")
10192     {
10193       data3 = prop.param();
10194     }
10195     else if (prop.name == "duration" || prop.name == "nextduration")
10196     {
10197       data4 = TranslateTimeFormat(prop.param());
10198     }
10199   }
10200 
10201   if (ret == 0)
10202   {
10203     for (const infomap& listitem_label : listitem_labels) // these ones don't have or need an id
10204     {
10205       if (prop.name == listitem_label.str)
10206       {
10207         ret = listitem_label.val;
10208         break;
10209       }
10210     }
10211   }
10212 
10213   if (ret)
10214   {
10215     int offset = std::atoi(cat.param().c_str());
10216 
10217     int flags = 0;
10218     if (cat.name == "listitem")
10219       flags = INFOFLAG_LISTITEM_WRAP;
10220     else if (cat.name == "listitemposition")
10221       flags = INFOFLAG_LISTITEM_POSITION;
10222     else if (cat.name == "listitemabsolute")
10223       flags = INFOFLAG_LISTITEM_ABSOLUTE;
10224     else if (cat.name == "listitemnowrap")
10225       flags = INFOFLAG_LISTITEM_NOWRAP;
10226 
10227     if (container)
10228       flags |= INFOFLAG_LISTITEM_CONTAINER;
10229 
10230     return AddMultiInfo(CGUIInfo(ret, id, offset, flags, data3, data4));
10231   }
10232 
10233   return 0;
10234 }
10235 
TranslateMusicPlayerString(const std::string & info) const10236 int CGUIInfoManager::TranslateMusicPlayerString(const std::string &info) const
10237 {
10238   for (const infomap& i : musicplayer)
10239   {
10240     if (info == i.str)
10241       return i.val;
10242   }
10243   return 0;
10244 }
10245 
TranslateVideoPlayerString(const std::string & info) const10246 int CGUIInfoManager::TranslateVideoPlayerString(const std::string& info) const
10247 {
10248   for (const infomap& i : videoplayer)
10249   {
10250     if (info == i.str)
10251       return i.val;
10252   }
10253   return 0;
10254 }
10255 
TranslatePlayerString(const std::string & info) const10256 int CGUIInfoManager::TranslatePlayerString(const std::string& info) const
10257 {
10258   for (const infomap& i : player_labels)
10259   {
10260     if (info == i.str)
10261       return i.val;
10262   }
10263   return 0;
10264 }
10265 
TranslateTimeFormat(const std::string & format)10266 TIME_FORMAT CGUIInfoManager::TranslateTimeFormat(const std::string &format)
10267 {
10268   if (format.empty())
10269     return TIME_FORMAT_GUESS;
10270   else if (StringUtils::EqualsNoCase(format, "hh"))
10271     return TIME_FORMAT_HH;
10272   else if (StringUtils::EqualsNoCase(format, "mm"))
10273     return TIME_FORMAT_MM;
10274   else if (StringUtils::EqualsNoCase(format, "ss"))
10275     return TIME_FORMAT_SS;
10276   else if (StringUtils::EqualsNoCase(format, "hh:mm"))
10277     return TIME_FORMAT_HH_MM;
10278   else if (StringUtils::EqualsNoCase(format, "mm:ss"))
10279     return TIME_FORMAT_MM_SS;
10280   else if (StringUtils::EqualsNoCase(format, "hh:mm:ss"))
10281     return TIME_FORMAT_HH_MM_SS;
10282   else if (StringUtils::EqualsNoCase(format, "hh:mm:ss xx"))
10283     return TIME_FORMAT_HH_MM_SS_XX;
10284   else if (StringUtils::EqualsNoCase(format, "h"))
10285     return TIME_FORMAT_H;
10286   else if (StringUtils::EqualsNoCase(format, "m"))
10287     return TIME_FORMAT_M;
10288   else if (StringUtils::EqualsNoCase(format, "h:mm:ss"))
10289     return TIME_FORMAT_H_MM_SS;
10290   else if (StringUtils::EqualsNoCase(format, "h:mm:ss xx"))
10291     return TIME_FORMAT_H_MM_SS_XX;
10292   else if (StringUtils::EqualsNoCase(format, "xx"))
10293     return TIME_FORMAT_XX;
10294   else if (StringUtils::EqualsNoCase(format, "secs"))
10295     return TIME_FORMAT_SECS;
10296   else if (StringUtils::EqualsNoCase(format, "mins"))
10297     return TIME_FORMAT_MINS;
10298   else if (StringUtils::EqualsNoCase(format, "hours"))
10299     return TIME_FORMAT_HOURS;
10300   return TIME_FORMAT_GUESS;
10301 }
10302 
GetLabel(int info,int contextWindow,std::string * fallback) const10303 std::string CGUIInfoManager::GetLabel(int info, int contextWindow, std::string *fallback) const
10304 {
10305   if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
10306   {
10307     return GetSkinVariableString(info, false);
10308   }
10309   else if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
10310   {
10311     return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START], contextWindow);
10312   }
10313   else if (info >= LISTITEM_START && info <= LISTITEM_END)
10314   {
10315     const CGUIListItemPtr item = GUIINFO::GetCurrentListItem(contextWindow);
10316     if (item && item->IsFileItem())
10317       return GetItemLabel(static_cast<CFileItem*>(item.get()), contextWindow, info, fallback);
10318   }
10319 
10320   std::string strLabel;
10321   m_infoProviders.GetLabel(strLabel, m_currentFile, contextWindow, CGUIInfo(info), fallback);
10322   return strLabel;
10323 }
10324 
GetInt(int & value,int info,int contextWindow,const CGUIListItem * item) const10325 bool CGUIInfoManager::GetInt(int &value, int info, int contextWindow, const CGUIListItem *item /* = nullptr */) const
10326 {
10327   if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
10328   {
10329     return GetMultiInfoInt(value, m_multiInfo[info - MULTI_INFO_START], contextWindow, item);
10330   }
10331   else if (info >= LISTITEM_START && info <= LISTITEM_END)
10332   {
10333     CGUIListItemPtr itemPtr;
10334     if (!item)
10335     {
10336       itemPtr = GUIINFO::GetCurrentListItem(contextWindow);
10337       item = itemPtr.get();
10338     }
10339     return GetItemInt(value, item, contextWindow, info);
10340   }
10341 
10342   value = 0;
10343   return m_infoProviders.GetInt(value, m_currentFile, contextWindow, CGUIInfo(info));
10344 }
10345 
Register(const std::string & expression,int context)10346 INFO::InfoPtr CGUIInfoManager::Register(const std::string &expression, int context)
10347 {
10348   std::string condition(CGUIInfoLabel::ReplaceLocalize(expression));
10349   StringUtils::Trim(condition);
10350 
10351   if (condition.empty())
10352     return INFO::InfoPtr();
10353 
10354   CSingleLock lock(m_critInfo);
10355   std::pair<INFOBOOLTYPE::iterator, bool> res;
10356 
10357   if (condition.find_first_of("|+[]!") != condition.npos)
10358     res = m_bools.insert(std::make_shared<InfoExpression>(condition, context, m_refreshCounter));
10359   else
10360     res = m_bools.insert(std::make_shared<InfoSingle>(condition, context, m_refreshCounter));
10361 
10362   if (res.second)
10363     res.first->get()->Initialize();
10364 
10365   return *(res.first);
10366 }
10367 
EvaluateBool(const std::string & expression,int contextWindow,const CGUIListItemPtr & item)10368 bool CGUIInfoManager::EvaluateBool(const std::string &expression, int contextWindow /* = 0 */, const CGUIListItemPtr &item /* = nullptr */)
10369 {
10370   INFO::InfoPtr info = Register(expression, contextWindow);
10371   if (info)
10372     return info->Get(item.get());
10373   return false;
10374 }
10375 
GetBool(int condition1,int contextWindow,const CGUIListItem * item)10376 bool CGUIInfoManager::GetBool(int condition1, int contextWindow, const CGUIListItem *item)
10377 {
10378   bool bReturn = false;
10379   int condition = std::abs(condition1);
10380 
10381   if (condition >= LISTITEM_START && condition < LISTITEM_END)
10382   {
10383     CGUIListItemPtr itemPtr;
10384     if (!item)
10385     {
10386       itemPtr = GUIINFO::GetCurrentListItem(contextWindow);
10387       item = itemPtr.get();
10388     }
10389     bReturn = GetItemBool(item, contextWindow, condition);
10390   }
10391   else if (condition >= MULTI_INFO_START && condition <= MULTI_INFO_END)
10392   {
10393     bReturn = GetMultiInfoBool(m_multiInfo[condition - MULTI_INFO_START], contextWindow, item);
10394   }
10395   else if (!m_infoProviders.GetBool(bReturn, m_currentFile, contextWindow, CGUIInfo(condition)))
10396   {
10397     // default: use integer value different from 0 as true
10398     int val;
10399     bReturn = GetInt(val, condition) && val != 0;
10400   }
10401 
10402   return (condition1 < 0) ? !bReturn : bReturn;
10403 }
10404 
GetMultiInfoBool(const CGUIInfo & info,int contextWindow,const CGUIListItem * item)10405 bool CGUIInfoManager::GetMultiInfoBool(const CGUIInfo &info, int contextWindow, const CGUIListItem *item)
10406 {
10407   bool bReturn = false;
10408   int condition = std::abs(info.m_info);
10409 
10410   if (condition >= LISTITEM_START && condition <= LISTITEM_END)
10411   {
10412     CGUIListItemPtr itemPtr;
10413     if (!item)
10414     {
10415       itemPtr = GUIINFO::GetCurrentListItem(contextWindow, info.GetData1(), info.GetData2(), info.GetInfoFlag());
10416       item = itemPtr.get();
10417     }
10418     if (item)
10419     {
10420       if (condition == LISTITEM_PROPERTY)
10421       {
10422         if (item->HasProperty(info.GetData3()))
10423           bReturn = item->GetProperty(info.GetData3()).asBoolean();
10424       }
10425       else
10426         bReturn = GetItemBool(item, contextWindow, condition);
10427     }
10428     else
10429     {
10430       bReturn = false;
10431     }
10432   }
10433   else if (!m_infoProviders.GetBool(bReturn, m_currentFile, contextWindow, info))
10434   {
10435     switch (condition)
10436     {
10437       case STRING_IS_EMPTY:
10438         // note: Get*Image() falls back to Get*Label(), so this should cover all of them
10439         if (item && item->IsFileItem() && IsListItemInfo(info.GetData1()))
10440           bReturn = GetItemImage(item, contextWindow, info.GetData1()).empty();
10441         else
10442           bReturn = GetImage(info.GetData1(), contextWindow).empty();
10443         break;
10444       case STRING_STARTS_WITH:
10445       case STRING_ENDS_WITH:
10446       case STRING_CONTAINS:
10447       case STRING_IS_EQUAL:
10448         {
10449           std::string compare;
10450           if (info.GetData2() < 0) // info labels are stored with negative numbers
10451           {
10452             int info2 = -info.GetData2();
10453             CGUIListItemPtr item2;
10454 
10455             if (IsListItemInfo(info2))
10456             {
10457               int iResolvedInfo2 = ResolveMultiInfo(info2);
10458               if (iResolvedInfo2 != 0)
10459               {
10460                 const GUIINFO::CGUIInfo& resolvedInfo2 = m_multiInfo[iResolvedInfo2 - MULTI_INFO_START];
10461                 if (resolvedInfo2.GetInfoFlag() & INFOFLAG_LISTITEM_CONTAINER)
10462                   item2 = GUIINFO::GetCurrentListItem(contextWindow, resolvedInfo2.GetData1()); // data1 contains the container id
10463               }
10464             }
10465 
10466             if (item2 && item2->IsFileItem())
10467               compare = GetItemImage(item2.get(), contextWindow, info2);
10468             else if (item && item->IsFileItem())
10469               compare = GetItemImage(item, contextWindow, info2);
10470             else
10471               compare = GetImage(info2, contextWindow);
10472           }
10473           else if (!info.GetData3().empty())
10474           { // conditional string
10475             compare = info.GetData3();
10476           }
10477           StringUtils::ToLower(compare);
10478 
10479           std::string label;
10480           if (item && item->IsFileItem() && IsListItemInfo(info.GetData1()))
10481             label = GetItemImage(item, contextWindow, info.GetData1());
10482           else
10483             label = GetImage(info.GetData1(), contextWindow);
10484           StringUtils::ToLower(label);
10485 
10486           if (condition == STRING_STARTS_WITH)
10487             bReturn = StringUtils::StartsWith(label, compare);
10488           else if (condition == STRING_ENDS_WITH)
10489             bReturn = StringUtils::EndsWith(label, compare);
10490           else if (condition == STRING_CONTAINS)
10491             bReturn = label.find(compare) != std::string::npos;
10492           else
10493             bReturn = StringUtils::EqualsNoCase(label, compare);
10494         }
10495         break;
10496       case INTEGER_IS_EQUAL:
10497       case INTEGER_GREATER_THAN:
10498       case INTEGER_GREATER_OR_EQUAL:
10499       case INTEGER_LESS_THAN:
10500       case INTEGER_LESS_OR_EQUAL:
10501       case INTEGER_EVEN:
10502       case INTEGER_ODD:
10503         {
10504           int integer = 0;
10505           if (!GetInt(integer, info.GetData1(), contextWindow, item))
10506           {
10507             std::string value;
10508             if (item && item->IsFileItem() && IsListItemInfo(info.GetData1()))
10509               value = GetItemImage(item, contextWindow, info.GetData1());
10510             else
10511               value = GetImage(info.GetData1(), contextWindow);
10512 
10513             // Handle the case when a value contains time separator (:). This makes Integer.IsGreater
10514             // useful for Player.Time* members without adding a separate set of members returning time in seconds
10515             if (value.find_first_of( ':' ) != value.npos)
10516               integer = StringUtils::TimeStringToSeconds(value);
10517             else
10518               integer = atoi(value.c_str());
10519           }
10520 
10521           // compare
10522           if (condition == INTEGER_IS_EQUAL)
10523             bReturn = integer == info.GetData2();
10524           else if (condition == INTEGER_GREATER_THAN)
10525             bReturn = integer > info.GetData2();
10526           else if (condition == INTEGER_GREATER_OR_EQUAL)
10527             bReturn = integer >= info.GetData2();
10528           else if (condition == INTEGER_LESS_THAN)
10529             bReturn = integer < info.GetData2();
10530           else if (condition == INTEGER_LESS_OR_EQUAL)
10531             bReturn = integer <= info.GetData2();
10532           else if (condition == INTEGER_EVEN)
10533             bReturn = integer % 2 == 0;
10534           else if (condition == INTEGER_ODD)
10535             bReturn = integer % 2 != 0;
10536         }
10537         break;
10538     }
10539   }
10540   return (info.m_info < 0) ? !bReturn : bReturn;
10541 }
10542 
GetMultiInfoInt(int & value,const CGUIInfo & info,int contextWindow,const CGUIListItem * item) const10543 bool CGUIInfoManager::GetMultiInfoInt(int &value, const CGUIInfo &info, int contextWindow, const CGUIListItem *item) const
10544 {
10545   if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
10546   {
10547     CGUIListItemPtr itemPtr;
10548     if (!item)
10549     {
10550       itemPtr = GUIINFO::GetCurrentListItem(contextWindow, info.GetData1(), info.GetData2(), info.GetInfoFlag());
10551       item = itemPtr.get();
10552     }
10553     if (item)
10554     {
10555       if (info.m_info == LISTITEM_PROPERTY)
10556       {
10557         if (item->HasProperty(info.GetData3()))
10558         {
10559           value = item->GetProperty(info.GetData3()).asInteger();
10560           return true;
10561         }
10562         return false;
10563       }
10564       else
10565         return GetItemInt(value, item, contextWindow, info.m_info);
10566     }
10567     else
10568     {
10569       return false;
10570     }
10571   }
10572 
10573   return m_infoProviders.GetInt(value, m_currentFile, contextWindow, info);
10574 }
10575 
GetMultiInfoLabel(const CGUIInfo & constinfo,int contextWindow,std::string * fallback) const10576 std::string CGUIInfoManager::GetMultiInfoLabel(const CGUIInfo &constinfo, int contextWindow, std::string *fallback) const
10577 {
10578   CGUIInfo info(constinfo);
10579 
10580   if (info.m_info >= LISTITEM_START && info.m_info <= LISTITEM_END)
10581   {
10582     const CGUIListItemPtr item = GUIINFO::GetCurrentListItem(contextWindow, info.GetData1(), info.GetData2(), info.GetInfoFlag());
10583     if (item)
10584     {
10585       // Image prioritizes images over labels (in the case of music item ratings for instance)
10586       return GetMultiInfoItemImage(dynamic_cast<CFileItem*>(item.get()), contextWindow, info, fallback);
10587     }
10588     else
10589     {
10590       return std::string();
10591     }
10592   }
10593   else if (info.m_info == SYSTEM_ADDON_TITLE ||
10594            info.m_info == SYSTEM_ADDON_ICON ||
10595            info.m_info == SYSTEM_ADDON_VERSION)
10596   {
10597     if (info.GetData2() == 0)
10598     {
10599       // resolve the addon id
10600       const std::string addonId = GetLabel(info.GetData1(), contextWindow);
10601       info = CGUIInfo(info.m_info, addonId);
10602     }
10603   }
10604 
10605   std::string strValue;
10606   m_infoProviders.GetLabel(strValue, m_currentFile, contextWindow, info, fallback);
10607   return strValue;
10608 }
10609 
10610 /// \brief Obtains the filename of the image to show from whichever subsystem is needed
GetImage(int info,int contextWindow,std::string * fallback)10611 std::string CGUIInfoManager::GetImage(int info, int contextWindow, std::string *fallback)
10612 {
10613   if (info >= CONDITIONAL_LABEL_START && info <= CONDITIONAL_LABEL_END)
10614   {
10615     return GetSkinVariableString(info, true);
10616   }
10617   else if (info >= MULTI_INFO_START && info <= MULTI_INFO_END)
10618   {
10619     return GetMultiInfoLabel(m_multiInfo[info - MULTI_INFO_START], contextWindow, fallback);
10620   }
10621   else if (info == LISTITEM_THUMB ||
10622            info == LISTITEM_ICON ||
10623            info == LISTITEM_ACTUAL_ICON ||
10624            info == LISTITEM_OVERLAY ||
10625            info == LISTITEM_ART)
10626   {
10627     const CGUIListItemPtr item = GUIINFO::GetCurrentListItem(contextWindow);
10628     if (item && item->IsFileItem())
10629       return GetItemImage(item.get(), contextWindow, info, fallback);
10630   }
10631 
10632   return GetLabel(info, contextWindow, fallback);
10633 }
10634 
ResetCurrentItem()10635 void CGUIInfoManager::ResetCurrentItem()
10636 {
10637   m_currentFile->Reset();
10638   m_infoProviders.InitCurrentItem(nullptr);
10639 }
10640 
UpdateCurrentItem(const CFileItem & item)10641 void CGUIInfoManager::UpdateCurrentItem(const CFileItem &item)
10642 {
10643   m_currentFile->UpdateInfo(item);
10644 }
10645 
SetCurrentItem(const CFileItem & item)10646 void CGUIInfoManager::SetCurrentItem(const CFileItem &item)
10647 {
10648   *m_currentFile = item;
10649   m_currentFile->FillInDefaultIcon();
10650 
10651   m_infoProviders.InitCurrentItem(m_currentFile);
10652 
10653   CServiceBroker::GetAnnouncementManager()->Announce(ANNOUNCEMENT::Info, "OnChanged");
10654 }
10655 
SetCurrentAlbumThumb(const std::string & thumbFileName)10656 void CGUIInfoManager::SetCurrentAlbumThumb(const std::string &thumbFileName)
10657 {
10658   if (XFILE::CFile::Exists(thumbFileName))
10659     m_currentFile->SetArt("thumb", thumbFileName);
10660   else
10661   {
10662     m_currentFile->SetArt("thumb", "");
10663     m_currentFile->FillInDefaultIcon();
10664   }
10665 }
10666 
Clear()10667 void CGUIInfoManager::Clear()
10668 {
10669   CSingleLock lock(m_critInfo);
10670   m_skinVariableStrings.clear();
10671 
10672   /*
10673     Erase any info bools that are unused. We do this repeatedly as each run
10674     will remove those bools that are no longer dependencies of other bools
10675     in the vector.
10676    */
10677   INFOBOOLTYPE swapList(&InfoBoolComparator);
10678   do
10679   {
10680     swapList.clear();
10681     for (auto &item : m_bools)
10682       if (!item.unique())
10683         swapList.insert(item);
10684     m_bools.swap(swapList);
10685   } while (swapList.size() != m_bools.size());
10686 
10687   // log which ones are used - they should all be gone by now
10688   for (INFOBOOLTYPE::const_iterator i = m_bools.begin(); i != m_bools.end(); ++i)
10689     CLog::Log(LOGDEBUG, "Infobool '%s' still used by %u instances", (*i)->GetExpression().c_str(), (unsigned int) i->use_count());
10690 }
10691 
UpdateAVInfo()10692 void CGUIInfoManager::UpdateAVInfo()
10693 {
10694   if (CServiceBroker::GetDataCacheCore().HasAVInfoChanges())
10695   {
10696     VideoStreamInfo video;
10697     AudioStreamInfo audio;
10698     SubtitleStreamInfo subtitle;
10699 
10700     g_application.GetAppPlayer().GetVideoStreamInfo(CURRENT_STREAM, video);
10701     g_application.GetAppPlayer().GetAudioStreamInfo(CURRENT_STREAM, audio);
10702     g_application.GetAppPlayer().GetSubtitleStreamInfo(CURRENT_STREAM, subtitle);
10703 
10704     m_infoProviders.UpdateAVInfo(audio, video, subtitle);
10705   }
10706 }
10707 
AddMultiInfo(const CGUIInfo & info)10708 int CGUIInfoManager::AddMultiInfo(const CGUIInfo &info)
10709 {
10710   // check to see if we have this info already
10711   for (unsigned int i = 0; i < m_multiInfo.size(); ++i)
10712     if (m_multiInfo[i] == info)
10713       return static_cast<int>(i) + MULTI_INFO_START;
10714   // return the new offset
10715   m_multiInfo.emplace_back(info);
10716   int id = static_cast<int>(m_multiInfo.size()) + MULTI_INFO_START - 1;
10717   if (id > MULTI_INFO_END)
10718     CLog::Log(LOGERROR, "%s - too many multiinfo bool/labels in this skin", __FUNCTION__);
10719   return id;
10720 }
10721 
ResolveMultiInfo(int info) const10722 int CGUIInfoManager::ResolveMultiInfo(int info) const
10723 {
10724   int iLastInfo = 0;
10725 
10726   int iResolvedInfo = info;
10727   while (iResolvedInfo >= MULTI_INFO_START && iResolvedInfo <= MULTI_INFO_END)
10728   {
10729     iLastInfo = iResolvedInfo;
10730     iResolvedInfo = m_multiInfo[iResolvedInfo - MULTI_INFO_START].m_info;
10731   }
10732 
10733   return iLastInfo;
10734 }
10735 
IsListItemInfo(int info) const10736 bool CGUIInfoManager::IsListItemInfo(int info) const
10737 {
10738   int iResolvedInfo = info;
10739   while (iResolvedInfo >= MULTI_INFO_START && iResolvedInfo <= MULTI_INFO_END)
10740     iResolvedInfo = m_multiInfo[iResolvedInfo - MULTI_INFO_START].m_info;
10741 
10742   return (iResolvedInfo >= LISTITEM_START && iResolvedInfo <= LISTITEM_END);
10743 }
10744 
GetItemInt(int & value,const CGUIListItem * item,int contextWindow,int info) const10745 bool CGUIInfoManager::GetItemInt(int &value, const CGUIListItem *item, int contextWindow, int info) const
10746 {
10747   value = 0;
10748 
10749   if (!item)
10750     return false;
10751 
10752   return m_infoProviders.GetInt(value, item, contextWindow, CGUIInfo(info));
10753 }
10754 
GetItemLabel(const CFileItem * item,int contextWindow,int info,std::string * fallback) const10755 std::string CGUIInfoManager::GetItemLabel(const CFileItem *item, int contextWindow, int info, std::string *fallback /* = nullptr */) const
10756 {
10757   return GetMultiInfoItemLabel(item, contextWindow, CGUIInfo(info), fallback);
10758 }
10759 
GetMultiInfoItemLabel(const CFileItem * item,int contextWindow,const CGUIInfo & info,std::string * fallback) const10760 std::string CGUIInfoManager::GetMultiInfoItemLabel(const CFileItem *item, int contextWindow, const CGUIInfo &info, std::string *fallback /* = nullptr */) const
10761 {
10762   if (!item)
10763     return std::string();
10764 
10765   std::string value;
10766 
10767   if (info.m_info >= CONDITIONAL_LABEL_START && info.m_info <= CONDITIONAL_LABEL_END)
10768   {
10769     return GetSkinVariableString(info.m_info, false, item);
10770   }
10771   else if (info.m_info >= MULTI_INFO_START && info.m_info <= MULTI_INFO_END)
10772   {
10773     return GetMultiInfoItemLabel(item, contextWindow, m_multiInfo[info.m_info - MULTI_INFO_START], fallback);
10774   }
10775   else if (!m_infoProviders.GetLabel(value, item, contextWindow, info, fallback))
10776   {
10777     switch (info.m_info)
10778     {
10779       case LISTITEM_PROPERTY:
10780         return item->GetProperty(info.GetData3()).asString();
10781       case LISTITEM_LABEL:
10782         return item->GetLabel();
10783       case LISTITEM_LABEL2:
10784         return item->GetLabel2();
10785       case LISTITEM_FILENAME:
10786       case LISTITEM_FILE_EXTENSION:
10787       case LISTITEM_FILENAME_NO_EXTENSION:
10788       {
10789         std::string strFile = URIUtils::GetFileName(item->GetPath());
10790         if (info.m_info == LISTITEM_FILE_EXTENSION)
10791         {
10792           std::string strExtension = URIUtils::GetExtension(strFile);
10793           return StringUtils::TrimLeft(strExtension, ".");
10794         }
10795         else if (info.m_info == LISTITEM_FILENAME_NO_EXTENSION)
10796         {
10797           URIUtils::RemoveExtension(strFile);
10798         }
10799         return strFile;
10800       }
10801       case LISTITEM_DATE:
10802         if (item->m_dateTime.IsValid())
10803           return item->m_dateTime.GetAsLocalizedDate();
10804         break;
10805       case LISTITEM_DATETIME:
10806         if (item->m_dateTime.IsValid())
10807           return item->m_dateTime.GetAsLocalizedDateTime();
10808         break;
10809       case LISTITEM_SIZE:
10810         if (!item->m_bIsFolder || item->m_dwSize)
10811           return StringUtils::SizeToString(item->m_dwSize);
10812         break;
10813       case LISTITEM_PROGRAM_COUNT:
10814         return StringUtils::Format("%i", item->m_iprogramCount);
10815       case LISTITEM_ACTUAL_ICON:
10816         return item->GetArt("icon");
10817       case LISTITEM_ICON:
10818       {
10819         std::string strThumb = item->GetThumbHideIfUnwatched(item);
10820         if (strThumb.empty())
10821           strThumb = item->GetArt("icon");
10822         if (fallback)
10823           *fallback = item->GetArt("icon");
10824         return strThumb;
10825       }
10826       case LISTITEM_ART:
10827         return item->GetArt(info.GetData3());
10828       case LISTITEM_OVERLAY:
10829         return item->GetOverlayImage();
10830       case LISTITEM_THUMB:
10831         return item->GetThumbHideIfUnwatched(item);
10832       case LISTITEM_FOLDERPATH:
10833         return CURL(item->GetPath()).GetWithoutUserDetails();
10834       case LISTITEM_FOLDERNAME:
10835       case LISTITEM_PATH:
10836       {
10837         std::string path;
10838         URIUtils::GetParentPath(item->GetPath(), path);
10839         path = CURL(path).GetWithoutUserDetails();
10840         if (info.m_info == LISTITEM_FOLDERNAME)
10841         {
10842           URIUtils::RemoveSlashAtEnd(path);
10843           path = URIUtils::GetFileName(path);
10844         }
10845         return path;
10846       }
10847       case LISTITEM_FILENAME_AND_PATH:
10848       {
10849         std::string path = item->GetPath();
10850         path = CURL(path).GetWithoutUserDetails();
10851         return path;
10852       }
10853       case LISTITEM_SORT_LETTER:
10854       {
10855         std::string letter;
10856         std::wstring character(1, item->GetSortLabel()[0]);
10857         StringUtils::ToUpper(character);
10858         g_charsetConverter.wToUTF8(character, letter);
10859         return letter;
10860       }
10861       case LISTITEM_STARTTIME:
10862       {
10863         if (item->m_dateTime.IsValid())
10864           return item->m_dateTime.GetAsLocalizedTime("", false);
10865         break;
10866       }
10867       case LISTITEM_STARTDATE:
10868       {
10869         if (item->m_dateTime.IsValid())
10870           return item->m_dateTime.GetAsLocalizedDate(true);
10871         break;
10872       }
10873       case LISTITEM_CURRENTITEM:
10874         return std::to_string(item->GetCurrentItem());
10875     }
10876   }
10877 
10878   return value;
10879 }
10880 
GetItemImage(const CGUIListItem * item,int contextWindow,int info,std::string * fallback) const10881 std::string CGUIInfoManager::GetItemImage(const CGUIListItem *item, int contextWindow, int info, std::string *fallback /*= nullptr*/) const
10882 {
10883   if (!item || !item->IsFileItem())
10884     return std::string();
10885 
10886   return GetMultiInfoItemImage(static_cast<const CFileItem*>(item), contextWindow, CGUIInfo(info), fallback);
10887 }
10888 
GetMultiInfoItemImage(const CFileItem * item,int contextWindow,const CGUIInfo & info,std::string * fallback) const10889 std::string CGUIInfoManager::GetMultiInfoItemImage(const CFileItem *item, int contextWindow, const CGUIInfo &info, std::string *fallback /*= nullptr*/) const
10890 {
10891   if (info.m_info >= CONDITIONAL_LABEL_START && info.m_info <= CONDITIONAL_LABEL_END)
10892   {
10893     return GetSkinVariableString(info.m_info, true, item);
10894   }
10895   else if (info.m_info >= MULTI_INFO_START && info.m_info <= MULTI_INFO_END)
10896   {
10897     return GetMultiInfoItemImage(item, contextWindow, m_multiInfo[info.m_info - MULTI_INFO_START], fallback);
10898   }
10899 
10900   return GetMultiInfoItemLabel(item, contextWindow, info, fallback);
10901 }
10902 
GetItemBool(const CGUIListItem * item,int contextWindow,int condition) const10903 bool CGUIInfoManager::GetItemBool(const CGUIListItem *item, int contextWindow, int condition) const
10904 {
10905   if (!item)
10906     return false;
10907 
10908   bool value = false;
10909   if (!m_infoProviders.GetBool(value, item, contextWindow, CGUIInfo(condition)))
10910   {
10911     switch (condition)
10912     {
10913       case LISTITEM_ISSELECTED:
10914         return item->IsSelected();
10915       case LISTITEM_IS_FOLDER:
10916         return item->m_bIsFolder;
10917       case LISTITEM_IS_PARENTFOLDER:
10918       {
10919         if (item->IsFileItem())
10920         {
10921           const CFileItem *pItem = static_cast<const CFileItem *>(item);
10922           return pItem->IsParentFolder();
10923         }
10924         break;
10925       }
10926     }
10927   }
10928 
10929   return value;
10930 }
10931 
ResetCache()10932 void CGUIInfoManager::ResetCache()
10933 {
10934   // mark our infobools as dirty
10935   CSingleLock lock(m_critInfo);
10936   ++m_refreshCounter;
10937 }
10938 
SetCurrentVideoTag(const CVideoInfoTag & tag)10939 void CGUIInfoManager::SetCurrentVideoTag(const CVideoInfoTag &tag)
10940 {
10941   m_currentFile->SetFromVideoInfoTag(tag);
10942   m_currentFile->m_lStartOffset = 0;
10943 }
10944 
SetCurrentSongTag(const MUSIC_INFO::CMusicInfoTag & tag)10945 void CGUIInfoManager::SetCurrentSongTag(const MUSIC_INFO::CMusicInfoTag &tag)
10946 {
10947   m_currentFile->SetFromMusicInfoTag(tag);
10948   m_currentFile->m_lStartOffset = 0;
10949 }
10950 
GetCurrentSongTag() const10951 const MUSIC_INFO::CMusicInfoTag* CGUIInfoManager::GetCurrentSongTag() const
10952 {
10953   if (m_currentFile->HasMusicInfoTag())
10954     return m_currentFile->GetMusicInfoTag();
10955 
10956   return nullptr;
10957 }
10958 
GetCurrentMovieTag() const10959 const CVideoInfoTag* CGUIInfoManager::GetCurrentMovieTag() const
10960 {
10961   if (m_currentFile->HasVideoInfoTag())
10962     return m_currentFile->GetVideoInfoTag();
10963 
10964   return nullptr;
10965 }
10966 
RegisterSkinVariableString(const CSkinVariableString * info)10967 int CGUIInfoManager::RegisterSkinVariableString(const CSkinVariableString* info)
10968 {
10969   if (!info)
10970     return 0;
10971 
10972   CSingleLock lock(m_critInfo);
10973   m_skinVariableStrings.emplace_back(*info);
10974   delete info;
10975   return CONDITIONAL_LABEL_START + m_skinVariableStrings.size() - 1;
10976 }
10977 
TranslateSkinVariableString(const std::string & name,int context)10978 int CGUIInfoManager::TranslateSkinVariableString(const std::string& name, int context)
10979 {
10980   for (std::vector<CSkinVariableString>::const_iterator it = m_skinVariableStrings.begin();
10981        it != m_skinVariableStrings.end(); ++it)
10982   {
10983     if (StringUtils::EqualsNoCase(it->GetName(), name) && it->GetContext() == context)
10984       return it - m_skinVariableStrings.begin() + CONDITIONAL_LABEL_START;
10985   }
10986   return 0;
10987 }
10988 
GetSkinVariableString(int info,bool preferImage,const CGUIListItem * item) const10989 std::string CGUIInfoManager::GetSkinVariableString(int info,
10990                                                    bool preferImage /*= false*/,
10991                                                    const CGUIListItem *item /*= nullptr*/) const
10992 {
10993   info -= CONDITIONAL_LABEL_START;
10994   if (info >= 0 && info < static_cast<int>(m_skinVariableStrings.size()))
10995     return m_skinVariableStrings[info].GetValue(preferImage, item);
10996 
10997   return "";
10998 }
10999 
ConditionsChangedValues(const std::map<INFO::InfoPtr,bool> & map)11000 bool CGUIInfoManager::ConditionsChangedValues(const std::map<INFO::InfoPtr, bool>& map)
11001 {
11002   for (std::map<INFO::InfoPtr, bool>::const_iterator it = map.begin() ; it != map.end() ; ++it)
11003   {
11004     if (it->first->Get() != it->second)
11005       return true;
11006   }
11007   return false;
11008 }
11009 
GetMessageMask()11010 int CGUIInfoManager::GetMessageMask()
11011 {
11012   return TMSG_MASK_GUIINFOMANAGER;
11013 }
11014 
OnApplicationMessage(KODI::MESSAGING::ThreadMessage * pMsg)11015 void CGUIInfoManager::OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg)
11016 {
11017   switch (pMsg->dwMessage)
11018   {
11019   case TMSG_GUI_INFOLABEL:
11020   {
11021     if (pMsg->lpVoid)
11022     {
11023       auto infoLabels = static_cast<std::vector<std::string>*>(pMsg->lpVoid);
11024       for (auto& param : pMsg->params)
11025         infoLabels->emplace_back(GetLabel(TranslateString(param)));
11026     }
11027   }
11028   break;
11029 
11030   case TMSG_GUI_INFOBOOL:
11031   {
11032     if (pMsg->lpVoid)
11033     {
11034       auto infoLabels = static_cast<std::vector<bool>*>(pMsg->lpVoid);
11035       for (auto& param : pMsg->params)
11036         infoLabels->push_back(EvaluateBool(param));
11037     }
11038   }
11039   break;
11040 
11041   case TMSG_UPDATE_CURRENT_ITEM:
11042   {
11043     CFileItem* item = static_cast<CFileItem*>(pMsg->lpVoid);
11044     if (!item)
11045       return;
11046 
11047     if (pMsg->param1 == 1 && item->HasMusicInfoTag()) // only grab music tag
11048       SetCurrentSongTag(*item->GetMusicInfoTag());
11049     else if (pMsg->param1 == 2 && item->HasVideoInfoTag()) // only grab video tag
11050       SetCurrentVideoTag(*item->GetVideoInfoTag());
11051     else
11052       SetCurrentItem(*item);
11053 
11054     delete item;
11055   }
11056   break;
11057 
11058   default:
11059     break;
11060   }
11061 }
11062 
RegisterInfoProvider(IGUIInfoProvider * provider)11063 void CGUIInfoManager::RegisterInfoProvider(IGUIInfoProvider *provider)
11064 {
11065   if (!CServiceBroker::GetWinSystem())
11066     return;
11067 
11068   CSingleLock lock(CServiceBroker::GetWinSystem()->GetGfxContext());
11069 
11070   m_infoProviders.RegisterProvider(provider, false);
11071 }
11072 
UnregisterInfoProvider(IGUIInfoProvider * provider)11073 void CGUIInfoManager::UnregisterInfoProvider(IGUIInfoProvider *provider)
11074 {
11075   if (!CServiceBroker::GetWinSystem())
11076     return;
11077 
11078   CSingleLock lock(CServiceBroker::GetWinSystem()->GetGfxContext());
11079 
11080   m_infoProviders.UnregisterProvider(provider);
11081 }
11082